Browse Source

* bugfix of hdisponen (base must be set, not index)
* more portability fixes

carl 23 năm trước cách đây
mục cha
commit
d75603c2ed

+ 10 - 6
compiler/cg64f32.pas

@@ -144,7 +144,7 @@ unit cg64f32;
         tmpref := ref;
         if (tmpref.base=reglo) then
          begin
-           tmpreg := get_scratch_reg(list);
+           tmpreg := get_scratch_reg_int(list);
            got_scratch:=true;
            a_load_reg_reg(list,OS_ADDR,tmpref.base,tmpreg);
            tmpref.base:=tmpreg;
@@ -152,7 +152,7 @@ unit cg64f32;
         else
          if (tmpref.index=reglo) then
           begin
-            tmpreg := get_scratch_reg(list);
+            tmpreg := get_scratch_reg_int(list);
             got_scratch:=true;
             a_load_reg_reg(list,OS_ADDR,tmpref.index,tmpreg);
             tmpref.index:=tmpreg;
@@ -456,7 +456,7 @@ unit cg64f32;
                end
              else
                begin
-                 hreg := get_scratch_reg(list);
+                 hreg := get_scratch_reg_int(list);
                  got_scratch := true;
                  a_load64high_ref_reg(list,p.location.reference,hreg);
                end;
@@ -504,7 +504,7 @@ unit cg64f32;
                    end
                  else
                    begin
-                     hreg := get_scratch_reg(list);
+                     hreg := get_scratch_reg_int(list);
                      got_scratch := true;
                      a_load64low_ref_reg(list,p.location.reference,hreg);
                    end;
@@ -558,7 +558,7 @@ unit cg64f32;
                  end
                else
                  begin
-                   hreg := get_scratch_reg(list);
+                   hreg := get_scratch_reg_int(list);
                    got_scratch := true;
 
                    opsize := def_cgsize(p.resulttype.def);
@@ -591,7 +591,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.13  2002-05-18 13:34:05  peter
+  Revision 1.14  2002-05-20 13:30:40  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.13  2002/05/18 13:34:05  peter
     * readded missing revisions
 
   Revision 1.12  2002/05/16 19:46:35  carl

+ 8 - 3
compiler/cgbase.pas

@@ -127,8 +127,9 @@ unit cgbase;
        { also an exit label, only used we need to clear only the stack }
        aktexit2label : tasmlabel;
 
