Browse Source

* fixed include/exclude for byte-sized sets in registers

git-svn-id: trunk@9887 -
Jonas Maebe 17 years ago
parent
commit
ea22e81374
1 changed files with 15 additions and 4 deletions
  1. 15 4
      compiler/x86/nx86inl.pas

+ 15 - 4
compiler/x86/nx86inl.pas

@@ -457,12 +457,14 @@ implementation
 
 
       procedure tx86inlinenode.second_IncludeExclude;
       procedure tx86inlinenode.second_IncludeExclude;
         var
         var
-         hregister : tregister;
+         hregister,
+         hregister2: tregister;
          setbase   : aint;
          setbase   : aint;
          bitsperop,l : longint;
          bitsperop,l : longint;
          cgop : topcg;
          cgop : topcg;
          asmop : tasmop;
          asmop : tasmop;
-         opsize : tcgsize;
+         opsize,
+         orgsize: tcgsize;
         begin
         begin
           if not(is_varset(tcallparanode(left).resultdef)) then
           if not(is_varset(tcallparanode(left).resultdef)) then
             opsize:=int_cgsize(tcallparanode(left).resultdef.size)
             opsize:=int_cgsize(tcallparanode(left).resultdef.size)
@@ -500,8 +502,11 @@ implementation
             end
             end
           else
           else
             begin
             begin
+              orgsize:=opsize;
               if opsize in [OS_8,OS_S8] then
               if opsize in [OS_8,OS_S8] then
-                opsize:=OS_32;
+                begin
+                  opsize:=OS_32;
+                end;
               { determine asm operator }
               { determine asm operator }
               if inlinenumber=in_include_x_y then
               if inlinenumber=in_include_x_y then
                  asmop:=A_BTS
                  asmop:=A_BTS
@@ -514,7 +519,13 @@ implementation
               if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then
               if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then
                 emit_reg_ref(asmop,tcgsize2opsize[opsize],hregister,tcallparanode(left).left.location.reference)
                 emit_reg_ref(asmop,tcgsize2opsize[opsize],hregister,tcallparanode(left).left.location.reference)
               else
               else
-                emit_reg_reg(asmop,tcgsize2opsize[opsize],hregister,tcallparanode(left).left.location.register);
+                begin
+                  { second argument can't be an 8 bit register either }
+                  hregister2:=tcallparanode(left).left.location.register;
+                  if (orgsize in [OS_8,OS_S8]) then
+                    hregister2:=cg.makeregsize(current_asmdata.CurrAsmList,hregister2,opsize);
+                  emit_reg_reg(asmop,tcgsize2opsize[opsize],hregister,hregister2);
+                end;
             end;
             end;
         end;
         end;