This commit is contained in:
Pavel 2025-07-16 20:22:35 +03:00
parent b9a423697f
commit 6a633a2470
2 changed files with 27 additions and 88 deletions

View File

@ -25,7 +25,18 @@ type
function ALock:Boolean; inline;
end;
//vex rexw modes:
// vwZero -> always 0
// vwOne -> always 1
// vwR64 -> 64bit regster sets 1
// vwM64 -> 64bit memory sets 1
t_vw_mode=(vwZero,vwOne,vwR64,vwM64);
//vex len modes:
// vlM256 -> 256bit memory sets 1
// vlR256 -> 256bit regster sets 1
// vlZero -> always 0
// vlOne -> always 1
t_vl_mode=(vlM256,vlR256,vlZero,vlOne);
t_op_opt=Set of (not_impl,not_os8,reg_size_pri,not_prefix,verif_vex_len,verif_rexw);

View File

@ -177,7 +177,8 @@ end;
function get_vw_mode(var ctx:t_jit_context2):t_vw_mode;
begin
Result:=vwZero;
Result:=vwZero; //default
case ctx.din.OpCode.Opcode of
OPcvtsi2:Result:=vwM64;
@ -222,7 +223,8 @@ end;
function get_vl_mode(var ctx:t_jit_context2):t_vl_mode;
begin
Result:=vlM256;
Result:=vlM256; //default
case ctx.din.OpCode.Opcode of
OPcvtdq2:
@ -255,6 +257,14 @@ begin
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;
@ -826,26 +836,6 @@ end;
//
const
vptest_desc:t_op_desc=(
mem_reg:(opt:[not_impl]);
reg_mem:(op:$17;simdop:1;mm:2;vl_mode:vlZero);
reg_imm:(opt:[not_impl]);
reg_im8:(opt:[not_impl]);
hint:[his_ro];
);
procedure op_vptest(var ctx:t_jit_context2);
begin
if is_preserved(ctx.din) or is_memory(ctx.din) then
begin
op_emit_avx2(ctx,vptest_desc);
end else
begin
add_orig(ctx);
end;
end;
procedure op_bmi_gen(var ctx:t_jit_context2);
const
desc:t_op_type=(
@ -1039,68 +1029,6 @@ end;
//
const
vbroadcastss_desc:t_op_desc=(
mem_reg:(opt:[not_impl]);
reg_mem:(op:$18;simdop:1;mm:2;vw_mode:vwZero;vl_mode:vlR256);
reg_imm:(opt:[not_impl]);
reg_im8:(opt:[not_impl]);
hint:[his_wo];
);
procedure op_vbroadcastss(var ctx:t_jit_context2);
begin
if is_memory(ctx.din) then
begin
op_emit_avx2(ctx,vbroadcastss_desc);
end else
begin
add_orig(ctx);
end;
end;
const
vbroadcastsd_desc:t_op_desc=(
mem_reg:(opt:[not_impl]);
reg_mem:(op:$19;simdop:1;mm:2;vw_mode:vwZero;vl_mode:vlOne);
reg_imm:(opt:[not_impl]);
reg_im8:(opt:[not_impl]);
hint:[];
);
procedure op_vbroadcastsd(var ctx:t_jit_context2);
begin
if is_memory(ctx.din) then
begin
op_emit_avx2(ctx,vbroadcastsd_desc);
end else
begin
add_orig(ctx);
end;
end;
const
vbroadcastf128_desc:t_op_desc=(
mem_reg:(opt:[not_impl]);
reg_mem:(op:$1A;simdop:1;mm:2;vw_mode:vwZero;vl_mode:vlOne);
reg_imm:(opt:[not_impl]);
reg_im8:(opt:[not_impl]);
hint:[his_wo];
);
procedure op_vbroadcastf128(var ctx:t_jit_context2);
begin
if is_memory(ctx.din) then
begin
op_emit_avx2(ctx,vbroadcastf128_desc);
end else
begin
add_orig(ctx);
end;
end;
//
const
vldmxcsr_desc:t_op_type=(
op:$AE;index:2;simdop:0;mm:1;
@ -1198,7 +1126,7 @@ begin
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_vptest;
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;
@ -1414,9 +1342,9 @@ begin
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_vbroadcastss;
jit_cbs[OPPnone,OPvbroadcast,OPSx_sd ]:=@op_vbroadcastsd;
jit_cbs[OPPnone,OPvbroadcast,OPSx_f128]:=@op_vbroadcastf128;
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;