-       { only used in constructor for fail or if getmem fails }
-       faillabel,quickexitlabel : tasmlabel;
+       {# only used in constructor for fail keyword or if getmem fails }
+       faillabel      : tasmlabel;
+       quickexitlabel : tasmlabel;
 
        {# true, if there was an error while code generation occurs }
        codegenerror : boolean;
@@ -524,7 +525,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.16  2002-05-18 13:34:05  peter
+  Revision 1.17  2002-05-20 13:30:40  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.16  2002/05/18 13:34:05  peter
     * readded missing revisions
 
   Revision 1.15  2002/05/16 19:46:35  carl

+ 48 - 29
compiler/cgobj.pas

@@ -69,14 +69,22 @@ unit cgobj;
           {# Deallocates register r by inserting a pa_regdealloc record}
           procedure a_reg_dealloc(list : taasmoutput;r : tregister);
 
-          {# @abstract(Returns a register for use as scratch register)
+          {# @abstract(Returns an int register for use as scratch register)
              This routine returns a register which can be used by
-             the code generator as a scratch register. Since
-             scratch_registers are scarce resources, the register
-             should be freed by calling @link(get_scratch_reg) as
+             the code generator as a general purpose scratch register. 
+             Since scratch_registers are scarce resources, the register
+             should be freed by calling @link(free_scratch_reg) as
              soon as it is no longer required.
           }
-          function get_scratch_reg(list : taasmoutput) : tregister;
+          function get_scratch_reg_int(list : taasmoutput) : tregister;virtual;
+          {# @abstract(Returns an address register for use as scratch register)
+             This routine returns a register which can be used by
+             the code generator as a pointer scratch register. 
+             Since scratch_registers are scarce resources, the register
+             should be freed by calling @link(free_scratch_reg) as
+             soon as it is no longer required.
+          }
+          function get_scratch_reg_address(list : taasmoutput) : tregister;virtual;
           {# @abstract(Releases a scratch register)
 
              Releases a scratch register.
@@ -372,7 +380,7 @@ unit cgobj;
          list.concat(tai_label.create(l));
       end;
 
-    function tcg.get_scratch_reg(list : taasmoutput) : tregister;
+    function tcg.get_scratch_reg_int(list : taasmoutput) : tregister;
 
       var
          r : tregister;
@@ -394,8 +402,15 @@ unit cgobj;
          if scratch_register_array_pointer>max_scratch_regs then
            scratch_register_array_pointer:=1;
          a_reg_alloc(list,r);
-         get_scratch_reg:=r;
+         get_scratch_reg_int:=r;
       end;
+     
+    { the default behavior simply returns a general purpose register } 
+    function tcg.get_scratch_reg_address(list : taasmoutput) : tregister;
+     begin
+       get_scratch_reg_address := get_scratch_reg_int(list);
+     end;
+      
 
     procedure tcg.free_scratch_reg(list : taasmoutput;r : tregister);
 
@@ -414,7 +429,7 @@ unit cgobj;
          hr : tregister;
 
       begin
-         hr:=get_scratch_reg(list);
+         hr:=get_scratch_reg_int(list);
          a_load_const_reg(list,size,a,hr);
          a_param_reg(list,size,hr,nr);
          free_scratch_reg(list,hr);
@@ -426,7 +441,7 @@ unit cgobj;
          hr : tregister;
 
       begin
-         hr:=get_scratch_reg(list);
+         hr:=get_scratch_reg_int(list);
          a_load_ref_reg(list,size,r,hr);
          a_param_reg(list,size,hr,nr);
          free_scratch_reg(list,hr);
@@ -457,7 +472,7 @@ unit cgobj;
          hr : tregister;
 
       begin
-         hr:=get_scratch_reg(list);
+         hr:=get_scratch_reg_address(list);
          a_loadaddr_ref_reg(list,r,hr);
          a_param_reg(list,OS_ADDR,hr,nr);
          free_scratch_reg(list,hr);
@@ -482,7 +497,7 @@ unit cgobj;
           tmpreg := rg.getregisterint(exprasmlist)
         else
 {$endif i386}
-        tmpreg := get_scratch_reg(list);
+        tmpreg := get_scratch_reg_int(list);
         tmpreg:=rg.makeregsize(tmpreg,size);
         a_load_ref_reg(list,size,sref,tmpreg);
         a_load_reg_ref(list,size,tmpreg,dref);
@@ -501,7 +516,7 @@ unit cgobj;
         tmpreg: tregister;
 
       begin
-        tmpreg := get_scratch_reg(list);
+        tmpreg := get_scratch_reg_int(list);
         a_load_const_reg(list,size,a,tmpreg);
         a_load_reg_ref(list,size,tmpreg,ref);
         free_scratch_reg(list,tmpreg);
@@ -600,7 +615,7 @@ unit cgobj;
         tmpreg: tregister;
 
       begin
-        tmpreg := get_scratch_reg(list);
+        tmpreg := get_scratch_reg_int(list);
         a_load_ref_reg(list,size,ref,tmpreg);
         a_op_const_reg(list,op,a,tmpreg);
         a_load_reg_ref(list,size,tmpreg,ref);
@@ -628,7 +643,7 @@ unit cgobj;
         tmpreg: tregister;
 
       begin
-        tmpreg := get_scratch_reg(list);
+        tmpreg := get_scratch_reg_int(list);
         a_load_ref_reg(list,size,ref,tmpreg);
         a_op_reg_reg(list,op,size,reg,tmpreg);
         a_load_reg_ref(list,size,tmpreg,ref);
@@ -651,7 +666,7 @@ unit cgobj;
             end;
           else
             begin
-              tmpreg := get_scratch_reg(list);
+              tmpreg := get_scratch_reg_int(list);
               a_load_ref_reg(list,size,ref,tmpreg);
               a_op_reg_reg(list,op,size,tmpreg,reg);
               free_scratch_reg(list,tmpreg);
@@ -685,7 +700,7 @@ unit cgobj;
             a_op_ref_reg(list,op,loc.size,ref,loc.register);
           LOC_REFERENCE,LOC_CREFERENCE:
             begin
-              tmpreg := get_scratch_reg(list);
+              tmpreg := get_scratch_reg_int(list);
               tmpreg:=rg.makeregsize(tmpreg,loc.size);
               a_load_ref_reg(list,loc.size,ref,tmpreg);
               a_op_reg_ref(list,op,loc.size,tmpreg,loc.reference);
@@ -719,7 +734,7 @@ unit cgobj;
         tmpreg: tregister;
 
       begin
-        tmpreg := get_scratch_reg(list);
+        tmpreg := get_scratch_reg_int(list);
         a_load_ref_reg(list,size,ref,tmpreg);
         a_cmp_const_reg_label(list,size,cmp_op,a,tmpreg,l);
         free_scratch_reg(list,tmpreg);
@@ -745,7 +760,7 @@ unit cgobj;
         tmpreg: tregister;
 
       begin
-        tmpreg := get_scratch_reg(list);
+        tmpreg := get_scratch_reg_int(list);
         a_load_ref_reg(list,size,ref,tmpreg);
         a_cmp_reg_reg_label(list,size,cmp_op,tmpreg,reg,l);
         free_scratch_reg(list,tmpreg);
@@ -788,7 +803,7 @@ unit cgobj;
                 tmpreg := rg.getregisterint(exprasmlist)
               else
 {$endif i386}
-              tmpreg := get_scratch_reg(list);
+              tmpreg := get_scratch_reg_int(list);
               tmpreg := rg.makeregsize(tmpreg,size);
               a_load_ref_reg(list,size,loc.reference,tmpreg);
               a_cmp_ref_reg_label(list,size,cmp_op,ref,tmpreg,l);
@@ -1029,7 +1044,7 @@ unit cgobj;
                 lto := 0;
             end;
 
-        hreg := get_scratch_reg(list);
+        hreg := get_scratch_reg_int(list);
         if (p.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
           a_op_const_reg_reg(list,OP_SUB,def_cgsize(p.resulttype.def),
            aword(longint(lto and $ffffffff)),p.location.register,hreg)
@@ -1106,10 +1121,10 @@ unit cgobj;
             reference_reset_base(href, procinfo^.framepointer,procinfo^.selfpointer_offset);
             a_param_ref(list, OS_ADDR,href,1);
             a_call_name(list,'FPC_NEW_CLASS');
-            a_load_reg_reg(list,OS_INT,accumulator,SELF_POINTER_REG);
+            a_load_reg_reg(list,OS_ADDR,accumulator,SELF_POINTER_REG);
             { save the self pointer result }
             a_load_reg_ref(list,OS_ADDR,SELF_POINTER_REG,href);
-            a_cmp_const_reg_label(list,OS_INT,OC_EQ,0,accumulator,faillabel);
+            a_cmp_const_reg_label(list,OS_ADDR,OC_EQ,0,accumulator,faillabel);
           end
         else if is_object(procinfo^._class) then
           begin
@@ -1118,19 +1133,19 @@ unit cgobj;
             { parameter 2 : address of pointer to vmt }
             {  this is the first(?) parameter which was pushed to the constructor }
             reference_reset_base(href, procinfo^.framepointer,procinfo^.selfpointer_offset-POINTER_SIZE);
-            hregister:=get_scratch_reg(list);
+            hregister:=get_scratch_reg_address(list);
             a_loadaddr_ref_reg(list, href, hregister);
-            a_param_reg(list, OS_INT,hregister,1);
+            a_param_reg(list, OS_ADDR,hregister,1);
             free_scratch_reg(list, hregister);
             { parameter 1 : address of self pointer   }
             reference_reset_base(href, procinfo^.framepointer,procinfo^.selfpointer_offset);
-            hregister:=get_scratch_reg(list);
+            hregister:=get_scratch_reg_address(list);
             a_loadaddr_ref_reg(list, href, hregister);
-            a_param_reg(list, OS_INT,hregister,1);
+            a_param_reg(list, OS_ADDR,hregister,1);
             free_scratch_reg(list, hregister);
             a_call_name(list,'FPC_HELP_CONSTRUCTOR');
-            a_load_reg_reg(list,OS_INT,accumulator,SELF_POINTER_REG);
-            a_cmp_const_reg_label(list,OS_INT,OC_EQ,0,accumulator,faillabel);
+            a_load_reg_reg(list,OS_ADDR,accumulator,SELF_POINTER_REG);
+            a_cmp_const_reg_label(list,OS_ADDR,OC_EQ,0,accumulator,faillabel);
           end
         else
           internalerror(200006161);
@@ -1164,7 +1179,11 @@ finalization
 end.
 {
   $Log$
-  Revision 1.25  2002-05-18 13:34:05  peter
+  Revision 1.26  2002-05-20 13:30:40  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.25  2002/05/18 13:34:05  peter
     * readded missing revisions
 
   Revision 1.24  2002/05/16 19:46:35  carl

+ 8 - 4
compiler/i386/cgcpu.pas

@@ -363,7 +363,7 @@ unit cgcpu;
           OS_8,OS_S8,
           OS_16,OS_S16:
             begin
-              tmpreg := get_scratch_reg(list);
+              tmpreg := get_scratch_reg_address(list);
               a_load_ref_reg(list,size,r,tmpreg);
               if target_info.alignment.paraalign = 2 then
                 list.concat(taicpu.op_reg(A_PUSH,S_W,rg.makeregsize(tmpreg,OS_16)))
@@ -397,7 +397,7 @@ unit cgcpu;
           list.concat(Taicpu.Op_reg(A_PUSH,S_L,r.base))
         else
           begin
-            tmpreg := get_scratch_reg(list);
+            tmpreg := get_scratch_reg_address(list);
             a_loadaddr_ref_reg(list,r,tmpreg);
             list.concat(taicpu.op_reg(A_PUSH,S_L,tmpreg));
             free_scratch_reg(list,tmpreg);
@@ -790,7 +790,7 @@ unit cgcpu;
                       S_W: regloadsize := OS_16;
                       else regloadsize := OS_32;
                     end;
-                    tmpreg := get_scratch_reg(list);
+                    tmpreg := get_scratch_reg_int(list);
                     a_load_reg_reg(list,regloadsize,src,tmpreg);
                   end;
                 if not(src in [R_ECX,R_CX,R_CL]) then
@@ -1778,7 +1778,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.20  2002-05-18 13:34:22  peter
+  Revision 1.21  2002-05-20 13:30:40  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.20  2002/05/18 13:34:22  peter
     * readded missing revisions
 
   Revision 1.19  2002/05/16 19:46:50  carl

+ 13 - 9
compiler/i386/n386cal.pas

@@ -161,7 +161,7 @@ implementation
                      begin
                        if inlined then
                          begin
-                           tmpreg:=cg.get_scratch_reg(exprasmlist);
+                           tmpreg:=cg.get_scratch_reg_address(exprasmlist);
                            cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
                            reference_reset_base(href,procinfo^.framepointer,para_offset-pushedparasize);
                            cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
@@ -202,7 +202,7 @@ implementation
               inc(pushedparasize,4);
               if inlined then
                 begin
-                   tmpreg:=cg.get_scratch_reg(exprasmlist);
+                   tmpreg:=cg.get_scratch_reg_address(exprasmlist);
                    cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
                    reference_reset_base(href,procinfo^.framepointer,para_offset-pushedparasize);
                    cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
@@ -249,7 +249,7 @@ implementation
                    inc(pushedparasize,4);
                    if inlined then
                      begin
-                        tmpreg:=cg.get_scratch_reg(exprasmlist);
+                        tmpreg:=cg.get_scratch_reg_address(exprasmlist);
                         cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,tmpreg);
                         reference_reset_base(href,procinfo^.framepointer,para_offset-pushedparasize);
                         cg.a_load_reg_ref(exprasmlist,OS_ADDR,tmpreg,href);
@@ -551,7 +551,7 @@ implementation
 {$endif not OLD_C_STACK}
              if inlined then
                begin
-                  hregister:=cg.get_scratch_reg(exprasmlist);
+                  hregister:=cg.get_scratch_reg_address(exprasmlist);
                   cg.a_loadaddr_ref_reg(exprasmlist,funcretref,hregister);
                   reference_reset_base(href,procinfo^.framepointer,inlinecode.retoffset);
                   cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,href);
@@ -857,7 +857,7 @@ implementation
                   begin
                      cg.a_param_reg(exprasmlist,OS_ADDR,self_pointer_reg,1);
                      reference_reset_base(href,self_pointer_reg,0);
-                     tmpreg:=cg.get_scratch_reg(exprasmlist);
+                     tmpreg:=cg.get_scratch_reg_address(exprasmlist);
                      cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,tmpreg);
                      reference_reset_base(href,tmpreg,72);
                      cg.a_call_ref(exprasmlist,href);
@@ -945,7 +945,7 @@ implementation
                          begin
                             { this is one point where we need vmt_offset (PM) }
                             reference_reset_base(href,R_ESI,tprocdef(procdefinition)._class.vmt_offset);
-                            tmpreg:=cg.get_scratch_reg(exprasmlist);
+                            tmpreg:=cg.get_scratch_reg_address(exprasmlist);
                             cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,tmpreg);
                             reference_reset_base(href,tmpreg,0);
                             release_tmpreg:=true;
@@ -1022,7 +1022,7 @@ implementation
                       (right.location.reference.index=R_ESI) then
                      begin
                         reference_release(exprasmlist,right.location.reference);
-                        hregister:=cg.get_scratch_reg(exprasmlist);
+                        hregister:=cg.get_scratch_reg_address(exprasmlist);
                         cg.a_load_ref_reg(exprasmlist,OS_ADDR,right.location.reference,hregister);
                      end;
 
@@ -1133,7 +1133,7 @@ implementation
               emitjmp(C_Z,constructorfailed);
               cg.a_param_reg(exprasmlist,OS_ADDR,self_pointer_reg,1);
               reference_reset_base(href,self_pointer_reg,0);
-              tmpreg:=cg.get_scratch_reg(exprasmlist);
+              tmpreg:=cg.get_scratch_reg_address(exprasmlist);
               cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,tmpreg);
               reference_reset_base(href,tmpreg,68);
               cg.a_call_ref(exprasmlist,href);
@@ -1484,7 +1484,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.53  2002-05-18 13:34:23  peter
+  Revision 1.54  2002-05-20 13:30:40  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.53  2002/05/18 13:34:23  peter
     * readded missing revisions
 
   Revision 1.52  2002/05/16 19:46:51  carl

+ 8 - 4
compiler/i386/n386cnv.pas

@@ -105,7 +105,7 @@ implementation
                    hregister:=left.location.register;
                  else
                    begin
-                     hregister:=cg.get_scratch_reg(exprasmlist);
+                     hregister:=cg.get_scratch_reg_int(exprasmlist);
                      freereg:=true;
                      cg.a_load_reg_reg(exprasmlist,left.location.size,left.location.register,hregister);
                    end;
@@ -114,7 +114,7 @@ implementation
            LOC_REFERENCE,
            LOC_CREFERENCE :
              begin
-               hregister:=cg.get_scratch_reg(exprasmlist);
+               hregister:=cg.get_scratch_reg_int(exprasmlist);
                freereg:=true;
                if left.location.size in [OS_64,OS_S64] then
                 begin
@@ -244,7 +244,7 @@ implementation
               begin
                 if left.location.size in [OS_64,OS_S64] then
                  begin
-                   hregister:=cg.get_scratch_reg(exprasmlist);
+                   hregister:=cg.get_scratch_reg_int(exprasmlist);
                    cg.a_load_reg_reg(exprasmlist,OS_32,left.location.registerlow,hregister);
                    cg.a_op_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,hregister);
                    cg.free_scratch_reg(exprasmlist,hregister);
@@ -365,7 +365,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.41  2002-05-18 13:34:24  peter
+  Revision 1.42  2002-05-20 13:30:40  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.41  2002/05/18 13:34:24  peter
     * readded missing revisions
 
   Revision 1.40  2002/05/16 19:46:51  carl

+ 5 - 14
compiler/i386/n386flw.pas

@@ -47,9 +47,6 @@ interface
           procedure pass_2;override;
        end;
 
-       ti386failnode = class(tfailnode)
-          procedure pass_2;override;
-       end;
 
 implementation
 
@@ -720,26 +717,20 @@ implementation
       end;
 
 
-{*****************************************************************************
-                             SecondFail
-*****************************************************************************}
-
-    procedure ti386failnode.pass_2;
-      begin
-        cg.a_jmp_always(exprasmlist,faillabel);
-      end;
-
 
 begin
    craisenode:=ti386raisenode;
    ctryexceptnode:=ti386tryexceptnode;
    ctryfinallynode:=ti386tryfinallynode;
    connode:=ti386onnode;
-   cfailnode:=ti386failnode;
 end.
 {
   $Log$
-  Revision 1.26  2002-05-18 13:34:25  peter
+  Revision 1.27  2002-05-20 13:30:41  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.26  2002/05/18 13:34:25  peter
     * readded missing revisions
 
   Revision 1.25  2002/05/16 19:46:51  carl

+ 22 - 1
compiler/ncgflw.pas

@@ -63,6 +63,10 @@ interface
           procedure pass_2;override;
        end;
 
+       tcgfailnode = class(tfailnode)
+          procedure pass_2;override;
+       end;
+
 implementation
 
     uses
@@ -597,6 +601,18 @@ do_jmp:
          rg.cleartempgen;
          secondpass(left);
       end;
+      
+      
+{*****************************************************************************
+                             SecondFail
+*****************************************************************************}
+
+    procedure tcgfailnode.pass_2;
+      begin
+        cg.a_jmp_always(exprasmlist,faillabel);
+      end;
+
+      
 
 
 begin
@@ -608,10 +624,15 @@ begin
    ccontinuenode:=tcgcontinuenode;
    cgotonode:=tcggotonode;
    clabelnode:=tcglabelnode;
+   cfailnode:=tcgfailnode;
 end.
 {
   $Log$
-  Revision 1.18  2002-05-18 13:34:09  peter
+  Revision 1.19  2002-05-20 13:30:40  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.18  2002/05/18 13:34:09  peter
     * readded missing revisions
 
   Revision 1.17  2002/05/16 19:46:37  carl

+ 24 - 11
compiler/ncgld.pas

@@ -57,7 +57,7 @@ implementation
       ncnv,ncon,nmem,
       aasm,cpuasm,regvars,
       cginfo,cgbase,pass_2,
-      cpubase,
+      cpubase,cpuinfo,
       tgobj,ncgutil,cgobj,cg64f32,rgobj,rgcpu;
 
 {*****************************************************************************
@@ -188,7 +188,7 @@ implementation
                                    end;
                                  if (lexlevel>symtable.symtablelevel) then
                                    begin
-                                      hregister:=rg.getregisterint(exprasmlist);
+                                      hregister:=rg.getaddressregister(exprasmlist);
                                       { make a reference }
                                       reference_reset_base(href,procinfo^.framepointer,procinfo^.framepointer_offset);
                                       cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
@@ -197,7 +197,7 @@ implementation
                                       while (i>symtable.symtablelevel) do
                                         begin
                                            { make a reference }
-                                           reference_reset_base(href,hregister,8);
+                                           reference_reset_base(href,hregister,target_info.first_parm_offset);
                                            cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
                                            dec(i);
                                         end;
@@ -264,8 +264,17 @@ implementation
                begin
                   if assigned(left) then
                     begin
-                       location_reset(location,LOC_CREFERENCE,OS_64);
-                       tg.gettempofsizereference(exprasmlist,8,location.reference);
+                       { 
+                         THIS IS A TERRIBLE HACK!!!!!! WHICH WILL NOT WORK 
+                         ON 64-BIT SYSTEMS: SINCE PROCSYM FOR METHODS     
+                         CONSISTS OF TWO OS_ADDR, so you cannot set it 
+                         to OS_64 - how to solve?? Carl
+                       }
+                       if (sizeof(aword) = 4) then
+                          location_reset(location,LOC_CREFERENCE,OS_64)
+                       else
+                          internalerror(20020520);
+                       tg.gettempofsizereference(exprasmlist,2*POINTER_SIZE,location.reference);
                        freereg:=false;
 
                        { called as type.method, then we only need to return
@@ -305,7 +314,7 @@ implementation
 
                           { store the class instance address }
                           href:=location.reference;
-                          inc(href.offset,4);
+                          inc(href.offset,POINTER_SIZE);
                           cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,href);
                           { hregister will be reused when loading a virtual method }
                           freereg:=true;
@@ -338,7 +347,7 @@ implementation
                              rg.ungetregisterint(exprasmlist,hregister);
                             { load address of the function }
                             reference_reset_symbol(href,newasmsymbol(tprocdef(resulttype.def).mangledname),0);
-                            hregister:=cg.get_scratch_reg(exprasmlist);
+                            hregister:=cg.get_scratch_reg_address(exprasmlist);
                             cg.a_loadaddr_ref_reg(exprasmlist,href,hregister);
                             cg.a_load_reg_ref(exprasmlist,OS_ADDR,hregister,location.reference);
                             cg.free_scratch_reg(exprasmlist,hregister);
@@ -662,7 +671,7 @@ implementation
          if (not inlining_procedure) and
             (lexlevel<>funcretsym.owner.symtablelevel) then
            begin
-              hreg:=rg.getregisterint(exprasmlist);
+              hreg:=rg.getaddressregister(exprasmlist);
               hr_valid:=true;
               reference_reset_base(href,procinfo^.framepointer,procinfo^.framepointer_offset);
               cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hreg);
@@ -843,7 +852,7 @@ implementation
                      end
                     else
                      cg.a_param_loc(exprasmlist,hp.left.location,-1);
-                    inc(pushedparasize,4);
+                    inc(pushedparasize,pointer_size);
                   end
                  else
                   begin
@@ -852,7 +861,7 @@ implementation
                     if vaddr then
                      begin
                        location_force_mem(exprasmlist,hp.left.location);
-                       tmpreg:=cg.get_scratch_reg(exprasmlist);
+                       tmpreg:=cg.get_scratch_reg_address(exprasmlist);
                        cg.a_loadaddr_ref_reg(exprasmlist,hp.left.location.reference,tmpreg);
                        cg.a_load_reg_ref(exprasmlist,cg.reg_cgsize(tmpreg),tmpreg,href);
                        cg.free_scratch_reg(exprasmlist,tmpreg);
@@ -912,7 +921,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.8  2002-05-18 13:34:09  peter
+  Revision 1.9  2002-05-20 13:30:40  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.8  2002/05/18 13:34:09  peter
     * readded missing revisions
 
   Revision 1.7  2002/05/18 11:17:03  peter

+ 22 - 10
compiler/ncgmem.pas

@@ -109,6 +109,7 @@ implementation
 
     procedure tcghnewnode.pass_2;
       begin
+         { completely resolved in first pass now }
       end;
 
 
@@ -130,20 +131,20 @@ implementation
                 if not rg.isaddressregister(left.location.register) then
                   begin
                     location_release(exprasmlist,left.location);
-                    location.reference.index := rg.getaddressregister(exprasmlist);
+                    location.reference.base := rg.getaddressregister(exprasmlist);
                     cg.a_load_reg_reg(exprasmlist,OS_ADDR,left.location.register,
-                      location.reference.index);
+                      location.reference.base);
                   end
                 else
-                  location.reference.index := left.location.register;
+                  location.reference.base := left.location.register;
               end;
             LOC_CREGISTER,
             LOC_CREFERENCE,
             LOC_REFERENCE:
               begin
                  location_release(exprasmlist,left.location);
-                 location.reference.index:=rg.getaddressregister(exprasmlist);
-                 cg.a_load_loc_reg(exprasmlist,left.location,location.reference.index);
+                 location.reference.base:=rg.getaddressregister(exprasmlist);
+                 cg.a_load_loc_reg(exprasmlist,left.location,location.reference.base);
               end;
             else
               internalerror(2002032217);
@@ -183,8 +184,10 @@ implementation
            cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,
              location.register)
          else
+          begin
            cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,
              location.register);
