[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v5 13/47] x86emul: support AVX512F v{, u}comis{d, s} insns
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- v4: Add missing avx512_vlen_check(). v3: New. --- a/tools/tests/x86_emulator/evex-disp8.c +++ b/tools/tests/x86_emulator/evex-disp8.c @@ -107,6 +107,8 @@ static const struct test avx512f_all[] = INSN_FP(add, 0f, 58), INSN(broadcastss, 66, 0f38, 18, el, d, el), INSN_FP(cmp, 0f, c2), + INSN(comisd, 66, 0f, 2f, el, q, el), + INSN(comiss, , 0f, 2f, el, d, el), INSN_FP(div, 0f, 5e), INSN(fmadd132, 66, 0f38, 98, vl, sd, vl), INSN(fmadd132, 66, 0f38, 99, el, sd, el), @@ -166,6 +168,8 @@ static const struct test avx512f_all[] = INSN_PFP(shuf, 0f, c6), INSN_FP(sqrt, 0f, 51), INSN_FP(sub, 0f, 5c), + INSN(ucomisd, 66, 0f, 2e, el, q, el), + INSN(ucomiss, , 0f, 2e, el, d, el), INSN_PFP(unpckh, 0f, 15), INSN_PFP(unpckl, 0f, 14), }; --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -299,7 +299,7 @@ static const struct twobyte_table { [0x2a] = { DstImplicit|SrcMem|ModRM|Mov, simd_other }, [0x2b] = { DstMem|SrcImplicit|ModRM|Mov, simd_any_fp, d8s_vl }, [0x2c ... 0x2d] = { DstImplicit|SrcMem|ModRM|Mov, simd_other }, - [0x2e ... 0x2f] = { ImplicitOps|ModRM|TwoOp }, + [0x2e ... 0x2f] = { ImplicitOps|ModRM|TwoOp, simd_none, d8s_dq }, [0x30 ... 0x35] = { ImplicitOps }, [0x37] = { ImplicitOps }, [0x38] = { DstReg|SrcMem|ModRM }, @@ -6119,24 +6119,34 @@ x86_emulate( } opc = init_prefixes(stub); + op_bytes = 4 << vex.pfx; + vcomi: opc[0] = b; opc[1] = modrm; if ( ea.type == OP_MEM ) { - rc = ops->read(ea.mem.seg, ea.mem.off, mmvalp, vex.pfx ? 8 : 4, - ctxt); + rc = ops->read(ea.mem.seg, ea.mem.off, mmvalp, op_bytes, ctxt); if ( rc != X86EMUL_OKAY ) goto done; /* Convert memory operand to (%rAX). */ rex_prefix &= ~REX_B; vex.b = 1; + evex.b = 1; opc[1] &= 0x38; } - insn_bytes = PFX_BYTES + 2; + if ( evex_encoded() ) + { + insn_bytes = EVEX_PFX_BYTES + 2; + copy_EVEX(opc, evex); + } + else + { + insn_bytes = PFX_BYTES + 2; + copy_REX_VEX(opc, rex_prefix, vex); + } opc[2] = 0xc3; - copy_REX_VEX(opc, rex_prefix, vex); invoke_stub(_PRE_EFLAGS("[eflags]", "[mask]", "[tmp]"), _POST_EFLAGS("[eflags]", "[mask]", "[tmp]"), [eflags] "+g" (_regs.eflags), @@ -6147,6 +6157,20 @@ x86_emulate( ASSERT(!state->simd_size); break; + CASE_SIMD_PACKED_FP(_EVEX, 0x0f, 0x2e): /* vucomis{s,d} xmm/mem,xmm */ + CASE_SIMD_PACKED_FP(_EVEX, 0x0f, 0x2f): /* vcomis{s,d} xmm/mem,xmm */ + generate_exception_if((evex.reg != 0xf || !evex.RX || evex.opmsk || + (ea.type != OP_REG && evex.br) || + evex.w != evex.pfx), + EXC_UD); + host_and_vcpu_must_have(avx512f); + avx512_vlen_check(true); + get_fpu(X86EMUL_FPU_zmm); + + opc = init_evex(stub); + op_bytes = 4 << evex.w; + goto vcomi; + case X86EMUL_OPC(0x0f, 0x30): /* wrmsr */ generate_exception_if(!mode_ring0(), EXC_GP, 0); fail_if(ops->write_msr == NULL); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |