Browse Source

* tcginnode.pass_2 doesn't call a helper anymore in any case
* fixed ungetregisterfpu compilation problems

Jonas Maebe 22 years ago
parent
commit
7ca760912b
4 changed files with 67 additions and 36 deletions
  1. 42 26
      compiler/ncgset.pas
  2. 10 4
      compiler/nset.pas
  3. 6 2
      compiler/powerpc/nppccnv.pas
  4. 9 4
      compiler/powerpc/rgcpu.pas

+ 42 - 26
compiler/ncgset.pas

@@ -159,18 +159,19 @@ implementation
            start,stop : byte;    {Start/stop when range; Stop=element when an element.}
          end;
        var
-         genjumps,
-         use_small,
-         ranges     : boolean;
+         l,l2,l3       : tasmlabel;
+         adjustment : longint;
+         href : treference;
+         r:Tregister;
          hr,hr2,hr3,
          pleftreg   : tregister;
-         opsize     : tcgsize;
          setparts   : array[1..8] of Tsetpart;
-         i,numparts : byte;
-         adjustment : longint;
          pushedregs : tmaybesave;
-         l,l2,l3       : tasmlabel;
-         r:Tregister;
+         opsize     : tcgsize;
+         genjumps,
+         use_small,
+         ranges     : boolean;
+         i,numparts : byte;
 
 {$ifdef oldset}
          function analizeset(Aset:Pconstset;is_small:boolean):boolean;
@@ -606,25 +607,36 @@ implementation
                   else
                     pleftreg:=rg.getregisterint(exprasmlist,OS_INT);
                   cg.a_load_loc_reg(exprasmlist,OS_INT,left.location,pleftreg);
+
                   location_freetemp(exprasmlist,left.location);
+                  hr := rg.getaddressregister(exprasmlist);
                   location_release(exprasmlist,left.location);
-                  cg.a_param_reg(exprasmlist,OS_8,pleftreg,paramanager.getintparaloc(exprasmlist,2));
-                  { release the allocated register  }
-                  if not (left.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
-                    rg.ungetregisterint(exprasmlist,pleftreg);
-                  cg.a_paramaddr_ref(exprasmlist,right.location.reference,paramanager.getintparaloc(exprasmlist,1));
-                  cg.a_call_name(exprasmlist,'FPC_SET_IN_BYTE');
-                  paramanager.freeintparaloc(exprasmlist,2);
-                  paramanager.freeintparaloc(exprasmlist,1);
-                  { result of value is always one full register }
-                  r.enum:=R_INTREGISTER;
-                  r.number:=NR_FUNCTION_RESULT_REG;
-{$ifdef newra}
-                  rg.getexplicitregisterint(exprasmlist,NR_FUNCTION_RESULT_REG);
-                  rg.ungetregisterint(exprasmlist,r);
-{$endif newra}
-                  cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,r,location.register);
-                  location_release(exprasmlist,right.location);
+                  cg.a_op_const_reg_reg(exprasmlist,OP_SHR,OS_32,5,pleftreg,hr);
+                  cg.a_op_const_reg(exprasmlist,OP_SHL,OS_32,2,hr);
+
+                  href := right.location.reference;
+                  if (href.base.number = NR_NO) then
+                    href.base := hr
+                  else if (right.location.reference.index.number = NR_NO) then
+                    href.index := hr
+                  else
+                    begin
+                      reference_release(exprasmlist,href);
+                      hr2 := rg.getaddressregister(exprasmlist);
+                      cg.a_loadaddr_ref_reg(exprasmlist,href, hr2);
+                      reference_reset_base(href,hr2,0);
+                      right.location.reference.index := hr;
+                    end;
+                  reference_release(exprasmlist,href);
+                  cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,href,location.register);
+                  if left.location.loc = LOC_CREGISTER then
+                    hr := rg.getregisterint(exprasmlist,OS_32)
+                  else
+                    hr := pleftreg;
+                  cg.a_op_const_reg_reg(exprasmlist,OP_AND,OS_32,31,pleftreg,hr);
+                  cg.a_op_reg_reg(exprasmlist,OP_SHR,OS_32,hr,location.register);
+                  rg.ungetregisterint(exprasmlist,hr);
+                  cg.a_op_const_reg(exprasmlist,OP_AND,OS_32,1,location.register);
                 end;
              end;
           end;