+          end;
       end;
 
 
@@ -355,13 +358,18 @@ implementation
                else
                 { call can have happend with a property }
                 begin
-                  tmpreg := cg.get_scratch_reg(exprasmlist);
                   usetemp:=true;
                   if is_class_or_interface(left.resulttype.def) then
-                    cg.a_load_loc_reg(exprasmlist,left.location,tmpreg)
+                    begin
+                      tmpreg := cg.get_scratch_reg_int(exprasmlist);
+                      cg.a_load_loc_reg(exprasmlist,left.location,tmpreg)
+                    end
                   else
-                    cg.a_loadaddr_ref_reg(exprasmlist,
-                      left.location.reference,tmpreg);
+                    begin
+                      tmpreg := cg.get_scratch_reg_address(exprasmlist);
+                      cg.a_loadaddr_ref_reg(exprasmlist,
+                        left.location.reference,tmpreg);
+                    end;  
                 end;
 
                location_release(exprasmlist,left.location);
@@ -454,7 +462,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.12  2002-05-18 13:34:09  peter
+  Revision 1.13  2002-05-20 13:30:40  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.12  2002/05/18 13:34:09  peter
     * readded missing revisions
 
   Revision 1.11  2002/05/16 19:46:37  carl

+ 7 - 3
compiler/ncgutil.pas

