Browse Source

* modifications to work with the generic code to copy LOC_REFERENCE
parameters to local temps (fixes tests/test/cg/tmanypara)

Jonas Maebe 21 years ago
parent
commit
49a8939b22
2 changed files with 29 additions and 72 deletions
  1. 7 66
      compiler/powerpc/cgcpu.pas
  2. 22 6
      compiler/powerpc/cpupara.pas

+ 7 - 66
compiler/powerpc/cgcpu.pas

@@ -1167,72 +1167,9 @@ const
 }
           end;
 
-        if assigned(current_procinfo.procdef.parast) then
-          begin
-            if not (po_assembler in current_procinfo.procdef.procoptions) then
-              begin
-                { copy memory parameters to local parast }
-                for i:=0 to current_procinfo.procdef.paras.count-1 do
-                  begin
-                    hp:=tparavarsym(current_procinfo.procdef.paras[i]);
-                    if (hp.paraloc[calleeside].location^.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
-                      begin
-                        if assigned(hp.paraloc[callerside].location^.next) then
-                          internalerror(2004091210);
-                        case hp.localloc.loc of
-                          LOC_REFERENCE:
-                            begin
-                              reference_reset_base(href,hp.localloc.reference.base,hp.localloc.reference.offset);
-                              reference_reset_base(href2,NR_R12,hp.paraloc[callerside].location^.reference.offset);
-                              { we can't use functions here which allocate registers (FK)
-                               cg.a_load_ref_ref(list,hp.paraloc[calleeside].size,hp.paraloc[calleeside].size,href2,href);
-                              }
-                              case hp.paraloc[calleeside].size of
-                                OS_F32:
-                                  size := OS_32;
-                                OS_64,OS_S64:
-                                  size := OS_F64;
-                                else
-                                  size := hp.paraloc[calleeside].size;
-                              end;
-                              case size of
-                                OS_8,OS_S8,OS_16,OS_S16,OS_32,OS_S32:
-                                  begin
-                                    cg.a_load_ref_reg(list,size,size,href2,NR_R0);
-                                    cg.a_load_reg_ref(list,size,size,NR_R0,href);
-                                  end;
-                                OS_F64:
-                                  begin
-                                    cg.a_loadfpu_ref_reg(list,size,href2,NR_F0);
-                                    cg.a_loadfpu_reg_ref(list,size,NR_F0,href);
-                                  end;
-                                else
-                                  internalerror(2004070910);
-                              end;
-                            end;
-{
-{$ifdef oldregvars}
-                          LOC_CREGISTER:
-                            begin
-                              reference_reset_base(href2,NR_R12,hp.paraloc[callerside].location^.reference.offset);
-                              cg.a_load_ref_reg(list,hp.paraloc[calleeside].size,hp.paraloc[calleeside].size,href2,tvarsym(hp.parasym).localloc.register);
-                            end;
-                          LOC_CFPUREGISTER:
-                            begin
-                              reference_reset_base(href2,NR_R12,hp.paraloc[callerside].location^.reference.offset);
-                              cg.a_loadfpu_ref_reg(list,hp.paraloc[calleeside].size,href2,tvarsym(hp.parasym).localloc.register);
-                            end;
-{$endif oldregvars}
-                          else
-                            internalerror(2004070911);
-}
-                        end;
-                      end;
-                  end;
-              end;
-          end;
+{ see "!!! always allocate space for all registers for now !!!" above }
 
-        if usesfpr or usesgpr then
+{        if usesfpr or usesgpr then }
           a_reg_dealloc(list,NR_R12);
 
         { if we didn't get the GOT pointer till now, we've to calculate it now }
@@ -2356,7 +2293,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.186  2004-11-15 23:35:31  peter
+  Revision 1.187  2004-12-04 21:47:46  jonas
+    * modifications to work with the generic code to copy LOC_REFERENCE
+      parameters to local temps (fixes tests/test/cg/tmanypara)
+
+  Revision 1.186  2004/11/15 23:35:31  peter
     * tparaitem removed, use tparavarsym instead
     * parameter order is now calculated from paranr value in tparavarsym
 

+ 22 - 6
compiler/powerpc/cpupara.pas

@@ -102,7 +102,7 @@ unit cpupara;
            else
              begin
                loc:=LOC_REFERENCE;
-               reference.index:=NR_STACK_POINTER_REG;
+               paraloc^.reference.index:=NR_STACK_POINTER_REG;
                reference.offset:=sizeof(aint)*(nr-8);
              end;
           end;
@@ -316,7 +316,10 @@ unit cpupara;
           else
              begin
                 paraloc^.loc:=LOC_REFERENCE;
-                paraloc^.reference.index:=NR_STACK_POINTER_REG;
+                if (side = callerside) then
+                  paraloc^.reference.index:=NR_STACK_POINTER_REG
+                else
+                  paraloc^.reference.index:=NR_R12;
                 paraloc^.reference.offset:=stack_offset;
                 inc(stack_offset,4);
             end;
@@ -413,7 +416,10 @@ unit cpupara;
                          begin
                             nextintreg:=RS_R11;
                             paraloc^.loc:=LOC_REFERENCE;
-                            paraloc^.reference.index:=NR_STACK_POINTER_REG;
+                            if (side = callerside) then
+                              paraloc^.reference.index:=NR_STACK_POINTER_REG
+                            else
+                              paraloc^.reference.index:=NR_R12;
                             paraloc^.reference.offset:=stack_offset;
                             if not is_64bit then
                               inc(stack_offset,4)
@@ -432,7 +438,10 @@ unit cpupara;
                       else
                          begin
                             paraloc^.loc:=LOC_REFERENCE;
-                            paraloc^.reference.index:=NR_STACK_POINTER_REG;
+                            if (side = callerside) then
+                              paraloc^.reference.index:=NR_STACK_POINTER_REG
+                            else
+                              paraloc^.reference.index:=NR_R12;
                             paraloc^.reference.offset:=stack_offset;
                         end;
                       if target_info.abi=abi_powerpc_aix then
@@ -463,7 +472,10 @@ unit cpupara;
                       else
                         begin
                            paraloc^.loc:=LOC_REFERENCE;
-                           paraloc^.reference.index:=NR_STACK_POINTER_REG;
+                           if (side = callerside) then
+                             paraloc^.reference.index:=NR_STACK_POINTER_REG
+                           else
+                             paraloc^.reference.index:=NR_R12;
                            paraloc^.reference.offset:=stack_offset;
                            inc(stack_offset,hp.vartype.def.size);
                         end;
@@ -587,7 +599,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.74  2004-11-22 22:01:19  peter
+  Revision 1.75  2004-12-04 21:47:46  jonas
+    * modifications to work with the generic code to copy LOC_REFERENCE
+      parameters to local temps (fixes tests/test/cg/tmanypara)
+
+  Revision 1.74  2004/11/22 22:01:19  peter
     * fixed varargs
     * replaced dynarray with tlist