mirror of https://github.com/red-prig/fpPS4.git
1443 lines
32 KiB
Plaintext
1443 lines
32 KiB
Plaintext
unit kern_jit_ops_avx;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
{$CALLING SysV_ABI_CDecl}
|
|
|
|
interface
|
|
|
|
implementation
|
|
|
|
uses
|
|
x86_fpdbgdisas,
|
|
x86_jit,
|
|
kern_jit_ops,
|
|
kern_jit_ctx;
|
|
|
|
///verif
|
|
|
|
procedure op_emit_avx1(var ctx:t_jit_context2;const desc:t_op_type;hint:t_op_hint);
|
|
var
|
|
tmp:t_op_type;
|
|
begin
|
|
tmp:=desc;
|
|
|
|
tmp.opt :=tmp.opt+[verif_vex_len,verif_rexw];
|
|
tmp.vx_len:=ctx.dis.Vex.Length;
|
|
tmp.rexw :=rexW in ctx.dis.Flags;
|
|
|
|
kern_jit_ctx.op_emit_avx1(ctx,tmp,hint);
|
|
end;
|
|
|
|
procedure op_emit_avx2_rr(var ctx:t_jit_context2;const desc:t_op_type);
|
|
var
|
|
tmp:t_op_type;
|
|
begin
|
|
tmp:=desc;
|
|
|
|
tmp.opt :=tmp.opt+[verif_vex_len,verif_rexw];
|
|
tmp.vx_len:=ctx.dis.Vex.Length;
|
|
tmp.rexw :=rexW in ctx.dis.Flags;
|
|
|
|
kern_jit_ctx.op_emit_avx2_rr(ctx,tmp);
|
|
end;
|
|
|
|
procedure op_emit_avx2(var ctx:t_jit_context2;const desc:t_op_desc);
|
|
var
|
|
tmp:t_op_desc;
|
|
begin
|
|
tmp:=desc;
|
|
|
|
if not (not_impl in tmp.mem_reg.opt) then
|
|
begin
|
|
tmp.mem_reg.opt :=tmp.mem_reg.opt+[verif_vex_len,verif_rexw];
|
|
tmp.mem_reg.vx_len:=ctx.dis.Vex.Length;
|
|
tmp.mem_reg.rexw :=rexW in ctx.dis.Flags;
|
|
end;
|
|
|
|
if not (not_impl in tmp.reg_mem.opt) then
|
|
begin
|
|
tmp.reg_mem.opt :=tmp.reg_mem.opt+[verif_vex_len,verif_rexw];
|
|
tmp.reg_mem.vx_len:=ctx.dis.Vex.Length;
|
|
tmp.reg_mem.rexw :=rexW in ctx.dis.Flags;
|
|
end;
|
|
|
|
if not (not_impl in tmp.reg_imm.opt) then
|
|
begin
|
|
tmp.reg_imm.opt :=tmp.reg_imm.opt+[verif_vex_len,verif_rexw];
|
|
tmp.reg_imm.vx_len:=ctx.dis.Vex.Length;
|
|
tmp.reg_imm.rexw :=rexW in ctx.dis.Flags;
|
|
end;
|
|
|
|
if not (not_impl in tmp.reg_im8.opt) then
|
|
begin
|
|
tmp.reg_im8.opt :=tmp.reg_im8.opt+[verif_vex_len,verif_rexw];
|
|
tmp.reg_im8.vx_len:=ctx.dis.Vex.Length;
|
|
tmp.reg_im8.rexw :=rexW in ctx.dis.Flags;
|
|
end;
|
|
|
|
kern_jit_ctx.op_emit_avx2(ctx,tmp);
|
|
end;
|
|
|
|
procedure op_emit_avx3(var ctx:t_jit_context2;const desc:t_op_type);
|
|
var
|
|
tmp:t_op_type;
|
|
begin
|
|
tmp:=desc;
|
|
|
|
tmp.opt :=tmp.opt+[verif_vex_len,verif_rexw];
|
|
tmp.vx_len:=ctx.dis.Vex.Length;
|
|
tmp.rexw :=rexW in ctx.dis.Flags;
|
|
|
|
kern_jit_ctx.op_emit_avx3(ctx,tmp);
|
|
end;
|
|
|
|
procedure op_emit_avx3_imm8(var ctx:t_jit_context2;const desc:t_op_avx3_imm);
|
|
var
|
|
tmp:t_op_avx3_imm;
|
|
begin
|
|
tmp:=desc;
|
|
|
|
tmp.rmi.opt :=tmp.rmi.opt+[verif_vex_len,verif_rexw];
|
|
tmp.rmi.vx_len:=ctx.dis.Vex.Length;
|
|
tmp.rmi.rexw :=rexW in ctx.dis.Flags;
|
|
|
|
tmp.mri.opt :=tmp.mri.opt+[verif_vex_len,verif_rexw];
|
|
tmp.mri.vx_len:=ctx.dis.Vex.Length;
|
|
tmp.mri.rexw :=rexW in ctx.dis.Flags;
|
|
|
|
kern_jit_ctx.op_emit_avx3_imm8(ctx,tmp);
|
|
end;
|
|
|
|
procedure op_emit_avx_F3(var ctx:t_jit_context2;const desc:t_op_type);
|
|
var
|
|
tmp:t_op_type;
|
|
begin
|
|
tmp:=desc;
|
|
|
|
tmp.opt :=tmp.opt+[verif_vex_len,verif_rexw];
|
|
tmp.vx_len:=ctx.dis.Vex.Length;
|
|
tmp.rexw :=rexW in ctx.dis.Flags;
|
|
|
|
kern_jit_ctx.op_emit_avx_F3(ctx,tmp);
|
|
end;
|
|
|
|
procedure op_emit_avx4(var ctx:t_jit_context2;const desc:t_op_type);
|
|
var
|
|
tmp:t_op_type;
|
|
begin
|
|
tmp:=desc;
|
|
|
|
tmp.opt :=tmp.opt+[verif_vex_len,verif_rexw];
|
|
tmp.vx_len:=ctx.dis.Vex.Length;
|
|
tmp.rexw :=rexW in ctx.dis.Flags;
|
|
|
|
kern_jit_ctx.op_emit_avx4(ctx,tmp);
|
|
end;
|
|
|
|
procedure op_emit_bmi_rmr(var ctx:t_jit_context2;const desc:t_op_type);
|
|
var
|
|
tmp:t_op_type;
|
|
|
|
Operand:array[2..3] of TOperand;
|
|
begin
|
|
tmp:=desc;
|
|
|
|
tmp.opt :=tmp.opt+[verif_vex_len,verif_rexw];
|
|
tmp.vx_len:=ctx.dis.Vex.Length;
|
|
tmp.rexw :=rexW in ctx.dis.Flags;
|
|
|
|
//swap operands 2<->3
|
|
Operand[2]:=ctx.din.Operand[2];
|
|
Operand[3]:=ctx.din.Operand[3];
|
|
//
|
|
ctx.din.Operand[2]:=Operand[3];
|
|
ctx.din.Operand[3]:=Operand[2];
|
|
|
|
kern_jit_ctx.op_emit_bmi_rrm(ctx,tmp);
|
|
|
|
//restore operands
|
|
ctx.din.Operand[2]:=Operand[2];
|
|
ctx.din.Operand[3]:=Operand[3];
|
|
end;
|
|
|
|
procedure op_emit_bmi_rrm(var ctx:t_jit_context2;const desc:t_op_type);
|
|
var
|
|
tmp:t_op_type;
|
|
begin
|
|
tmp:=desc;
|
|
|
|
tmp.opt :=tmp.opt+[verif_vex_len,verif_rexw];
|
|
tmp.vx_len:=ctx.dis.Vex.Length;
|
|
tmp.rexw :=rexW in ctx.dis.Flags;
|
|
|
|
kern_jit_ctx.op_emit_bmi_rrm(ctx,tmp);
|
|
end;
|
|
|
|
///verif
|
|
|
|
function get_vw_mode(var ctx:t_jit_context2):t_vw_mode;
|
|
begin
|
|
Result:=vwZero; //default
|
|
|
|
case ctx.din.OpCode.Opcode of
|
|
|
|
OPcvtsi2:Result:=vwM64;
|
|
|
|
OPcvtss2:
|
|
case ctx.din.OpCode.Suffix of
|
|
OPSx_si:Result:=vwR64;
|
|
else;
|
|
end;
|
|
|
|
OPcvtsd2:
|
|
case ctx.din.OpCode.Suffix of
|
|
OPSx_si:Result:=vwR64;
|
|
else;
|
|
end;
|
|
|
|
OPcvttss2:Result:=vwR64;
|
|
OPcvttsd2:Result:=vwR64;
|
|
|
|
OPpextr:
|
|
case ctx.din.OpCode.Suffix of
|
|
OPSx_q:Result:=vwOne;
|
|
else;
|
|
end;
|
|
|
|
OPpinsr:
|
|
case ctx.din.OpCode.Suffix of
|
|
OPSx_q:Result:=vwOne;
|
|
else;
|
|
end;
|
|
|
|
OPvperm:
|
|
case ctx.din.OpCode.Suffix of
|
|
OPSx_q :Result:=vwOne;
|
|
OPSx_pd:Result:=vwOne;
|
|
else;
|
|
end;
|
|
|
|
else;
|
|
end;
|
|
end;
|
|
|
|
function get_vl_mode(var ctx:t_jit_context2):t_vl_mode;
|
|
begin
|
|
Result:=vlM256; //default
|
|
|
|
case ctx.din.OpCode.Opcode of
|
|
|
|
OPcvtdq2:
|
|
case ctx.din.OpCode.Suffix of
|
|
OPSx_pd:Result:=vlR256;
|
|
else;
|
|
end;
|
|
|
|
OPcvtps2:
|
|
case ctx.din.OpCode.Suffix of
|
|
OPSx_pd:Result:=vlR256;
|
|
OPSx_ph:Result:=vlR256;
|
|
else;
|
|
end;
|
|
|
|
OPvcvtph2ps:Result:=vlR256;
|
|
|
|
OPvperm2:Result:=vlOne;
|
|
OPvperm :Result:=vlOne;
|
|
|
|
OPinsert:
|
|
case ctx.din.OpCode.Suffix of
|
|
OPSx_f128:Result:=vlOne;
|
|
else;
|
|
end;
|
|
|
|
OPextract:
|
|
case ctx.din.OpCode.Suffix of
|
|
OPSx_f128:Result:=vlOne;
|
|
else;
|
|
end;
|
|
|
|
OPvbroadcast:
|
|
case ctx.din.OpCode.Suffix of
|
|
OPSx_ss :Result:=vlR256;
|
|
OPSx_sd :Result:=vlOne;
|
|
OPSx_f128:Result:=vlOne;
|
|
else;
|
|
end;
|
|
|
|
else;
|
|
end;
|
|
end;
|
|
|
|
procedure op_emit_avx2_mem_reg(var ctx:t_jit_context2;hint:t_op_hint);
|
|
const
|
|
desc:t_op_desc=(
|
|
mem_reg:();
|
|
reg_mem:(opt:[not_impl]);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mri8];
|
|
);
|
|
var
|
|
tmp:t_op_desc;
|
|
begin
|
|
tmp:=desc;
|
|
tmp.mem_reg.op :=ctx.dis.opcode and $FF;
|
|
tmp.mem_reg.simdop :=SCODES[ctx.dis.SimdOpcode];
|
|
tmp.mem_reg.mm :=ctx.dis.mm;
|
|
tmp.mem_reg.vw_mode:=get_vw_mode(ctx);
|
|
tmp.mem_reg.vl_mode:=get_vl_mode(ctx);
|
|
tmp.hint:=tmp.hint+hint;
|
|
//
|
|
op_emit_avx2(ctx,tmp);
|
|
end;
|
|
|
|
procedure op_emit_avx2_reg_mem(var ctx:t_jit_context2;hint:t_op_hint);
|
|
const
|
|
desc:t_op_desc=(
|
|
mem_reg:(opt:[not_impl]);
|
|
reg_mem:();
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[];
|
|
);
|
|
var
|
|
tmp:t_op_desc;
|
|
begin
|
|
tmp:=desc;
|
|
tmp.reg_mem.op :=ctx.dis.opcode and $FF;
|
|
tmp.reg_mem.simdop :=SCODES[ctx.dis.SimdOpcode];
|
|
tmp.reg_mem.mm :=ctx.dis.mm;
|
|
tmp.reg_mem.vw_mode:=get_vw_mode(ctx);
|
|
tmp.reg_mem.vl_mode:=get_vl_mode(ctx);
|
|
tmp.hint:=hint;
|
|
//
|
|
op_emit_avx2(ctx,tmp);
|
|
end;
|
|
|
|
procedure op_avx2_mem_reg_mov_wo(var ctx:t_jit_context2);
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx2_mem_reg(ctx,[his_mov,his_wo]);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
procedure op_avx2_reg_mem_mov_wo(var ctx:t_jit_context2);
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx2_reg_mem(ctx,[his_mov,his_wo]);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
procedure op_avx2_reg_mem_wo(var ctx:t_jit_context2);
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx2_reg_mem(ctx,[his_wo]);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
procedure op_avx2_reg_mem_ro(var ctx:t_jit_context2);
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx2_reg_mem(ctx,[his_ro]);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
procedure op_avx2_rr(var ctx:t_jit_context2);
|
|
var
|
|
tmp:t_op_type;
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
tmp:=Default(t_op_type);
|
|
tmp.op :=ctx.dis.opcode and $FF;
|
|
tmp.simdop :=SCODES[ctx.dis.SimdOpcode];
|
|
tmp.mm :=ctx.dis.mm;
|
|
tmp.vw_mode:=get_vw_mode(ctx);
|
|
tmp.vl_mode:=get_vl_mode(ctx);
|
|
//
|
|
op_emit_avx2_rr(ctx,tmp);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
procedure op_avx3_gen(var ctx:t_jit_context2);
|
|
var
|
|
tmp:t_op_type;
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
tmp:=Default(t_op_type);
|
|
tmp.op :=ctx.dis.opcode and $FF;
|
|
tmp.simdop :=SCODES[ctx.dis.SimdOpcode];
|
|
tmp.mm :=ctx.dis.mm;
|
|
tmp.vw_mode:=get_vw_mode(ctx);
|
|
tmp.vl_mode:=get_vl_mode(ctx);
|
|
//
|
|
op_emit_avx3(ctx,tmp);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
procedure op_avx3_vx_zero(var ctx:t_jit_context2);
|
|
var
|
|
tmp:t_op_type;
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
tmp:=Default(t_op_type);
|
|
tmp.op :=ctx.dis.opcode and $FF;
|
|
tmp.simdop :=SCODES[ctx.dis.SimdOpcode];
|
|
tmp.mm :=ctx.dis.mm;
|
|
tmp.vw_mode:=get_vw_mode(ctx);
|
|
tmp.vl_mode:=vlZero;
|
|
//
|
|
op_emit_avx3(ctx,tmp);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
procedure op_avx3_rmi(var ctx:t_jit_context2);
|
|
const
|
|
desc:t_op_avx3_imm=(
|
|
rmi:();
|
|
mri:(opt:[not_impl]);
|
|
);
|
|
var
|
|
tmp:t_op_avx3_imm;
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
tmp:=desc;
|
|
tmp.rmi.op :=ctx.dis.opcode and $FF;
|
|
tmp.rmi.simdop :=SCODES[ctx.dis.SimdOpcode];
|
|
tmp.rmi.mm :=ctx.dis.mm;
|
|
tmp.rmi.vw_mode:=get_vw_mode(ctx);
|
|
tmp.rmi.vl_mode:=get_vl_mode(ctx);
|
|
//
|
|
op_emit_avx3_imm8(ctx,tmp);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
procedure op_avx3_mri(var ctx:t_jit_context2);
|
|
const
|
|
desc:t_op_avx3_imm=(
|
|
rmi:(opt:[not_impl]);
|
|
mri:();
|
|
);
|
|
var
|
|
tmp:t_op_avx3_imm;
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
tmp:=desc;
|
|
tmp.mri.op :=ctx.dis.opcode and $FF;
|
|
tmp.mri.simdop :=SCODES[ctx.dis.SimdOpcode];
|
|
tmp.mri.mm :=ctx.dis.mm;
|
|
tmp.mri.vw_mode:=get_vw_mode(ctx);
|
|
tmp.mri.vl_mode:=get_vl_mode(ctx);
|
|
//
|
|
op_emit_avx3_imm8(ctx,tmp);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
procedure op_maskmov_dqu(var ctx:t_jit_context2);
|
|
begin
|
|
if jit_memory_guard then
|
|
begin
|
|
with ctx.builder do
|
|
begin
|
|
//save
|
|
movq(r_tmp1,rdi);
|
|
|
|
op_uplift(ctx,rdi,os64,[not_use_r_tmp1]); //in/out:rdi
|
|
|
|
add_orig(ctx);
|
|
|
|
//restore
|
|
movq(rdi,r_tmp1);
|
|
end;
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
const
|
|
vmovups_desc:t_op_desc=(
|
|
mem_reg:(op:$11;simdop:0;mm:1);
|
|
reg_mem:(op:$10;simdop:0;mm:1);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo];
|
|
);
|
|
|
|
procedure op_vmovups(var ctx:t_jit_context2);
|
|
begin
|
|
if is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx2(ctx,vmovups_desc);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
const
|
|
vmovupd_desc:t_op_desc=(
|
|
mem_reg:(op:$11;simdop:1;mm:1);
|
|
reg_mem:(op:$10;simdop:1;mm:1);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo];
|
|
);
|
|
|
|
procedure op_vmovupd(var ctx:t_jit_context2);
|
|
begin
|
|
if is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx2(ctx,vmovupd_desc);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
const
|
|
vmovaps_desc:t_op_desc=(
|
|
mem_reg:(op:$29;simdop:0;mm:1);
|
|
reg_mem:(op:$28;simdop:0;mm:1);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo,his_align];
|
|
);
|
|
|
|
procedure op_vmovaps(var ctx:t_jit_context2);
|
|
begin
|
|
if is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx2(ctx,vmovaps_desc);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
const
|
|
vmovapd_desc:t_op_desc=(
|
|
mem_reg:(op:$29;simdop:1;mm:1);
|
|
reg_mem:(op:$28;simdop:1;mm:1);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo,his_align];
|
|
);
|
|
|
|
procedure op_vmovapd(var ctx:t_jit_context2);
|
|
begin
|
|
if is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx2(ctx,vmovapd_desc);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
const
|
|
vmovdqu_desc:t_op_desc=(
|
|
mem_reg:(op:$7F;simdop:2;mm:1);
|
|
reg_mem:(op:$6F;simdop:2;mm:1);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo];
|
|
);
|
|
|
|
procedure op_vmovdqu(var ctx:t_jit_context2);
|
|
begin
|
|
if is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx2(ctx,vmovdqu_desc);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
const
|
|
vmovdqa_desc:t_op_desc=(
|
|
mem_reg:(op:$7F;simdop:1;mm:1);
|
|
reg_mem:(op:$6F;simdop:1;mm:1);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo,his_align];
|
|
);
|
|
|
|
procedure op_vmovdqa(var ctx:t_jit_context2);
|
|
begin
|
|
if is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx2(ctx,vmovdqa_desc);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
procedure op_vmovntdqa(var ctx:t_jit_context2);
|
|
begin
|
|
if is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx2_reg_mem(ctx,[his_mov,his_wo,his_align]);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
const
|
|
vmov_d_desc:t_op_desc=(
|
|
mem_reg:(op:$7E;simdop:1;mm:1;vw_mode:vwZero);
|
|
reg_mem:(op:$6E;simdop:1;mm:1;vw_mode:vwZero);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo];
|
|
);
|
|
|
|
procedure op_vmovd(var ctx:t_jit_context2);
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx2(ctx,vmov_d_desc);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
const
|
|
vmov_q_desc:t_op_desc=(
|
|
mem_reg:(op:$7E;simdop:1;mm:1;vw_mode:vwOne);
|
|
reg_mem:(op:$6E;simdop:1;mm:1;vw_mode:vwOne);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo];
|
|
);
|
|
|
|
vmovq_desc:t_op_desc=(
|
|
mem_reg:(op:$D6;simdop:1;mm:1;vw_mode:vwZero);
|
|
reg_mem:(op:$7E;simdop:2;mm:1;vw_mode:vwZero);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo];
|
|
);
|
|
|
|
procedure op_vmovq(var ctx:t_jit_context2);
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
if (ctx.dis.SimdOpcode=so66) and
|
|
((ctx.dis.opcode and $FF) in [$6E,$7E]) then
|
|
begin
|
|
op_emit_avx2(ctx,vmov_q_desc);
|
|
end else
|
|
begin
|
|
op_emit_avx2(ctx,vmovq_desc);
|
|
end;
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
const
|
|
vmov_ss_desc:t_op_desc=(
|
|
mem_reg:(op:$11;simdop:2;mm:1);
|
|
reg_mem:(op:$10;simdop:2;mm:1);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo];
|
|
);
|
|
|
|
procedure op_vmov_ss_sd(var ctx:t_jit_context2);
|
|
var
|
|
desc:t_op_desc;
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
case ctx.din.OperCnt of
|
|
2:begin
|
|
desc:=vmov_ss_desc;
|
|
desc.mem_reg.simdop:=SCODES[ctx.dis.SimdOpcode];
|
|
desc.reg_mem.simdop:=SCODES[ctx.dis.SimdOpcode];
|
|
//
|
|
op_emit_avx2(ctx,desc);
|
|
end;
|
|
3:op_avx3_vx_zero(ctx);
|
|
else
|
|
Assert(False,'op_vmov_ss_sd');
|
|
end;
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
const
|
|
vmovlps_desc2:t_op_desc=(
|
|
mem_reg:(op:$13;simdop:0;mm:1;vl_mode:vlZero);
|
|
reg_mem:(opt:[not_impl]);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo];
|
|
);
|
|
|
|
vmovlps_rrm_desc:t_op_type=(op:$12;simdop:0;mm:1);
|
|
|
|
procedure op_vmovlps(var ctx:t_jit_context2);
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
case ctx.din.OperCnt of
|
|
2:op_emit_avx2(ctx,vmovlps_desc2);
|
|
3:op_emit_avx3(ctx,vmovlps_rrm_desc);
|
|
else
|
|
Assert(False,'op_vmovlps');
|
|
end;
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
const
|
|
vmovlpd_desc2:t_op_desc=(
|
|
mem_reg:(op:$13;simdop:1;mm:1;vl_mode:vlZero);
|
|
reg_mem:(opt:[not_impl]);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo];
|
|
);
|
|
|
|
vmovlpd_rrm_desc:t_op_type=(op:$12;simdop:1;mm:1;vl_mode:vlZero);
|
|
|
|
procedure op_vmovlpd(var ctx:t_jit_context2);
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
case ctx.din.OperCnt of
|
|
2:op_emit_avx2(ctx,vmovlpd_desc2);
|
|
3:op_emit_avx3(ctx,vmovlpd_rrm_desc);
|
|
else
|
|
Assert(False,'op_vmovlpd');
|
|
end;
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
const
|
|
vmovhps_desc2:t_op_desc=(
|
|
mem_reg:(op:$17;simdop:0;mm:1;vl_mode:vlZero);
|
|
reg_mem:(opt:[not_impl]);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo];
|
|
);
|
|
|
|
vmovhps_rrm_desc:t_op_type=(op:$16;simdop:0;mm:1;vl_mode:vlZero);
|
|
|
|
procedure op_vmovhps(var ctx:t_jit_context2);
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
case ctx.din.OperCnt of
|
|
2:op_emit_avx2(ctx,vmovhps_desc2);
|
|
3:op_emit_avx3(ctx,vmovhps_rrm_desc);
|
|
else
|
|
Assert(False,'op_vmovhps');
|
|
end;
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
const
|
|
vmovhpd_desc2:t_op_desc=(
|
|
mem_reg:(op:$17;simdop:1;mm:1;vl_mode:vlZero);
|
|
reg_mem:(opt:[not_impl]);
|
|
reg_imm:(opt:[not_impl]);
|
|
reg_im8:(opt:[not_impl]);
|
|
hint:[his_mov,his_wo];
|
|
);
|
|
|
|
vmovhpd_rrm_desc:t_op_type=(op:$16;simdop:1;mm:1;vl_mode:vlZero);
|
|
|
|
procedure op_vmovhpd(var ctx:t_jit_context2);
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
case ctx.din.OperCnt of
|
|
2:op_emit_avx2(ctx,vmovhpd_desc2);
|
|
3:op_emit_avx3(ctx,vmovhpd_rrm_desc);
|
|
else
|
|
Assert(False,'op_vmovhpd');
|
|
end;
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
procedure op_bmi_gen(var ctx:t_jit_context2);
|
|
const
|
|
desc:t_op_type=(
|
|
op:$F3;index:0;mm:0;vw_mode:vwR64;vl_mode:vlZero
|
|
);
|
|
var
|
|
tmp:t_op_type;
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
tmp:=desc;
|
|
tmp.index:=ctx.dis.ModRM.Index;
|
|
tmp.mm :=ctx.dis.mm;
|
|
//
|
|
op_emit_avx_F3(ctx,tmp);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
const
|
|
vpermilps_rrm_desc:t_op_type=(
|
|
op:$0C;simdop:1;mm:2;
|
|
);
|
|
|
|
vpermilps_rmi_desc:t_op_avx3_imm=(
|
|
rmi:(op:$04;simdop:1;mm:3);
|
|
mri:(opt:[not_impl]);
|
|
);
|
|
|
|
procedure op_vpermilps(var ctx:t_jit_context2);
|
|
begin
|
|
if is_memory(ctx.din) then
|
|
begin
|
|
if is_memory(ctx.din.Operand[3]) then
|
|
begin
|
|
op_emit_avx3(ctx,vpermilps_rrm_desc);
|
|
end else
|
|
if (ctx.din.Operand[3].ByteCount<>0) then
|
|
begin
|
|
op_emit_avx3_imm8(ctx,vpermilps_rmi_desc);
|
|
end else
|
|
begin
|
|
Assert(False,'op_vpermilps');
|
|
end;
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
const
|
|
vpermilpd_rrm_desc:t_op_type=(
|
|
op:$0D;simdop:1;mm:2;
|
|
);
|
|
|
|
vpermilpd_rmi_desc:t_op_avx3_imm=(
|
|
rmi:(op:$05;simdop:1;mm:3);
|
|
mri:(opt:[not_impl]);
|
|
);
|
|
|
|
procedure op_vpermilpd(var ctx:t_jit_context2);
|
|
begin
|
|
if is_memory(ctx.din) then
|
|
begin
|
|
if is_memory(ctx.din.Operand[3]) then
|
|
begin
|
|
op_emit_avx3(ctx,vpermilpd_rrm_desc);
|
|
end else
|
|
if (ctx.din.Operand[3].ByteCount<>0) then
|
|
begin
|
|
op_emit_avx3_imm8(ctx,vpermilpd_rmi_desc);
|
|
end else
|
|
begin
|
|
Assert(False,'op_vpermilpd');
|
|
end;
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
const
|
|
vpblendvb_desc:t_op_type=(
|
|
op:$4C;simdop:1;mm:3
|
|
);
|
|
|
|
procedure op_vpblendvb(var ctx:t_jit_context2);
|
|
begin
|
|
if is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx4(ctx,vpblendvb_desc);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
const
|
|
vblendvps_desc:t_op_type=(
|
|
op:$4A;simdop:1;mm:3
|
|
);
|
|
|
|
procedure op_vblendvps(var ctx:t_jit_context2);
|
|
begin
|
|
if is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx4(ctx,vblendvps_desc);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
const
|
|
vblendvpd_desc:t_op_type=(
|
|
op:$4B;simdop:1;mm:3
|
|
);
|
|
|
|
procedure op_vblendvpd(var ctx:t_jit_context2);
|
|
begin
|
|
if is_memory(ctx.din) then
|
|
begin
|
|
op_emit_avx4(ctx,vblendvpd_desc);
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
const
|
|
bextr_desc:t_op_type=(
|
|
op:$F7;simdop:0;mm:2;vw_mode:vwR64;opt:[reg_size_pri]
|
|
);
|
|
|
|
procedure op_bextr(var ctx:t_jit_context2);
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
op_emit_bmi_rmr(ctx,bextr_desc); //r64a, r/m64, r64b
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
const
|
|
andn_desc:t_op_type=(
|
|
op:$F2;simdop:0;mm:2;vw_mode:vwR64;opt:[reg_size_pri]
|
|
);
|
|
|
|
procedure op_andn(var ctx:t_jit_context2);
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
op_emit_bmi_rrm(ctx,andn_desc); //r64a, r64b, r/m64
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
procedure op_vpextrw(var ctx:t_jit_context2);
|
|
begin
|
|
if is_preserved(ctx.din) or is_memory(ctx.din) then
|
|
begin
|
|
//VEX.128.66.0F.W0 C5 /r ib VPEXTRW reg , xmm1, imm8
|
|
//VEX.128.66.0F3A.W0 15 /r ib VPEXTRW reg/m16, xmm2, imm8
|
|
case ctx.dis.opcode of
|
|
$C5:op_avx3_rmi(ctx);
|
|
$15:op_avx3_mri(ctx);
|
|
else;
|
|
Assert(false);
|
|
end;
|
|
end else
|
|
begin
|
|
add_orig(ctx);
|
|
end;
|
|
end;
|
|
|
|
//
|
|
|
|
const
|
|
vldmxcsr_desc:t_op_type=(
|
|
op:$AE;index:2;simdop:0;mm:1;
|
|
);
|
|
|
|
procedure op_vldmxcsr(var ctx:t_jit_context2);
|
|
begin
|
|
op_emit_avx1(ctx,vldmxcsr_desc,[his_ro]);
|
|
end;
|
|
|
|
const
|
|
vstmxcsr_desc:t_op_type=(
|
|
op:$AE;index:3;simdop:0;mm:1;
|
|
);
|
|
|
|
procedure op_vstmxcsr(var ctx:t_jit_context2);
|
|
begin
|
|
op_emit_avx1(ctx,vstmxcsr_desc,[his_wo]);
|
|
end;
|
|
|
|
procedure op_invalid(var ctx:t_jit_context2);
|
|
begin
|
|
ctx.builder.ud2;
|
|
end;
|
|
|
|
///
|
|
|
|
procedure init_cbs_avx;
|
|
begin
|
|
jit_cbs[OPPv,OPmovu,OPSx_ps ]:=@op_vmovups;
|
|
jit_cbs[OPPv,OPmovu,OPSx_pd ]:=@op_vmovupd;
|
|
jit_cbs[OPPv,OPmova,OPSx_ps ]:=@op_vmovaps;
|
|
jit_cbs[OPPv,OPmova,OPSx_pd ]:=@op_vmovapd;
|
|
jit_cbs[OPPv,OPmov ,OPSx_dqu]:=@op_vmovdqu;
|
|
jit_cbs[OPPv,OPmov ,OPSx_dqa]:=@op_vmovdqa;
|
|
|
|
jit_cbs[OPPv,OPlddqu,OPSnone]:=@op_avx2_reg_mem_wo;
|
|
|
|
jit_cbs[OPPv,OPmovnt,OPSx_dqa]:=@op_vmovntdqa;
|
|
jit_cbs[OPPv,OPmovnt,OPSx_dq ]:=@op_avx2_mem_reg_mov_wo;
|
|
|
|
jit_cbs[OPPv,OPmovnt,OPSx_ps ]:=@op_avx2_mem_reg_mov_wo;
|
|
jit_cbs[OPPv,OPmovnt,OPSx_pd ]:=@op_avx2_mem_reg_mov_wo;
|
|
|
|
jit_cbs[OPPv,OPmovddup,OPSnone]:=@op_avx2_reg_mem_mov_wo;
|
|
|
|
jit_cbs[OPPv,OPmov ,OPSx_d ]:=@op_vmovd;
|
|
jit_cbs[OPPv,OPmov ,OPSx_q ]:=@op_vmovq;
|
|
|
|
jit_cbs[OPPv,OPmov ,OPSx_ss ]:=@op_vmov_ss_sd;
|
|
jit_cbs[OPPv,OPmov ,OPSx_sd ]:=@op_vmov_ss_sd;
|
|
|
|
jit_cbs[OPPv,OPmovl,OPSx_ps]:=@op_vmovlps;
|
|
jit_cbs[OPPv,OPmovl,OPSx_pd]:=@op_vmovlpd;
|
|
|
|
jit_cbs[OPPv,OPmovh,OPSx_ps]:=@op_vmovhps;
|
|
jit_cbs[OPPv,OPmovh,OPSx_pd]:=@op_vmovhpd;
|
|
|
|
jit_cbs[OPPv,OPmovhlps,OPSnone]:=@add_orig;
|
|
|
|
jit_cbs[OPPv,OPmovlh,OPSx_ps]:=@add_orig;
|
|
|
|
jit_cbs[OPPv,OPmovsldup,OPSnone]:=@op_avx2_reg_mem_mov_wo;
|
|
jit_cbs[OPPv,OPmovshdup,OPSnone]:=@op_avx2_reg_mem_mov_wo;
|
|
|
|
jit_cbs[OPPv,OPpmovsx,OPSv_bw]:=@op_avx2_reg_mem_mov_wo;
|
|
jit_cbs[OPPv,OPpmovsx,OPSv_bd]:=@op_avx2_reg_mem_mov_wo;
|
|
jit_cbs[OPPv,OPpmovsx,OPSv_bq]:=@op_avx2_reg_mem_mov_wo;
|
|
jit_cbs[OPPv,OPpmovsx,OPSv_wd]:=@op_avx2_reg_mem_mov_wo;
|
|
jit_cbs[OPPv,OPpmovsx,OPSv_wq]:=@op_avx2_reg_mem_mov_wo;
|
|
jit_cbs[OPPv,OPpmovsx,OPSv_dq]:=@op_avx2_reg_mem_mov_wo;
|
|
|
|
jit_cbs[OPPv,OPpmovzx,OPSv_bw]:=@op_avx2_reg_mem_mov_wo;
|
|
jit_cbs[OPPv,OPpmovzx,OPSv_bd]:=@op_avx2_reg_mem_mov_wo;
|
|
jit_cbs[OPPv,OPpmovzx,OPSv_bq]:=@op_avx2_reg_mem_mov_wo;
|
|
jit_cbs[OPPv,OPpmovzx,OPSv_wd]:=@op_avx2_reg_mem_mov_wo;
|
|
jit_cbs[OPPv,OPpmovzx,OPSv_wq]:=@op_avx2_reg_mem_mov_wo;
|
|
jit_cbs[OPPv,OPpmovzx,OPSv_dq]:=@op_avx2_reg_mem_mov_wo;
|
|
|
|
jit_cbs[OPPv,OPmovmsk ,OPSx_ps]:=@op_avx2_rr;
|
|
jit_cbs[OPPv,OPmovmsk ,OPSx_pd]:=@op_avx2_rr;
|
|
jit_cbs[OPPv,OPpmovmskb,OPSnone]:=@op_avx2_rr;
|
|
|
|
jit_cbs[OPPv,OPmaskmov,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPmaskmov,OPSx_pd]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPmaskmov,OPSx_dqu]:=@op_maskmov_dqu;
|
|
|
|
jit_cbs[OPPv,OPcomi ,OPSx_ss]:=@op_avx2_reg_mem_ro;
|
|
jit_cbs[OPPv,OPcomi ,OPSx_sd]:=@op_avx2_reg_mem_ro;
|
|
|
|
jit_cbs[OPPv,OPucomi,OPSx_ss]:=@op_avx2_reg_mem_ro;
|
|
jit_cbs[OPPv,OPucomi,OPSx_sd]:=@op_avx2_reg_mem_ro;
|
|
|
|
jit_cbs[OPPnone,OPvtest,OPSx_ps]:=@op_avx2_reg_mem_ro;
|
|
jit_cbs[OPPnone,OPvtest,OPSx_pd]:=@op_avx2_reg_mem_ro;
|
|
|
|
jit_cbs[OPPv,OPptest,OPSnone]:=@op_avx2_reg_mem_ro;
|
|
|
|
jit_cbs[OPPv,OPpcmpeq,OPSx_b ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpcmpeq,OPSx_w ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpcmpeq,OPSx_d ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpcmpeq,OPSx_q ]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpcmpgt,OPSx_b ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpcmpgt,OPSx_w ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpcmpgt,OPSx_d ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpcmpgt,OPSx_q ]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpcmpestrm,OPSnone]:=@op_avx3_rmi;
|
|
jit_cbs[OPPv,OPpcmpestri,OPSnone]:=@op_avx3_rmi;
|
|
jit_cbs[OPPv,OPpcmpistrm,OPSnone]:=@op_avx3_rmi;
|
|
jit_cbs[OPPv,OPpcmpistri,OPSnone]:=@op_avx3_rmi;
|
|
|
|
jit_cbs[OPPv,OPsub ,OPSx_sd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPsub ,OPSx_ss]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPsub ,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPsub ,OPSx_pd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsub ,OPSx_b ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsub ,OPSx_w ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsub ,OPSx_d ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsub ,OPSx_q ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsubs ,OPSx_b ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsubs ,OPSx_w ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsubus,OPSx_b ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsubus,OPSx_w ]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPadd ,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPadd ,OPSx_pd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPadd ,OPSx_ss]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPadd ,OPSx_sd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpadd ,OPSx_b ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpadd ,OPSx_w ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpadd ,OPSx_d ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpadd ,OPSx_q ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpadds ,OPSx_b ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpadds ,OPSx_w ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpaddus,OPSx_b ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpaddus,OPSx_w ]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPphadd ,OPSx_w]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPphadd ,OPSx_d]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPaddsub,OPSx_pd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPaddsub,OPSx_ps]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPphsub,OPSx_w]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPphsub,OPSx_d]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPdiv ,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPdiv ,OPSx_pd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPdiv ,OPSx_ss]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPdiv ,OPSx_sd]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPmul ,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPmul ,OPSx_pd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPmul ,OPSx_ss]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPmul ,OPSx_sd]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpmull ,OPSx_d]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpmull ,OPSx_w]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpmuludq ,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpmulhuw ,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpmulhrsw,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpmulhw ,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpmuldq ,OPSnone]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpunpcklbw ,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpunpcklwd ,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpunpckldq ,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpunpcklqdq,OPSnone]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpunpckhbw ,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpunpckhwd ,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpunpckhdq ,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpunpckhqdq,OPSnone]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPunpckl ,OPSx_pd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPunpckl ,OPSx_ps]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPunpckh ,OPSx_pd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPunpckh ,OPSx_ps]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPcmp ,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPcmp ,OPSx_pd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPcmp ,OPSx_sd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPcmp ,OPSx_ss]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpshuf ,OPSx_b ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpshuf ,OPSx_d ]:=@op_avx3_rmi;
|
|
jit_cbs[OPPv,OPpshuf ,OPSx_hw]:=@op_avx3_rmi;
|
|
jit_cbs[OPPv,OPpshuf ,OPSx_lw]:=@op_avx3_rmi;
|
|
|
|
jit_cbs[OPPv,OPshuf ,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPshuf ,OPSx_pd]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPnone,OPvpermil,OPSx_ps]:=@op_vpermilps;
|
|
jit_cbs[OPPnone,OPvpermil,OPSx_pd]:=@op_vpermilpd;
|
|
|
|
jit_cbs[OPPnone,OPvperm2,OPSx_f128]:=@op_avx3_gen;
|
|
jit_cbs[OPPnone,OPvperm2,OPSx_i128]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPnone,OPvperm,OPSx_d]:=@op_avx3_gen;
|
|
jit_cbs[OPPnone,OPvperm,OPSx_q]:=@op_avx3_rmi;
|
|
|
|
jit_cbs[OPPnone,OPvperm,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPnone,OPvperm,OPSx_pd]:=@op_avx3_rmi;
|
|
|
|
jit_cbs[OPPv,OPxor ,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPxor ,OPSx_pd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpxor ,OPSnone]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPor ,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPor ,OPSx_pd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpor ,OPSnone]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPand ,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPand ,OPSx_pd]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPandn ,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPandn ,OPSx_pd]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpand ,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpandn ,OPSnone]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPblend ,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPblend ,OPSx_pd]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpblend ,OPSx_w ]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpblendvb,OPSnone]:=@op_vpblendvb;
|
|
|
|
jit_cbs[OPPv,OPblendv ,OPSx_ps]:=@op_vblendvps;
|
|
jit_cbs[OPPv,OPblendv ,OPSx_pd]:=@op_vblendvpd;
|
|
|
|
jit_cbs[OPPv,OPcvtsi2 ,OPSx_ss]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPcvtsi2 ,OPSx_sd]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPcvtss2 ,OPSx_sd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPcvtss2 ,OPSx_si]:=@op_avx2_reg_mem_wo;
|
|
|
|
jit_cbs[OPPv,OPcvtsd2 ,OPSx_ss]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPcvtsd2 ,OPSx_si]:=@op_avx2_reg_mem_wo;
|
|
|
|
jit_cbs[OPPv,OPcvttps2,OPSx_dq]:=@op_avx2_reg_mem_wo;
|
|
jit_cbs[OPPv,OPcvttpd2,OPSx_dq]:=@op_avx2_reg_mem_wo;
|
|
|
|
jit_cbs[OPPv,OPcvtdq2 ,OPSx_ps]:=@op_avx2_reg_mem_wo;
|
|
jit_cbs[OPPv,OPcvtdq2 ,OPSx_pd]:=@op_avx2_reg_mem_wo;
|
|
|
|
jit_cbs[OPPv,OPcvttss2,OPSx_si]:=@op_avx2_reg_mem_wo;
|
|
jit_cbs[OPPv,OPcvttsd2,OPSx_si]:=@op_avx2_reg_mem_wo;
|
|
|
|
jit_cbs[OPPv,OPcvtpd2 ,OPSx_ps]:=@op_avx2_reg_mem_wo;
|
|
jit_cbs[OPPv,OPcvtpd2 ,OPSx_dq]:=@op_avx2_reg_mem_wo;
|
|
|
|
jit_cbs[OPPv,OPcvtps2 ,OPSx_pd]:=@op_avx2_reg_mem_wo;
|
|
jit_cbs[OPPv,OPcvtps2 ,OPSx_dq]:=@op_avx2_reg_mem_wo;
|
|
|
|
jit_cbs[OPPv,OPphminposuw,OPSnone]:=@op_avx2_reg_mem_wo;
|
|
|
|
jit_cbs[OPPv,OPcvtps2 ,OPSx_ph]:=@op_avx3_mri;
|
|
|
|
jit_cbs[OPPnone,OPvcvtph2ps,OPSnone]:=@op_avx2_reg_mem_wo;
|
|
|
|
//BMI1
|
|
jit_cbs[OPPnone,OPbextr,OPSnone]:=@op_bextr;
|
|
jit_cbs[OPPnone,OPandn ,OPSnone]:=@op_andn;
|
|
//
|
|
jit_cbs[OPPnone,OPblsr ,OPSnone]:=@op_bmi_gen;
|
|
jit_cbs[OPPnone,OPblsmsk,OPSnone]:=@op_bmi_gen;
|
|
jit_cbs[OPPnone,OPblsi ,OPSnone]:=@op_bmi_gen;
|
|
//BMI1
|
|
|
|
//BMI2
|
|
jit_cbs[OPPnone,OPshl ,OPSx_x ]:=@op_invalid;
|
|
jit_cbs[OPPnone,OPshr ,OPSx_x ]:=@op_invalid;
|
|
jit_cbs[OPPnone,OProrx,OPSnone]:=@op_invalid;
|
|
jit_cbs[OPPnone,OPbzhi,OPSnone]:=@op_invalid;
|
|
//BMI2
|
|
|
|
//3DNow
|
|
jit_cbs[OPPnone,OPpavgusb,OPSnone]:=@op_invalid;
|
|
//3DNow
|
|
|
|
jit_cbs[OPPv,OPpextr,OPSx_b]:=@op_avx3_mri;
|
|
jit_cbs[OPPv,OPpextr,OPSx_d]:=@op_avx3_mri;
|
|
jit_cbs[OPPv,OPpextr,OPSx_q]:=@op_avx3_mri;
|
|
jit_cbs[OPPv,OPpextr,OPSx_w]:=@op_vpextrw;
|
|
|
|
jit_cbs[OPPv,OPextract,OPSx_ps ]:=@op_avx3_mri;
|
|
jit_cbs[OPPv,OPextract,OPSx_f128]:=@op_avx3_mri;
|
|
|
|
jit_cbs[OPPv,OPinsert ,OPSx_ps ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPinsert ,OPSx_f128]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPround,OPSx_ps]:=@op_avx3_rmi;
|
|
jit_cbs[OPPv,OPround,OPSx_pd]:=@op_avx3_rmi;
|
|
jit_cbs[OPPv,OPround,OPSx_ss]:=@op_avx3_gen; //rrmi
|
|
jit_cbs[OPPv,OPround,OPSx_sd]:=@op_avx3_gen; //rrmi
|
|
|
|
jit_cbs[OPPv,OPsqrt ,OPSx_ps]:=@op_avx2_reg_mem_wo;
|
|
jit_cbs[OPPv,OPsqrt ,OPSx_pd]:=@op_avx2_reg_mem_wo;
|
|
jit_cbs[OPPv,OPsqrt ,OPSx_sd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPsqrt ,OPSx_ss]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPrsqrt,OPSx_ps]:=@op_avx2_reg_mem_wo;
|
|
jit_cbs[OPPv,OPrsqrt,OPSx_ss]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPrcp ,OPSx_ps]:=@op_avx2_reg_mem_wo;
|
|
jit_cbs[OPPv,OPrcp ,OPSx_ss]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPnone,OPvbroadcast,OPSx_ss ]:=@op_avx2_reg_mem_wo;
|
|
jit_cbs[OPPnone,OPvbroadcast,OPSx_sd ]:=@op_avx2_reg_mem_wo;
|
|
jit_cbs[OPPnone,OPvbroadcast,OPSx_f128]:=@op_avx2_reg_mem_wo;
|
|
|
|
jit_cbs[OPPv,OPpclmulqdq,OPSnone]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpinsr,OPSx_b]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpinsr,OPSx_d]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpinsr,OPSx_q]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpinsr,OPSx_w]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpacksswb,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpackssdw,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpackusdw,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpackuswb,OPSnone]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpabs,OPSx_b]:=@op_avx2_reg_mem_wo;
|
|
jit_cbs[OPPv,OPpabs,OPSx_w]:=@op_avx2_reg_mem_wo;
|
|
jit_cbs[OPPv,OPpabs,OPSx_d]:=@op_avx2_reg_mem_wo;
|
|
|
|
jit_cbs[OPPv,OPpsra,OPSx_w]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsra,OPSx_d]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpsrl,OPSx_w ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsrl,OPSx_d ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsrl,OPSx_q ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsrl,OPSx_dq]:=@add_orig;
|
|
|
|
jit_cbs[OPPv,OPpsll,OPSx_w ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsll,OPSx_d ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsll,OPSx_q ]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsll,OPSx_dq]:=@add_orig;
|
|
|
|
jit_cbs[OPPv,OPpminu,OPSx_b]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpminu,OPSx_w]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpminu,OPSx_d]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpmins,OPSx_b]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpmins,OPSx_w]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpmins,OPSx_d]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPmin ,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPmin ,OPSx_pd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPmin ,OPSx_ss]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPmin ,OPSx_sd]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpmaxu,OPSx_b]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpmaxu,OPSx_w]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpmaxu,OPSx_d]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpmaxs,OPSx_b]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpmaxs,OPSx_w]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpmaxs,OPSx_d]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPmax ,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPmax ,OPSx_pd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPmax ,OPSx_ss]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPmax ,OPSx_sd]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPhadd,OPSx_pd]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPhadd,OPSx_ps]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpmaddubsw,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpmaddwd ,OPSnone]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpsadbw,OPSnone]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpalignr,OPSnone]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPpsign,OPSx_b]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsign,OPSx_w]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpsign,OPSx_d]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPldmxcsr,OPSnone]:=@op_vldmxcsr;
|
|
jit_cbs[OPPv,OPstmxcsr,OPSnone]:=@op_vstmxcsr;
|
|
|
|
jit_cbs[OPPv,OPpavg,OPSx_b]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPpavg,OPSx_w]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPdp,OPSx_ps]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPdp,OPSx_pd]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPaeskeygenassist,OPSnone]:=@op_avx3_rmi;
|
|
jit_cbs[OPPv,OPaesimc ,OPSnone]:=@op_avx2_reg_mem_wo;
|
|
|
|
jit_cbs[OPPv,OPaesenc ,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPaesenclast,OPSnone]:=@op_avx3_gen;
|
|
|
|
jit_cbs[OPPv,OPaesdec ,OPSnone]:=@op_avx3_gen;
|
|
jit_cbs[OPPv,OPaesdeclast,OPSnone]:=@op_avx3_gen;
|
|
|
|
end;
|
|
|
|
initialization
|
|
init_cbs_avx;
|
|
|
|
end.
|
|
|