mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-08 22:49:50 +01:00
* safe an loadaddr for simple references when generating unaligned accesses
git-svn-id: trunk@6308 -
This commit is contained in:
parent
986a73c12c
commit
d0b34fef46
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user