Browse Source

* 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)

Jonas Maebe 26 năm trước cách đây
mục cha
commit
14d3ca992f
2 tập tin đã thay đổi với 41 bổ sung7 xóa
  1. 25 1
      compiler/cgai386.pas
  2. 16 6
      compiler/i386asm.pas

+ 25 - 1
compiler/cgai386.pas

@@ -253,6 +253,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
           internalerror(7453984);
       end;
 
+{$ifdef jmpfix}
     procedure emitjmp(c : tasmcond;var l : pasmlabel);
       var
         ai : Pai386;
@@ -267,6 +268,22 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
             exprasmlist^.concat(ai);
           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);
       var
@@ -3088,7 +3105,14 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 {
   $Log$
-  Revision 1.5.2.2  1999-06-17 12:38:39  pierre
+  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.5.2.2  1999/06/17 12:38:39  pierre
    * wrong warning for operators removed
 
   Revision 1.5.2.1  1999/06/14 17:27:08  peter

+ 16 - 6
compiler/i386asm.pas

@@ -511,18 +511,21 @@ uses
          loadref(1,_op2);
       end;
 
-
     destructor tai386.done;
       var
         i : longint;
       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;
       end;
 
-
     function tai386.getcopy:plinkedlist_item;
       var
         i : longint;
@@ -1521,7 +1524,14 @@ end;
 end.
 {
   $Log$
-  Revision 1.12.2.1  1999-06-28 19:18:53  peter
+  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.12.2.1  1999/06/28 19:18:53  peter
     * fixed loadsym with sym=nil
 
   Revision 1.12  1999/06/14 11:15:01  pierre