Browse Source

* more fixes for the ppc
+ wrappers for the tcnvnode.first_* stuff introduced

florian 23 years ago
parent
commit
e7a6cd18dd

+ 7 - 3
compiler/ncginl.pas

@@ -106,7 +106,7 @@ implementation
                   second_TypeInfo;
                   second_TypeInfo;
                end;
                end;
             in_assigned_x :
             in_assigned_x :
-              begin
+              begin                 
                  second_Assigned;
                  second_Assigned;
               end;
               end;
             in_include_x_y,
             in_include_x_y,
@@ -583,7 +583,11 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.5  2002-07-28 20:45:22  florian
+  Revision 1.6  2002-07-29 21:23:42  florian
+    * more fixes for the ppc
+    + wrappers for the tcnvnode.first_* stuff introduced
+
+  Revision 1.5  2002/07/28 20:45:22  florian
     + added direct assembler reader for PowerPC
     + added direct assembler reader for PowerPC
 
 
   Revision 1.4  2002/07/26 09:45:20  florian
   Revision 1.4  2002/07/26 09:45:20  florian
@@ -597,4 +601,4 @@ end.
 
 
   Revision 1.1  2002/07/24 04:07:49  carl
   Revision 1.1  2002/07/24 04:07:49  carl
    + first revision (incomplete)
    + first revision (incomplete)
-}
+}

+ 33 - 19
compiler/ncgutil.pas

@@ -1071,6 +1071,30 @@ implementation
       end;
       end;
 
 
 
 