@@ -874,7 +874,7 @@ implementation
              vs_out :
                begin
                  reference_reset_base(href,procinfo^.framepointer,tvarsym(p).address+procinfo^.para_offset);
-                 tmpreg:=cg.get_scratch_reg(list);
+                 tmpreg:=cg.get_scratch_reg_address(list);
                  cg.a_load_ref_reg(list,OS_ADDR,href,tmpreg);
                  reference_reset_base(href,tmpreg,0);
                  cg.g_initialize(list,tvarsym(p).vartype.def,href,false);
@@ -1352,7 +1352,7 @@ implementation
                             if (po_virtualmethod in pd.procoptions) then
                              begin
                                reference_reset_base(href,self_pointer_reg,0);
-                               tmpreg:=cg.get_scratch_reg(list);
+                               tmpreg:=cg.get_scratch_reg_address(list);
                                cg.a_load_ref_reg(list,OS_ADDR,href,tmpreg);
                                reference_reset_base(href,tmpreg,procinfo^._class.vmtmethodoffset(pd.extnumber));
                                cg.free_scratch_reg(list,tmpreg);
@@ -1607,7 +1607,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.16  2002-05-18 13:34:09  peter
+  Revision 1.17  2002-05-20 13:30:40  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.16  2002/05/18 13:34:09  peter
     * readded missing revisions
 
   Revision 1.15  2002/05/16 19:46:37  carl

