mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-19 05:29:18 +02:00
Fix some small bugs in the Thumb assembler.
git-svn-id: trunk@32785 -
This commit is contained in:
parent
4c4da73506
commit
4b0f4cf86a
@ -1416,6 +1416,32 @@ implementation
|
||||
ait_instruction:
|
||||
begin
|
||||
case taicpu(curtai).opcode of
|
||||
A_STM:
|
||||
begin
|
||||
if (taicpu(curtai).ops=2) and
|
||||
(taicpu(curtai).oper[0]^.typ=top_ref) and
|
||||
(taicpu(curtai).oper[0]^.ref^.index=NR_STACK_POINTER_REG) and
|
||||
(taicpu(curtai).oper[0]^.ref^.addressmode=AM_PREINDEXED) then
|
||||
begin
|
||||
taicpu(curtai).loadregset(0, taicpu(curtai).oper[1]^.regtyp, taicpu(curtai).oper[1]^.subreg, taicpu(curtai).oper[1]^.regset^);
|
||||
taicpu(curtai).ops:=1;
|
||||
taicpu(curtai).opcode:=A_PUSH;
|
||||
end;
|
||||
end;
|
||||
|
||||
A_LDM:
|
||||
begin
|
||||
if (taicpu(curtai).ops=2) and
|
||||
(taicpu(curtai).oper[0]^.typ=top_ref) and
|
||||
(taicpu(curtai).oper[0]^.ref^.index=NR_STACK_POINTER_REG) and
|
||||
(taicpu(curtai).oper[0]^.ref^.addressmode=AM_PREINDEXED) then
|
||||
begin
|
||||
taicpu(curtai).loadregset(0, taicpu(curtai).oper[1]^.regtyp, taicpu(curtai).oper[1]^.subreg, taicpu(curtai).oper[1]^.regset^);
|
||||
taicpu(curtai).ops:=1;
|
||||
taicpu(curtai).opcode:=A_POP;
|
||||
end;
|
||||
end;
|
||||
|
||||
A_ADD,
|
||||
A_AND,A_EOR,A_ORR,A_BIC,
|
||||
A_LSL,A_LSR,A_ASR,A_ROR,
|
||||
@ -4487,11 +4513,9 @@ implementation
|
||||
bytes:=bytes or (ord(insentry^.code[1]) shl 8);
|
||||
bytes:=bytes or ord(insentry^.code[2]);
|
||||
|
||||
|
||||
case opcode of
|
||||
A_SUB:
|
||||
begin
|
||||
bytes:=bytes or (getsupreg(oper[0]^.reg) and $7);
|
||||
if (ops=3) and
|
||||
(oper[2]^.typ=top_const) then
|
||||
bytes:=bytes or ((oper[2]^.val shr 2) and $7F)
|
||||
@ -4651,7 +4675,7 @@ implementation
|
||||
bytes:=bytes or (1 shl r);
|
||||
|
||||
if oper[0]^.typ=top_ref then
|
||||
bytes:=bytes or (getsupreg(oper[0]^.ref^.base) shl 8)
|
||||
bytes:=bytes or (getsupreg(oper[0]^.ref^.index) shl 8)
|
||||
else
|
||||
bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8);
|
||||
end;
|
||||
@ -4662,7 +4686,7 @@ implementation
|
||||
bytes:=bytes or (1 shl r);
|
||||
|
||||
if oper[0]^.typ=top_ref then
|
||||
bytes:=bytes or (getsupreg(oper[0]^.ref^.base) shl 8)
|
||||
bytes:=bytes or (getsupreg(oper[0]^.ref^.index) shl 8)
|
||||
else
|
||||
bytes:=bytes or (getsupreg(oper[0]^.reg) shl 8);
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user