mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 14:09:17 +02:00
* do not convert JMP into RJMP in assembler blocks, resolves issue #280208
git-svn-id: trunk@30936 -
This commit is contained in:
parent
9f4333d20a
commit
aadcf9f6bc
@ -402,6 +402,7 @@ implementation
|
|||||||
curtai : tai;
|
curtai : tai;
|
||||||
again : boolean;
|
again : boolean;
|
||||||
l : tasmlabel;
|
l : tasmlabel;
|
||||||
|
inasmblock : Boolean;
|
||||||
begin
|
begin
|
||||||
again:=true;
|
again:=true;
|
||||||
while again do
|
while again do
|
||||||
@ -436,31 +437,41 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
curtai:=tai(list.first);
|
curtai:=tai(list.first);
|
||||||
|
inasmblock:=false;
|
||||||
while assigned(curtai) do
|
while assigned(curtai) do
|
||||||
begin
|
begin
|
||||||
if (curtai.typ=ait_instruction) and
|
case curtai.typ of
|
||||||
(taicpu(curtai).opcode in [A_BRxx]) and
|
ait_instruction:
|
||||||
((taicpu(curtai).InsOffset-taicpu(curtai).oper[0]^.ref^.symbol.offset>64) or
|
case taicpu(curtai).opcode of
|
||||||
(taicpu(curtai).InsOffset-taicpu(curtai).oper[0]^.ref^.symbol.offset<-63)
|
A_BRxx:
|
||||||
) then
|
if (taicpu(curtai).InsOffset-taicpu(curtai).oper[0]^.ref^.symbol.offset>64) or
|
||||||
begin
|
(taicpu(curtai).InsOffset-taicpu(curtai).oper[0]^.ref^.symbol.offset<-63) then
|
||||||
current_asmdata.getjumplabel(l);
|
begin
|
||||||
list.insertafter(tai_label.create(l),curtai);
|
current_asmdata.getjumplabel(l);
|
||||||
list.insertafter(taicpu.op_sym(A_JMP,taicpu(curtai).oper[0]^.ref^.symbol),curtai);
|
list.insertafter(tai_label.create(l),curtai);
|
||||||
taicpu(curtai).oper[0]^.ref^.symbol:=l;
|
list.insertafter(taicpu.op_sym(A_JMP,taicpu(curtai).oper[0]^.ref^.symbol),curtai);
|
||||||
taicpu(curtai).condition:=inverse_cond(taicpu(curtai).condition);
|
taicpu(curtai).oper[0]^.ref^.symbol:=l;
|
||||||
again:=true;
|
taicpu(curtai).condition:=inverse_cond(taicpu(curtai).condition);
|
||||||
end
|
again:=true;
|
||||||
{ replace JMP by RJMP? }
|
end;
|
||||||
else if (curtai.typ=ait_instruction) and
|
A_JMP:
|
||||||
(taicpu(curtai).opcode=A_JMP) and
|
{ replace JMP by RJMP? ...
|
||||||
(taicpu(curtai).InsOffset-taicpu(curtai).oper[0]^.ref^.symbol.offset<=2048) and
|
... but do not mess with asm block }
|
||||||
(taicpu(curtai).InsOffset-taicpu(curtai).oper[0]^.ref^.symbol.offset>=-2047) then
|
if not(inasmblock) and (taicpu(curtai).InsOffset-taicpu(curtai).oper[0]^.ref^.symbol.offset<=2048) and
|
||||||
begin
|
(taicpu(curtai).InsOffset-taicpu(curtai).oper[0]^.ref^.symbol.offset>=-2047) then
|
||||||
taicpu(curtai).opcode:=A_RJMP;
|
begin
|
||||||
again:=true;
|
taicpu(curtai).opcode:=A_RJMP;
|
||||||
end;
|
again:=true;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
ait_marker:
|
||||||
|
case tai_marker(curtai).Kind of
|
||||||
|
mark_AsmBlockStart:
|
||||||
|
inasmblock:=true;
|
||||||
|
mark_AsmBlockEnd:
|
||||||
|
inasmblock:=false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
curtai:=tai(curtai.next);
|
curtai:=tai(curtai.next);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user