Browse Source

* moved locflags2reg() procedure from cg386add to cgai386
+ added locjump2reg() procedure to cgai386
* fixed internalerror(2002) when the result of a case expression has
LOC_JUMP
(all merged from fixes branch)

Jonas Maebe 25 years ago
parent
commit
0f7ae1718e
3 changed files with 98 additions and 66 deletions
  1. 11 57
      compiler/cg386add.pas
  2. 26 8
      compiler/cg386set.pas
  3. 61 1
      compiler/cgai386.pas

+ 11 - 57
compiler/cg386add.pas

@@ -47,23 +47,6 @@ implementation
                                 Helpers
 *****************************************************************************}
 
-    procedure locflags2reg(var l:tlocation;opsize:topsize);
-      var
-        hregister : tregister;
-      begin
-        if (l.loc=LOC_FLAGS) then
-         begin
-           case opsize of
-            S_L : hregister:=getregister32;
-            S_W : hregister:=reg32toreg16(getregister32);
-            S_B : hregister:=reg32toreg8(getregister32);
-           end;
-           emit_flag2reg(l.resflags,hregister);
-           l.loc:=LOC_REGISTER;
-           l.register:=hregister;
-         end;
-      end;
-
     function getresflags(p : ptree;unsigned : boolean) : tresflags;
 
       begin
@@ -870,25 +853,7 @@ implementation
                           LOC_FLAGS:
                             locflags2reg(p^.left^.location,opsize);
                           LOC_JUMP:
-                            begin
-                               case opsize of
-                                  S_L : hregister:=getregister32;
-                                  S_W : hregister:=reg32toreg16(getregister32);
-                                  S_B : hregister:=reg32toreg8(getregister32);
-                               end;
-                               p^.left^.location.loc:=LOC_REGISTER;
-                               p^.left^.location.register:=hregister;
-                               emitlab(truelabel);
-                               truelabel:=otl;
-                               emit_const_reg(A_MOV,opsize,1,hregister);
-                               getlabel(hl);
-                               emitjmp(C_None,hl);
-                               emitlab(falselabel);
-                               falselabel:=ofl;
-                               emit_reg_reg(A_XOR,S_L,makereg32(hregister),
-                                 makereg32(hregister));
-                               emitlab(hl);
-                            end;
+                            locjump2reg(p^.left^.location,opsize, otl, ofl);
                        end;
                        set_location(p^.location,p^.left^.location);
                        pushed:=maybe_push(p^.right^.registers32,p,false);
@@ -909,25 +874,7 @@ implementation
                           LOC_FLAGS:
                             locflags2reg(p^.right^.location,opsize);
                           LOC_JUMP:
-                            begin
-                               case opsize of
-                                  S_L : hregister:=getregister32;
-                                  S_W : hregister:=reg32toreg16(getregister32);
-                                  S_B : hregister:=reg32toreg8(getregister32);
-                               end;
-                               p^.right^.location.loc:=LOC_REGISTER;
-                               p^.right^.location.register:=hregister;
-                               emitlab(truelabel);
-                               truelabel:=otl;
-                               emit_const_reg(A_MOV,opsize,1,hregister);
-                               getlabel(hl);
-                               emitjmp(C_None,hl);
-                               emitlab(falselabel);
-                               falselabel:=ofl;
-                               emit_reg_reg(A_XOR,S_L,makereg32(hregister),
-                                 makereg32(hregister));
-                               emitlab(hl);
-                            end;
+                            locjump2reg(p^.right^.location,opsize,otl,ofl);
                        end;
                        goto do_normal;
                     end
@@ -2377,7 +2324,14 @@ implementation
 end.
 {
   $Log$
-  Revision 1.2  2000-07-13 11:32:32  michael
+  Revision 1.3  2000-07-27 09:25:05  jonas
+    * moved locflags2reg() procedure from cg386add to cgai386
+    + added locjump2reg() procedure to cgai386
+    * fixed internalerror(2002) when the result of a case expression has
+      LOC_JUMP
+    (all merged from fixes branch)
+
+  Revision 1.2  2000/07/13 11:32:32  michael
   + removed logs
 
-}
+}

+ 26 - 8
compiler/cg386set.pas

@@ -783,6 +783,7 @@ implementation
       var
          lv,hv,max_label,labels : longint;
          max_linear_list : longint;
+         otl, ofl: pasmlabel;
 {$ifdef Delphi}
          dist : cardinal;
 {$else Delphi}
@@ -809,6 +810,15 @@ implementation
               jmp_lee:=C_BE;
            end;
          cleartempgen;
