diff --git a/rtl/x86_jit.pas b/rtl/x86_jit.pas index a960cebf..5460995b 100644 --- a/rtl/x86_jit.pas +++ b/rtl/x86_jit.pas @@ -2036,37 +2036,64 @@ begin end; procedure t_modrm_info.emit_gop(var ji:t_jit_instruction;rexW:Boolean;op:DWORD); +var + b_op:array[0..3] of Byte; begin + DWORD(b_op):=op; + // case op of $00..$FF: begin emit_rex(ji,rexW); - ji.EmitByte(Byte(op)); + ji.EmitByte(b_op[0]); end; $100..$FFFF: begin emit_rex(ji,rexW); - ji.EmitByte(Hi(Lo(op))); - ji.EmitByte(Lo(Lo(op))); + ji.EmitByte(b_op[1]); + ji.EmitByte(b_op[0]); end; - else + $10000..$FFFFFF: begin - case Lo(Hi(op)) of + case b_op[2] of $66, $F2, $F3: begin - ji.EmitByte(Lo(Hi(op))); + ji.EmitByte(b_op[2]); emit_rex(ji,rexW); - ji.EmitByte(Hi(Lo(op))); - ji.EmitByte(Lo(Lo(op))); + ji.EmitByte(b_op[1]); + ji.EmitByte(b_op[0]); end; else begin emit_rex(ji,rexW); - ji.EmitByte(Lo(Hi(op))); - ji.EmitByte(Hi(Lo(op))); - ji.EmitByte(Lo(Lo(op))); + ji.EmitByte(b_op[2]); + ji.EmitByte(b_op[1]); + ji.EmitByte(b_op[0]); + end; + end; + end; + else + begin + case b_op[3] of + $66, + $F2, + $F3: + begin + ji.EmitByte(b_op[3]); + emit_rex(ji,rexW); + ji.EmitByte(b_op[2]); + ji.EmitByte(b_op[1]); + ji.EmitByte(b_op[0]); + end; + else + begin + emit_rex(ji,rexW); + ji.EmitByte(b_op[3]); + ji.EmitByte(b_op[2]); + ji.EmitByte(b_op[1]); + ji.EmitByte(b_op[0]); end; end; end; @@ -2131,7 +2158,7 @@ var begin Assert(not (not_impl in desc.opt)); Assert(is_reg_size(reg,[os8,os16,os32,os64,os128])); - Assert(is_reg_type(reg,[regGeneral,regGeneralH,regXmm])); + Assert(is_reg_type(reg,[regGeneral,regGeneralH,regMm,regXmm])); Assert(reg.AScale<=1); mreg:=Sums(mem); @@ -2212,7 +2239,7 @@ var begin Assert(not (not_impl in desc.opt)); Assert(is_reg_size(reg,[os8,os16,os32,os64,os128])); - Assert(is_reg_type(reg,[regGeneral,regGeneralH,regXmm])); + Assert(is_reg_type(reg,[regGeneral,regGeneralH,regMm,regXmm])); Assert(reg.AScale<=1); mreg:=Sums(mem); @@ -2301,7 +2328,7 @@ var begin Assert(not (not_impl in desc.opt)); Assert(is_reg_size(reg,[os8,os16,os32,os64,os128])); - Assert(is_reg_type(reg,[regGeneral,regGeneralH,regXmm])); + Assert(is_reg_type(reg,[regGeneral,regGeneralH,regMm,regXmm])); Assert(reg.AScale<=1); mreg:=Sums(mem); @@ -2385,8 +2412,8 @@ begin Assert(is_reg_size(reg0,[os8,os16,os32,os64,os128])); Assert(is_reg_size(reg1,[os8,os16,os32,os64,os128])); - Assert(is_reg_type(reg0,[regGeneral,regGeneralH,regXmm])); - Assert(is_reg_type(reg1,[regGeneral,regGeneralH,regXmm])); + Assert(is_reg_type(reg0,[regGeneral,regGeneralH,regMm,regXmm])); + Assert(is_reg_type(reg1,[regGeneral,regGeneralH,regMm,regXmm])); Assert(reg0.AScale<=1); Assert(reg1.AScale<=1); @@ -2455,8 +2482,8 @@ begin Assert(is_reg_size(reg0,[os8,os16,os32,os64,os128])); Assert(is_reg_size(reg1,[os8,os16,os32,os64,os128])); - Assert(is_reg_type(reg0,[regGeneral,regGeneralH,regXmm])); - Assert(is_reg_type(reg1,[regGeneral,regGeneralH,regXmm])); + Assert(is_reg_type(reg0,[regGeneral,regGeneralH,regMm,regXmm])); + Assert(is_reg_type(reg1,[regGeneral,regGeneralH,regMm,regXmm])); Assert(reg0.AScale<=1); Assert(reg1.AScale<=1); @@ -2531,8 +2558,8 @@ begin Assert(is_reg_size(reg0,[os8,os16,os32,os64,os128])); Assert(is_reg_size(reg1,[os8,os16,os32,os64,os128])); - Assert(is_reg_type(reg0,[regGeneral,regGeneralH,regXmm])); - Assert(is_reg_type(reg1,[regGeneral,regGeneralH,regXmm])); + Assert(is_reg_type(reg0,[regGeneral,regGeneralH,regMm,regXmm])); + Assert(is_reg_type(reg1,[regGeneral,regGeneralH,regMm,regXmm])); Assert(reg0.AScale<=1); Assert(reg1.AScale<=1); @@ -2598,7 +2625,7 @@ var begin Assert(not (not_impl in desc.opt)); Assert(is_reg_size(reg,[os8,os16,os32,os64,os128])); - Assert(is_reg_type(reg,[regGeneral,regGeneralH,regXmm])); + Assert(is_reg_type(reg,[regGeneral,regGeneralH,regMm,regXmm])); Assert(reg.AScale<=1); ji:=default_jit_instruction; @@ -2889,7 +2916,7 @@ var begin Assert(not (not_impl in desc.opt)); Assert(is_reg_size(reg,[os8,os16,os32,os64])); - Assert(is_reg_type(reg,[regGeneral,regGeneralH,regXmm])); + Assert(is_reg_type(reg,[regGeneral,regGeneralH,regMm,regXmm])); Assert(reg.AScale<=1); ji:=default_jit_instruction; @@ -3036,7 +3063,7 @@ var begin Assert(not (not_impl in desc.opt)); Assert(is_reg_size(reg,[os8,os16,os32,os64])); - Assert(is_reg_type(reg,[regGeneral,regGeneralH,regXmm])); + Assert(is_reg_type(reg,[regGeneral,regGeneralH,regMm,regXmm])); Assert(reg.AScale<=1); ji:=default_jit_instruction; diff --git a/sys/jit/kern_jit_ctx.pas b/sys/jit/kern_jit_ctx.pas index 102fb5a0..db28ccf3 100644 --- a/sys/jit/kern_jit_ctx.pas +++ b/sys/jit/kern_jit_ctx.pas @@ -1946,6 +1946,7 @@ begin pop(fix_size8(reg)); end; + reg:=ovr.original; end; end; @@ -2011,6 +2012,7 @@ begin pop(fix_size8(reg)); end; + reg:=ovr.original; end; end; diff --git a/sys/jit/kern_jit_ops_avx.pas b/sys/jit/kern_jit_ops_avx.pas index 72e622fb..64c0a49a 100644 --- a/sys/jit/kern_jit_ops_avx.pas +++ b/sys/jit/kern_jit_ops_avx.pas @@ -1180,6 +1180,10 @@ begin 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; diff --git a/sys/jit/kern_jit_ops_sse.pas b/sys/jit/kern_jit_ops_sse.pas index e86519e6..5f92c087 100644 --- a/sys/jit/kern_jit_ops_sse.pas +++ b/sys/jit/kern_jit_ops_sse.pas @@ -622,6 +622,10 @@ begin jit_cbs[OPPnone,OPpalignr,OPSnone]:=@op_reg_mem_rw; + jit_cbs[OPPnone,OPpsign,OPSx_b]:=@op_reg_mem_rw; + jit_cbs[OPPnone,OPpsign,OPSx_w]:=@op_reg_mem_rw; + jit_cbs[OPPnone,OPpsign,OPSx_d]:=@op_reg_mem_rw; + jit_cbs[OPPnone,OPldmxcsr,OPSnone]:=@op_ldmxcsr; jit_cbs[OPPnone,OPstmxcsr,OPSnone]:=@op_stmxcsr;