VirtualBox

Changeset 96713 in vbox for trunk


Ignore:
Timestamp:
Sep 13, 2022 9:09:57 AM (2 years ago)
Author:
vboxsync
Message:

VMM/IEM: Implement [v]movmskps/[v]movmskpd instructions, bugref:9898

Location:
trunk/src/VBox/VMM
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r96707 r96713  
    54275427dw 0x105ff - (.immEnd - .imm0)          ; will cause warning if entries are too small.
    54285428ENDPROC iemAImpl_vpextrw_u128
     5429
     5430
     5431;;
     5432; movmskp{s,d} SSE instruction template
     5433;
     5434; @param    1       The SSE instruction name.
     5435; @param    2       The AVX instruction name.
     5436;
     5437; @param    A0      Pointer to the output register (output/byte sized).
     5438; @param    A1      Pointer to the source media register size operand (input).
     5439;
     5440%macro IEMIMPL_MEDIA_MOVMSK_P 2
     5441BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16
     5442        PROLOGUE_2_ARGS
     5443        IEMIMPL_SSE_PROLOGUE
     5444
     5445        movdqu  xmm0, [A1]
     5446        %1      T0, xmm0
     5447        mov     byte [A0], T0_8
     5448
     5449        IEMIMPL_SSE_EPILOGUE
     5450        EPILOGUE_2_ARGS
     5451ENDPROC iemAImpl_ %+ %1 %+ _u128
     5452
     5453BEGINPROC_FASTCALL iemAImpl_ %+ %2 %+ _u128, 16
     5454        PROLOGUE_2_ARGS
     5455        IEMIMPL_AVX_PROLOGUE
     5456
     5457        movdqu  xmm0, [A1]
     5458        %2      T0, xmm0
     5459        mov     byte [A0], T0_8
     5460
     5461        IEMIMPL_AVX_EPILOGUE
     5462        EPILOGUE_2_ARGS
     5463ENDPROC iemAImpl_ %+ %2 %+ _u128
     5464
     5465BEGINPROC_FASTCALL iemAImpl_ %+ %2 %+ _u256, 16
     5466        PROLOGUE_2_ARGS
     5467        IEMIMPL_AVX_PROLOGUE
     5468
     5469        vmovdqu ymm0, [A1]
     5470        %2      T0, ymm0
     5471        mov     byte [A0], T0_8
     5472
     5473        IEMIMPL_AVX_EPILOGUE
     5474        EPILOGUE_2_ARGS
     5475ENDPROC iemAImpl_ %+ %2 %+ _u256
     5476%endmacro
     5477
     5478IEMIMPL_MEDIA_MOVMSK_P movmskps, vmovmskps
     5479IEMIMPL_MEDIA_MOVMSK_P movmskpd, vmovmskpd
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96707 r96713  
    1593515935    *pu16Dst = puSrc->au16[bEvil & 0x7];
    1593615936}
     15937
     15938
     15939/**
     15940 * [V]MOVMSKPS
     15941 */
     15942#ifdef IEM_WITHOUT_ASSEMBLY
     15943IEM_DECL_IMPL_DEF(void, iemAImpl_movmskps_u128,(uint8_t *pu8Dst, PCRTUINT128U puSrc))
     15944{
     15945    *pu8Dst  =  puSrc->au32[0] >> 31;
     15946    *pu8Dst |= (puSrc->au32[1] >> 31) << 1;
     15947    *pu8Dst |= (puSrc->au32[2] >> 31) << 2;
     15948    *pu8Dst |= (puSrc->au32[3] >> 31) << 3;
     15949}
     15950
     15951#endif
     15952
     15953IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskps_u128_fallback,(uint8_t *pu8Dst, PCRTUINT128U puSrc))
     15954{
     15955    *pu8Dst  =  puSrc->au32[0] >> 31;
     15956    *pu8Dst |= (puSrc->au32[1] >> 31) << 1;
     15957    *pu8Dst |= (puSrc->au32[2] >> 31) << 2;
     15958    *pu8Dst |= (puSrc->au32[3] >> 31) << 3;
     15959}
     15960
     15961
     15962IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskps_u256_fallback,(uint8_t *pu8Dst, PCRTUINT256U puSrc))
     15963{
     15964    *pu8Dst  =  puSrc->au32[0] >> 31;
     15965    *pu8Dst |= (puSrc->au32[1] >> 31) << 1;
     15966    *pu8Dst |= (puSrc->au32[2] >> 31) << 2;
     15967    *pu8Dst |= (puSrc->au32[3] >> 31) << 3;
     15968    *pu8Dst |= (puSrc->au32[4] >> 31) << 4;
     15969    *pu8Dst |= (puSrc->au32[5] >> 31) << 5;
     15970    *pu8Dst |= (puSrc->au32[6] >> 31) << 6;
     15971    *pu8Dst |= (puSrc->au32[7] >> 31) << 7;
     15972}
     15973
     15974
     15975/**
     15976 * [V]MOVMSKPD
     15977 */
     15978#ifdef IEM_WITHOUT_ASSEMBLY
     15979IEM_DECL_IMPL_DEF(void, iemAImpl_movmskpd_u128,(uint8_t *pu8Dst, PCRTUINT128U puSrc))
     15980{
     15981    *pu8Dst  =  puSrc->au64[0] >> 63;
     15982    *pu8Dst |= (puSrc->au64[1] >> 63) << 1;
     15983}
     15984
     15985#endif
     15986
     15987IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskpd_u128_fallback,(uint8_t *pu8Dst, PCRTUINT128U puSrc))
     15988{
     15989    *pu8Dst  =  puSrc->au64[0] >> 63;
     15990    *pu8Dst |= (puSrc->au64[1] >> 63) << 1;
     15991}
     15992
     15993
     15994IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskpd_u256_fallback,(uint8_t *pu8Dst, PCRTUINT256U puSrc))
     15995{
     15996    *pu8Dst  =  puSrc->au64[0] >> 63;
     15997    *pu8Dst |= (puSrc->au64[1] >> 63) << 1;
     15998    *pu8Dst |= (puSrc->au64[2] >> 63) << 2;
     15999    *pu8Dst |= (puSrc->au64[3] >> 63) << 3;
     16000}
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r96707 r96713  
    40194019
    40204020/** Opcode      0x0f 0x50 - movmskps Gy, Ups */
    4021 FNIEMOP_STUB(iemOp_movmskps_Gy_Ups);
     4021FNIEMOP_DEF(iemOp_movmskps_Gy_Ups)
     4022{
     4023    IEMOP_MNEMONIC2(RM_REG, MOVMSKPS, movmskps, Gy, Ux, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /** @todo */
     4024    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     4025    if (IEM_IS_MODRM_REG_MODE(bRm))
     4026    {
     4027        /*
     4028         * Register, register.
     4029         */
     4030        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4031        IEM_MC_BEGIN(2, 1);
     4032        IEM_MC_LOCAL(uint8_t,           u8Dst);
     4033        IEM_MC_ARG_LOCAL_REF(uint8_t *, pu8Dst,  u8Dst, 0);
     4034        IEM_MC_ARG(PCRTUINT128U,        puSrc,          1);
     4035        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     4036        IEM_MC_PREPARE_SSE_USAGE();
     4037        IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
     4038        IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_movmskps_u128, pu8Dst, puSrc);
     4039        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst);
     4040        IEM_MC_ADVANCE_RIP();
     4041        IEM_MC_END();
     4042        return VINF_SUCCESS;
     4043    }
     4044
     4045    /* No memory operand. */
     4046    return IEMOP_RAISE_INVALID_OPCODE();
     4047}
     4048
     4049
    40224050/** Opcode 0x66 0x0f 0x50 - movmskpd Gy, Upd */
    4023 FNIEMOP_STUB(iemOp_movmskpd_Gy_Upd);
     4051FNIEMOP_DEF(iemOp_movmskpd_Gy_Upd)
     4052{
     4053    IEMOP_MNEMONIC2(RM_REG, MOVMSKPD, movmskpd, Gy, Ux, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /** @todo */
     4054    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     4055    if (IEM_IS_MODRM_REG_MODE(bRm))
     4056    {
     4057        /*
     4058         * Register, register.
     4059         */
     4060        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4061        IEM_MC_BEGIN(2, 1);
     4062        IEM_MC_LOCAL(uint8_t,           u8Dst);
     4063        IEM_MC_ARG_LOCAL_REF(uint8_t *, pu8Dst,  u8Dst, 0);
     4064        IEM_MC_ARG(PCRTUINT128U,        puSrc,          1);
     4065        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     4066        IEM_MC_PREPARE_SSE_USAGE();
     4067        IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
     4068        IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_movmskpd_u128, pu8Dst, puSrc);
     4069        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst);
     4070        IEM_MC_ADVANCE_RIP();
     4071        IEM_MC_END();
     4072        return VINF_SUCCESS;
     4073    }
     4074
     4075    /* No memory operand. */
     4076    return IEMOP_RAISE_INVALID_OPCODE();
     4077
     4078}
     4079
     4080
    40244081/*  Opcode 0xf3 0x0f 0x50 - invalid */
    40254082/*  Opcode 0xf2 0x0f 0x50 - invalid */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r96707 r96713  
    23492349/*  Opcode VEX.0F 0x4f - invalid */
    23502350
     2351
    23512352/** Opcode VEX.0F 0x50 - vmovmskps Gy, Ups */
    2352 FNIEMOP_STUB(iemOp_vmovmskps_Gy_Ups);
     2353FNIEMOP_DEF(iemOp_vmovmskps_Gy_Ups)
     2354{
     2355    IEMOP_MNEMONIC2(VEX_RM_REG, VMOVMSKPS, vmovmskps, Gd, Ux, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO);
     2356    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     2357    if (IEM_IS_MODRM_REG_MODE(bRm))
     2358    {
     2359        /*
     2360         * Register, register.
     2361         */
     2362        if (pVCpu->iem.s.uVexLength == 0)
     2363        {
     2364            IEMOP_HLP_DONE_VEX_DECODING();
     2365            IEM_MC_BEGIN(2, 1);
     2366            IEM_MC_LOCAL(uint8_t,           u8Dst);
     2367            IEM_MC_ARG_LOCAL_REF(uint8_t *, pu8Dst,  u8Dst, 0);
     2368            IEM_MC_ARG(PCRTUINT128U,            puSrc,                 1);
     2369            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2370            IEM_MC_PREPARE_AVX_USAGE();
     2371            IEM_MC_REF_XREG_U128_CONST(puSrc,  IEM_GET_MODRM_RM(pVCpu, bRm));
     2372            IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vmovmskps_u128, iemAImpl_vmovmskps_u128_fallback),
     2373                                     pu8Dst, puSrc);
     2374            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst);
     2375            IEM_MC_ADVANCE_RIP();
     2376            IEM_MC_END();
     2377        }
     2378        else
     2379        {
     2380            IEMOP_HLP_DONE_VEX_DECODING();
     2381            IEM_MC_BEGIN(2, 2);
     2382            IEM_MC_LOCAL(uint8_t,               u8Dst);
     2383            IEM_MC_LOCAL(RTUINT256U,            uSrc);
     2384            IEM_MC_ARG_LOCAL_REF(uint8_t *,     pu8Dst,  u8Dst, 0);
     2385            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc,   uSrc,  1);
     2386
     2387            IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     2388            IEM_MC_PREPARE_AVX_USAGE();
     2389            IEM_MC_FETCH_YREG_U256(uSrc,    IEM_GET_MODRM_RM(pVCpu, bRm));
     2390            IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vmovmskps_u256, iemAImpl_vmovmskps_u256_fallback),
     2391                                     pu8Dst, puSrc);
     2392            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst);
     2393            IEM_MC_ADVANCE_RIP();
     2394            IEM_MC_END();
     2395        }
     2396        return VINF_SUCCESS;
     2397    }
     2398
     2399    /* No memory operand. */
     2400    return IEMOP_RAISE_INVALID_OPCODE();
     2401}
     2402
     2403
    23532404/** Opcode VEX.66.0F 0x50 - vmovmskpd Gy,Upd */
    2354 FNIEMOP_STUB(iemOp_vmovmskpd_Gy_Upd);
     2405FNIEMOP_DEF(iemOp_vmovmskpd_Gy_Upd)
     2406{
     2407{
     2408    IEMOP_MNEMONIC2(VEX_RM_REG, VMOVMSKPD, vmovmskpd, Gd, Ux, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO);
     2409    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     2410    if (IEM_IS_MODRM_REG_MODE(bRm))
     2411    {
     2412        /*
     2413         * Register, register.
     2414         */
     2415        if (pVCpu->iem.s.uVexLength == 0)
     2416        {
     2417            IEMOP_HLP_DONE_VEX_DECODING();
     2418            IEM_MC_BEGIN(2, 1);
     2419            IEM_MC_LOCAL(uint8_t,           u8Dst);
     2420            IEM_MC_ARG_LOCAL_REF(uint8_t *, pu8Dst,  u8Dst, 0);
     2421            IEM_MC_ARG(PCRTUINT128U,            puSrc,                 1);
     2422            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2423            IEM_MC_PREPARE_AVX_USAGE();
     2424            IEM_MC_REF_XREG_U128_CONST(puSrc,  IEM_GET_MODRM_RM(pVCpu, bRm));
     2425            IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vmovmskpd_u128, iemAImpl_vmovmskpd_u128_fallback),
     2426                                     pu8Dst, puSrc);
     2427            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst);
     2428            IEM_MC_ADVANCE_RIP();
     2429            IEM_MC_END();
     2430        }
     2431        else
     2432        {
     2433            IEMOP_HLP_DONE_VEX_DECODING();
     2434            IEM_MC_BEGIN(2, 2);
     2435            IEM_MC_LOCAL(uint8_t,               u8Dst);
     2436            IEM_MC_LOCAL(RTUINT256U,            uSrc);
     2437            IEM_MC_ARG_LOCAL_REF(uint8_t *,     pu8Dst,  u8Dst, 0);
     2438            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc,   uSrc,  1);
     2439
     2440            IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     2441            IEM_MC_PREPARE_AVX_USAGE();
     2442            IEM_MC_FETCH_YREG_U256(uSrc,    IEM_GET_MODRM_RM(pVCpu, bRm));
     2443            IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_vmovmskpd_u256, iemAImpl_vmovmskpd_u256_fallback),
     2444                                     pu8Dst, puSrc);
     2445            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst);
     2446            IEM_MC_ADVANCE_RIP();
     2447            IEM_MC_END();
     2448        }
     2449        return VINF_SUCCESS;
     2450    }
     2451
     2452    /* No memory operand. */
     2453    return IEMOP_RAISE_INVALID_OPCODE();
     2454}
     2455}
     2456
     2457
    23552458/*  Opcode VEX.F3.0F 0x50 - invalid */
    23562459/*  Opcode VEX.F2.0F 0x50 - invalid */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96707 r96713  
    22262226IEM_DECL_IMPL_DEF(void, iemAImpl_vpextrw_u128,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil));
    22272227IEM_DECL_IMPL_DEF(void, iemAImpl_vpextrw_u128_fallback,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil));
     2228
     2229IEM_DECL_IMPL_DEF(void, iemAImpl_movmskps_u128,(uint8_t *pu8Dst, PCRTUINT128U puSrc));
     2230IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskps_u128,(uint8_t *pu8Dst, PCRTUINT128U puSrc));
     2231IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskps_u128_fallback,(uint8_t *pu8Dst, PCRTUINT128U puSrc));
     2232IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskps_u256,(uint8_t *pu8Dst, PCRTUINT256U puSrc));
     2233IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskps_u256_fallback,(uint8_t *pu8Dst, PCRTUINT256U puSrc));
     2234
     2235IEM_DECL_IMPL_DEF(void, iemAImpl_movmskpd_u128,(uint8_t *pu8Dst, PCRTUINT128U puSrc));
     2236IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskpd_u128,(uint8_t *pu8Dst, PCRTUINT128U puSrc));
     2237IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskpd_u128_fallback,(uint8_t *pu8Dst, PCRTUINT128U puSrc));
     2238IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskpd_u256,(uint8_t *pu8Dst, PCRTUINT256U puSrc));
     2239IEM_DECL_IMPL_DEF(void, iemAImpl_vmovmskpd_u256_fallback,(uint8_t *pu8Dst, PCRTUINT256U puSrc));
    22282240
    22292241
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette