瀏覽代碼

* more x86-64 fixes

florian 22 年之前
父節點
當前提交
0493cd3d2e
共有 6 個文件被更改,包括 66 次插入27 次删除
  1. 19 2
      compiler/i386/cgcpu.pas
  2. 10 3
      compiler/regvars.pas
  3. 4 16
      compiler/x86/cgx86.pas
  4. 20 2
      compiler/x86_64/cgcpu.pas
  5. 7 1
      compiler/x86_64/cpubase.inc
  6. 6 3
      compiler/x86_64/cpuswtch.pas

+ 19 - 2
compiler/i386/cgcpu.pas

@@ -40,7 +40,8 @@ unit cgcpu;
 
 
     type
     type
       tcg386 = class(tcgx86)
       tcg386 = class(tcgx86)
-      end;
+         class function reg_cgsize(const reg: tregister): tcgsize; override;
+     end;
 
 
       tcg64f386 = class(tcg64f32)
       tcg64f386 = class(tcg64f32)
         procedure a_op64_ref_reg(list : taasmoutput;op:TOpCG;const ref : treference;reg : tregister64);override;
         procedure a_op64_ref_reg(list : taasmoutput;op:TOpCG;const ref : treference;reg : tregister64);override;
@@ -59,6 +60,19 @@ unit cgcpu;
        rgobj,tgobj;
        rgobj,tgobj;
 
 
 
 
+    class function tcg386.reg_cgsize(const reg: tregister): tcgsize;
+      const
+        opsize_2_cgsize: array[topsize] of tcgsize = (OS_NO,
+          OS_8,OS_16,OS_32,OS_NO,OS_NO,OS_NO,
+          OS_32,OS_64,OS_64,
+          OS_F32,OS_F64,OS_F80,OS_F32,OS_F64,OS_NO,OS_NO,
+          OS_NO,OS_NO,OS_NO
+        );
+      begin
+        result := opsize_2_cgsize[reg2opsize(reg)];
+      end;
+
+
 { ************* 64bit operations ************ }
 { ************* 64bit operations ************ }
 
 
     procedure tcg64f386.get_64bit_ops(op:TOpCG;var op1,op2:TAsmOp);
     procedure tcg64f386.get_64bit_ops(op:TOpCG;var op1,op2:TAsmOp);
@@ -193,7 +207,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.37  2003-09-03 15:55:01  peter
+  Revision 1.38  2003-09-25 13:13:32  florian
+    * more x86-64 fixes
+
+  Revision 1.37  2003/09/03 15:55:01  peter
     * NEWRA branch merged
     * NEWRA branch merged
 
 
   Revision 1.36.2.1  2003/08/29 17:28:59  peter
   Revision 1.36.2.1  2003/08/29 17:28:59  peter

+ 10 - 3
compiler/regvars.pas

@@ -264,8 +264,12 @@ implementation
                        { reserve place on the FPU stack }
                        { reserve place on the FPU stack }
                        regvarinfo^.fpuregvars[i].localloc.register:=trgcpu(rg).correct_fpuregister(NR_ST0,i);
                        regvarinfo^.fpuregvars[i].localloc.register:=trgcpu(rg).correct_fpuregister(NR_ST0,i);
 {$else i386}
 {$else i386}
-                       regvarinfo^.fpuregvars[i].localloc.register:=fpuvarregs[i];
-                       rg.makeregvarother(regvarinfo^.fpuregvars[i].localloc.register);
+{$ifdef x86_64}
+{$endif x86_64}
+                       begin
+                         regvarinfo^.fpuregvars[i].localloc.register:=fpuvarregs[i];
+                         rg.makeregvarother(regvarinfo^.fpuregvars[i].localloc.register);
+                       end;
 {$endif i386}
 {$endif i386}
                      end;
                      end;
                   end;
                   end;
@@ -608,7 +612,10 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.66  2003-09-23 17:56:06  peter
+  Revision 1.67  2003-09-25 13:13:32  florian
+    * more x86-64 fixes
+
+  Revision 1.66  2003/09/23 17:56:06  peter
     * locals and paras are allocated in the code generation
     * locals and paras are allocated in the code generation
     * tvarsym.localloc contains the location of para/local when
     * tvarsym.localloc contains the location of para/local when
       generating code for the current procedure
       generating code for the current procedure

