mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-03 11:30:25 +02:00
* 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:
parent
4cf63d5b32
commit
7677b18770
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user