FPPS4/sys/jit/kern_jit_ops_avx.pas

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.