Ver Fonte

* load_frame_pointer is now generic
* change fpu emulation routine names

carl há 22 anos atrás
pai
commit
ce2b1f45ef
2 ficheiros alterados com 64 adições e 13 exclusões
  1. 15 11
      compiler/nadd.pas
  2. 49 2
      compiler/ncgcal.pas

+ 15 - 11
compiler/nadd.pas

@@ -1552,26 +1552,26 @@ implementation
           exit;
 
         case nodetype of
-          addn : procname := 'float32_add';
-          muln : procname := 'float32_mul';
-          subn : procname := 'float32_sub';
-          slashn : procname := 'float32_div';
-          ltn : procname := 'float32_lt';
-          lten: procname := 'float32_le';
+          addn : procname := 'fpc_float32_add';
+          muln : procname := 'fpc_float32_mul';
+          subn : procname := 'fpc_float32_sub';
+          slashn : procname := 'fpc_float32_div';
+          ltn : procname := 'fpc_float32_lt';
+          lten: procname := 'fpc_float32_le';
           gtn:
             begin
-             procname := 'float32_le';
+             procname := 'fpc_float32_le';
              notnode := true;
             end;
           gten:
             begin
-              procname := 'float32_lt';
+              procname := 'fpc_float32_lt';
               notnode := true;
             end;
-          equaln: procname := 'float32_eq';
+          equaln: procname := 'fpc_float32_eq';
           unequaln :
             begin
-              procname := 'float32_eq';
+              procname := 'fpc_float32_eq';
               notnode := true;
             end;
           else
@@ -1931,7 +1931,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.79  2003-01-02 22:19:54  peter
+  Revision 1.80  2003-02-12 22:10:07  carl
+    * load_frame_pointer is now generic
+    * change fpu emulation routine names
+
+  Revision 1.79  2003/01/02 22:19:54  peter
     * support pchar-char operations converting to string first
     * support chararray-nil
 

+ 49 - 2
compiler/ncgcal.pas

@@ -44,7 +44,16 @@ interface
           funcretref : treference;
           refcountedtemp : treference;
           procedure handle_return_value(inlined,extended_new:boolean);
-          procedure load_framepointer;virtual;abstract;
+          {# This routine is used to push the current frame pointer 
+             on the stack. This is used in nested routines where the
+             value of the frame pointer is always pushed as an extra
+             parameter.
+             
+             The default handling is the standard handling used on
+             most stack based machines, where the frame pointer is
+             the first invisible parameter.
+          }
+          procedure load_framepointer;virtual;
           procedure extra_interrupt_code;virtual;
        public
           procedure pass_2;override;
@@ -322,6 +331,40 @@ implementation
          emit_reg(A_PUSH,S_L,r);
 {$endif i386}
       end;
+      
+      
+      procedure tcgcallnode.load_framepointer;
+        var href : treference;
+            hregister : tregister;
+            i: integer; 
+        begin
+          { this routine is itself not nested }
+          if lexlevel=(tprocdef(procdefinition).parast.symtablelevel) then
+            begin
+              reference_reset_base(href,procinfo.framepointer,procinfo.framepointer_offset);
+              cg.a_param_ref(exprasmlist,OS_ADDR,href,paramanager.getintparaloc(1));
+            end
+          { one nesting level }
+          else if (lexlevel=(tprocdef(procdefinition).parast.symtablelevel)-1) then
+            begin
+              cg.a_param_reg(exprasmlist,OS_ADDR,procinfo.framepointer,paramanager.getintparaloc(1));
+            end
+          { very complex nesting level ... }  
+          else if (lexlevel>(tprocdef(procdefinition).parast.symtablelevel)) then
+            begin
+              hregister:=rg.getaddressregister(exprasmlist);
+              reference_reset_base(href,procinfo.framepointer,procinfo.framepointer_offset);
+              cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
+              for i:=(tprocdef(procdefinition).parast.symtablelevel) to lexlevel-1 do
+                begin
+                  reference_reset_base(href,hregister,procinfo.framepointer_offset);
+                  cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
+                end;
+              cg.a_param_reg(exprasmlist,OS_ADDR,hregister,paramanager.getintparaloc(1));
+              rg.ungetaddressregister(exprasmlist,hregister);
+            end;
+        end;
+      
 
 
 
@@ -1579,7 +1622,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.36  2003-01-30 21:46:57  peter
+  Revision 1.37  2003-02-12 22:10:07  carl
+    * load_frame_pointer is now generic
+    * change fpu emulation routine names
+
+  Revision 1.36  2003/01/30 21:46:57  peter
     * self fixes for static methods (merged)
 
   Revision 1.35  2003/01/22 20:45:15  mazen