@@ -1127,7 +1139,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.42  2003-06-08 16:03:22  jonas
+  Revision 1.43  2003-06-12 22:09:54  jonas
+    * tcginnode.pass_2 doesn't call a helper anymore in any case
+    * fixed ungetregisterfpu compilation problems
+
+  Revision 1.42  2003/06/08 16:03:22  jonas
     - disabled gentreejmp for now, it expects that the case labels are
       ordered as a perfectly balanced tree, while they are often a linked
       list -> generates extremely bad code

+ 10 - 4
compiler/nset.pas

@@ -329,10 +329,12 @@ implementation
            exit;
 
          left_right_max;
-         { this is not allways true due to optimization }
-         { but if we don't set this we get problems with optimizing self code }
+
          if tsetdef(right.resulttype.def).settype<>smallset then
-           include(current_procinfo.flags,pi_do_call)
+           begin
+             if registers32 < 3 then
+               registers32 := 3;
+           end
          else
            begin
               { a smallset needs maybe an misc. register }
@@ -705,7 +707,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.42  2003-05-13 19:14:41  peter
+  Revision 1.43  2003-06-12 22:09:54  jonas
+    * tcginnode.pass_2 doesn't call a helper anymore in any case
+    * fixed ungetregisterfpu compilation problems
+
+  Revision 1.42  2003/05/13 19:14:41  peter
     * failn removed
     * inherited result code check moven to pexpr
 

+ 6 - 2
compiler/powerpc/nppccnv.pas

@@ -245,7 +245,7 @@ implementation
 
          exprasmlist.concat(taicpu.op_reg_reg_reg(A_FSUB,location.register,
            location.register,tmpfpureg));
-         rg.ungetregisterfpu(exprasmlist,tmpfpureg);
+         rg.ungetregisterfpu(exprasmlist,tmpfpureg,OS_F64);
 
          { work around bug in some PowerPC processors }
          if (tfloatdef(resulttype.def).typ = s32real) then
@@ -434,7 +434,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.38  2003-06-04 11:58:58  jonas
+  Revision 1.39  2003-06-12 22:09:54  jonas
+    * tcginnode.pass_2 doesn't call a helper anymore in any case
+    * fixed ungetregisterfpu compilation problems
+
+  Revision 1.38  2003/06/04 11:58:58  jonas
     * calculate localsize also in g_return_from_proc since it's now called
       before g_stackframe_entry (still have to fix macos)
     * compilation fixes (cycle doesn't work yet though)

+ 9 - 4
compiler/powerpc/rgcpu.pas

@@ -30,6 +30,7 @@ unit rgcpu;
 
      uses
        aasmbase,aasmtai,
+       cginfo,
        cpubase,
        rgobj;
 
@@ -38,7 +39,7 @@ unit rgcpu;
          function getexplicitregisterint(list: taasmoutput; reg: Tnewregister): tregister; override;
          procedure ungetregisterint(list: taasmoutput; reg: tregister); override;
          function getexplicitregisterfpu(list : taasmoutput; r : Toldregister) : tregister;override;
-         procedure ungetregisterfpu(list: taasmoutput; r : tregister);override;
+         procedure ungetregisterfpu(list: taasmoutput; r : tregister; size:TCGsize);override;
          procedure saveusedintregisters(list:Taasmoutput;
                                          var saved:Tpushedsavedint;
                                          const s:Tsupregset);override;
@@ -105,7 +106,7 @@ unit rgcpu;
       end;
 
 
-    procedure trgcpu.ungetregisterfpu(list: taasmoutput; r : tregister);
+    procedure trgcpu.ungetregisterfpu(list: taasmoutput; r : tregister; size:TCGsize);
       begin
         if (r.enum in [R_F1..R_F13]) and
            not is_reg_var_other[r.enum] then
@@ -116,7 +117,7 @@ unit rgcpu;
             cg.a_reg_dealloc(list,r);
           end
         else
-          inherited ungetregisterfpu(list,r);
+          inherited ungetregisterfpu(list,r,size);
       end;
 
 
@@ -156,7 +157,11 @@ end.
 
 {
   $Log$
-  Revision 1.9  2003-06-09 14:54:26  jonas
+  Revision 1.10  2003-06-12 22:09:54  jonas
+    * tcginnode.pass_2 doesn't call a helper anymore in any case
+    * fixed ungetregisterfpu compilation problems
+
+  Revision 1.9  2003/06/09 14:54:26  jonas
     * (de)allocation of registers for parameters is now performed properly
       (and checked on the ppc)
     - removed obsolete allocation of all parameter registers at the start