Browse Source

* making math code in RTL compiling.
*NB : This does NOT mean necessary that it will generate correct code!

mazen 22 years ago
parent
commit
07a21319b9
5 changed files with 123 additions and 97 deletions
  1. 8 4
      compiler/ncgcal.pas
  2. 7 3
      compiler/sparc/cpunode.pas
  3. 13 3
      compiler/sparc/ncpuadd.pas
  4. 6 2
      compiler/sparc/ncpucnv.pas
  5. 89 85
      rtl/sparc/math.inc

+ 8 - 4
compiler/ncgcal.pas

@@ -1052,16 +1052,16 @@ implementation
                      cg.a_call_ref(exprasmlist,href);
                      cg.a_call_ref(exprasmlist,href);
                      cg.free_scratch_reg(exprasmlist,tmpreg);
                      cg.free_scratch_reg(exprasmlist,tmpreg);
                   end;
                   end;
-
+{$ifndef SPARC}{We don't need that on SPARC arch!}
               { push base pointer ?}
               { push base pointer ?}
               { never when inlining, since if necessary, the base pointer }
               { never when inlining, since if necessary, the base pointer }
               { can/will be gottten from the current procedure's symtable }
               { can/will be gottten from the current procedure's symtable }
-              { (JM)                                                      }
+              { (JM)}
               if not inlined then
               if not inlined then
                 if (lexlevel>=normal_function_level) and assigned(tprocdef(procdefinition).parast) and
                 if (lexlevel>=normal_function_level) and assigned(tprocdef(procdefinition).parast) and
                   ((tprocdef(procdefinition).parast.symtablelevel)>normal_function_level) then
                   ((tprocdef(procdefinition).parast.symtablelevel)>normal_function_level) then
                   load_framepointer;
                   load_framepointer;
-
+{$endif SPARC}
               rg.saveregvars(exprasmlist,regs_to_push);
               rg.saveregvars(exprasmlist,regs_to_push);
 
 
 {$ifdef dummy}
 {$ifdef dummy}
@@ -1572,7 +1572,11 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.34  2003-01-17 12:03:45  daniel
+  Revision 1.35  2003-01-22 20:45:15  mazen
+  * making math code in RTL compiling.
+  *NB : This does NOT mean necessary that it will generate correct code!
+
+  Revision 1.34  2003/01/17 12:03:45  daniel
     * Optalign conditional code adapted to record Tregister
     * Optalign conditional code adapted to record Tregister
 
 
   Revision 1.33  2003/01/08 18:43:56  daniel
   Revision 1.33  2003/01/08 18:43:56  daniel

+ 7 - 3
compiler/sparc/cpunode.pas

@@ -28,14 +28,18 @@ the behaviour of such a unit having just a USES clause!}
 implementation
 implementation
 uses
 uses
   ncgbas,ncgflw,ncgcnv,ncgld,ncgmem,ncgcon,{ncgset,}
   ncgbas,ncgflw,ncgcnv,ncgld,ncgmem,ncgcon,{ncgset,}
-  ncpuadd,ncpucall,{n386con,n386cnv,n386flw,}ncpumat,{n386mem,}
-  {n386set,}ncpuinln,{n386opt,}ncpucnv,
+  ncpuadd,ncpucall,{n386con,n386flw,}ncpumat,{n386mem,}
+  ncgset,ncpuinln,{n386opt,}ncpucnv,
   { this not really a node }
   { this not really a node }
   {ncpuobj,}rgcpu;
   {ncpuobj,}rgcpu;
 end.
 end.
 {
 {
     $Log$
     $Log$
-    Revision 1.6  2002-12-21 23:21:47  mazen
+    Revision 1.7  2003-01-22 20:45:15  mazen
+    * making math code in RTL compiling.
+    *NB : This does NOT mean necessary that it will generate correct code!
+
+    Revision 1.6  2002/12/21 23:21:47  mazen
     + added support for the shift nodes
     + added support for the shift nodes
     + added debug output on screen with -an command line option
     + added debug output on screen with -an command line option
 
 

+ 13 - 3
compiler/sparc/ncpuadd.pas

@@ -905,10 +905,16 @@ procedures }
       orddef:
       orddef:
         if is_boolean(left.resulttype.def)and is_boolean(right.resulttype.def)
         if is_boolean(left.resulttype.def)and is_boolean(right.resulttype.def)
         then{handling boolean expressions}
         then{handling boolean expressions}
-          second_addboolean
+          begin
+            second_addboolean;
+            exit;
+          end
         else if is_64bitint(left.resulttype.def)
         else if is_64bitint(left.resulttype.def)
         then{64bit operations}
         then{64bit operations}
-          second_add64bit;
+          begin
+            second_add64bit;
+            exit;
+          end;
       stringdef:
       stringdef:
         InternalError(20020726);//second_addstring;
         InternalError(20020726);//second_addstring;
       setdef:
       setdef:
@@ -1040,7 +1046,11 @@ begin
 end.
 end.
 {
 {
     $Log$
     $Log$
-    Revision 1.7  2003-01-20 22:21:36  mazen
+    Revision 1.8  2003-01-22 20:45:15  mazen
+    * making math code in RTL compiling.
+    *NB : This does NOT mean necessary that it will generate correct code!
+
+    Revision 1.7  2003/01/20 22:21:36  mazen
     * many stuff related to RTL fixed
     * many stuff related to RTL fixed
 
 
     Revision 1.6  2003/01/08 18:43:58  daniel
     Revision 1.6  2003/01/08 18:43:58  daniel

+ 6 - 2
compiler/sparc/ncpucnv.pas

@@ -246,7 +246,7 @@ procedure TSparctypeconvnode.second_int_to_real;
       tempconst.free;
       tempconst.free;
       location.register := rg.getregisterfpu(exprasmlist);
       location.register := rg.getregisterfpu(exprasmlist);
       {$WARNING FIXME what really should be done?}
       {$WARNING FIXME what really should be done?}
-      exprasmlist.concat(taicpu.op_reg_ref(A_LD,location.register,ref));
+      exprasmlist.concat(taicpu.op_Ref_Reg(A_LDF,Ref,location.register));
       tg.ungetiftemp(exprasmlist,ref);
       tg.ungetiftemp(exprasmlist,ref);
       exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,location.register,location.register,tmpfpureg));
       exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,location.register,location.register,tmpfpureg));
       rg.ungetregisterfpu(exprasmlist,tmpfpureg);
       rg.ungetregisterfpu(exprasmlist,tmpfpureg);
@@ -388,7 +388,11 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.10  2003-01-20 22:21:36  mazen
+  Revision 1.11  2003-01-22 20:45:15  mazen
+  * making math code in RTL compiling.
+  *NB : This does NOT mean necessary that it will generate correct code!
+
+  Revision 1.10  2003/01/20 22:21:36  mazen
   * many stuff related to RTL fixed
   * many stuff related to RTL fixed
 
 
   Revision 1.9  2002/12/05 14:28:03  florian
   Revision 1.9  2002/12/05 14:28:03  florian

+ 89 - 85
rtl/sparc/math.inc

@@ -15,6 +15,89 @@
 
 
  **********************************************************************}
  **********************************************************************}
 
 
