فهرست منبع

* some changes to compile the new code generator

florian 26 سال پیش
والد
کامیت
9fd7385c65
5فایلهای تغییر یافته به همراه66 افزوده شده و 16 حذف شده
  1. 7 3
      compiler/cg386cnv.pas
  2. 33 8
      compiler/cgai386.pas
  3. 12 1
      compiler/new/nstatmnt.pas
  4. 5 2
      compiler/parser.pas
  5. 9 2
      compiler/version.pas

+ 7 - 3
compiler/cg386cnv.pas

@@ -339,11 +339,12 @@ implementation
               begin
                  exprasmlist^.concat(new(pai386,op_reg_reg(A_XOR,S_L,
                    hregister2,hregister2)));
-                 if (porddef(pto^.resulttype)^.typ=s64bitint) then
+                 if (porddef(pto^.resulttype)^.typ=s64bitint) and
+                   is_signed(pfrom^.resulttype) then
                    begin
                       getlabel(l);
                       exprasmlist^.concat(new(pai386,op_const_reg(A_TEST,S_L,
-                        $80000000,hregister)));
+                        $80000000,makereg32(hregister))));
                       emitjmp(C_Z,l);
                       exprasmlist^.concat(new(pai386,op_reg(A_NOT,S_L,
                         hregister2)));
@@ -1462,7 +1463,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.79  1999-07-22 09:37:34  florian
+  Revision 1.80  1999-08-01 23:36:38  florian
+    * some changes to compile the new code generator
+
+  Revision 1.79  1999/07/22 09:37:34  florian
     + resourcestring implemented
     + start of longstring support
 

+ 33 - 8
compiler/cgai386.pas

@@ -1098,16 +1098,37 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                      R_EAX,R_EBX,R_ECX,R_EDX,R_ESI,
                      R_EDI,R_ESP,R_EBP :
                         begin
-                          inc(pushedparasize,4);
-                          if inlined then
+                          if p^.resulttype^.size=8 then
                             begin
-                               r:=new_reference(procinfo.framepointer,para_offset-pushedparasize);
-                               exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,
-                                 p^.location.register,r)));
+                               inc(pushedparasize,8);
+                               if inlined then
+                                 begin
+                                    r:=new_reference(procinfo.framepointer,para_offset-pushedparasize);
+                                    exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,
+                                      p^.location.registerlow,r)));
+                                    r:=new_reference(procinfo.framepointer,para_offset-pushedparasize+4);
+                                    exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,
+                                      p^.location.registerhigh,r)));
+                                 end
+                               else
+                                 exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,p^.location.registerhigh)));
+                               ungetregister32(p^.location.registerhigh);
+                                 exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,p^.location.registerlow)));
+                               ungetregister32(p^.location.registerlow);
                             end
                           else
-                            exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,p^.location.register)));
-                          ungetregister32(p^.location.register);
+                            begin
+                               inc(pushedparasize,4);
+                               if inlined then
+                                 begin
+                                    r:=new_reference(procinfo.framepointer,para_offset-pushedparasize);
+                                    exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,
+                                      p^.location.register,r)));
+                                 end
+                               else
+                                 exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,p^.location.register)));
+                               ungetregister32(p^.location.register);
+                            end;
                         end;
                      R_AX,R_BX,R_CX,R_DX,R_SI,R_DI:
                         begin
@@ -1156,6 +1177,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                             exprasmlist^.concat(new(pai386,op_reg(A_PUSH,opsize,hreg)));
                           ungetregister32(reg8toreg32(p^.location.register));
                         end;
+                     else internalerror(1899);
                   end;
                end;
              LOC_FPU:
@@ -3118,7 +3140,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 {
   $Log$
-  Revision 1.21  1999-08-01 17:32:31  florian
+  Revision 1.22  1999-08-01 23:36:39  florian
+    * some changes to compile the new code generator
+
+  Revision 1.21  1999/08/01 17:32:31  florian
     * more fixes for inittable call
 
   Revision 1.20  1999/08/01 17:17:37  florian

+ 12 - 1
compiler/new/nstatmnt.pas

@@ -33,6 +33,7 @@ unit nstatmnt;
          constructor init(l : pnode);
          procedure det_temp;virtual;
          procedure det_resulttype;virtual;
+          procedure secondpass;virtual;
        end;
 
        pstatementnode = ^tstatementnode;
@@ -134,11 +135,21 @@ unit nstatmnt;
            end;
       end;
 
+    procedure tblocknode.secondpass;
+
+      begin
+         if assigned(left) then
+           left^.secondpass;
+      end;
+
 
 end.
 {
   $Log$
-  Revision 1.1  1999-01-23 23:35:02  florian
+  Revision 1.2  1999-08-01 23:36:43  florian
+    * some changes to compile the new code generator
+
+  Revision 1.1  1999/01/23 23:35:02  florian
     + first versions
 
 }

+ 5 - 2
compiler/parser.pas

@@ -61,7 +61,7 @@ unit parser;
 {$ifdef newcg}
       cgobj,
   {$ifdef i386}
-      cg386,
+      cgcpu,
   {$endif i386}
 {$endif newcg}
       comphook,tree,scanner,pbase,pdecl,psystem,pmodules,cresstr;
@@ -471,7 +471,10 @@ unit parser;
 end.
 {
   $Log$
-  Revision 1.78  1999-07-24 16:22:18  michael
+  Revision 1.79  1999-08-01 23:36:40  florian
+    * some changes to compile the new code generator
+
+  Revision 1.78  1999/07/24 16:22:18  michael
   + Improved resourcestring handling
 
   Revision 1.77  1999/07/23 16:05:22  peter

+ 9 - 2
compiler/version.pas

@@ -28,11 +28,15 @@ interface
        wordversion = (0 shl 12)+99;
 
        { version string }
+
        version_nr = '0';
        release_nr = '99';
        patch_nr   = '13';
+{$ifdef newcg}
        minorpatch = '';
-
+{$else newcg}
+       minorpatch = 'newcg';
+{$endif newcg}
        version_string = version_nr+'.'+release_nr+'.'+patch_nr;
        full_version_string = version_nr+'.'+release_nr+'.'+patch_nr+minorpatch;
 
@@ -69,7 +73,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.9  1999-07-01 21:35:02  peter
+  Revision 1.10  1999-08-01 23:36:42  florian
+    * some changes to compile the new code generator
+
+  Revision 1.9  1999/07/01 21:35:02  peter
     * 0.99.13 instead of 0.99.13a
 
   Revision 1.8  1999/06/27 15:49:19  michael