diff --git a/compiler/aarch64/aasmcpu.pas b/compiler/aarch64/aasmcpu.pas index f427b326a4..520943569f 100644 --- a/compiler/aarch64/aasmcpu.pas +++ b/compiler/aarch64/aasmcpu.pas @@ -222,8 +222,8 @@ uses { nothing to add } end; - function spilling_create_load(const ref:treference;r:tregister):Taicpu; - function spilling_create_store(r:tregister; const ref:treference):Taicpu; + function spilling_create_load(const ref: treference; r: tregister): taicpu; + function spilling_create_store(r: tregister; const ref: treference): taicpu; function setoppostfix(i : taicpu;pf : toppostfix) : taicpu; function setcondition(i : taicpu;c : tasmcond) : taicpu; @@ -474,53 +474,57 @@ implementation end; - function spilling_create_load(const ref:treference;r:tregister):Taicpu; + function spilling_create_op(op: tasmop; const ref: treference; r: tregister): taicpu; + const + { invalid sizes for aarch64 are 0 } + subreg2bytesize: array[TSubRegister] of byte = + (0,0,0,0,4,8,0,0,0,4,8,0,0,0); var - op: tasmop; + scalefactor: byte; begin + scalefactor:=subreg2bytesize[getsubreg(r)]; + if scalefactor=0 then + internalerror(2014120301); + if (ref.offset>4095*scalefactor) or + ((ref.offset>255) and + ((ref.offset mod scalefactor)<>0)) or + (ref.offset<-256) then + internalerror(2014120302); case getregtype(r) of - R_INTREGISTER : - result:=taicpu.op_reg_ref(A_LDR,r,ref); - R_MMREGISTER : - begin - case getsubreg(r) of - R_SUBFD: - op:=A_LDR; - R_SUBFS: - op:=A_LDR; - else - internalerror(2009112905); - end; - result:=taicpu.op_reg_ref(op,r,ref); - end; + R_INTREGISTER, + R_MMREGISTER: + result:=taicpu.op_reg_ref(op,r,ref); else internalerror(200401041); end; end; - function spilling_create_store(r:tregister; const ref:treference):Taicpu; + function spilling_create_load(const ref: treference; r: tregister): taicpu; var op: tasmop; begin - case getregtype(r) of - R_INTREGISTER : - result:=taicpu.op_reg_ref(A_STR,r,ref); - R_MMREGISTER : - begin - case getsubreg(r) of - R_SUBFD: - op:=A_STR; - R_SUBFS: - op:=A_STR; - else - internalerror(2009112904); - end; - result:=taicpu.op_reg_ref(op,r,ref); - end; - else - internalerror(200401041); - end; + if (ref.index<>NR_NO) or + (ref.offset<-256) or + (ref.offset>255) then + op:=A_LDR + else + op:=A_LDUR; + result:=spilling_create_op(op,ref,r); + end; + + + function spilling_create_store(r: tregister; const ref: treference): taicpu; + var + op: tasmop; + begin + if (ref.index<>NR_NO) or + (ref.offset<-256) or + (ref.offset>255) then + op:=A_STR + else + op:=A_STUR; + result:=spilling_create_op(op,ref,r); end;