* new cgflow based on n386flw with all nodes until forn "translated"

+ a_cmp_loc_*_label methods for tcg
  + base implementatino for a_cmp_ref_*_label methods
  * small bugfixes to powerpc cg
This commit is contained in:
Jonas Maebe 2001-09-05 20:21:03 +00:00
parent a39cd8a580
commit 3b4b673069
3 changed files with 923 additions and 375 deletions

File diff suppressed because it is too large Load Diff

View File

@ -129,12 +129,14 @@ unit cgobj;
procedure a_load_reg_reg(list : paasmoutput;size : tcgsize;reg1,reg2 : tregister);virtual;
{ comparison operations }
procedure a_cmp_reg_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
procedure a_cmp_const_reg_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
l : pasmlabel);virtual;
procedure a_cmp_reg_reg_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg1,reg2 : tregister;l : pasmlabel);
procedure a_cmp_reg_ref_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg : tregister;l : pasmlabel);
procedure a_cmp_ref_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
l : pasmlabel);
procedure a_cmp_reg_reg_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg1,reg2 : tregister;l : pasmlabel); virtual;
procedure a_cmp_reg_ref_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg : tregister; const ref: treference; l : pasmlabel); virtual;
procedure a_cmp_const_ref_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;const ref : treference;
l : pasmlabel); virtual;
procedure a_cmp_const_loc_label(list: paasmoutput; size: tcgsiwe;cmp_op: topcmp; const loc: tlocation;
l : pasmlabel); virtual;
procedure a_jmp_cond(list : paasmoutput;cond : TOpCmp;l: pasmlabel);
@ -1029,7 +1031,7 @@ unit cgobj;
a_call_name(list,'FPC_POPADDRSTACK',0);
a_reg_alloc(list,accumulator);
g_pop_exception_value_reg(list,accumulator);
a_cmp_reg_const_label(list,OS_32,OC_EQ,0,accumulator,noreraiselabel);
a_cmp_const_reg_label(list,OS_32,OC_EQ,0,accumulator,noreraiselabel);
a_reg_dealloc(list,accumulator);
{$IFDEF NEWST}
@ -1273,7 +1275,7 @@ unit cgobj;
abstract;
end;
procedure tcg.a_cmp_reg_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
procedure tcg.a_cmp_const_reg_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
l : pasmlabel);
begin
@ -1286,17 +1288,58 @@ unit cgobj;
abstract;
end;
procedure tcg.a_cmp_reg_ref_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg : tregister;l : pasmlabel);
procedure tcg.a_cmp_ref_reg_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp; const ref: treference; reg : tregister; l : pasmlabel);
var
tmpreg: tregister;
begin
abstract;
tmpreg := get_scratch_reg(list);
a_load_ref_reg(list,size,ref,tmpreg);
a_cmp_reg_reg_label(list,size,cmp_op,a,tmpreg,l);
free_scratch_reg(tmpreg);
end;
procedure tcg.a_cmp_ref_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
procedure tcg.a_cmp_const_ref_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;const ref : treference;
l : pasmlabel);
var
tmpreg: tregister;
begin
abstract;
tmpreg := get_scratch_reg(list);
a_load_ref_reg(list,size,ref,tmpreg);
a_cmp_const_reg_label(list,size,cmp_op,a,tmpreg,l);
free_scratch_reg(tmpreg);
end;
procedure tcg.a_cmp_const_loc_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;const loc : tlocation;
l : pasmlabel);
begin
case loc.loc of
LOC_REGISTER,LOC_CREGISTER:
!!!!!! 64bit locations -> two registers!!
a_cmp_const_reg_label(list,size,cmp_op,a,loc.register,l);
LOC_REFERENCE,LOC_MEM:
a_cmp_const_ref_label(list,size,cmp_op,a,loc.reference,l);
end;
end;
procedure tcg.a_cmp_ref_loc_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;const ref: treference;const loc : tlocation;
l : pasmlabel);
var
tmpreg: tregister;
begin
case loc.loc of
LOC_REGISTER,LOC_CREGISTER:
a_cmp_ref_reg_label(list,size,cmp_op,ref,loc.register,l);
LOC_REFERENCE,LOC_MEM:
begin
tmpreg := get_scratch_reg(list);
a_load_ref_reg(size,location.reference,tmpreg);
a_cmp_ref_reg(list,size,cmp_op,ref,tmpreg,l);
free_scratch_reg(list,tmpreg);
end;
end;
end;
procedure tcg.a_jmp_cond(list : paasmoutput;cond : TOpCmp;l: pasmlabel);
@ -1326,7 +1369,13 @@ unit cgobj;
end.
{
$Log$
Revision 1.2 2001-08-26 13:37:04 florian
Revision 1.3 2001-09-05 20:21:03 jonas
* new cgflow based on n386flw with all nodes until forn "translated"
+ a_cmp_loc_*_label methods for tcg
+ base implementatino for a_cmp_ref_*_label methods
* small bugfixes to powerpc cg
Revision 1.2 2001/08/26 13:37:04 florian
* some cg reorganisation
* some PPC updates

View File

@ -54,7 +54,7 @@ unit cgcpu;
procedure a_load_reg_reg(list : paasmoutput;size : tcgsize;reg1,reg2 : tregister);virtual;
{ comparison operations }
procedure a_cmp_reg_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
procedure a_cmp_const_reg_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
l : pasmlabel);virtual;
procedure a_cmp_reg_reg_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg1,reg2 : tregister;l : pasmlabel);
procedure a_jmp_cond(list : paasmoutput;cond : TOpCmp;l: pasmlabel);
@ -70,7 +70,7 @@ unit cgcpu;
procedure a_loadaddress_ref_reg(list : paasmoutput;const ref2 : treference;r : tregister);virtual;
procedure g_concatcopy(list : paasmoutput;const source,dest : treference;len : aword;loadref : boolean);virtual;
procedure g_concatcopy(list : paasmoutput;const source,dest : treference;len : aword; delsource,loadref : boolean);virtual;
private
@ -235,7 +235,8 @@ const
Begin
list^.concat(new(paicpu,op_reg_const(A_LI,reg,a and $ffff)));
If (a shr 16) <> 0 Then
list^.concat(new(paicpu,op_reg_const(A_ORIS,reg,a shr 16)))
list^.concat(new(paicpu,op_reg_const(A_ADDIS,reg,
(a shr 16)+ord(smallint(a and $ffff) < 0))))
End
Else
list^.concat(new(paicpu,op_reg_const(A_LIS,reg,a shr 16)));
@ -310,7 +311,7 @@ const
{*************** compare instructructions ****************}
procedure tcgppc.a_cmp_reg_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
procedure tcgppc.a_cmp_const_reg_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
l : pasmlabel);
var p: paicpu;
@ -329,8 +330,8 @@ const
list^.concat(new(paicpu,op_const_reg_reg(A_CMP,0,reg,scratch_register)));
free_scratch_reg(list,scratch_register);
end
else
if (a <= $ffff) then
else
if (a <= $ffff) then
list^.concat(new(paicpu,op_const_reg_const(A_CMPLI,0,reg,a)))
else
begin
@ -594,7 +595,7 @@ const
{ ************* concatcopy ************ }
procedure tcgppc.g_concatcopy(list : paasmoutput;const source,dest : treference;len : aword;loadref : boolean);
procedure tcgppc.g_concatcopy(list : paasmoutput;const source,dest : treference;len : aword; delsource,loadref : boolean);
var
p: paicpu;
@ -615,6 +616,8 @@ const
if loadref then
a_load_ref_reg(list,OS_32,source,src.base)
else a_loadaddress_ref_reg(list,source,src.base);
if delsource then
del_reference(list,source);
{ load the address of dest into dst.base }
dst.base := get_scratch_reg(list);
a_loadaddress_ref_reg(list,dest,dst.base);
@ -702,7 +705,7 @@ const
if (a and $ffff) <> 0 Then
list^.concat(new(paicpu,op_reg_reg_const(OpLo,reg1,reg2,a and $ffff)));
If (a shr 16) <> 0 Then
list^.concat(new(paicpu,op_reg_reg_const(OpHi,reg1,reg2,a shr 16)))
list^.concat(new(paicpu,op_reg_reg_const(OpHi,reg1,reg1,a shr 16)))
end;
procedure tcgppc.a_load_store(list:paasmoutput;op: tasmop;reg:tregister;
@ -745,7 +748,13 @@ const
end.
{
$Log$
Revision 1.1 2001-08-26 13:31:04 florian
Revision 1.2 2001-09-05 20:21:03 jonas
* new cgflow based on n386flw with all nodes until forn "translated"
+ a_cmp_loc_*_label methods for tcg
+ base implementatino for a_cmp_ref_*_label methods
* small bugfixes to powerpc cg
Revision 1.1 2001/08/26 13:31:04 florian
* some cg reorganisation
* some PPC updates