* Removed usage of edi in a lot of places when new register allocator used

+ Added newra versions of g_concatcopy and secondadd_float
This commit is contained in:
daniel 2003-04-23 09:51:16 +00:00
parent 4cf63d5b32
commit 7677b18770
3 changed files with 144 additions and 4 deletions

View File

@ -229,9 +229,13 @@ interface
begin
if extra_not then
emit_reg(A_NOT,opsize,left.location.register);
{$ifdef newra}
r:=rg.getregisterint(exprasmlist,OS_INT);
{$else}
r.enum:=R_INTREGISTER;
r.number:=NR_EDI;
rg.getexplicitregisterint(exprasmlist,NR_EDI);
{$endif}
cg.a_load_loc_reg(exprasmlist,right.location,r);
emit_reg_reg(op,opsize,left.location.register,r);
emit_reg_reg(A_MOV,opsize,r,left.location.register);
@ -275,9 +279,13 @@ interface
begin
if extra_not then
begin
{$ifdef newra}
r:=rg.getregisterint(exprasmlist,OS_INT);
{$else}
rg.getexplicitregisterint(exprasmlist,NR_EDI);
r.enum:=R_INTREGISTER;
r.number:=NR_EDI;
{$endif}
cg.a_load_loc_reg(exprasmlist,right.location,r);
emit_reg(A_NOT,S_L,r);
emit_reg_reg(A_AND,S_L,r,left.location.register);
@ -680,6 +688,9 @@ interface
{ on comparison load flags }
if cmpop then
begin
{$ifdef newra}
r:=rg.getexplicitregisterint(exprasmlist,NR_AX);
{$else}
if not(RS_EAX in rg.unusedregsint) then
begin
rg.getexplicitregisterint(exprasmlist,NR_EDI);
@ -691,8 +702,12 @@ interface
end;
r.enum:=R_INTREGISTER;
r.number:=NR_AX;
{$endif}
emit_reg(A_FNSTSW,S_NO,r);
emit_none(A_SAHF,S_NO);
{$ifdef newra}
rg.ungetregisterint(exprasmlist,r);
{$else}
if not(RS_EAX in rg.unusedregsint) then
begin
r.enum:=R_INTREGISTER;
@ -702,6 +717,7 @@ interface
emit_reg_reg(A_MOV,S_L,r2,r);
rg.ungetregisterint(exprasmlist,r2);
end;
{$endif}
if nf_swaped in flags then
begin
case nodetype of
@ -1653,7 +1669,11 @@ begin
end.
{
$Log$
Revision 1.63 2003-04-22 23:50:23 peter
Revision 1.64 2003-04-23 09:51:16 daniel
* Removed usage of edi in a lot of places when new register allocator used
+ Added newra versions of g_concatcopy and secondadd_float
Revision 1.63 2003/04/22 23:50:23 peter
* firstpass uses expectloc
* checks if there are differences between the expectloc and
location.loc from secondpass in EXTDEBUG

View File

@ -247,7 +247,11 @@ implementation
else
begin
{ load the value in a register }
{$ifdef newra}
pleftreg:=rg.getregisterint(exprasmlist,OS_INT);
{$else}
pleftreg := rg.getexplicitregisterint(exprasmlist,NR_EDI);
{$endif}
opsize := S_L;
emit_ref_reg(A_MOVZX,S_BL,left.location.reference,pleftreg);
end;
@ -527,7 +531,11 @@ implementation
pleftreg.number:=(left.location.register.number and not $ff) or R_SUBWHOLE;
end
else
{$ifdef newra}
pleftreg:=rg.getregisterint(exprasmlist,OS_INT);
{$else}
pleftreg:=rg.getexplicitregisterint(exprasmlist,NR_EDI);
{$endif}
cg.a_load_loc_reg(exprasmlist,left.location,pleftreg);
location_freetemp(exprasmlist,left.location);
location_release(exprasmlist,left.location);
@ -718,7 +726,11 @@ begin
end.
{
$Log$
Revision 1.54 2003-04-22 23:50:23 peter
Revision 1.55 2003-04-23 09:51:16 daniel
* Removed usage of edi in a lot of places when new register allocator used
+ Added newra versions of g_concatcopy and secondadd_float
Revision 1.54 2003/04/22 23:50:23 peter
* firstpass uses expectloc
* checks if there are differences between the expectloc and
location.loc from secondpass in EXTDEBUG

View File

@ -1158,6 +1158,110 @@ unit cgx86;
{ ************* concatcopy ************ }
{$ifdef newra}
procedure Tcgx86.g_concatcopy(list:Taasmoutput;const source,dest:Treference;
len:aword;delsource,loadref:boolean);
var srcref,dstref:Treference;
srcreg,destreg,countreg,r:Tregister;
helpsize:aword;
copysize:byte;
cgsize:Tcgsize;
begin
helpsize:=12;
if cs_littlesize in aktglobalswitches then
helpsize:=8;
if not loadref and (len<=helpsize) then
begin
dstref:=dest;
srcref:=source;
copysize:=4;
cgsize:=OS_32;
while len<>0 do
begin
dec(len,copysize);
r:=rg.getregisterint(list,cgsize);
a_load_ref_reg(list,cgsize,srcref,r);
if (len=0) and delsource then
reference_release(list,source);
a_load_reg_ref(list,cgsize,r,dstref);
inc(srcref.offset,copysize);
inc(dstref.offset,copysize);
rg.ungetregisterint(list,r);
if copysize<2 then
begin
copysize:=1;
cgsize:=OS_8;
end
else if copysize<4 then
begin
copysize:=2;
cgsize:=OS_16;
end;
end;
end
else
begin
destreg:=rg.getexplicitregisterint(list,NR_EDI);
a_loadaddr_ref_reg(list,dest,destreg);
srcreg:=rg.getexplicitregisterint(list,NR_ESI);
if loadref then
a_load_ref_reg(list,OS_ADDR,source,srcreg)
else
begin
a_loadaddr_ref_reg(list,source,srcreg);
if delsource then
begin
srcref:=source;
{ Don't release ESI register yet, it's needed
by the movsl }
if (srcref.base.number=NR_ESI) then
srcref.base.number:=NR_NO
else if (srcref.index.number=NR_ESI) then
srcref.index.number:=NR_NO;
reference_release(list,srcref);
end;
end;
countreg:=rg.getexplicitregisterint(list,NR_ECX);
list.concat(Taicpu.op_none(A_CLD,S_NO));
if cs_littlesize in aktglobalswitches then
begin
a_load_const_reg(list,OS_INT,len,countreg);
list.concat(Taicpu.op_none(A_REP,S_NO));
list.concat(Taicpu.op_none(A_MOVSB,S_NO));
end
else
begin
helpsize:=len shr 2;
len:=len and 3;
if helpsize>1 then
begin
a_load_const_reg(list,OS_INT,helpsize,countreg);
list.concat(Taicpu.op_none(A_REP,S_NO));
end;
if helpsize>0 then
list.concat(Taicpu.op_none(A_MOVSD,S_NO));
if len>1 then
begin
dec(len,2);
list.concat(Taicpu.op_none(A_MOVSW,S_NO));
end;
if len=1 then
list.concat(Taicpu.op_none(A_MOVSB,S_NO));
end;
rg.ungetregisterint(list,countreg);
rg.ungetregisterint(list,srcreg);
rg.ungetregisterint(list,destreg);
end;
if delsource then
tg.ungetiftemp(list,source);
end;
{$else newra}
procedure tcgx86.g_concatcopy(list : taasmoutput;const source,dest : treference;len : aword; delsource,loadref : boolean);
var
ecxpushed,esipushed : boolean;
@ -1360,7 +1464,7 @@ unit cgx86;
tg.ungetiftemp(list,source);
end;
{$endif newra}
procedure tcgx86.g_exception_reason_save(list : taasmoutput; const href : treference);
@ -1834,7 +1938,11 @@ unit cgx86;
end.
{
$Log$
Revision 1.40 2003-04-22 13:47:08 peter
Revision 1.41 2003-04-23 09:51:16 daniel
* Removed usage of edi in a lot of places when new register allocator used
+ Added newra versions of g_concatcopy and secondadd_float
Revision 1.40 2003/04/22 13:47:08 peter
* fixed C style array of const
* fixed C array passing
* fixed left to right with high parameters