* forgotten file in previous commit

git-svn-id: branches/avr@17107 -
This commit is contained in:
florian 2011-03-09 19:46:42 +00:00
parent c7e6d07ff0
commit d4ff3b2eb6

View File

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