浏览代码

* x86: Added new emit_reg_ref_reg routine and related methods to support BMI2 instructions

J. Gareth "Curious Kit" Moreton 2 年之前
父节点
当前提交
e748e4c7ab
共有 2 个文件被更改,包括 19 次插入1 次删除
  1. 12 0
      compiler/x86/aasmcpu.pas
  2. 7 1
      compiler/x86/cga.pas

+ 12 - 0
compiler/x86/aasmcpu.pas

@@ -578,6 +578,7 @@ interface
          constructor op_reg_reg_reg(op : tasmop;_size : topsize;_op1,_op2,_op3 : tregister);
          constructor op_const_reg_reg(op : tasmop;_size : topsize;_op1 : aint;_op2 : tregister;_op3 : tregister);
          constructor op_const_ref_reg(op : tasmop;_size : topsize;_op1 : aint;const _op2 : treference;_op3 : tregister);
+         constructor op_reg_ref_reg(op : tasmop;_size : topsize;_op1 : tregister; const _op2 : treference;_op3 : tregister);
          constructor op_ref_reg_reg(op : tasmop;_size : topsize;const _op1 : treference;_op2,_op3 : tregister);
          constructor op_const_reg_ref(op : tasmop;_size : topsize;_op1 : aint;_op2 : tregister;const _op3 : treference);
          constructor op_reg_reg_ref(op : tasmop;_size : topsize;_op1,_op2 : tregister;const _op3 : treference);
@@ -1159,6 +1160,17 @@ implementation
       end;
 
 
+    constructor taicpu.op_reg_ref_reg(op : tasmop;_size : topsize;_op1 : tregister; const _op2 : treference;_op3 : tregister);
+      begin
+        inherited create(op);
+        init(_size);
+        ops:=3;
+        loadreg(0,_op1);
+        loadref(1,_op2);
+        loadreg(2,_op3);
+      end;
+
+
     constructor taicpu.op_ref_reg_reg(op : tasmop;_size : topsize;const _op1 : treference;_op2,_op3 : tregister);
       begin
          inherited create(op);

+ 7 - 1
compiler/x86/cga.pas

@@ -45,7 +45,7 @@ interface
     procedure emit_const_reg_reg(i : tasmop;s : topsize;c : longint;reg1,reg2 : tregister);
     procedure emit_reg_reg_reg(i : tasmop;s : topsize;reg1,reg2,reg3 : tregister);
     procedure emit_ref_reg_reg(i : tasmop;s : topsize;ref : treference;reg1,reg2 : tregister);
-
+    procedure emit_reg_ref_reg(i : tasmop;s : topsize; reg1 : tregister; ref : treference; reg2 : tregister);
 
     procedure emit_sym(i : tasmop;s : topsize;op : tasmsymbol);
 
@@ -130,6 +130,12 @@ implementation
         current_asmdata.CurrAsmList.concat(Taicpu.Op_ref_reg_reg(i,s,ref,reg1,reg2));
       end;
 
+    procedure emit_reg_ref_reg(i : tasmop;s : topsize; reg1 : tregister; ref : treference; reg2 : tregister);
+      begin
+        tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList,ref);
+        current_asmdata.CurrAsmList.concat(Taicpu.Op_reg_ref_reg(i,s,reg1,ref,reg2));
+      end;
+
     procedure emit_sym(i : tasmop;s : topsize;op : tasmsymbol);
       begin
         current_asmdata.CurrAsmList.concat(Taicpu.Op_sym(i,s,op));