فهرست منبع

* fix tcgx86.make_direct_ref: we need to use the register in which we loaded the symbol and combine that with the base register (if it is set) without using an ADD

git-svn-id: trunk@34557 -
svenbarth 8 سال پیش
والد
کامیت
89f7da58ea
1فایلهای تغییر یافته به همراه6 افزوده شده و 2 حذف شده
  1. 6 2
      compiler/x86/cgx86.pas

+ 6 - 2
compiler/x86/cgx86.pas

@@ -650,6 +650,7 @@ unit cgx86;
       begin
       begin
         if assigned(ref.symbol) and (ref.symbol.bind in asmsymbindindirect) then
         if assigned(ref.symbol) and (ref.symbol.bind in asmsymbindindirect) then
           begin
           begin
+            { load the symbol into a register }
             hreg:=getaddressregister(list);
             hreg:=getaddressregister(list);
             reference_reset_symbol(href,ref.symbol,0,sizeof(pint));
             reference_reset_symbol(href,ref.symbol,0,sizeof(pint));
             { tell make_simple_ref that we are loading the symbol address via an indirect
             { tell make_simple_ref that we are loading the symbol address via an indirect
@@ -658,10 +659,13 @@ unit cgx86;
             a_op_ref_reg(list,OP_MOVE,OS_ADDR,href,hreg);
             a_op_ref_reg(list,OP_MOVE,OS_ADDR,href,hreg);
             if ref.base<>NR_NO then
             if ref.base<>NR_NO then
               begin
               begin
-                { don't use ADD, the flags may contain a value }
-                reference_reset_base(href,ref.base,0,ref.alignment);
+                { fold symbol register into base register }
+                reference_reset_base(href,hreg,0,sizeof(pint));
+                href.index:=ref.base;
+                hreg:=getaddressregister(list);
                 a_loadaddr_ref_reg(list,href,hreg);
                 a_loadaddr_ref_reg(list,href,hreg);
               end;
               end;
+            { we're done }
             ref.symbol:=nil;
             ref.symbol:=nil;
             ref.base:=hreg;
             ref.base:=hreg;
           end;
           end;