+{****************************************************************************
+                         Int to real helpers
+ ****************************************************************************}
+
+const
+  longint_to_real_helper: int64 = $4330000080000000;
+  cardinal_to_real_helper: int64 = $430000000000000;
+  int_to_real_factor: double = double(high(cardinal))+1.0;
+
+function fpc_int64_to_double(i: int64): double; compilerproc;
+{assembler;}
+{ input: high(i) in r3, low(i) in r4 }
+{ output: double(i) in f0            }
+var
+  temp: packed record
+      case byte of
+        0: (l1,l2: cardinal);
+        1: (d: double);
+    end;
+begin{asm}
+(*           lis    r0,0x4330
+           stw    r0,temp
+           xoris  r3,r3,0x8000
+           stw    r3,4+temp
+           {$ifndef macos}
+           lis    r3,longint_to_real_helper@ha
+           lfd    f1,longint_to_real_helper@l(r3)
+           {$else}
+           lfd    f1,longint_to_real_helper(r2)
+           {$endif}
+           lfd    f0,temp
+           stw    r4,4+temp
+           fsub   f0,f0,f1
+           {$ifndef macos}
+           lis    r4,cardinal_to_real_helper@ha
+           lfd    f1,cardinal_to_real_helper@l(r4)
+           lis    r3,int_to_real_factor@ha
+           lfd    f3,temp
+           lfd    f2,int_to_real_factor@l(r3)
+           {$else}
+           lfd    f1,cardinal_to_real_helper(r2)
+           lfd    f3,temp
+           lfd    f2,int_to_real_factor(r2)
+           {$endif}
+           fsub   f3,f3,f1
+           fmadd  f1,f0,f2,f3*)
+end{ ['R0','R3','R4','F0','F1','F2','F3']};
+
+
+function fpc_qword_to_double(q: qword): double; compilerproc;
+{assembler;}
+{ input: high(q) in r3, low(q) in r4 }
+{ output: double(q) in f0            }
+var
+  temp: packed record
+      case byte of
+        0: (l1,l2: cardinal);
+        1: (d: double);
+    end;
+begin{asm}
+(*           lis    r0,0x4330
+           stw    r0,temp
+           stw    r3,4+temp
+           lfd    f0,temp
+           {$ifndef macos}
+           lis    r3,cardinal_to_real_helper@ha
+           lfd    f1,cardinal_to_real_helper@l(r3)
+           {$else}
+           lfd    f1,cardinal_to_real_helper(r2)
+           {$endif}
+           stw    r4,4+temp
+           fsub   f0,f0,f1
+           lfd    f3,temp
+           {$ifndef macos}
+           lis    r3,int_to_real_factor@ha
+           lfd    f2,int_to_real_factor@l(r3)
+           {$else}
+           lfd    f2,int_to_real_factor(r2)
+           {$endif}
+           fsub   f3,f3,f1
+           fmadd  f1,f0,f2,f3*)
+end{ ['R0','R3','F0','F1','F2','F3']};
+
 
 
 {****************************************************************************
 {****************************************************************************
                        EXTENDED data type routines
                        EXTENDED data type routines
@@ -137,7 +220,7 @@
 {****************************************************************************
 {****************************************************************************
                        Longint data type routines
                        Longint data type routines
  ****************************************************************************}
  ****************************************************************************}
-
+  {$define FPC_SYSTEM_HAS_POWER_INT64}
    function power(bas,expo : Int64) : Int64;
    function power(bas,expo : Int64) : Int64;
      begin
      begin
         if bas=0 then
         if bas=0 then
@@ -198,93 +281,14 @@
       end;
       end;
 
 
 
 
-{****************************************************************************
-                         Int to real helpers
- ****************************************************************************}
-
-const
-  longint_to_real_helper: int64 = $4330000080000000;
-  cardinal_to_real_helper: int64 = $430000000000000;
-  int_to_real_factor: double = double(high(cardinal))+1.0;
-
-function fpc_int64_to_double(i: int64): double; compilerproc;
-{assembler;}
-{ input: high(i) in r3, low(i) in r4 }
-{ output: double(i) in f0            }
-var
-  temp: packed record
-      case byte of
-        0: (l1,l2: cardinal);
-        1: (d: double);
-    end;
-begin{asm}
-(*           lis    r0,0x4330
-           stw    r0,temp
-           xoris  r3,r3,0x8000
-           stw    r3,4+temp
-           {$ifndef macos}
-           lis    r3,longint_to_real_helper@ha
-           lfd    f1,longint_to_real_helper@l(r3)
-           {$else}
-           lfd    f1,longint_to_real_helper(r2)
-           {$endif}
-           lfd    f0,temp
-           stw    r4,4+temp
-           fsub   f0,f0,f1
-           {$ifndef macos}
-           lis    r4,cardinal_to_real_helper@ha
-           lfd    f1,cardinal_to_real_helper@l(r4)
-           lis    r3,int_to_real_factor@ha
-           lfd    f3,temp
-           lfd    f2,int_to_real_factor@l(r3)
-           {$else}
-           lfd    f1,cardinal_to_real_helper(r2)
-           lfd    f3,temp
-           lfd    f2,int_to_real_factor(r2)
-           {$endif}
-           fsub   f3,f3,f1
-           fmadd  f1,f0,f2,f3*)
-end{ ['R0','R3','R4','F0','F1','F2','F3']};
-
-
-function fpc_qword_to_double(q: qword): double; compilerproc;
-{assembler;}
-{ input: high(q) in r3, low(q) in r4 }
-{ output: double(q) in f0            }
-var
-  temp: packed record
-      case byte of
-        0: (l1,l2: cardinal);
-        1: (d: double);
-    end;
-begin{asm}
-(*           lis    r0,0x4330
-           stw    r0,temp
-           stw    r3,4+temp
-           lfd    f0,temp
-           {$ifndef macos}
-           lis    r3,cardinal_to_real_helper@ha
-           lfd    f1,cardinal_to_real_helper@l(r3)
-           {$else}
-           lfd    f1,cardinal_to_real_helper(r2)
-           {$endif}
-           stw    r4,4+temp
-           fsub   f0,f0,f1
-           lfd    f3,temp
-           {$ifndef macos}
-           lis    r3,int_to_real_factor@ha
-           lfd    f2,int_to_real_factor@l(r3)
-           {$else}
-           lfd    f2,int_to_real_factor(r2)
-           {$endif}
-           fsub   f3,f3,f1
-           fmadd  f1,f0,f2,f3*)
-end{ ['R0','R3','F0','F1','F2','F3']};
-
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.2  2003-01-20 22:21:36  mazen
+  Revision 1.3  2003-01-22 20:45:15  mazen
+  * making math code in RTL compiling.
+  *NB : This does NOT mean necessary that it will generate correct code!
+
+  Revision 1.2  2003/01/20 22:21:36  mazen
   * many stuff related to RTL fixed
   * many stuff related to RTL fixed
 
 
   Revision 1.1  2002/12/24 21:30:20  mazen
   Revision 1.1  2002/12/24 21:30:20  mazen