+ 4 - 16
compiler/x86/cgx86.pas

@@ -104,8 +104,6 @@ unit cgx86;
         procedure g_exception_reason_save_const(list : taasmoutput; const href : treference; a: aword);override;
         procedure g_exception_reason_save_const(list : taasmoutput; const href : treference; a: aword);override;
         procedure g_exception_reason_load(list : taasmoutput; const href : treference);override;
         procedure g_exception_reason_load(list : taasmoutput; const href : treference);override;
 
 
-        class function reg_cgsize(const reg: tregister): tcgsize; override;
-
         { entry/exit code helpers }
         { entry/exit code helpers }
         procedure g_copyvaluepara_openarray(list : taasmoutput;const ref, lenref:treference;elesize:integer);override;
         procedure g_copyvaluepara_openarray(list : taasmoutput;const ref, lenref:treference;elesize:integer);override;
         procedure g_interrupt_stackframe_entry(list : taasmoutput);override;
         procedure g_interrupt_stackframe_entry(list : taasmoutput);override;
@@ -330,19 +328,6 @@ unit cgx86;
                               Assembler code
                               Assembler code
 ****************************************************************************}
 ****************************************************************************}
 
 
-    class function tcgx86.reg_cgsize(const reg: tregister): tcgsize;
-      const
-        opsize_2_cgsize: array[topsize] of tcgsize = (OS_NO,
-          OS_8,OS_16,OS_32,OS_NO,OS_NO,OS_NO,
-          OS_32,OS_64,OS_64,
-          OS_F32,OS_F64,OS_F80,OS_F32,OS_F64,OS_NO,OS_NO,
-          OS_NO,OS_NO,OS_NO
-        );
-      begin
-        result := opsize_2_cgsize[reg2opsize(reg)];
-      end;
-
-
     { currently does nothing }
     { currently does nothing }
     procedure tcgx86.a_jmp_always(list : taasmoutput;l: tasmlabel);
     procedure tcgx86.a_jmp_always(list : taasmoutput;l: tasmlabel);
      begin
      begin
@@ -1622,7 +1607,10 @@ unit cgx86;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.64  2003-09-11 11:55:00  florian
+  Revision 1.65  2003-09-25 13:13:32  florian
+    * more x86-64 fixes
+
+  Revision 1.64  2003/09/11 11:55:00  florian
     * improved arm code generation
     * improved arm code generation
     * move some protected and private field around
     * move some protected and private field around
     * the temp. register for register parameters/arguments are now released
     * the temp. register for register parameters/arguments are now released

+ 20 - 2
compiler/x86_64/cgcpu.pas

@@ -36,7 +36,8 @@ unit cgcpu;
 
 
     type
     type
       tcgx86_64 = class(tcgx86)
       tcgx86_64 = class(tcgx86)
-         procedure g_concatcopy(list : taasmoutput;const source,dest : treference;len : aword; delsource,loadref : boolean);override;
+        class function reg_cgsize(const reg: tregister): tcgsize; override;
+        procedure g_concatcopy(list : taasmoutput;const source,dest : treference;len : aword; delsource,loadref : boolean);override;
       end;
       end;
 
 
   implementation
   implementation
@@ -46,6 +47,20 @@ unit cgcpu;
        symdef,symsym,defutil,paramgr,
        symdef,symsym,defutil,paramgr,
        rgobj,tgobj,rgcpu;
        rgobj,tgobj,rgcpu;
 
 
+
+    class function tcgx86_64.reg_cgsize(const reg: tregister): tcgsize;
+      const
+        opsize_2_cgsize: array[topsize] of tcgsize = (OS_NO,
+          OS_8,OS_16,OS_32,OS_NO,OS_NO,OS_NO,OS_NO,OS_NO,OS_NO,
+          OS_32,OS_64,OS_64,
+          OS_F32,OS_F64,OS_F80,OS_F32,OS_F64,OS_NO,OS_NO,
+          OS_NO,OS_NO,OS_NO
+        );
+      begin
+        result := opsize_2_cgsize[reg2opsize(reg)];
+      end;
+
+
     procedure tcgx86_64.g_concatcopy(list : taasmoutput;const source,dest : treference;len : aword; delsource,loadref : boolean);
     procedure tcgx86_64.g_concatcopy(list : taasmoutput;const source,dest : treference;len : aword; delsource,loadref : boolean);
       var
       var
          ecxpushed : boolean;
          ecxpushed : boolean;
