* safe an loadaddr for simple references when generating unaligned accesses

git-svn-id: trunk@6308 -
This commit is contained in:
florian 2007-02-02 22:43:30 +00:00
parent 986a73c12c
commit d0b34fef46

View File

@ -852,10 +852,19 @@ unit cgcpu;
begin begin
case FromSize of case FromSize of
OS_16,OS_S16: OS_16,OS_S16:
begin
{ only complicated references need an extra loadaddr }
if assigned(ref.symbol) or
(ref.offset<-4095) or
(ref.offset>4094) then
begin begin
tmpreg3:=getintregister(list,OS_INT); tmpreg3:=getintregister(list,OS_INT);
a_loadaddr_ref_reg(list,ref,tmpreg3); a_loadaddr_ref_reg(list,ref,tmpreg3);
reference_reset_base(usedtmpref,tmpreg3,0); reference_reset_base(usedtmpref,tmpreg3,0);
end
else
usedtmpref:=ref;
shifterop_reset(so);so.shiftmode:=SM_LSL;so.shiftimm:=8; shifterop_reset(so);so.shiftmode:=SM_LSL;so.shiftimm:=8;
tmpreg:=getintregister(list,OS_INT); tmpreg:=getintregister(list,OS_INT);
a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg); a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);
@ -871,10 +880,20 @@ unit cgcpu;
begin begin
tmpreg:=getintregister(list,OS_INT); tmpreg:=getintregister(list,OS_INT);
tmpreg2:=getintregister(list,OS_INT); tmpreg2:=getintregister(list,OS_INT);
{ only complicated references need an extra loadaddr }
if assigned(ref.symbol) or
(ref.offset<-4095) or
(ref.offset>4092) then
begin
tmpreg3:=getintregister(list,OS_INT); tmpreg3:=getintregister(list,OS_INT);
shifterop_reset(so);so.shiftmode:=SM_LSL;so.shiftimm:=8;
a_loadaddr_ref_reg(list,ref,tmpreg3); a_loadaddr_ref_reg(list,ref,tmpreg3);
reference_reset_base(usedtmpref,tmpreg3,0); reference_reset_base(usedtmpref,tmpreg3,0);
end
else
usedtmpref:=ref;
shifterop_reset(so);so.shiftmode:=SM_LSL;so.shiftimm:=8;
a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,reg); a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,reg);
inc(usedtmpref.offset); inc(usedtmpref.offset);
a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg); a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);