+         { save current truelabel and falselabel (they are restored in }
+         { locjump2reg) (JM)                                           }
+         if p^.left^.location.loc=LOC_JUMP then
+           begin
+            otl:=truelabel;
+            getlabel(truelabel);
+            ofl:=falselabel;
+            getlabel(falselabel);
+           end;
          secondpass(p^.left);
          { determines the size of the operand }
          opsize:=bytes2Sxx[p^.left^.resulttype^.size];
@@ -818,12 +828,13 @@ implementation
               hregister:=p^.left^.location.register;
             LOC_FLAGS :
               begin
-                hregister:=getregister32;
-                case opsize of
-                  S_B : hregister:=reg32toreg8(hregister);
-                  S_W : hregister:=reg32toreg16(hregister);
-                end;
-                emit_flag2reg(p^.left^.location.resflags,hregister);
+                locflags2reg(p^.left^.location,opsize);
+                hregister := p^.left^.location.register;
+              end;
+            LOC_JUMP:
+              begin
+                locjump2reg(p^.left^.location,opsize,otl,ofl);
+                hregister := p^.left^.location.register;
               end;
             LOC_CREGISTER:
               begin
@@ -958,7 +969,14 @@ implementation
 end.
 {
   $Log$
-  Revision 1.2  2000-07-13 11:32:35  michael
+  Revision 1.3  2000-07-27 09:25:05  jonas
+    * moved locflags2reg() procedure from cg386add to cgai386
+    + added locjump2reg() procedure to cgai386
+    * fixed internalerror(2002) when the result of a case expression has
+      LOC_JUMP
+    (all merged from fixes branch)
+
+  Revision 1.2  2000/07/13 11:32:35  michael
   + removed logs
 
-}
+}

+ 61 - 1
compiler/cgai386.pas

@@ -39,6 +39,11 @@ unit cgai386;
     function makereg16(r:tregister):tregister;
     function makereg32(r:tregister):tregister;
 
+
+    procedure locflags2reg(var l:tlocation;opsize:topsize);
+    procedure locjump2reg(var l:tlocation;opsize:topsize; otl, ofl: pasmlabel);
+
+
     procedure emitlab(var l : pasmlabel);
     procedure emitjmp(c : tasmcond;var l : pasmlabel);
     procedure emit_flag2reg(flag:tresflags;hregister:tregister);
@@ -272,6 +277,54 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
       end;
 
 
+    procedure locflags2reg(var l:tlocation;opsize:topsize);
+      var
+        hregister : tregister;
+      begin
+        if (l.loc=LOC_FLAGS) then
+         begin
+           hregister:=getregister32;
+           case opsize of
+            S_W : hregister:=reg32toreg16(hregister);
+            S_B : hregister:=reg32toreg8(hregister);
+           end;
+           emit_flag2reg(l.resflags,hregister);
+           l.loc:=LOC_REGISTER;
+           l.register:=hregister;
+         end
+        else internalerror(270720001);
+      end;
+
+
+    procedure locjump2reg(var l:tlocation;opsize:topsize; otl, ofl: pasmlabel);
+      var
+        hregister : tregister;
+        hl : pasmlabel;
+      begin
+         if l.loc = LOC_JUMP then
+           begin
+             hregister:=getregister32;
+             case opsize of
+               S_W : hregister:=reg32toreg16(hregister);
+               S_B : hregister:=reg32toreg8(hregister);
+             end;
+             l.loc:=LOC_REGISTER;
+             l.register:=hregister;
+             emitlab(truelabel);
+             truelabel:=otl;
+             emit_const_reg(A_MOV,opsize,1,hregister);
+             getlabel(hl);
+             emitjmp(C_None,hl);
+             emitlab(falselabel);
+             falselabel:=ofl;
+             emit_reg_reg(A_XOR,S_L,makereg32(hregister),
+             makereg32(hregister));
+             emitlab(hl);
+           end
+        else internalerror(270720002);
+      end;
+
+
 {*****************************************************************************
                               Emit Assembler
 *****************************************************************************}
@@ -3969,7 +4022,14 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 {
   $Log$
-  Revision 1.4  2000-07-21 15:14:02  jonas
+  Revision 1.5  2000-07-27 09:25:05  jonas
+    * moved locflags2reg() procedure from cg386add to cgai386
+    + added locjump2reg() procedure to cgai386
+    * fixed internalerror(2002) when the result of a case expression has
+      LOC_JUMP
+    (all merged from fixes branch)
+
+  Revision 1.4  2000/07/21 15:14:02  jonas
     + added is_addr field for labels, if they are only used for getting the address
        (e.g. for io checks) and corresponding getaddrlabel() procedure