mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2026-01-04 15:00:53 +01:00
* forgotten file in previous commit
git-svn-id: branches/avr@17107 -
This commit is contained in:
parent
c7e6d07ff0
commit
d4ff3b2eb6
@ -552,15 +552,15 @@ unit cgcpu;
|
||||
end;
|
||||
if assigned(ref.symbol) or (ref.offset<>0) then
|
||||
begin
|
||||
getcpuregister(list,NR_R30);
|
||||
getcpuregister(list,NR_R31);
|
||||
tmpreg:=NR_R30;
|
||||
reference_reset(tmpref,0);
|
||||
tmpref.symbol:=ref.symbol;
|
||||
tmpref.offset:=ref.offset;
|
||||
tmpref.refaddr:=addr_lo8;
|
||||
getcpuregister(list,tmpreg);
|
||||
list.concat(taicpu.op_reg_ref(A_LDI,tmpreg,tmpref));
|
||||
tmpref.refaddr:=addr_hi8;
|
||||
getcpuregister(list,GetNextReg(tmpreg));
|
||||
list.concat(taicpu.op_reg_ref(A_LDI,GetNextReg(tmpreg),tmpref));
|
||||
if (ref.base<>NR_NO) then
|
||||
begin
|
||||
@ -579,10 +579,10 @@ unit cgcpu;
|
||||
end
|
||||
else if (ref.base<>NR_NO) and (ref.index<>NR_NO) then
|
||||
begin
|
||||
getcpuregister(list,NR_R30);
|
||||
getcpuregister(list,NR_R31);
|
||||
tmpreg:=NR_R30;
|
||||
getcpuregister(list,tmpreg);
|
||||
emit_mov(list,tmpreg,ref.index);
|
||||
getcpuregister(list,GetNextReg(tmpreg));
|
||||
emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.index));
|
||||
list.concat(taicpu.op_reg_reg(A_ADD,tmpreg,ref.base));
|
||||
list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(tmpreg),GetNextReg(ref.base)));
|
||||
@ -591,20 +591,20 @@ unit cgcpu;
|
||||
end
|
||||
else if (ref.base<>NR_NO) then
|
||||
begin
|
||||
getcpuregister(list,NR_R30);
|
||||
getcpuregister(list,NR_R31);
|
||||
tmpreg:=NR_R30;
|
||||
getcpuregister(list,tmpreg);
|
||||
emit_mov(list,tmpreg,ref.base);
|
||||
getcpuregister(list,GetNextReg(tmpreg));
|
||||
emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.base));
|
||||
ref.base:=tmpreg;
|
||||
ref.index:=NR_NO;
|
||||
end
|
||||
else if (ref.index<>NR_NO) then
|
||||
begin
|
||||
getcpuregister(list,NR_R30);
|
||||
getcpuregister(list,NR_R31);
|
||||
tmpreg:=NR_R30;
|
||||
getcpuregister(list,tmpreg);
|
||||
emit_mov(list,tmpreg,ref.index);
|
||||
getcpuregister(list,GetNextReg(tmpreg));
|
||||
emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.index));
|
||||
ref.base:=tmpreg;
|
||||
ref.index:=NR_NO;
|
||||
@ -621,6 +621,7 @@ unit cgcpu;
|
||||
i : integer;
|
||||
QuickRef : Boolean;
|
||||
begin
|
||||
QuickRef:=false;
|
||||
if not((Ref.addressmode=AM_UNCHANGED) and
|
||||
(Ref.symbol=nil) and
|
||||
((Ref.base=NR_R28) or
|
||||
@ -774,6 +775,12 @@ unit cgcpu;
|
||||
reg:=GetNextReg(reg);
|
||||
end;
|
||||
end;
|
||||
|
||||
if not(QuickRef) then
|
||||
begin
|
||||
ungetcpuregister(list,href.base);
|
||||
ungetcpuregister(list,GetNextReg(href.base));
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
@ -786,6 +793,7 @@ unit cgcpu;
|
||||
i : integer;
|
||||
QuickRef : boolean;
|
||||
begin
|
||||
QuickRef:=false;
|
||||
if not((Ref.addressmode=AM_UNCHANGED) and
|
||||
(Ref.symbol=nil) and
|
||||
((Ref.base=NR_R28) or
|
||||
@ -902,6 +910,12 @@ unit cgcpu;
|
||||
reg:=GetNextReg(reg);
|
||||
end;
|
||||
end;
|
||||
|
||||
if not(QuickRef) then
|
||||
begin
|
||||
ungetcpuregister(list,href.base);
|
||||
ungetcpuregister(list,GetNextReg(href.base));
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
@ -1250,6 +1264,7 @@ unit cgcpu;
|
||||
copysize,countregsize : tcgsize;
|
||||
l : TAsmLabel;
|
||||
i : longint;
|
||||
SrcQuickRef, DestQuickRef : Boolean;
|
||||
begin
|
||||
if len>16 then
|
||||
begin
|
||||
@ -1294,29 +1309,63 @@ unit cgcpu;
|
||||
end
|
||||
else
|
||||
begin
|
||||
SrcQuickRef:=false;
|
||||
DestQuickRef:=false;
|
||||
if not((source.addressmode=AM_UNCHANGED) and
|
||||
(source.symbol=nil) and
|
||||
((source.base=NR_R28) or
|
||||
(source.base=NR_R29)) and
|
||||
(source.Index=NR_No) and
|
||||
(source.Offset in [0..64-len])) and
|
||||
not((source.Base=NR_NO) and (source.Index=NR_NO)) then
|
||||
srcref:=normalize_ref(list,source)
|
||||
else
|
||||
begin
|
||||
SrcQuickRef:=true;
|
||||
srcref:=source;
|
||||
end;
|
||||
|
||||
if not((dest.addressmode=AM_UNCHANGED) and
|
||||
(dest.symbol=nil) and
|
||||
((dest.base=NR_R28) or
|
||||
(dest.base=NR_R29)) and
|
||||
(dest.Index=NR_No) and
|
||||
(dest.Offset in [0..64-len])) and
|
||||
not((dest.Base=NR_NO) and (dest.Index=NR_NO)) then
|
||||
dstref:=normalize_ref(list,dest)
|
||||
else
|
||||
begin
|
||||
DestQuickRef:=true;
|
||||
dstref:=dest;
|
||||
end;
|
||||
|
||||
for i:=1 to len do
|
||||
begin
|
||||
srcref:=normalize_ref(list,source);
|
||||
dstref:=normalize_ref(list,source);
|
||||
copysize:=OS_8;
|
||||
tmpreg:=getintregister(list,copysize);
|
||||
if (srcref.base<>NR_NO) and (i<len) then
|
||||
|
||||
if not(SrcQuickRef) and (i<len) then
|
||||
srcref.addressmode:=AM_POSTINCREMENT
|
||||
else
|
||||
srcref.addressmode:=AM_UNCHANGED;
|
||||
if (dstref.base<>NR_NO) and (i<len) then
|
||||
|
||||
if not(DestQuickRef) and (i<len) then
|
||||
dstref.addressmode:=AM_POSTINCREMENT
|
||||
else
|
||||
dstref.addressmode:=AM_UNCHANGED;
|
||||
|
||||
list.concat(taicpu.op_reg_ref(GetLoad(srcref),tmpreg,srcref));
|
||||
list.concat(taicpu.op_ref_reg(GetStore(dstref),dstref,tmpreg));
|
||||
|
||||
if (dstref.offset<>0) or assigned(dstref.symbol) then
|
||||
inc(dstref.offset);
|
||||
if (srcref.offset<>0) or assigned(srcref.symbol) then
|
||||
inc(srcref.offset);
|
||||
list.concat(taicpu.op_reg_ref(GetLoad(srcref),tmpreg,srcref));
|
||||
list.concat(taicpu.op_ref_reg(GetStore(dstref),dstref,tmpreg));
|
||||
|
||||
if SrcQuickRef then
|
||||
inc(srcref.offset);
|
||||
if DestQuickRef then
|
||||
inc(dstref.offset);
|
||||
end;
|
||||
if not(SrcQuickRef) then
|
||||
begin
|
||||
ungetcpuregister(list,srcref.base);
|
||||
ungetcpuregister(list,GetNextReg(srcref.base));
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user