Jonas Maebe 26 years ago
parent
commit
aede14847e
2 changed files with 48 additions and 7 deletions
  1. 28 1
      compiler/cgai386.pas
  2. 20 6
      compiler/i386asm.pas

+ 28 - 1
compiler/cgai386.pas

@@ -256,6 +256,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
           internalerror(7453984);
           internalerror(7453984);
       end;
       end;
 
 
+{$ifdef jmpfix}
     procedure emitjmp(c : tasmcond;var l : pasmlabel);
     procedure emitjmp(c : tasmcond;var l : pasmlabel);
       var
       var
         ai : Pai386;
         ai : Pai386;
@@ -270,6 +271,22 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
             exprasmlist^.concat(ai);
             exprasmlist^.concat(ai);
           end;
           end;
       end;
       end;
+{$else jmpfix}
+    procedure emitjmp(c : tasmcond;var l : pasmlabel);
+      var
+        ai : Pai386;
+      begin
+        if c=C_None then
+          ai := new(pai386,op_sym(A_JMP,S_NO,l))
+        else
+          begin
+            ai:=new(pai386,op_sym(A_Jcc,S_NO,l));
+            ai^.SetCondition(c);
+          end;
+        ai^.is_jmp:=true;
+        exprasmlist^.concat(ai);
+      end; 
+{$endif jmpfix}
 
 
     procedure emit_flag2reg(flag:tresflags;hregister:tregister);
     procedure emit_flag2reg(flag:tresflags;hregister:tregister);
       var
       var
@@ -3095,7 +3112,17 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.9  1999-07-01 15:49:11  florian
+  Revision 1.10  1999-07-04 21:59:30  jonas
+    * merged
+
+  Revision 1.5.2.3  1999/07/04 21:50:17  jonas
+    * everything between {$ifdef jmpfix}:
+      * when a jxx instruction is disposed, decrease the refcount of the label
+        it referenced
+      * for jmp instructions to a label, set is_jmp also to true (was only done
+        for Jcc instructions)
+
+  Revision 1.9  1999/07/01 15:49:11  florian
     * int64/qword type release
     * int64/qword type release
     + lo/hi for int64/qword
     + lo/hi for int64/qword
 
 

+ 20 - 6
compiler/i386asm.pas

@@ -511,18 +511,21 @@ uses
          loadref(1,_op2);
          loadref(1,_op2);
       end;
       end;
 
 
-
     destructor tai386.done;
     destructor tai386.done;
       var
       var
         i : longint;
         i : longint;
       begin
       begin
-        for i:=1 to ops do
-         if (oper[i-1].typ=top_ref) then
-          dispose(oper[i-1].ref);
+{$ifdef jmpfix}
+        if is_jmp then
+          dec(PasmLabel(oper[0].sym)^.refs)
+        else
+{$endif jmpfix}
+          for i:=1 to ops do
+            if (oper[i-1].typ=top_ref) then
+              dispose(oper[i-1].ref);
         inherited done;
         inherited done;
       end;
       end;
 
 
-
     function tai386.getcopy:plinkedlist_item;
     function tai386.getcopy:plinkedlist_item;
       var
       var
         i : longint;
         i : longint;
@@ -1521,7 +1524,18 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.13  1999-06-28 19:30:06  peter
+  Revision 1.14  1999-07-04 21:59:31  jonas
+    * merged
+
+
+  Revision 1.12.2.2  1999/07/04 21:50:16  jonas
+    * everything between {$ifdef jmpfix}:
+      * when a jxx instruction is disposed, decrease the refcount of the label
+        it referenced
+      * for jmp instructions to a label, set is_jmp also to true (was only done
+        for Jcc instructions)
+
+  Revision 1.13  1999/06/28 19:30:06  peter
     * merged
     * merged
 
 
   Revision 1.12.2.1  1999/06/28 19:18:53  peter
   Revision 1.12.2.1  1999/06/28 19:18:53  peter