浏览代码

* make use of xor reg,reg by generating it directly instead of hoping for the peephole
optimizer which cannot do this properly due to missing information about flags. By doing
so the size of the compiler executable gets reduced by ~1 %

git-svn-id: trunk@33524 -

florian 9 年之前
父节点
当前提交
f576b0c01b
共有 2 个文件被更改,包括 4 次插入13 次删除
  1. 0 10
      compiler/i386/popt386.pas
  2. 4 3
      compiler/x86/cgx86.pas

+ 0 - 10
compiler/i386/popt386.pas

@@ -453,16 +453,6 @@ begin
                           hp1.free;
                           hp1.free;
                         end;
                         end;
                 end;
                 end;
-              A_XOR:
-                if (taicpu(p).oper[0]^.typ = top_reg) and
-                   (taicpu(p).oper[1]^.typ = top_reg) and
-                   (taicpu(p).oper[0]^.reg = taicpu(p).oper[1]^.reg) then
-                 { temporarily change this to 'mov reg,0' to make it easier }
-                 { for the CSE. Will be changed back in pass 2              }
-                  begin
-                    taicpu(p).opcode := A_MOV;
-                    taicpu(p).loadConst(0,0);
-                  end;
             end;
             end;
           end;
           end;
       end;
       end;

+ 4 - 3
compiler/x86/cgx86.pas

@@ -909,9 +909,10 @@ unit cgx86;
 
 
       begin
       begin
         check_register_size(tosize,reg);
         check_register_size(tosize,reg);
-        { the optimizer will change it to "xor reg,reg" when loading zero, }
-        { no need to do it here too (JM)                                   }
-        list.concat(taicpu.op_const_reg(A_MOV,TCGSize2OpSize[tosize],a,reg))
+        if a=0 then
+          list.concat(taicpu.op_reg_reg(A_XOR,TCGSize2OpSize[tosize],reg,reg))
+        else
+          list.concat(taicpu.op_const_reg(A_MOV,TCGSize2OpSize[tosize],a,reg));
       end;
       end;