Browse Source

* 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

Jonas Maebe 24 years ago
parent
commit
3b4b673069
3 changed files with 901 additions and 365 deletions
  1. 821 343
      compiler/new/cgflw.pas
  2. 62 13
      compiler/new/cgobj.pas
  3. 18 9
      compiler/powerpc/cgcpu.pas

File diff suppressed because it is too large
+ 821 - 343
compiler/new/cgflw.pas


+ 62 - 13
compiler/new/cgobj.pas

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

+ 18 - 9
compiler/powerpc/cgcpu.pas

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

Some files were not shown because too many files changed in this diff