diff --git a/compiler/cgobj.pas b/compiler/cgobj.pas index 959c1b681e..6e80061501 100644 --- a/compiler/cgobj.pas +++ b/compiler/cgobj.pas @@ -260,6 +260,7 @@ unit cgobj; procedure a_loadfpu_reg_reg(list: TAsmList; fromsize, tosize:tcgsize; reg1, reg2: tregister); virtual; abstract; procedure a_loadfpu_ref_reg(list: TAsmList; fromsize, tosize: tcgsize; const ref: treference; reg: tregister); virtual; abstract; procedure a_loadfpu_reg_ref(list: TAsmList; fromsize, tosize: tcgsize; reg: tregister; const ref: treference); virtual; abstract; + procedure a_loadfpu_ref_ref(list: TAsmList; fromsize, tosize: tcgsize; const ref1,ref2: treference); procedure a_loadfpu_loc_reg(list: TAsmList; tosize: tcgsize; const loc: tlocation; const reg: tregister); procedure a_loadfpu_reg_loc(list: TAsmList; fromsize: tcgsize; const reg: tregister; const loc: tlocation); procedure a_paramfpu_reg(list : TAsmList;size : tcgsize;const r : tregister;const cgpara : TCGPara);virtual; @@ -2469,6 +2470,21 @@ implementation end; + procedure tcg.a_loadfpu_ref_ref(list: TAsmList; fromsize, tosize: tcgsize; const ref1,ref2: treference); + var + reg: tregister; + regsize: tcgsize; + begin + if (fromsize>=tosize) then + regsize:=fromsize + else + regsize:=tosize; + reg:=getfpuregister(list,regsize); + a_loadfpu_ref_reg(list,fromsize,regsize,ref1,reg); + a_loadfpu_reg_ref(list,regsize,tosize,reg,ref2); + end; + + procedure tcg.a_paramfpu_reg(list : TAsmList;size : tcgsize;const r : tregister;const cgpara : TCGPara); var ref : treference; diff --git a/compiler/ncgld.pas b/compiler/ncgld.pas index 627d20c9c8..f89d4120b2 100644 --- a/compiler/ncgld.pas +++ b/compiler/ncgld.pas @@ -692,27 +692,57 @@ implementation LOC_REFERENCE, LOC_CREFERENCE : begin -{$warning HACK: unaligned test, maybe remove all unaligned locations (array of char) from the compiler} - { Use unaligned copy when the offset is not aligned } - len:=left.resultdef.size; - if (right.location.reference.offset mod sizeof(aint)<>0) or - (left.location.reference.offset mod sizeof(aint)<>0) or - (right.resultdef.alignment0) and - (right.location.reference.alignment0) and - (left.location.reference.alignmentright.location.size) then + begin + cg.a_loadfpu_ref_ref(current_asmdata.CurrAsmList, + right.location.size,left.location.size, + right.location.reference,left.location.reference) + end else - cg.g_concatcopy(current_asmdata.CurrAsmList,right.location.reference,left.location.reference,len); + begin +{$warning HACK: unaligned test, maybe remove all unaligned locations (array of char) from the compiler} + { Use unaligned copy when the offset is not aligned } + len:=left.resultdef.size; + if (right.location.reference.offset mod sizeof(aint)<>0) or + (left.location.reference.offset mod sizeof(aint)<>0) or + (right.resultdef.alignment0) and + (right.location.reference.alignment0) and + (left.location.reference.alignment