* AVR: for avr1 lds/sts must be converted to in/out as well if possible

git-svn-id: trunk@44138 -
(cherry picked from commit 84cfa8d9b0)
This commit is contained in:
florian 2020-02-09 13:55:25 +00:00
parent a589637b1d
commit 438c971460

View File

@ -508,33 +508,61 @@ implementation
end;
A_STS:
begin
if current_settings.cputype=cpu_avr1 then
begin
remove_instruction;
result:=false;
end
else if current_settings.cputype=cpu_avrtiny then
with taicpu(curtai).oper[0]^ do
if (ref^.base=NR_NO) and (ref^.index=NR_NO) and (ref^.symbol=nil) and (ref^.offset<$40) then
begin
taicpu(curtai).opcode:=A_OUT;
taicpu(curtai).loadconst(0,ref^.offset);
end;
{ certain cpu types do not support some instructions, so replace them }
case current_settings.cputype of
cpu_avr1:
begin
with taicpu(curtai).oper[0]^ do
if (ref^.base=NR_NO) and (ref^.index=NR_NO) and (ref^.symbol=nil) and (ref^.offset<$40) then
begin
taicpu(curtai).opcode:=A_OUT;
taicpu(curtai).loadconst(0,ref^.offset);
end
else
begin
remove_instruction;
result:=false;
end;
end;
cpu_avrtiny:
begin
with taicpu(curtai).oper[0]^ do
if (ref^.base=NR_NO) and (ref^.index=NR_NO) and (ref^.symbol=nil) and (ref^.offset<$40) then
begin
taicpu(curtai).opcode:=A_OUT;
taicpu(curtai).loadconst(0,ref^.offset);
end;
end;
end;
end;
A_LDS:
begin
if current_settings.cputype=cpu_avr1 then
begin
remove_instruction;
result:=false;
end
else if current_settings.cputype=cpu_avrtiny then
with taicpu(curtai).oper[1]^ do
if (ref^.base=NR_NO) and (ref^.index=NR_NO) and (ref^.symbol=nil) and (ref^.offset<$40) then
begin
taicpu(curtai).opcode:=A_IN;
taicpu(curtai).loadconst(1,ref^.offset)
end;
{ certain cpu types do not support some instructions, so replace them }
case current_settings.cputype of
cpu_avr1:
begin
with taicpu(curtai).oper[1]^ do
if (ref^.base=NR_NO) and (ref^.index=NR_NO) and (ref^.symbol=nil) and (ref^.offset<$40) then
begin
taicpu(curtai).opcode:=A_IN;
taicpu(curtai).loadconst(1,ref^.offset)
end
else
begin
remove_instruction;
result:=false;
end;
end;
cpu_avrtiny:
begin
with taicpu(curtai).oper[1]^ do
if (ref^.base=NR_NO) and (ref^.index=NR_NO) and (ref^.symbol=nil) and (ref^.offset<$40) then
begin
taicpu(curtai).opcode:=A_IN;
taicpu(curtai).loadconst(1,ref^.offset)
end;
end;
end;
end;
A_SBIW,
A_MULS,
@ -548,6 +576,7 @@ implementation
A_POP,
A_PUSH:
begin
{ certain cpu types do not support some instructions, so replace them }
if current_settings.cputype=cpu_avr1 then
begin
remove_instruction;