Browse Source

* proper fix to avoid sp relative adressing as r23867 tries

git-svn-id: branches/i8086@23868 -
florian 12 years ago
parent
commit
edd4c1ce4b
2 changed files with 9 additions and 24 deletions
  1. 0 24
      compiler/i8086/cgcpu.pas
  2. 9 0
      compiler/x86/cgx86.pas

+ 0 - 24
compiler/i8086/cgcpu.pas

@@ -59,9 +59,6 @@ unit cgcpu;
         procedure a_load_ref_reg(list : TAsmList;fromsize,tosize: tcgsize;const ref : treference;reg : tregister);override;
         procedure a_load_ref_reg(list : TAsmList;fromsize,tosize: tcgsize;const ref : treference;reg : tregister);override;
         procedure a_load_reg_reg(list : TAsmList;fromsize,tosize: tcgsize;reg1,reg2 : tregister);override;
         procedure a_load_reg_reg(list : TAsmList;fromsize,tosize: tcgsize;reg1,reg2 : tregister);override;
 
 
-        { fpu move instructions }
-        procedure a_loadfpu_reg_ref(list: TAsmList; fromsize, tosize: tcgsize; reg: tregister; const ref: treference); override;
-
         procedure g_flags2reg(list: TAsmList; size: TCgSize; const f: tresflags; reg: TRegister);override;
         procedure g_flags2reg(list: TAsmList; size: TCgSize; const f: tresflags; reg: TRegister);override;
         procedure g_flags2ref(list: TAsmList; size: TCgSize; const f: tresflags; const ref: TReference);override;
         procedure g_flags2ref(list: TAsmList; size: TCgSize; const f: tresflags; const ref: TReference);override;
 
 
@@ -829,27 +826,6 @@ unit cgcpu;
       end;
       end;
 
 
 
 
-    procedure tcg8086.a_loadfpu_reg_ref(list: TAsmList; fromsize, tosize: tcgsize; reg: tregister; const ref: treference);
-      var
-        tmpref: treference;
-      begin
-        { i8086 does not support stack relative addressing }
-        if ref.base = NR_STACK_POINTER_REG then
-          begin
-            tmpref := ref;
-            { TODO: is there a faster way to do this (e.g. rebase the address to
-              be relative to bp directly)? }
-            list.Concat(Taicpu.op_reg(A_PUSH, S_W, NR_BP));
-            list.Concat(Taicpu.op_reg_reg(A_MOV, S_W, NR_SP, NR_BP));
-            reference_reset_base(tmpref,NR_BP,ref.offset + 2,ref.alignment);
-            inherited a_loadfpu_reg_ref(list, fromsize, tosize, reg, tmpref);
-            list.Concat(Taicpu.op_reg(A_POP, S_W, NR_BP));
-          end
-        else
-          inherited a_loadfpu_reg_ref(list, fromsize, tosize, reg, ref);
-      end;
-
-
     procedure tcg8086.g_flags2reg(list: TAsmList; size: TCgSize; const f: tresflags; reg: TRegister);
     procedure tcg8086.g_flags2reg(list: TAsmList; size: TCgSize; const f: tresflags; reg: TRegister);
       var
       var
         ai : taicpu;
         ai : taicpu;

+ 9 - 0
compiler/x86/cgx86.pas

@@ -568,6 +568,15 @@ unit cgx86;
               end;
               end;
           end;
           end;
 {$elseif defined(i8086)}
 {$elseif defined(i8086)}
+        { i8086 does not support stack relative addressing }
+        if ref.base = NR_STACK_POINTER_REG then
+          begin
+            href:=ref;
+            href.base:=getaddressregister(list);
+            { let the register allocator find a suitable register for the reference }
+            list.Concat(Taicpu.op_reg_reg(A_MOV, S_W, NR_SP, href.base));
+            ref:=href;
+          end
 {$endif}
 {$endif}
       end;
       end;