@@ -177,7 +192,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.4  2003-04-30 15:45:35  florian
+  Revision 1.5  2003-09-25 13:13:32  florian
+    * more x86-64 fixes
+
+  Revision 1.4  2003/04/30 15:45:35  florian
     * merged more x86-64/i386 code
     * merged more x86-64/i386 code
 
 
   Revision 1.3  2003/01/05 13:36:54  florian
   Revision 1.3  2003/01/05 13:36:54  florian

+ 7 - 1
compiler/x86_64/cpubase.inc

@@ -73,6 +73,8 @@ const
          (RS_EBX,RS_EDX,RS_ECX,RS_EAX);
          (RS_EBX,RS_EDX,RS_ECX,RS_EAX);
 
 
       maxfpuvarregs = 8;
       maxfpuvarregs = 8;
+      fpuvarregs : Array [1..maxfpuvarregs] of Tsuperregister =
+                (RS_MM8,RS_MM9,RS_MM10,RS_MM11,RS_MM12,RS_MM13,RS_MM14,RS_MM15);
 
 
 {*****************************************************************************
 {*****************************************************************************
                                GDB Information
                                GDB Information
@@ -107,6 +109,7 @@ const
 *****************************************************************************}
 *****************************************************************************}
 
 
       {# Stack pointer register }
       {# Stack pointer register }
+      RS_STACK_POINTER_REG = RS_RSP;
       NR_STACK_POINTER_REG = NR_RSP;
       NR_STACK_POINTER_REG = NR_RSP;
       {# Frame pointer register }
       {# Frame pointer register }
       RS_FRAME_POINTER_REG = RS_EBP;
       RS_FRAME_POINTER_REG = RS_EBP;
@@ -155,7 +158,10 @@ const
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.7  2003-09-24 17:12:02  florian
+  Revision 1.8  2003-09-25 13:13:32  florian
+    * more x86-64 fixes
+
+  Revision 1.7  2003/09/24 17:12:02  florian
     * several fixes for new reg allocator
     * several fixes for new reg allocator
 
 
   Revision 1.6  2003/06/03 13:01:59  daniel
   Revision 1.6  2003/06/03 13:01:59  daniel

+ 6 - 3
compiler/x86_64/cpuswtch.pas

@@ -54,7 +54,7 @@ begin
                  '-' :
                  '-' :
                    begin
                    begin
                      initglobalswitches:=initglobalswitches-[cs_optimize,cs_fastoptimize,cs_slowoptimize,cs_littlesize,
                      initglobalswitches:=initglobalswitches-[cs_optimize,cs_fastoptimize,cs_slowoptimize,cs_littlesize,
-                       cs_regalloc,cs_uncertainopts];
+                       cs_regvars,cs_uncertainopts];
                      FillChar(ParaAlignment,sizeof(ParaAlignment),0);
                      FillChar(ParaAlignment,sizeof(ParaAlignment),0);
                    end;
                    end;
                  'a' :
                  'a' :
@@ -66,7 +66,7 @@ begin
                  'G' : initglobalswitches:=initglobalswitches-[cs_littlesize];
                  'G' : initglobalswitches:=initglobalswitches-[cs_littlesize];
                  'r' :
                  'r' :
                    begin
                    begin
-                     initglobalswitches:=initglobalswitches+[cs_regalloc];
+                     initglobalswitches:=initglobalswitches+[cs_regvars];
                      Simplify_ppu:=false;
                      Simplify_ppu:=false;
                    end;
                    end;
                  'u' : initglobalswitches:=initglobalswitches+[cs_uncertainopts];
                  'u' : initglobalswitches:=initglobalswitches+[cs_uncertainopts];
@@ -101,7 +101,10 @@ initialization
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.2  2002-08-10 14:53:38  carl
+  Revision 1.3  2003-09-25 13:13:32  florian
+    * more x86-64 fixes
+
+  Revision 1.2  2002/08/10 14:53:38  carl
     + moved target_cpu_string to cpuinfo
     + moved target_cpu_string to cpuinfo
     * renamed asmmode enum.
     * renamed asmmode enum.
     * assembler reader has now less ifdef's
     * assembler reader has now less ifdef's