From 08fd0b1c5ca102431320170425ab75ac4ed4b0f6 Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 20 Aug 2017 20:35:08 +0000 Subject: [PATCH] * fix jump. tables for sparc64 git-svn-id: trunk@36997 - --- compiler/sparcgen/ncpuset.pas | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/compiler/sparcgen/ncpuset.pas b/compiler/sparcgen/ncpuset.pas index 2ca450c03d..cb5cf73c30 100644 --- a/compiler/sparcgen/ncpuset.pas +++ b/compiler/sparcgen/ncpuset.pas @@ -109,11 +109,15 @@ unit ncpuset; end; current_asmdata.getjumplabel(table); indexreg:=cg.getaddressregister(current_asmdata.CurrAsmList); +{$ifdef SPARC64} + cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SHL,OS_ADDR,3,hregister,indexreg); +{$else SPARC64} cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SHL,OS_ADDR,2,hregister,indexreg); +{$endif SPARC64} { create reference } current_asmdata.getjumplabel(base); cg.a_label(current_asmdata.CurrAsmList,base); - reference_reset_symbol(href,table,(-aint(min_))*4,sizeof(pint),[]); + reference_reset_symbol(href,table,(-aint(min_))*sizeof(pint),sizeof(pint),[]); href.relsymbol:=base; { Generate the following code: .Lbase: @@ -133,6 +137,7 @@ unit ncpuset; current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg(A_SETHI,href,basereg)); href.refaddr:=addr_low; current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref_reg(A_OR,basereg,href,basereg)); + { add index } cg.a_op_reg_reg_reg(current_asmdata.CurrAsmList,OP_ADD,OS_ADDR,basereg,indexreg,basereg); @@ -143,10 +148,13 @@ unit ncpuset; href.index:=jmpreg; href.refaddr:=addr_full; current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_JMP,href)); + { Delay slot } current_asmdata.CurrAsmList.concat(taicpu.op_none(A_NOP)); cg.ungetcpuregister(current_asmdata.CurrAsmList,NR_O7); + { generate jump table } + current_asmdata.CurrAsmList.Concat(tai_align.Create(sizeof(pint))); cg.a_label(current_asmdata.CurrAsmList,table); genitem(current_asmdata.CurrAsmList,hp); end;