+ 17 - 13
compiler/powerpc/cgcpu.pas

@@ -192,7 +192,7 @@ const
             reset_reference(ref);
             ref.base := STACK_POINTER_REG;
             ref.offset := LinkageAreaSize+para_size_till_now;
-            tmpreg := get_scratch_reg(list);
+            tmpreg := get_scratch_reg_int(list);
             a_load_ref_reg(list,size,r,tmpreg);
             a_load_reg_ref(list,size,tmpreg,ref);
             free_scratch_reg(list,tmpreg);
@@ -216,7 +216,7 @@ const
             reset_reference(ref);
             ref.base := STACK_POINTER_REG;
             ref.offset := LinkageAreaSize+para_size_till_now;
-            tmpreg := get_scratch_reg(list);
+            tmpreg := get_scratch_reg_address(list);
             a_loadaddr_ref_reg(list,size,r,tmpreg);
             a_load_reg_ref(list,size,tmpreg,ref);
             free_scratch_reg(list,tmpreg);
@@ -460,7 +460,7 @@ const
               begin
                 if src <> dst then
                   list.concat(taicpu.op_reg_reg(A_MR,dst,src));
-                scratchreg := get_scratch_reg(list);
+                scratchreg := get_scratch_reg_int(list);
                 list.concat(taicpu.op_reg_const(A_LI,scratchreg,-1));
                 list.concat(taicpu.op_reg_reg_const_const_const(A_RLWIMI,dst,
                   scratchreg,0,l1,l2));
