Forráskód Böngészése

+ setting of bit 6 of cr for c var args on ppc implemented

florian 21 éve
szülő
commit
d38abc3a3f

+ 6 - 3
compiler/i386/cpupara.pas

@@ -50,7 +50,7 @@ unit cpupara;
           }
           function getintparaloc(calloption : tproccalloption; nr : longint) : tparalocation;override;
           function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
-          function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tlinkedlist):longint;override;
+          function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;override;
        private
           procedure create_funcret_paraloc_info(p : tabstractprocdef; side: tcallercallee);
           function create_stdcall_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
@@ -255,7 +255,7 @@ unit cpupara;
       end;
 
 
-    function ti386paramanager.create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tlinkedlist):longint;
+    function ti386paramanager.create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;
       var
         hp : tparaitem;
         paraloc : tparalocation;
@@ -487,7 +487,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.47  2003-12-03 23:13:20  peter
+  Revision 1.48  2003-12-28 22:09:12  florian
+    + setting of bit 6 of cr for c var args on ppc implemented
+
+  Revision 1.47  2003/12/03 23:13:20  peter
     * delayed paraloc allocation, a_param_*() gets extra parameter
       if it needs to allocate temp or real paralocation
     * optimized/simplified int-real loading

+ 9 - 5
compiler/ncal.pas

@@ -29,6 +29,7 @@ interface
     uses
        cutils,cclasses,
        globtype,cpuinfo,
+       paramgr,
        node,nbas,
        {$ifdef state_tracking}
        nstate,
@@ -93,7 +94,7 @@ interface
           { inline function body }
           inlinecode : tnode;
           { varargs tparaitems }
-          varargsparas : tlinkedlist;
+          varargsparas : tvarargspara;
           { node that specifies where the result should be put for calls }
           { that return their result in a parameter                      }
           property funcretnode: tnode read _funcretnode write setfuncretnode;
@@ -186,7 +187,7 @@ implementation
     uses
       systems,
       verbose,globals,
-      symconst,paramgr,defutil,defcmp,
+      symconst,defutil,defcmp,
       htypechk,pass_1,
       ncnv,nld,ninl,nadd,ncon,nmem,
       procinfo,
@@ -1057,7 +1058,7 @@ type
          n.inlinecode:=nil;
         if assigned(varargsparas) then
          begin
-           n.varargsparas:=tlinkedlist.create;
+           n.varargsparas:=tvarargspara.create;
            hp:=tparaitem(varargsparas.first);
            while assigned(hp) do
             begin
@@ -1943,7 +1944,7 @@ type
             if nf_varargs_para in pt.flags then
               begin
                 if not assigned(varargsparas) then
-                  varargsparas:=tlinkedlist.create;
+                  varargsparas:=tvarargspara.create;
                 varargspara:=tparaitem.create;
                 varargspara.paratyp:=vs_value;
                 varargspara.paratype:=pt.resulttype;
@@ -2701,7 +2702,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.216  2003-12-21 19:42:42  florian
+  Revision 1.217  2003-12-28 22:09:12  florian
+    + setting of bit 6 of cr for c var args on ppc implemented
+
+  Revision 1.216  2003/12/21 19:42:42  florian
     * fixed ppc inlining stuff
     * fixed wrong unit writing
     + added some sse stuff

+ 13 - 1
compiler/ncgcal.pas

@@ -66,6 +66,7 @@ interface
           function  align_parasize:longint;virtual;
           procedure pop_parasize(pop_size:longint);virtual;
           procedure extra_interrupt_code;virtual;
+          procedure extra_call_code;virtual;
        public
           procedure pass_2;override;
        end;
@@ -413,6 +414,11 @@ implementation
       end;
 
 
+    procedure tcgcallnode.extra_call_code;
+      begin
+      end;
+
+
     function tcgcallnode.align_parasize:longint;
       begin
         result:=0;
