Преглед на файлове

+ added cg.a_call_ref_near and a_call_ref_far

git-svn-id: trunk@24853 -
nickysn преди 12 години
родител
ревизия
604b7c9deb
променени са 4 файла, в които са добавени 38 реда и са изтрити 3 реда
  1. 2 1
      compiler/cgbase.pas
  2. 18 0
      compiler/i8086/cgcpu.pas
  3. 8 2
      compiler/x86/agx86nsm.pas
  4. 10 0
      compiler/x86/cgx86.pas

+ 2 - 1
compiler/cgbase.pas

@@ -99,7 +99,8 @@ interface
          {$ENDIF}
          {$IFDEF i8086}
          ,addr_dgroup      // the data segment group
-         ,addr_far         // used for emitting 'call far' or 'jmp far' instructions
+         ,addr_far         // used for emitting 'call/jmp far label' instructions
+         ,addr_far_ref     // used for emitting 'call far [reference]' instructions
          {$ENDIF}
          );
 

+ 18 - 0
compiler/i8086/cgcpu.pas

@@ -47,6 +47,8 @@ unit cgcpu;
         procedure a_call_name_far(list : TAsmList;const s : string; weak: boolean);
         procedure a_call_name_static(list : TAsmList;const s : string);override;
         procedure a_call_name_static_far(list : TAsmList;const s : string);
+        procedure a_call_ref(list : TAsmList;ref : treference);override;
+        procedure a_call_ref_far(list : TAsmList;ref : treference);
 
         procedure a_op_const_reg(list : TAsmList; Op: TOpCG; size: TCGSize; a: tcgint; reg: TRegister); override;
         procedure a_op_const_ref(list : TAsmList; Op: TOpCG; size: TCGSize; a: tcgint; const ref: TReference); override;
@@ -208,6 +210,22 @@ unit cgcpu;
       end;
 
 
+    procedure tcg8086.a_call_ref(list: TAsmList; ref: treference);
+      begin
+        if current_settings.x86memorymodel in x86_far_code_models then
+          a_call_ref_far(list,ref)
+        else
+          a_call_ref_near(list,ref);
+      end;
+
+
+    procedure tcg8086.a_call_ref_far(list: TAsmList; ref: treference);
+      begin
+        ref.refaddr:=addr_far_ref;
+        list.concat(taicpu.op_ref(A_CALL,S_NO,ref));
+      end;
+
+
     procedure tcg8086.a_op_const_reg(list: TAsmList; Op: TOpCG; size: TCGSize;
       a: tcgint; reg: TRegister);
       var

+ 8 - 2
compiler/x86/agx86nsm.pas

@@ -426,8 +426,14 @@ interface
           top_reg :
             AsmWrite(nasm_regname(o.reg));
           top_ref :
-            if o.ref^.refaddr=addr_no then
-              WriteReference(o.ref^)
+            if o.ref^.refaddr in [addr_no{$ifdef i8086},addr_far_ref{$endif}] then
+              begin
+{$ifdef i8086}
+                if o.ref^.refaddr=addr_far_ref then
+                  AsmWrite('far ');
+{$endif i8086}
+                WriteReference(o.ref^);
+              end
             else
               begin
 { NEAR forces NASM to emit near jumps, which are 386+ }

+ 10 - 0
compiler/x86/cgx86.pas

@@ -35,6 +35,9 @@ unit cgx86;
        symconst,symtype,symdef;
 
     type
+
+      { tcgx86 }
+
       tcgx86 = class(tcg)
         rgfpu   : Trgx86fpu;
         procedure done_register_allocators;override;
@@ -58,6 +61,7 @@ unit cgx86;
         procedure a_call_name_static_near(list : TAsmList;const s : string);
         procedure a_call_reg(list : TAsmList;reg : tregister);override;
         procedure a_call_ref(list : TAsmList;ref : treference);override;
+        procedure a_call_ref_near(list : TAsmList;ref : treference);
 
         procedure a_op_const_reg(list : TAsmList; Op: TOpCG; size: TCGSize; a: tcgint; reg: TRegister); override;
         procedure a_op_const_ref(list : TAsmList; Op: TOpCG; size: TCGSize; a: tcgint; const ref: TReference); override;
@@ -808,6 +812,12 @@ unit cgx86;
 
 
     procedure tcgx86.a_call_ref(list : TAsmList;ref : treference);
+      begin
+        a_call_ref_near(list,ref);
+      end;
+
+
+    procedure tcgx86.a_call_ref_near(list: TAsmList; ref: treference);
       begin
         list.concat(taicpu.op_ref(A_CALL,S_NO,ref));
       end;