@@ -492,7 +492,7 @@ const
         { perform the operation                                        }
         if useReg then
           begin
-            scratchreg := get_scratch_reg(list);
+            scratchreg := get_scratch_reg_int(list);
             a_load_const_reg(list,OS_32,a,scratchreg);
             a_op_reg_reg_reg(list,op,OS_32,scratchreg,src,dst);
             free_scratch_reg(list,scratchreg);
@@ -535,7 +535,7 @@ const
               list.concat(taicpu.op_reg_reg_const(A_CMPI,R_CR0,reg,a))
             else
               begin
-                scratch_register := get_scratch_reg(list);
+                scratch_register := get_scratch_reg_int(list);
                 a_load_const_reg(list,OS_32,a,scratch_register);
                 list.concat(taicpu.op_reg_reg_reg(A_CMP,R_CR0,reg,scratch_register));
                 free_scratch_reg(list,scratch_register);
@@ -545,7 +545,7 @@ const
               list.concat(taicpu.op_reg_reg_const(A_CMPLI,R_CR0,reg,a))
             else
               begin
-                scratch_register := get_scratch_reg(list);
+                scratch_register := get_scratch_reg_int(list);
                 a_load_const_reg(list,OS_32,a,scratch_register);
                 list.concat(taicpu.op_reg_reg_reg(A_CMPL,R_CR0,reg,scratch_register));
                 free_scratch_reg(list,scratch_register);