@@ -785,6 +791,7 @@ implementation
                      cg.allocexplicitregisters(exprasmlist,R_MMREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
 
                    { call method }
+                   extra_call_code;
                    cg.a_call_reg(exprasmlist,pvreg);
                 end
               else
@@ -807,6 +814,7 @@ implementation
                     extra code }
                   if (po_interrupt in procdefinition.procoptions) then
                     extra_interrupt_code;
+                  extra_call_code;
                   cg.a_call_name(exprasmlist,tprocdef(procdefinition).mangledname);
                end;
            end
@@ -847,6 +855,7 @@ implementation
                 extra_interrupt_code;
               {$warning fixme regvars.}
 {              rg.saveotherregvars(exprasmlist,ALL_OTHERREGISTERS);}
+              extra_call_code;
               cg.a_call_reg(exprasmlist,pvreg);
            end;
 
@@ -1145,7 +1154,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.148  2003-12-26 13:19:16  florian
+  Revision 1.149  2003-12-28 22:09:12  florian
+    + setting of bit 6 of cr for c var args on ppc implemented
+
+  Revision 1.148  2003/12/26 13:19:16  florian
     * rtl and compiler compile with -Cfsse2
 
   Revision 1.147  2003/12/21 19:42:42  florian

+ 13 - 2
compiler/paramgr.pas

@@ -35,6 +35,14 @@ unit paramgr;
        symconst,symtype,symdef;
 
     type
+       tvarargsinfo = (
+         va_uses_float_reg
+       );
+
+       tvarargspara = class(tlinkedlist)
+          varargsinfo : set of tvarargsinfo;
+       end;
+
        {# This class defines some methods to take care of routine
           parameters. It should be overriden for each new processor
        }
@@ -107,7 +115,7 @@ unit paramgr;
             for the routine that are passed as varargs. It returns
             the size allocated on the stack (including the normal parameters)
           }
-          function  create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tlinkedlist):longint;virtual;abstract;
+          function  create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;virtual;abstract;
 
           { Return the location of the low and high part of a 64bit parameter }
           procedure splitparaloc64(const locpara:tparalocation;var loclopara,lochipara:tparalocation);virtual;
@@ -450,7 +458,10 @@ end.
 
 {
    $Log$
-   Revision 1.67  2003-12-06 01:15:22  florian
+   Revision 1.68  2003-12-28 22:09:12  florian
+     + setting of bit 6 of cr for c var args on ppc implemented
+
+   Revision 1.67  2003/12/06 01:15:22  florian
      * reverted Peter's alloctemp patch; hopefully properly
 
    Revision 1.66  2003/12/03 23:13:20  peter

+ 15 - 1
compiler/powerpc/aasmcpu.pas

@@ -58,6 +58,7 @@ uses
          constructor op_reg_reg_ref(op : tasmop;_op1,_op2 : tregister; const _op3: treference);
          constructor op_const_reg_reg(op : tasmop;_op1 : longint;_op2, _op3 : tregister);
          constructor op_const_reg_const(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : longint);
+         constructor op_const_const_const(op : tasmop;_op1 : longint;_op2 : longint;_op3 : longint);
 
          constructor op_reg_reg_reg_reg(op : tasmop;_op1,_op2,_op3,_op4 : tregister);
          constructor op_reg_bool_reg_reg(op : tasmop;_op1: tregister;_op2:boolean;_op3,_op4:tregister);
@@ -239,6 +240,16 @@ uses cutils,rgobj;
       end;
 
 
+     constructor taicpu.op_const_const_const(op : tasmop;_op1 : longint;_op2 : longint;_op3 : longint);
+      begin
+         inherited create(op);
+         ops:=3;
+         loadconst(0,aword(_op1));
+         loadconst(1,aword(_op2));
+         loadconst(2,aword(_op3));
+      end;
+
+
      constructor taicpu.op_reg_reg_reg_reg(op : tasmop;_op1,_op2,_op3,_op4 : tregister);
       begin
          inherited create(op);
@@ -406,7 +417,10 @@ uses cutils,rgobj;
 end.
 {
   $Log$
-  Revision 1.22  2003-12-26 14:02:30  peter
+  Revision 1.23  2003-12-28 22:09:12  florian
+    + setting of bit 6 of cr for c var args on ppc implemented
+
+  Revision 1.22  2003/12/26 14:02:30  peter
     * sparc updates
     * use registertype in spill_register
 

+ 11 - 5
compiler/powerpc/cpupara.pas

@@ -41,7 +41,7 @@ unit cpupara;
           function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override;
           function getintparaloc(calloption : tproccalloption; nr : longint) : tparalocation;override;
           function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
-          function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tlinkedlist):longint;override;
+          function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;override;
          private
            procedure init_values(var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword);
            function create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee; firstpara: tparaitem;
@@ -293,7 +293,7 @@ unit cpupara;
                   hp.paraloc[side].size := OS_ADDR;
                   break;
                 end;
-                
+
               if (hp.paratyp in [vs_var,vs_out]) then
                 begin
                   paradef := voidpointertype.def;
@@ -400,15 +400,16 @@ unit cpupara;
       end;
 
 
-    function tppcparamanager.create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tlinkedlist):longint;
+    function tppcparamanager.create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;
       var
         cur_stack_offset: aword;
         parasize, l: longint;
