* do not convert JMP into RJMP in assembler blocks, resolves issue #280208

git-svn-id: trunk@30936 -
This commit is contained in:
florian 2015-05-30 16:17:24 +00:00
parent 9f4333d20a
commit aadcf9f6bc

View File

@ -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;