浏览代码

+ generate more optimal code for OP_NOT and OP_NEG in tcg64f8086.a_op64_ref

git-svn-id: trunk@45304 -
nickysn 5 年之前
父节点
当前提交
4f4d8191f0
共有 1 个文件被更改,包括 40 次插入0 次删除
  1. 40 0
      compiler/i8086/cgcpu.pas

+ 40 - 0
compiler/i8086/cgcpu.pas

@@ -106,6 +106,7 @@ unit cgcpu;
         procedure a_op64_reg_reg(list : TAsmList;op:TOpCG;size : tcgsize;regsrc,regdst : tregister64);override;
         procedure a_op64_const_reg(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;reg : tregister64);override;
         procedure a_op64_const_ref(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;const ref : treference);override;
+        procedure a_op64_ref(list : TAsmList;op:TOpCG;size : tcgsize;const ref : treference);override;
       private
         procedure get_64bit_ops(op:TOpCG;var op1,op2:TAsmOp);
       end;
@@ -3329,6 +3330,45 @@ unit cgcpu;
         end;
       end;
 
+
+    procedure tcg64f8086.a_op64_ref(list : TAsmList;op:TOpCG;size : tcgsize;const ref : treference);
+      var
+        tempref: treference;
+      begin
+        tempref:=ref;
+        tcgx86(cg).make_simple_ref(list,tempref);
+        case op of
+          OP_NOT:
+            begin
+              cg.a_op_ref(list,op,OS_32,tempref);
+              inc(tempref.offset,4);
+              cg.a_op_ref(list,op,OS_32,tempref);
+            end;
+          OP_NEG :
+            begin
+              inc(tempref.offset,6);
+              cg.a_op_ref(list,OP_NOT,OS_16,tempref);
+              dec(tempref.offset,2);
+              cg.a_op_ref(list,OP_NOT,OS_16,tempref);
+              dec(tempref.offset,2);
+              cg.a_op_ref(list,OP_NOT,OS_16,tempref);
+              dec(tempref.offset,2);
+              cg.a_reg_alloc(list,NR_DEFAULTFLAGS);
+              list.concat(taicpu.op_ref(A_NEG,S_W,tempref));
+              inc(tempref.offset,2);
+              list.concat(taicpu.op_const_ref(A_SBB,S_W,-1,tempref));
+              inc(tempref.offset,2);
+              list.concat(taicpu.op_const_ref(A_SBB,S_W,-1,tempref));
+              inc(tempref.offset,2);
+              list.concat(taicpu.op_const_ref(A_SBB,S_W,-1,tempref));
+              cg.a_reg_dealloc(list,NR_DEFAULTFLAGS);
+            end;
+          else
+            inherited;
+        end;
+      end;
+
+
     procedure create_codegen;
       begin
         cg := tcg8086.create;