+    procedure gen_exception_frame(list : taasmoutput);
+      var
+        tempbuf : treference;
+        tmpreg : tregister;
+      begin
+         include(rg.usedinproc,accumulator);
+
+         { allocate exception frame buffer }
+         { this isn't generic, several APIs doesn't }
+         { allow to change the stack pointer inside }
+         { a procedure                              }
+         { we should allocate a persistent temp.    }
+         { instead                                  }
+         cg.a_op_const_reg(list,OP_SUB,36,STACK_POINTER_REG);
+         tmpreg:=rg.getaddressregister(list);
+         cg.a_load_reg_reg(list,OS_ADDR,STACK_POINTER_REG,tmpreg);
+         reference_reset_base(tempbuf,tmpreg,0);
+         cg.g_push_exception(list,tempbuf,1,aktexitlabel);
+         reference_release(list,tempbuf);
+
+         { probably we've to reload self here }
+         cg.g_maybe_loadself(list);
+      end;
+
     procedure genentrycode(list : TAAsmoutput;
     procedure genentrycode(list : TAAsmoutput;
                            make_global:boolean;
                            make_global:boolean;
                            stackframe:longint;
                            stackframe:longint;
@@ -1080,7 +1104,6 @@ implementation
         hs : string;
         hs : string;
         href : treference;
         href : treference;
         p : tsymtable;
         p : tsymtable;
-        tempbuf : treference;
         tmpreg : tregister;
         tmpreg : tregister;
       begin
       begin
         { Insert alignment and assembler names }
         { Insert alignment and assembler names }
@@ -1160,11 +1183,11 @@ implementation
         { for the save all registers we can simply use a pusha,popa which
         { for the save all registers we can simply use a pusha,popa which
           push edi,esi,ebp,esp(ignored),ebx,edx,ecx,eax }
           push edi,esi,ebp,esp(ignored),ebx,edx,ecx,eax }
         if (po_saveregisters in aktprocdef.procoptions) then
         if (po_saveregisters in aktprocdef.procoptions) then
-         cg.g_save_all_registers(list)
+          cg.g_save_all_registers(list)
         else
         else
          { should we save edi,esi,ebx like C ? }
          { should we save edi,esi,ebx like C ? }
          if (po_savestdregs in aktprocdef.procoptions) then
          if (po_savestdregs in aktprocdef.procoptions) then
-          cg.g_save_standard_registers(list);
+           cg.g_save_standard_registers(list);
 
 
         { a constructor needs a help procedure }
         { a constructor needs a help procedure }
         if (aktprocdef.proctypeoption=potype_constructor) then
         if (aktprocdef.proctypeoption=potype_constructor) then
@@ -1253,20 +1276,7 @@ implementation
            if ((procinfo^.flags and pi_needs_implicit_finally)<>0) and
            if ((procinfo^.flags and pi_needs_implicit_finally)<>0) and
               { but it's useless in init/final code of units }
               { but it's useless in init/final code of units }
               not(aktprocdef.proctypeoption in [potype_unitfinalize,potype_unitinit]) then
               not(aktprocdef.proctypeoption in [potype_unitfinalize,potype_unitinit]) then
-            begin
-              include(rg.usedinproc,accumulator);
-
-              { allocate exception frame buffer }
-              cg.a_op_const_reg(list,OP_SUB,36,STACK_POINTER_REG);
-              tmpreg:=rg.getaddressregister(list);
-              cg.a_load_reg_reg(list,OS_ADDR,STACK_POINTER_REG,tmpreg);
-              reference_reset_base(tempbuf,tmpreg,0);
-              cg.g_push_exception(list,tempbuf,1,aktexitlabel);
-              reference_release(list,tempbuf);
-
-              { probably we've to reload self here }
-              cg.g_maybe_loadself(list);
-            end;
+             gen_exception_frame(list);
 
 
 {$ifdef GDB}
 {$ifdef GDB}
            if (cs_debuginfo in aktmoduleswitches) then
            if (cs_debuginfo in aktmoduleswitches) then
@@ -1628,7 +1638,11 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.27  2002-07-28 15:59:57  jonas
+  Revision 1.28  2002-07-29 21:23:42  florian
+    * more fixes for the ppc
+    + wrappers for the tcnvnode.first_* stuff introduced
+
+  Revision 1.27  2002/07/28 15:59:57  jonas
     * fixed bug in location_force_reg32() when converting smaller values to
     * fixed bug in location_force_reg32() when converting smaller values to
       64 bit locations
       64 bit locations
     * use cg.op_const_reg_reg() instead of a move and then cg.op_const_reg()
     * use cg.op_const_reg_reg() instead of a move and then cg.op_const_reg()
@@ -1762,4 +1776,4 @@ end.
   Revision 1.2  2002/03/04 19:10:11  peter
   Revision 1.2  2002/03/04 19:10:11  peter
     * removed compiler warnings
     * removed compiler warnings
 
 
-}
+}

+ 154 - 27
compiler/ncnv.pas

@@ -81,6 +81,30 @@ interface
           function first_char_to_char : tnode;virtual;
           function first_char_to_char : tnode;virtual;
           function first_call_helper(c : tconverttype) : tnode;
           function first_call_helper(c : tconverttype) : tnode;
 
 
+          { these wrapper are necessary, because the first_* stuff is called }
+          { through a table. Without the wrappers override wouldn't have     }
+          { any effect                                                       }
+          function _first_int_to_int : tnode;
+          function _first_cstring_to_pchar : tnode;
+          function _first_string_to_chararray : tnode;
+          function _first_char_to_string : tnode;
+          function _first_nothing : tnode;
+          function _first_array_to_pointer : tnode;
+          function _first_int_to_real : tnode;
+          function _first_real_to_real : tnode;
+          function _first_pointer_to_array : tnode;
+          function _first_cchar_to_pchar : tnode;
+          function _first_bool_to_int : tnode;
+          function _first_int_to_bool : tnode;
+          function _first_bool_to_bool : tnode;
+          function _first_proc_to_procvar : tnode;
+          function _first_load_smallset : tnode;
+          function _first_cord_to_pointer : tnode;
+          function _first_ansistring_to_pchar : tnode;
+          function _first_arrayconstructor_to_set : tnode;
+          function _first_class_to_intf : tnode;
+          function _first_char_to_char : tnode;
+
           procedure second_int_to_int;virtual;abstract;
           procedure second_int_to_int;virtual;abstract;
           procedure second_string_to_string;virtual;abstract;
           procedure second_string_to_string;virtual;abstract;
           procedure second_cstring_to_pchar;virtual;abstract;
           procedure second_cstring_to_pchar;virtual;abstract;
@@ -1485,40 +1509,139 @@ implementation
            registers32:=1;
            registers32:=1;
       end;
       end;
 
 
+    function ttypeconvnode._first_int_to_int : tnode;
+      begin
+         result:=first_int_to_int;
+      end;
+
+    function ttypeconvnode._first_cstring_to_pchar : tnode;
+      begin
+         result:=first_cstring_to_pchar;
+      end;
+
+    function ttypeconvnode._first_string_to_chararray : tnode;
+      begin
+         result:=first_string_to_chararray;
+      end;
+
+    function ttypeconvnode._first_char_to_string : tnode;
+      begin
+         result:=first_char_to_string;
+      end;
+
+    function ttypeconvnode._first_nothing : tnode;
+      begin
+         result:=first_nothing;
+      end;
+
+    function ttypeconvnode._first_array_to_pointer : tnode;
+      begin
+         result:=first_array_to_pointer;
+      end;
+
+    function ttypeconvnode._first_int_to_real : tnode;
+      begin
+         result:=first_int_to_real;
+      end;
+
+    function ttypeconvnode._first_real_to_real : tnode;
+      begin
+         result:=first_real_to_real;
+      end;
+
+    function ttypeconvnode._first_pointer_to_array : tnode;
+      begin
+         result:=first_pointer_to_array;
+      end;
+
+    function ttypeconvnode._first_cchar_to_pchar : tnode;
+      begin
+         result:=first_cchar_to_pchar;
+      end;
+
+    function ttypeconvnode._first_bool_to_int : tnode;
+      begin
+         result:=first_bool_to_int;
+      end;
+
+    function ttypeconvnode._first_int_to_bool : tnode;
+      begin
+         result:=first_int_to_bool;
+      end;
+
+    function ttypeconvnode._first_bool_to_bool : tnode;
+      begin
+         result:=first_bool_to_bool;
+      end;
+
+    function ttypeconvnode._first_proc_to_procvar : tnode;
+      begin
+         result:=first_proc_to_procvar;
+      end;
+
+    function ttypeconvnode._first_load_smallset : tnode;
+      begin
+         result:=first_load_smallset;
+      end;
+
+    function ttypeconvnode._first_cord_to_pointer : tnode;
+      begin
+         result:=first_cord_to_pointer;
+      end;
+
+    function ttypeconvnode._first_ansistring_to_pchar : tnode;
+      begin
+         result:=first_ansistring_to_pchar;
+      end;
+
+    function ttypeconvnode._first_arrayconstructor_to_set : tnode;
+      begin
+         result:=first_arrayconstructor_to_set;
+      end;
+
+    function ttypeconvnode._first_class_to_intf : tnode;
+      begin
+         result:=first_class_to_intf;
+      end;
+
+    function ttypeconvnode._first_char_to_char : tnode;
+      begin
+         result:=first_char_to_char;
+      end;
 
 
     function ttypeconvnode.first_call_helper(c : tconverttype) : tnode;
     function ttypeconvnode.first_call_helper(c : tconverttype) : tnode;
 
 
       const
       const
          firstconvert : array[tconverttype] of pointer = (
          firstconvert : array[tconverttype] of pointer = (
-           @ttypeconvnode.first_nothing, {equal}
-           @ttypeconvnode.first_nothing, {not_possible}
+           @ttypeconvnode._first_nothing, {equal}
+           @ttypeconvnode._first_nothing, {not_possible}
            nil, { removed in resulttype_string_to_string }
            nil, { removed in resulttype_string_to_string }
-           @ttypeconvnode.first_char_to_string,
-           @ttypeconvnode.first_nothing, { char_2_chararray, needs nothing extra }
+           @ttypeconvnode._first_char_to_string,
+           @ttypeconvnode._first_nothing, { char_2_chararray, needs nothing extra }
            nil, { removed in resulttype_chararray_to_string }
            nil, { removed in resulttype_chararray_to_string }
-           @ttypeconvnode.first_cchar_to_pchar,
-           @ttypeconvnode.first_cstring_to_pchar,
-           @ttypeconvnode.first_ansistring_to_pchar,
-           @ttypeconvnode.first_string_to_chararray,
+           @ttypeconvnode._first_cchar_to_pchar,
+           @ttypeconvnode._first_cstring_to_pchar,
+           @ttypeconvnode._first_ansistring_to_pchar,
+           @ttypeconvnode._first_string_to_chararray,
            nil, { removed in resulttype_chararray_to_string }
            nil, { removed in resulttype_chararray_to_string }
-           @ttypeconvnode.first_array_to_pointer,
-           @ttypeconvnode.first_pointer_to_array,
-           @ttypeconvnode.first_int_to_int,
-           @ttypeconvnode.first_int_to_bool,
-           @ttypeconvnode.first_bool_to_bool,
-           @ttypeconvnode.first_bool_to_int,
-           @ttypeconvnode.first_real_to_real,
-           @ttypeconvnode.first_int_to_real,
-           @ttypeconvnode.first_proc_to_procvar,
-           @ttypeconvnode.first_arrayconstructor_to_set,
-           @ttypeconvnode.first_load_smallset,
-           @ttypeconvnode.first_cord_to_pointer,
-           @ttypeconvnode.first_nothing,
-           @ttypeconvnode.first_nothing,
-           @ttypeconvnode.first_class_to_intf,
-           @ttypeconvnode.first_char_to_char,
-           @ttypeconvnode.first_nothing,
-           @ttypeconvnode.first_nothing
+           @ttypeconvnode._first_array_to_pointer,
+           @ttypeconvnode._first_pointer_to_array,
+           @ttypeconvnode._first_int_to_int,
+           @ttypeconvnode._first_int_to_bool,
+           @ttypeconvnode._first_bool_to_bool,
+           @ttypeconvnode._first_bool_to_int,
+           @ttypeconvnode._first_real_to_real,
+           @ttypeconvnode._first_int_to_real,
+           @ttypeconvnode._first_proc_to_procvar,
+           @ttypeconvnode._first_arrayconstructor_to_set,
+           @ttypeconvnode._first_load_smallset,
+           @ttypeconvnode._first_cord_to_pointer,
+           @ttypeconvnode._first_nothing,
+           @ttypeconvnode._first_nothing,
+           @ttypeconvnode._first_class_to_intf,
+           @ttypeconvnode._first_char_to_char,
+           @ttypeconvnode._first_nothing,
+           @ttypeconvnode._first_nothing
          );
          );
       type
       type
          tprocedureofobject = function : tnode of object;
          tprocedureofobject = function : tnode of object;
@@ -1770,7 +1893,11 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.64  2002-07-23 12:34:30  daniel
+  Revision 1.65  2002-07-29 21:23:42  florian
+    * more fixes for the ppc
+    + wrappers for the tcnvnode.first_* stuff introduced
+
+  Revision 1.64  2002/07/23 12:34:30  daniel
   * Readded old set code. To use it define 'oldset'. Activated by default
   * Readded old set code. To use it define 'oldset'. Activated by default
     for ppc.
     for ppc.
 
 

+ 29 - 25
compiler/ninl.pas

@@ -2259,94 +2259,94 @@ implementation
       begin
       begin
         { create the call to the helper }
         { create the call to the helper }
         first_pi := ccallnode.createintern('fpc_pi',nil);
         first_pi := ccallnode.createintern('fpc_pi',nil);
-        { now left is nil, nothing left, so no second pass 
+        { now left is nil, nothing left, so no second pass
           required.
           required.
-        }        
+        }
         left := nil;
         left := nil;
       end;
       end;
-      
-      
+
+
      function tinlinenode.first_arctan_real : tnode;
      function tinlinenode.first_arctan_real : tnode;
       begin
       begin
         { create the call to the helper }
         { create the call to the helper }
         { on entry left node contains the parameter }
         { on entry left node contains the parameter }
         first_arctan_real := ccallnode.createintern('fpc_arctan_real',
         first_arctan_real := ccallnode.createintern('fpc_arctan_real',
                 ccallparanode.create(left,nil));
                 ccallparanode.create(left,nil));
-        { now left is nil, nothing left, so no second pass 
+        { now left is nil, nothing left, so no second pass
           required.
           required.
-        }        
+        }
         left := nil;
         left := nil;
       end;
       end;
-      
+
      function tinlinenode.first_abs_real : tnode;
      function tinlinenode.first_abs_real : tnode;
       begin
       begin
         { create the call to the helper }
         { create the call to the helper }
         { on entry left node contains the parameter }
         { on entry left node contains the parameter }
         first_abs_real := ccallnode.createintern('fpc_abs_real',
         first_abs_real := ccallnode.createintern('fpc_abs_real',
                 ccallparanode.create(left,nil));
                 ccallparanode.create(left,nil));
-        { now left is nil, nothing left, so no second pass 
+        { now left is nil, nothing left, so no second pass
           required.
           required.
-        }        
+        }
         left := nil;
         left := nil;
       end;
       end;
-      
+
      function tinlinenode.first_sqr_real : tnode;
      function tinlinenode.first_sqr_real : tnode;
       begin
       begin
         { create the call to the helper }
         { create the call to the helper }
         { on entry left node contains the parameter }
         { on entry left node contains the parameter }
         first_sqr_real := ccallnode.createintern('fpc_sqr_real',
         first_sqr_real := ccallnode.createintern('fpc_sqr_real',
                 ccallparanode.create(left,nil));
                 ccallparanode.create(left,nil));
-        { now left is nil, nothing left, so no second pass 
+        { now left is nil, nothing left, so no second pass
           required.
           required.
-        }        
+        }
         left := nil;
         left := nil;
       end;
       end;
-      
+
      function tinlinenode.first_sqrt_real : tnode;
      function tinlinenode.first_sqrt_real : tnode;
       begin
       begin
         { create the call to the helper }
         { create the call to the helper }
         { on entry left node contains the parameter }
         { on entry left node contains the parameter }
         first_sqrt_real := ccallnode.createintern('fpc_sqrt_real',
         first_sqrt_real := ccallnode.createintern('fpc_sqrt_real',
                 ccallparanode.create(left,nil));
                 ccallparanode.create(left,nil));
-        { now left is nil, nothing left, so no second pass 
+        { now left is nil, nothing left, so no second pass
           required.
           required.
-        }        
+        }
         left := nil;
         left := nil;
       end;
       end;
-      
+
      function tinlinenode.first_ln_real : tnode;
      function tinlinenode.first_ln_real : tnode;
       begin
       begin
         { create the call to the helper }
         { create the call to the helper }
         { on entry left node contains the parameter }
         { on entry left node contains the parameter }
         first_ln_real := ccallnode.createintern('fpc_ln_real',
         first_ln_real := ccallnode.createintern('fpc_ln_real',
                 ccallparanode.create(left,nil));
                 ccallparanode.create(left,nil));
-        { now left is nil, nothing left, so no second pass 
+        { now left is nil, nothing left, so no second pass
           required.
           required.
-        }        
+        }
         left := nil;
         left := nil;
       end;
       end;
-      
+
      function tinlinenode.first_cos_real : tnode;
      function tinlinenode.first_cos_real : tnode;
       begin
       begin
         { create the call to the helper }
         { create the call to the helper }
         { on entry left node contains the parameter }
         { on entry left node contains the parameter }
         first_cos_real := ccallnode.createintern('fpc_cos_real',
         first_cos_real := ccallnode.createintern('fpc_cos_real',
                 ccallparanode.create(left,nil));
                 ccallparanode.create(left,nil));
-        { now left is nil, nothing left, so no second pass 
+        { now left is nil, nothing left, so no second pass
           required.
           required.
-        }        
+        }
         left := nil;
         left := nil;
       end;
       end;
-      
+
      function tinlinenode.first_sin_real : tnode;
      function tinlinenode.first_sin_real : tnode;
       begin
       begin
         { create the call to the helper }
         { create the call to the helper }
         { on entry left node contains the parameter }
         { on entry left node contains the parameter }
         first_sin_real := ccallnode.createintern('fpc_sin_real',
         first_sin_real := ccallnode.createintern('fpc_sin_real',
                 ccallparanode.create(left,nil));
                 ccallparanode.create(left,nil));
-        { now left is nil, nothing left, so no second pass 
+        { now left is nil, nothing left, so no second pass
           required.
           required.
-        }        
+        }
         left := nil;
         left := nil;
       end;
       end;
 
 
@@ -2356,7 +2356,11 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.81  2002-07-26 12:28:50  jonas
+  Revision 1.82  2002-07-29 21:23:43  florian
+    * more fixes for the ppc
+    + wrappers for the tcnvnode.first_* stuff introduced
+
+  Revision 1.81  2002/07/26 12:28:50  jonas
     * don't always convert the second argument of inc/dec to a longint, but
     * don't always convert the second argument of inc/dec to a longint, but
       to a type based on the first argument
       to a type based on the first argument
 
 

+ 8 - 2
compiler/pdecl.pas

@@ -54,7 +54,7 @@ implementation
        { aasm }
        { aasm }
        aasmbase,aasmtai,aasmcpu,fmodule,
        aasmbase,aasmtai,aasmcpu,fmodule,
        { symtable }
        { symtable }
-       symconst,symbase,symtype,symdef,symtable,
+       symconst,symbase,symtype,symdef,symtable,paramgr,
        { pass 1 }
        { pass 1 }
        nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,nobj,
        nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,nobj,
        { parser }
        { parser }
@@ -215,6 +215,7 @@ implementation
                        end;
                        end;
                       { add default calling convention }
                       { add default calling convention }
                       handle_calling_convention(nil,tabstractprocdef(tt.def));
                       handle_calling_convention(nil,tabstractprocdef(tt.def));
+                      paramanager.create_param_loc_info(tabstractprocdef(tt.def));
                     end;
                     end;
                    if not skipequal then
                    if not skipequal then
                     begin
                     begin
@@ -472,6 +473,7 @@ implementation
                         consume(_SEMICOLON);
                         consume(_SEMICOLON);
                        parse_var_proc_directives(tsym(newtype));
                        parse_var_proc_directives(tsym(newtype));
                      end;
                      end;
+                    paramanager.create_param_loc_info(tabstractprocdef(tt.def));
                   end;
                   end;
                 objectdef,
                 objectdef,
                 recorddef :
                 recorddef :
@@ -611,7 +613,11 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.48  2002-07-01 18:46:25  peter
+  Revision 1.49  2002-07-29 21:23:43  florian
+    * more fixes for the ppc
+    + wrappers for the tcnvnode.first_* stuff introduced
+
+  Revision 1.48  2002/07/01 18:46:25  peter
     * internal linker
     * internal linker
     * reorganized aasm layer
     * reorganized aasm layer
 
 

+ 7 - 2
compiler/pdecvar.pas

@@ -39,7 +39,7 @@ implementation
        globtype,globals,tokens,verbose,
        globtype,globals,tokens,verbose,
        systems,
        systems,
        { symtable }
        { symtable }
-       symconst,symbase,symtype,symdef,symsym,symtable,defbase,fmodule,
+       symconst,symbase,symtype,symdef,symsym,symtable,defbase,fmodule,paramgr,
        { pass 1 }
        { pass 1 }
        node,
        node,
        nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,
        nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,
@@ -334,6 +334,7 @@ implementation
                begin
                begin
                   newtype:=ttypesym.create('unnamed',tt);
                   newtype:=ttypesym.create('unnamed',tt);
                   parse_var_proc_directives(tsym(newtype));
                   parse_var_proc_directives(tsym(newtype));
+                  paramanager.create_param_loc_info(tabstractprocdef(tt.def));
                   newtype.restype.def:=nil;
                   newtype.restype.def:=nil;
                   tt.def.typesym:=nil;
                   tt.def.typesym:=nil;
                   newtype.free;
                   newtype.free;
@@ -583,7 +584,11 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.29  2002-07-26 21:15:40  florian
+  Revision 1.30  2002-07-29 21:23:44  florian
+    * more fixes for the ppc
+    + wrappers for the tcnvnode.first_* stuff introduced
+
+  Revision 1.29  2002/07/26 21:15:40  florian
     * rewrote the system handling
     * rewrote the system handling
 
 
   Revision 1.28  2002/07/20 11:57:55  florian
   Revision 1.28  2002/07/20 11:57:55  florian

+ 57 - 6
compiler/powerpc/cgcpu.pas

@@ -44,6 +44,7 @@ unit cgcpu;
 
 
 
 
         procedure a_call_name(list : taasmoutput;const s : string);override;
         procedure a_call_name(list : taasmoutput;const s : string);override;
+        procedure a_call_ref(list : taasmoutput;const ref : treference);override;
 
 
         procedure a_op_const_reg(list : taasmoutput; Op: TOpCG; a: AWord; reg: TRegister); override;
         procedure a_op_const_reg(list : taasmoutput; Op: TOpCG; a: AWord; reg: TRegister); override;
         procedure a_op_reg_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; src, dst: TRegister); override;
         procedure a_op_reg_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; src, dst: TRegister); override;
@@ -91,6 +92,13 @@ unit cgcpu;
         { that's the case, we can use rlwinm to do an AND operation        }
         { that's the case, we can use rlwinm to do an AND operation        }
         function get_rlwi_const(a: longint; var l1, l2: longint): boolean;
         function get_rlwi_const(a: longint; var l1, l2: longint): boolean;
 
 
+        procedure g_push_exception(list : taasmoutput;const exceptbuf:treference;l:AWord; exceptlabel:TAsmLabel);override;
+        procedure g_pop_exception(list : taasmoutput;endexceptlabel:tasmlabel);override;
+
+        procedure g_save_standard_registers(list : taasmoutput);override;
+        procedure g_restore_standard_registers(list : taasmoutput);override;
+        procedure g_save_all_registers(list : taasmoutput);override;
+        procedure g_restore_all_registers(list : taasmoutput;selfused,accused,acchiused:boolean);override;
         private
         private
 
 
         procedure a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: tasmlabel);
         procedure a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: tasmlabel);
@@ -201,7 +209,11 @@ const
                  internalerror(2002072801);
                  internalerror(2002072801);
             end;
             end;
           else
           else
-            internalerror(2002081103);
+            begin
+               runerror(216);
+               writeln(ord(locpara.loc));
+               internalerror(2002081103);
+            end;
         end;
         end;
         if locpara.sp_fixup<>0 then
         if locpara.sp_fixup<>0 then
           internalerror(2002081104);
           internalerror(2002081104);
@@ -231,15 +243,14 @@ const
   {$endif para_sizes_known}
   {$endif para_sizes_known}
       end;
       end;
 
 
-{ calling a code fragment by name }
-
+    { calling a code fragment by name }
     procedure tcgppc.a_call_name(list : taasmoutput;const s : string);
     procedure tcgppc.a_call_name(list : taasmoutput;const s : string);
 
 
       var
       var
         href : treference;
         href : treference;
       begin
       begin
- { save our RTOC register value. Only necessary when doing pointer based    }
- { calls or cross TOC calls, but currently done always                      }
+         { save our RTOC register value. Only necessary when doing pointer based    }
+         { calls or cross TOC calls, but currently done always                      }
          reference_reset_base(href,STACK_POINTER_REG,LA_RTOC);
          reference_reset_base(href,STACK_POINTER_REG,LA_RTOC);
          list.concat(taicpu.op_reg_ref(A_STW,R_TOC,href));
          list.concat(taicpu.op_reg_ref(A_STW,R_TOC,href));
          list.concat(taicpu.op_sym(A_BL,newasmsymbol(s)));
          list.concat(taicpu.op_sym(A_BL,newasmsymbol(s)));
@@ -247,6 +258,12 @@ const
          list.concat(taicpu.op_reg_ref(A_LWZ,R_TOC,href));
          list.concat(taicpu.op_reg_ref(A_LWZ,R_TOC,href));
       end;
       end;
 
 
+    { calling a code fragment through a reference }
+    procedure tcgppc.a_call_ref(list : taasmoutput;const ref : treference);
+      begin
+         {$warning FIX ME}
+      end;
+
 {********************** load instructions ********************}
 {********************** load instructions ********************}
 
 
      procedure tcgppc.a_load_const_reg(list : taasmoutput; size: TCGSize; a : aword; reg : TRegister);
      procedure tcgppc.a_load_const_reg(list : taasmoutput; size: TCGSize; a : aword; reg : TRegister);
@@ -626,6 +643,36 @@ const
         end;
         end;
 
 
 
 
+     procedure tcgppc.g_push_exception(list : taasmoutput;const exceptbuf:treference;l:AWord; exceptlabel:TAsmLabel);
+       begin
+         {$warning FIX ME}
+       end;
+
+     procedure tcgppc.g_pop_exception(list : taasmoutput;endexceptlabel:tasmlabel);
+       begin
+         {$warning FIX ME}
+       end;
+
+     procedure tcgppc.g_save_standard_registers(list : taasmoutput);
+       begin
+         {$warning FIX ME}
+       end;
+
+     procedure tcgppc.g_restore_standard_registers(list : taasmoutput);
+       begin
+         {$warning FIX ME}
+       end;
+
+     procedure tcgppc.g_save_all_registers(list : taasmoutput);
+       begin
+         {$warning FIX ME}
+       end;
+
+     procedure tcgppc.g_restore_all_registers(list : taasmoutput;selfused,accused,acchiused:boolean);
+       begin
+         {$warning FIX ME}
+       end;
+
      procedure tcgppc.a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: tasmlabel);
      procedure tcgppc.a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: tasmlabel);
 
 
        begin
        begin
@@ -1410,7 +1457,11 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.29  2002-07-28 21:38:30  florian
+  Revision 1.30  2002-07-29 21:23:44  florian
+    * more fixes for the ppc
+    + wrappers for the tcnvnode.first_* stuff introduced
+
+  Revision 1.29  2002/07/28 21:38:30  florian
     - removed debug code which was commited by accident
     - removed debug code which was commited by accident
 
 
   Revision 1.28  2002/07/28 21:34:31  florian
   Revision 1.28  2002/07/28 21:34:31  florian

+ 6 - 1
compiler/powerpc/nppccnv.pas

@@ -85,6 +85,7 @@ implementation
               fname := 'fpc_qword_to_double';
               fname := 'fpc_qword_to_double';
             result := ccallnode.createintern(fname,ccallparanode.create(
             result := ccallnode.createintern(fname,ccallparanode.create(
               left,nil));
               left,nil));
+            left:=nil;
             firstpass(result);
             firstpass(result);
             exit;
             exit;
           end
           end
@@ -416,7 +417,11 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.18  2002-07-29 09:20:20  jonas
+  Revision 1.19  2002-07-29 21:23:44  florian
+    * more fixes for the ppc
+    + wrappers for the tcnvnode.first_* stuff introduced
+
+  Revision 1.18  2002/07/29 09:20:20  jonas
     + second_int_to_int implementation which is almost the same as the
     + second_int_to_int implementation which is almost the same as the
       generic implementation, but it avoids some unnecessary type conversions
       generic implementation, but it avoids some unnecessary type conversions