diff --git a/sys/jit/kern_jit_ctx.pas b/sys/jit/kern_jit_ctx.pas index 4f3df2fd..0785d80f 100644 --- a/sys/jit/kern_jit_ctx.pas +++ b/sys/jit/kern_jit_ctx.pas @@ -4021,7 +4021,13 @@ begin //mri - _VVI8(desc.mri,new2,new1,imm,mem_size); + if (not (not_impl in desc.mri.opt)) then + begin + _VVI8(desc.mri,new2,new1,imm,mem_size); //swapped + end else + begin + _VVI8(desc.rmi,new1,new2,imm,mem_size); + end; op_save(ctx,1,fix_size(new1)); end; diff --git a/sys/jit/kern_jit_ops_avx.pas b/sys/jit/kern_jit_ops_avx.pas index 536a057f..993d58d5 100644 --- a/sys/jit/kern_jit_ops_avx.pas +++ b/sys/jit/kern_jit_ops_avx.pas @@ -1019,6 +1019,26 @@ 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 vbroadcastss_desc:t_op_desc=( mem_reg:(opt:[not_impl]); @@ -1354,7 +1374,7 @@ begin 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_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;