-        curintreg, curfloatreg, curmmreg: tsuperregister;
+        curintreg, firstfloatreg, curfloatreg, curmmreg: tsuperregister;
         hp: tparaitem;
         paraloc: tparalocation;
       begin
         init_values(curintreg,curfloatreg,curmmreg,cur_stack_offset);
+        firstfloatreg:=curfloatreg;
 
         result := create_paraloc_info_intern(p,callerside,tparaitem(p.para.first),curintreg,curfloatreg,curmmreg,cur_stack_offset);
         if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) then
@@ -432,6 +433,8 @@ unit cpupara;
               end;
             result := parasize;
           end;
+        if curfloatreg<>firstfloatreg then
+          include(varargspara.varargsinfo,va_uses_float_reg);
       end;
 
 
@@ -440,7 +443,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.54  2003-12-28 15:33:06  jonas
+  Revision 1.55  2003-12-28 22:09:12  florian
+    + setting of bit 6 of cr for c var args on ppc implemented
+
+  Revision 1.54  2003/12/28 15:33:06  jonas
     * hopefully fixed varargs (both Pascal- and C-style)
 
   Revision 1.53  2003/12/16 21:49:47  florian

+ 18 - 1
compiler/powerpc/nppccal.pas

@@ -31,6 +31,7 @@ interface
 
     type
        tppccallnode = class(tcgcallnode)
+         procedure extra_call_code;override;
        end;
 
 
@@ -54,12 +55,28 @@ implementation
       ncgutil,cgobj,tgobj,regvars,rgobj,rgcpu,
       cg64f32,cgcpu,cpupi,procinfo;
 
+
+    procedure tppccallnode.extra_call_code;
+      begin
+        if assigned(varargsparas) then
+          begin
+            if va_uses_float_reg in varargsparas.varargsinfo then
+              exprasmlist.concat(taicpu.op_const_const_const(A_CREQV,6,6,6))
+            else
+              exprasmlist.concat(taicpu.op_const_const_const(A_CRXOR,6,6,6));
+          end;
+      end;
+
+
 begin
    ccallnode:=tppccallnode;
 end.
 {
   $Log$
-  Revision 1.22  2003-10-01 20:34:49  peter
+  Revision 1.23  2003-12-28 22:09:12  florian
+    + setting of bit 6 of cr for c var args on ppc implemented
+
+  Revision 1.22  2003/10/01 20:34:49  peter
     * procinfo unit contains tprocinfo
     * cginfo renamed to cgbase
     * moved cgmessage to verbose