mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-01 15:30:43 +02:00
+ allocate real registers properly in tcgavr
git-svn-id: trunk@38490 -
This commit is contained in:
parent
61660375ce
commit
ee252d0ecd
@ -1178,9 +1178,10 @@ unit cgcpu;
|
||||
conv_done: boolean;
|
||||
tmpreg : tregister;
|
||||
i : integer;
|
||||
QuickRef : Boolean;
|
||||
QuickRef,ungetcpuregister_z: Boolean;
|
||||
begin
|
||||
QuickRef:=false;
|
||||
ungetcpuregister_z:=false;
|
||||
|
||||
href:=Ref;
|
||||
{ ensure, href.base contains a valid register if there is any register used }
|
||||
@ -1197,16 +1198,22 @@ unit cgcpu;
|
||||
(href.symbol=nil) and
|
||||
(href.Index=NR_NO) and
|
||||
(href.Offset in [0..64-tcgsize2size[fromsize]])) then
|
||||
href:=normalize_ref(list,href,NR_R30)
|
||||
begin
|
||||
href:=normalize_ref(list,href,NR_R30);
|
||||
getcpuregister(list,NR_R30);
|
||||
getcpuregister(list,NR_R31);
|
||||
ungetcpuregister_z:=true;
|
||||
end
|
||||
else
|
||||
begin
|
||||
if (href.base<>NR_R28) and (href.base<>NR_R30) then
|
||||
begin
|
||||
maybegetcpuregister(list,NR_R30);
|
||||
getcpuregister(list,NR_R30);
|
||||
emit_mov(list,NR_R30,href.base);
|
||||
maybegetcpuregister(list,NR_R31);
|
||||
getcpuregister(list,NR_R31);
|
||||
emit_mov(list,NR_R31,GetNextReg(href.base));
|
||||
href.base:=NR_R30;
|
||||
ungetcpuregister_z:=true;
|
||||
end;
|
||||
QuickRef:=true;
|
||||
end;
|
||||
@ -1356,7 +1363,7 @@ unit cgcpu;
|
||||
end;
|
||||
end;
|
||||
|
||||
if not(QuickRef) then
|
||||
if not(QuickRef) or ungetcpuregister_z then
|
||||
begin
|
||||
ungetcpuregister(list,href.base);
|
||||
ungetcpuregister(list,GetNextReg(href.base));
|
||||
@ -1371,9 +1378,10 @@ unit cgcpu;
|
||||
conv_done: boolean;
|
||||
tmpreg : tregister;
|
||||
i : integer;
|
||||
QuickRef : boolean;
|
||||
QuickRef,ungetcpuregister_z: boolean;
|
||||
begin
|
||||
QuickRef:=false;
|
||||
ungetcpuregister_z:=false;
|
||||
|
||||
href:=Ref;
|
||||
{ ensure, href.base contains a valid register if there is any register used }
|
||||
@ -1390,16 +1398,22 @@ unit cgcpu;
|
||||
(href.symbol=nil) and
|
||||
(href.Index=NR_NO) and
|
||||
(href.Offset in [0..64-tcgsize2size[fromsize]])) then
|
||||
href:=normalize_ref(list,href,NR_R30)
|
||||
begin
|
||||
href:=normalize_ref(list,href,NR_R30);
|
||||
getcpuregister(list,NR_R30);
|
||||
getcpuregister(list,NR_R31);
|
||||
ungetcpuregister_z:=true;
|
||||
end
|
||||
else
|
||||
begin
|
||||
if (href.base<>NR_R28) and (href.base<>NR_R30) then
|
||||
begin
|
||||
maybegetcpuregister(list,NR_R30);
|
||||
getcpuregister(list,NR_R30);
|
||||
emit_mov(list,NR_R30,href.base);
|
||||
maybegetcpuregister(list,NR_R31);
|
||||
getcpuregister(list,NR_R31);
|
||||
emit_mov(list,NR_R31,GetNextReg(href.base));
|
||||
href.base:=NR_R30;
|
||||
ungetcpuregister_z:=true;
|
||||
end;
|
||||
QuickRef:=true;
|
||||
end;
|
||||
@ -1512,7 +1526,7 @@ unit cgcpu;
|
||||
end;
|
||||
end;
|
||||
|
||||
if not(QuickRef) then
|
||||
if ungetcpuregister_z then
|
||||
begin
|
||||
ungetcpuregister(list,href.base);
|
||||
ungetcpuregister(list,GetNextReg(href.base));
|
||||
@ -1908,14 +1922,18 @@ unit cgcpu;
|
||||
list.concat(taicpu.op_reg(A_PUSH,newreg(R_INTREGISTER,reg,R_SUBWHOLE)));
|
||||
|
||||
{ Save SREG }
|
||||
cg.getcpuregister(list,NR_R0);
|
||||
list.concat(taicpu.op_reg_const(A_IN, NR_R0, $3F));
|
||||
list.concat(taicpu.op_reg(A_PUSH, NR_R0));
|
||||
cg.ungetcpuregister(list,NR_R0);
|
||||
|
||||
list.concat(taicpu.op_reg(A_CLR,NR_R1));
|
||||
|
||||
if current_procinfo.framepointer<>NR_NO then
|
||||
begin
|
||||
cg.getcpuregister(list,NR_R28);
|
||||
list.concat(taicpu.op_reg_const(A_IN,NR_R28,NIO_SP_LO));
|
||||
cg.getcpuregister(list,NR_R29);
|
||||
list.concat(taicpu.op_reg_const(A_IN,NR_R29,NIO_SP_HI));
|
||||
a_adjust_sp(list,-localsize);
|
||||
end;
|
||||
@ -1948,7 +1966,9 @@ unit cgcpu;
|
||||
|
||||
if current_procinfo.framepointer<>NR_NO then
|
||||
begin
|
||||
cg.getcpuregister(list,NR_R28);
|
||||
list.concat(taicpu.op_reg_const(A_IN,NR_R28,NIO_SP_LO));
|
||||
cg.getcpuregister(list,NR_R29);
|
||||
list.concat(taicpu.op_reg_const(A_IN,NR_R29,NIO_SP_HI));
|
||||
a_adjust_sp(list,-localsize);
|
||||
end;
|
||||
@ -1985,8 +2005,10 @@ unit cgcpu;
|
||||
{ Reload SREG }
|
||||
regs:=regs+[RS_R0];
|
||||
|
||||
cg.getcpuregister(list,NR_R0);
|
||||
list.concat(taicpu.op_reg(A_POP, NR_R0));
|
||||
list.concat(taicpu.op_const_reg(A_OUT, $3F, NR_R0));
|
||||
cg.ungetcpuregister(list,NR_R0);
|
||||
|
||||
for reg:=RS_R0 to RS_R31 do
|
||||
if reg in regs then
|
||||
@ -2129,6 +2151,8 @@ unit cgcpu;
|
||||
internalerror(2011022007);
|
||||
countreg:=getintregister(list,countregsize);
|
||||
a_load_const_reg(list,countregsize,len,countreg);
|
||||
cg.getcpuregister(list,NR_R30);
|
||||
cg.getcpuregister(list,NR_R31);
|
||||
a_loadaddr_ref_reg(list,source,NR_R30);
|
||||
|
||||
{ only base or index register in dest? }
|
||||
@ -2154,13 +2178,21 @@ unit cgcpu;
|
||||
}
|
||||
list.concat(taicpu.op_reg(A_PUSH,tmpreg));
|
||||
list.concat(taicpu.op_reg(A_PUSH,GetNextReg(tmpreg)));
|
||||
cg.getcpuregister(list,NR_R27);
|
||||
list.concat(taicpu.op_reg(A_POP,NR_R27));
|
||||
cg.getcpuregister(list,NR_R26);
|
||||
list.concat(taicpu.op_reg(A_POP,NR_R26));
|
||||
cg.a_label(list,l);
|
||||
cg.getcpuregister(list,NR_R0);
|
||||
list.concat(taicpu.op_reg_ref(GetLoad(srcref),NR_R0,srcref));
|
||||
list.concat(taicpu.op_ref_reg(GetStore(dstref),dstref,NR_R0));
|
||||
cg.ungetcpuregister(list,NR_R0);
|
||||
list.concat(taicpu.op_reg(A_DEC,countreg));
|
||||
a_jmp_flags(list,F_NE,l);
|
||||
cg.ungetcpuregister(list,NR_R26);
|
||||
cg.ungetcpuregister(list,NR_R27);
|
||||
cg.ungetcpuregister(list,NR_R30);
|
||||
cg.ungetcpuregister(list,NR_R31);
|
||||
// keep registers alive
|
||||
list.concat(taicpu.op_reg_reg(A_MOV,countreg,countreg));
|
||||
end
|
||||
@ -2175,7 +2207,11 @@ unit cgcpu;
|
||||
(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,NR_R30)
|
||||
begin
|
||||
cg.getcpuregister(list,NR_R30);
|
||||
cg.getcpuregister(list,NR_R31);
|
||||
srcref:=normalize_ref(list,source,NR_R30)
|
||||
end
|
||||
else
|
||||
begin
|
||||
SrcQuickRef:=true;
|
||||
@ -2214,12 +2250,18 @@ unit cgcpu;
|
||||
}
|
||||
list.concat(taicpu.op_reg(A_PUSH,tmpreg));
|
||||
list.concat(taicpu.op_reg(A_PUSH,GetNextReg(tmpreg)));
|
||||
cg.getcpuregister(list,NR_R27);
|
||||
list.concat(taicpu.op_reg(A_POP,NR_R27));
|
||||
cg.getcpuregister(list,NR_R26);
|
||||
list.concat(taicpu.op_reg(A_POP,NR_R26));
|
||||
dstref.base:=NR_R26;
|
||||
end
|
||||
else
|
||||
dstref:=normalize_ref(list,dest,NR_R30);
|
||||
begin
|
||||
cg.getcpuregister(list,NR_R30);
|
||||
cg.getcpuregister(list,NR_R31);
|
||||
dstref:=normalize_ref(list,dest,NR_R30);
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -2239,8 +2281,10 @@ unit cgcpu;
|
||||
else
|
||||
dstref.addressmode:=AM_UNCHANGED;
|
||||
|
||||
cg.getcpuregister(list,NR_R0);
|
||||
list.concat(taicpu.op_reg_ref(GetLoad(srcref),NR_R0,srcref));
|
||||
list.concat(taicpu.op_ref_reg(GetStore(dstref),dstref,NR_R0));
|
||||
cg.ungetcpuregister(list,NR_R0);
|
||||
|
||||
if SrcQuickRef then
|
||||
inc(srcref.offset);
|
||||
@ -2252,6 +2296,11 @@ unit cgcpu;
|
||||
ungetcpuregister(list,srcref.base);
|
||||
ungetcpuregister(list,TRegister(ord(srcref.base)+1));
|
||||
end;
|
||||
if not(DestQuickRef) then
|
||||
begin
|
||||
ungetcpuregister(list,dstref.base);
|
||||
ungetcpuregister(list,TRegister(ord(dstref.base)+1));
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user