mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 13:39:26 +02:00
Merged revision(s) 40585-40586 from trunk:
* ARM: Remove preindexing and postindexing for LDR in some cases when removing superfluous MOVs. It fixes crash when calling Format() if rtl is compiled with -O3. ........ * Improved the comment. ........ git-svn-id: branches/fixes_3_2@40588 -
This commit is contained in:
parent
7b77856515
commit
71d9269b25
@ -433,6 +433,19 @@ Implementation
|
|||||||
|
|
||||||
{ finally get rid of the mov }
|
{ finally get rid of the mov }
|
||||||
taicpu(p).loadreg(0,taicpu(movp).oper[0]^.reg);
|
taicpu(p).loadreg(0,taicpu(movp).oper[0]^.reg);
|
||||||
|
{ Remove preindexing and postindexing for LDR in some cases.
|
||||||
|
For example:
|
||||||
|
ldr reg2,[reg1, xxx]!
|
||||||
|
mov reg1,reg2
|
||||||
|
must be translated to:
|
||||||
|
ldr reg1,[reg1, xxx]
|
||||||
|
|
||||||
|
Preindexing must be removed there, since the same register is used as the base and as the target.
|
||||||
|
Such case is not allowed for ARM CPU and produces crash. }
|
||||||
|
if (taicpu(p).opcode = A_LDR) and (taicpu(p).oper[1]^.typ = top_ref)
|
||||||
|
and (taicpu(movp).oper[0]^.reg = taicpu(p).oper[1]^.ref^.base)
|
||||||
|
then
|
||||||
|
taicpu(p).oper[1]^.ref^.addressmode:=AM_OFFSET;
|
||||||
asml.remove(movp);
|
asml.remove(movp);
|
||||||
movp.free;
|
movp.free;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user