@@ -841,7 +841,7 @@ const
            { add the symbol's value to the base of the reference, and if the }
            { reference doesn't have a base, create one                       }
            begin
-             tmpreg := get_scratch_reg(list);
+             tmpreg := get_scratch_reg_address(list);
              reference_reset(tmpref);
              tmpref.symbol := ref2.symbol;
              tmpref.symaddr := refs_ha;
@@ -893,14 +893,14 @@ const
         reference_reset(src);
         reference_reset(dst);
         { load the address of source into src.base }
-        src.base := get_scratch_reg(list);
+        src.base := get_scratch_reg_address(list);
         if loadref then
           a_load_ref_reg(list,OS_32,source,src.base)
         else a_loadaddr_ref_reg(list,source,src.base);
         if delsource then
           reference_release(exprasmlist,source);
         { load the address of dest into dst.base }
-        dst.base := get_scratch_reg(list);
+        dst.base := get_scratch_reg_address(list);
         a_loadaddr_ref_reg(list,dest,dst.base);
         count := len div 4;
         if count > 3 then
@@ -914,7 +914,7 @@ const
             Inc(src.offset,4);
             list.concat(taicpu.op_reg_reg_const(A_SUBI,src.base,src.base,4));
             list.concat(taicpu.op_reg_reg_const(A_SUBI,dst.base,dst.base,4));
-            countreg := get_scratch_reg(list);
+            countreg := get_scratch_reg_int(list);
             a_load_const_reg(list,OS_32,count-1,countreg);
             { explicitely allocate R_0 since it can be used safely here }
             { (for holding date that's being copied)                    }
@@ -932,7 +932,7 @@ const
         else
           { unrolled loop }
           begin
-            tempreg := get_scratch_reg(list);
+            tempreg := get_scratch_reg_int(list);
             for count2 := 1 to count do
               begin
                 a_load_ref_reg(list,OS_32,src,tempreg);
@@ -1137,7 +1137,7 @@ const
       begin
         if assigned(ref.symbol) then
           begin
-            tmpreg := get_scratch_reg(list);
+            tmpreg := get_scratch_reg_address(list);
             reference_reset(tmpref);
             tmpref.symbol := ref.symbol;
             tmpref.symaddr := refs_ha;
@@ -1173,7 +1173,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.18  2002-05-18 13:34:26  peter
+  Revision 1.19  2002-05-20 13:30:41  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.18  2002/05/18 13:34:26  peter
     * readded missing revisions
 
   Revision 1.17  2002/05/16 19:46:53  carl

+ 8 - 4
compiler/powerpc/nppccnv.pas

@@ -278,13 +278,13 @@ implementation
             begin
               leftreg := left.location.register;
               if signed then
-                valuereg := cg.get_scratch_reg(exprasmlist)
+                valuereg := cg.get_scratch_reg_int(exprasmlist)
               else
                 valuereg := leftreg;
             end;
           LOC_REFERENCE,LOC_CREFERENCE:
             begin
-              leftreg := cg.get_scratch_reg(exprasmlist);
+              leftreg := cg.get_scratch_reg_int(exprasmlist);
               valuereg := leftreg;
               cg.a_load_ref_reg(exprasmlist,def_cgsize(left.resulttype.def),
                 left.location.reference,leftreg);
@@ -292,7 +292,7 @@ implementation
           else
             internalerror(200110012);
          end;
-         tempreg := cg.get_scratch_reg(exprasmlist);
+         tempreg := cg.get_scratch_reg_int(exprasmlist);
          exprasmlist.concat(taicpu.op_reg_const(A_LIS,tempreg,$4330));
          cg.a_load_reg_ref(exprasmlist,OS_32,tempreg,ref);
          if signed then
@@ -456,7 +456,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.8  2002-05-18 13:34:26  peter
+  Revision 1.9  2002-05-20 13:30:42  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.8  2002/05/18 13:34:26  peter
     * readded missing revisions
 
   Revision 1.7  2002/05/16 19:46:53  carl

+ 9 - 5
compiler/powerpc/nppcmat.pas

@@ -129,7 +129,7 @@ implementation
                  divider := right.location.register;
                LOC_REFERENCE, LOC_CREFERENCE:
                  begin
-                   divider := cg.get_scratch_reg(exprasmlist);
+                   divider := cg.get_scratch_reg_int(exprasmlist);
                    cg.a_load_ref_reg(exprasmlist,OS_32,
                      right.location.reference,divider);
                    reference_release(exprasmlist,right.location.reference);
@@ -266,7 +266,7 @@ implementation
                      end;
                    LOC_REFERENCE,LOC_CREFERENCE:
                      begin
-                       hregister1 := cg.get_scratch_reg(exprasmlist);
+                       hregister1 := cg.get_scratch_reg_int(exprasmlist);
                        cg.a_load_ref_reg(exprasmlist,OS_S32,
                          right.location.reference,hregister1);
                      end;
@@ -350,7 +350,7 @@ implementation
                       hregister2 := right.location.register;
                     LOC_REFERENCE, LOC_CREFERENCE:
                       begin
-                        hregister2 := cg.get_scratch_reg(exprasmlist);
+                        hregister2 := cg.get_scratch_reg_int(exprasmlist);
                         cg.a_load_ref_reg(exprasmlist,OS_32,
                           right.location.reference,hregister2);
                         reference_release(exprasmlist,right.location.reference);
@@ -391,7 +391,7 @@ implementation
              exprasmlist.concat(taicpu.op_reg_reg(A_NEG,location.registerlow,
                src1));
              cg.a_op_reg_reg(exprasmlist,OP_NOT,OS_32,src2,location.registerhigh);
-             tmp := cg.get_scratch_reg(exprasmlist);
+             tmp := cg.get_scratch_reg_int(exprasmlist);
              cg.a_op_const_reg_reg(exprasmlist,OP_SAR,OS_32,31,location.registerlow,
                tmp);
              if not(cs_check_overflow in aktlocalswitches) then
@@ -547,7 +547,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.9  2002-05-18 13:34:26  peter
+  Revision 1.10  2002-05-20 13:30:42  carl
+  * bugfix of hdisponen (base must be set, not index)
+  * more portability fixes
+
+  Revision 1.9  2002/05/18 13:34:26  peter
     * readded missing revisions
 
   Revision 1.8  2002/05/16 19:46:53  carl