VirtualBox

Changeset 105274 in vbox


Ignore:
Timestamp:
Jul 11, 2024 3:07:58 PM (5 months ago)
Author:
vboxsync
Message:

VMM/IEM: Rework roundps/roundpd which only have two operands instead of three, add vroundps/vroundpd, bugref:9898

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

Legend:

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

    r104521 r105274  
    65976597
    65986598
     6599struc IEMMEDIAF2YMMSRC
     6600    .uSrc1        resd 8
     6601    .uSrc2        resd 8
     6602endstruc
     6603
     6604
    65996605;
    66006606; CMPPS (SSE)
     
    66766682IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_5 cmpsd
    66776683
    6678 ;;
    6679 ; SSE instructions with 8-bit immediates of the form
     6684
     6685;;
     6686; SSE/AVX instructions with 2 full sized perands and an 8-bit immediate of the form
    66806687;    xxx xmm1, xmm2, imm8.
     6688;   vxxx xmm1, xmm2, imm8
    66816689; where the instruction encoding takes up 6 bytes and we need to load and save the MXCSR
    66826690; register.
     
    66876695; @param    A0_32   The guest's MXCSR register value to use (input).
    66886696; @param    A1      Pointer to the first media register size operand (output).
    6689 ; @param    A2      Pointer to the two media register sized inputs - IEMMEDIAF2XMMSRC (input).
     6697; @param    A2      Pointer to the second media register size operand (input).
    66906698; @param    A3      The 8-bit immediate (input).
    66916699;
    6692 %macro IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_6 1
     6700%macro IEMIMPL_MEDIA_SSE_AVX_INSN_F2_IMM8_MXCSR_6 1
    66936701BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16
    66946702        PROLOGUE_4_ARGS
     
    66976705
    66986706        movzx   A3, A3_8                ; must clear top bits
    6699         movdqu  xmm0, [A2 + IEMMEDIAF2XMMSRC.uSrc1]
    6700         movdqu  xmm1, [A2 + IEMMEDIAF2XMMSRC.uSrc2]
     6707        movdqu  xmm1, [A2]
    67016708        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8
    67026709        movdqu  [A1], xmm0
     
    67166723.immEnd:
    67176724ENDPROC iemAImpl_ %+ %1 %+ _u128
    6718 %endmacro
    6719 
    6720 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_6 roundps
    6721 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_6 roundpd
    6722 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_6 roundss
    6723 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_6 roundsd
    6724 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_6 dpps
    6725 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_6 dppd
     6725
     6726BEGINPROC_FASTCALL iemAImpl_v %+ %1 %+ _u128, 16
     6727        PROLOGUE_4_ARGS
     6728        IEMIMPL_SSE_PROLOGUE
     6729        SSE_AVX_LD_MXCSR A0_32
     6730
     6731        movzx   A3, A3_8                ; must clear top bits
     6732        movdqu  xmm1, [A2]
     6733        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8
     6734        movdqu  [A1], xmm0
     6735
     6736        SSE_AVX_ST_MXCSR R0_32, A0_32
     6737        IEMIMPL_SSE_EPILOGUE
     6738        EPILOGUE_4_ARGS
     6739 %assign bImm 0
     6740 %rep 256
     6741.imm %+ bImm:
     6742        IBT_ENDBRxx_WITHOUT_NOTRACK
     6743        v%1     xmm0, xmm1, bImm
     6744        ret
     6745        int3
     6746  %assign bImm bImm + 1
     6747 %endrep
     6748.immEnd:
     6749ENDPROC iemAImpl_v %+ %1 %+ _u128
     6750
     6751BEGINPROC_FASTCALL iemAImpl_v %+ %1 %+ _u256, 16
     6752        PROLOGUE_4_ARGS
     6753        IEMIMPL_SSE_PROLOGUE
     6754        SSE_AVX_LD_MXCSR A0_32
     6755
     6756        movzx   A3, A3_8                ; must clear top bits
     6757        vmovdqu ymm1, [A2]
     6758        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8
     6759        vmovdqu [A1], ymm0
     6760
     6761        SSE_AVX_ST_MXCSR R0_32, A0_32
     6762        IEMIMPL_SSE_EPILOGUE
     6763        EPILOGUE_4_ARGS
     6764 %assign bImm 0
     6765 %rep 256
     6766.imm %+ bImm:
     6767        IBT_ENDBRxx_WITHOUT_NOTRACK
     6768        v%1     ymm0, ymm1, bImm
     6769        ret
     6770        int3
     6771  %assign bImm bImm + 1
     6772 %endrep
     6773.immEnd:
     6774ENDPROC iemAImpl_v %+ %1 %+ _u256
     6775%endmacro
     6776
     6777IEMIMPL_MEDIA_SSE_AVX_INSN_F2_IMM8_MXCSR_6 roundps
     6778IEMIMPL_MEDIA_SSE_AVX_INSN_F2_IMM8_MXCSR_6 roundpd
     6779
     6780
     6781;;
     6782; SSE/AVX instructions with 3 full sized perands and an 8-bit immediate of the form
     6783;    xxx xmm1, xmm2, imm8.
     6784;   vxxx xmm1, xmm2, xmm3, imm8
     6785; where the instruction encoding takes up 6 bytes and we need to load and save the MXCSR
     6786; register.
     6787;
     6788; @param    1       The instruction name.
     6789;
     6790; @return   R0_32   The new MXCSR value of the guest.
     6791; @param    A0_32   The guest's MXCSR register value to use (input).
     6792; @param    A1      Pointer to the first media register size operand (output).
     6793; @param    A2      Pointer to the two media register sized inputs - IEMMEDIAF2XMMSRC/IEMMEDIAF2YMMSRC (input).
     6794; @param    A3      The 8-bit immediate (input).
     6795;
     6796%macro IEMIMPL_MEDIA_SSE_AVX_INSN_F3_IMM8_MXCSR_6 1
     6797BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16
     6798        PROLOGUE_4_ARGS
     6799        IEMIMPL_SSE_PROLOGUE
     6800        SSE_AVX_LD_MXCSR A0_32
     6801
     6802        movzx   A3, A3_8                ; must clear top bits
     6803        movdqu  xmm0, [A2 + IEMMEDIAF2XMMSRC.uSrc1]
     6804        movdqu  xmm1, [A2 + IEMMEDIAF2XMMSRC.uSrc2]
     6805        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8
     6806        movdqu  [A1], xmm0
     6807
     6808        SSE_AVX_ST_MXCSR R0_32, A0_32
     6809        IEMIMPL_SSE_EPILOGUE
     6810        EPILOGUE_4_ARGS
     6811 %assign bImm 0
     6812 %rep 256
     6813.imm %+ bImm:
     6814        IBT_ENDBRxx_WITHOUT_NOTRACK
     6815        %1      xmm0, xmm1, bImm
     6816        ret
     6817        int3
     6818  %assign bImm bImm + 1
     6819 %endrep
     6820.immEnd:
     6821ENDPROC iemAImpl_ %+ %1 %+ _u128
     6822%endmacro
     6823
     6824IEMIMPL_MEDIA_SSE_AVX_INSN_F3_IMM8_MXCSR_6 roundss
     6825IEMIMPL_MEDIA_SSE_AVX_INSN_F3_IMM8_MXCSR_6 roundsd
     6826IEMIMPL_MEDIA_SSE_AVX_INSN_F3_IMM8_MXCSR_6 dpps
     6827IEMIMPL_MEDIA_SSE_AVX_INSN_F3_IMM8_MXCSR_6 dppd
    67266828
    67276829
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r105253 r105274  
    1940019400
    1940119401/**
    19402  * ROUNDPS / ROUNDPD / ROUNDSS / ROUNDSD
     19402 * [V]ROUNDPS / [V]ROUNDPD / ROUNDSS / ROUNDSD
    1940319403 */
    1940419404
     
    1944719447}
    1944819448
     19449
    1944919450#ifdef IEM_WITHOUT_ASSEMBLY
    1945019451IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_roundss_u128,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC pSrc, uint8_t bImm))
     
    1946519466#endif
    1946619467
    19467 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_roundps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC pSrc, uint8_t bImm))
     19468
     19469IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_roundps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc, uint8_t bImm))
    1946819470{
    1946919471    for (uint8_t i = 0; i < RT_ELEMENTS(puDst->ar32); i++)
    1947019472    {
    19471         puDst->ar32[i] = iemAImpl_round_worker_r32(&uMxCsrIn, &pSrc->uSrc2.ar32[i], bImm & X86_SSE_ROUNDXX_IMM_MASK);
     19473        puDst->ar32[i] = iemAImpl_round_worker_r32(&uMxCsrIn, &puSrc->ar32[i], bImm & X86_SSE_ROUNDXX_IMM_MASK);
    1947219474    }
    1947319475
     
    1947619478
    1947719479
    19478 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_roundpd_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC pSrc, uint8_t bImm))
     19480IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_roundpd_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc, uint8_t bImm))
    1947919481{
    1948019482    for (uint8_t i = 0; i < RT_ELEMENTS(puDst->ar64); i++)
    1948119483    {
    19482         puDst->ar64[i] = iemAImpl_round_worker_r64(&uMxCsrIn, &pSrc->uSrc2.ar64[i], bImm & X86_SSE_ROUNDXX_IMM_MASK);
     19484        puDst->ar64[i] = iemAImpl_round_worker_r64(&uMxCsrIn, &puSrc->ar64[i], bImm & X86_SSE_ROUNDXX_IMM_MASK);
    1948319485    }
    1948419486
    1948519487    return uMxCsrIn;
    1948619488}
     19489
     19490
     19491IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vroundps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc, uint8_t bImm))
     19492{
     19493    for (uint8_t i = 0; i < RT_ELEMENTS(puDst->ar32); i++)
     19494    {
     19495        puDst->ar32[i] = iemAImpl_round_worker_r32(&uMxCsrIn, &puSrc->ar32[i], bImm & X86_SSE_ROUNDXX_IMM_MASK);
     19496    }
     19497
     19498    return uMxCsrIn;
     19499}
     19500
     19501
     19502IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vroundpd_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc, uint8_t bImm))
     19503{
     19504    for (uint8_t i = 0; i < RT_ELEMENTS(puDst->ar64); i++)
     19505    {
     19506        puDst->ar64[i] = iemAImpl_round_worker_r64(&uMxCsrIn, &puSrc->ar64[i], bImm & X86_SSE_ROUNDXX_IMM_MASK);
     19507    }
     19508
     19509    return uMxCsrIn;
     19510}
     19511
     19512
     19513IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vroundps_u256_fallback,(uint32_t uMxCsrIn, PX86YMMREG puDst, PCX86YMMREG puSrc, uint8_t bImm))
     19514{
     19515    for (uint8_t i = 0; i < RT_ELEMENTS(puDst->ar32); i++)
     19516    {
     19517        puDst->ar32[i] = iemAImpl_round_worker_r32(&uMxCsrIn, &puSrc->ar32[i], bImm & X86_SSE_ROUNDXX_IMM_MASK);
     19518    }
     19519
     19520    return uMxCsrIn;
     19521}
     19522
     19523
     19524IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vroundpd_u256_fallback,(uint32_t uMxCsrIn, PX86YMMREG puDst, PCX86YMMREG puSrc, uint8_t bImm))
     19525{
     19526    for (uint8_t i = 0; i < RT_ELEMENTS(puDst->ar64); i++)
     19527    {
     19528        puDst->ar64[i] = iemAImpl_round_worker_r64(&uMxCsrIn, &puSrc->ar64[i], bImm & X86_SSE_ROUNDXX_IMM_MASK);
     19529    }
     19530
     19531    return uMxCsrIn;
     19532}
     19533
     19534
    1948719535
    1948819536/**
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstThree0f3a.cpp.h

    r104368 r105274  
    162162 * @sa  iemOpCommonSse41_FullFullImm8_To_Full
    163163 */
    164 FNIEMOP_DEF_1(iemOpCommonSse41Fp_FullFullImm8_To_Full, PFNIEMAIMPLMXCSRF2XMMIMM8, pfnU128)
     164FNIEMOP_DEF_1(iemOpCommonSse41Fp_FullFullImm8_To_Full, PFNIEMAIMPLMEDIAF3XMMIMM8, pfnU128)
    165165{
    166166    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     
    213213        IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    214214
     215        IEM_MC_ADVANCE_RIP_AND_FINISH();
     216        IEM_MC_END();
     217    }
     218}
     219
     220
     221/**
     222 * Common worker for SSE 4.1 instructions of the form:
     223 *      xxx     xmm1, xmm2/mem128, imm8
     224 *
     225 * Proper alignment of the 128-bit operand is enforced.
     226 * MXCSR is used as input and output.
     227 * Exceptions type 4. SSE 4.1 cpuid checks.
     228 *
     229 * @sa  iemOpCommonSse41_FullFullImm8_To_Full
     230 */
     231FNIEMOP_DEF_1(iemOpCommonSse41Fp_FullImm8_To_Full, PFNIEMAIMPLMEDIAF2XMMIMM8, pfnU128)
     232{
     233    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     234    if (IEM_IS_MODRM_REG_MODE(bRm))
     235    {
     236        /*
     237         * XMM, XMM, imm8.
     238         */
     239        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     240        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     241        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse41);
     242        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     243        IEM_MC_PREPARE_SSE_USAGE();
     244        IEM_MC_LOCAL(X86XMMREG,                     uDst);
     245        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,            puDst,         uDst,    0);
     246        IEM_MC_ARG(          PCX86XMMREG,           puSrc,                  1);
     247        IEM_MC_REF_XREG_XMM_CONST(puSrc,        IEM_GET_MODRM_RM(pVCpu, bRm));
     248        IEM_MC_ARG_CONST(uint8_t,                   bImmArg, /*=*/ bImm,    2);
     249        IEM_MC_CALL_SSE_AIMPL_3(pfnU128, puDst, puSrc, bImmArg);
     250        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     251        IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     252        IEM_MC_ADVANCE_RIP_AND_FINISH();
     253        IEM_MC_END();
     254    }
     255    else
     256    {
     257        /*
     258         * XMM, [mem128], imm8.
     259         */
     260        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     261        IEM_MC_LOCAL(RTGCPTR,                       GCPtrEffSrc);
     262        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
     263        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     264        IEM_MC_ARG_CONST(uint8_t,                   bImmArg, /*=*/ bImm,    2);
     265        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse41);
     266        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     267        IEM_MC_PREPARE_SSE_USAGE();
     268        IEM_MC_LOCAL(X86XMMREG,                     uSrc);
     269        IEM_MC_FETCH_MEM_XMM_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     270        IEM_MC_LOCAL(X86XMMREG,                     uDst);
     271        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,            puDst,          uDst,    0);
     272        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,           puSrc,          uSrc,    1);
     273        IEM_MC_CALL_SSE_AIMPL_3(pfnU128, puDst, puSrc, bImmArg);
     274        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     275        IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
    215276        IEM_MC_ADVANCE_RIP_AND_FINISH();
    216277        IEM_MC_END();
     
    291352{
    292353    IEMOP_MNEMONIC3(RMI, ROUNDPS, roundps, Vx, Wx, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_SSE, 0);
    293     return FNIEMOP_CALL_1(iemOpCommonSse41Fp_FullFullImm8_To_Full,
     354    return FNIEMOP_CALL_1(iemOpCommonSse41Fp_FullImm8_To_Full,
    294355                          IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_roundps_u128, iemAImpl_roundps_u128_fallback));
    295356}
     
    300361{
    301362    IEMOP_MNEMONIC3(RMI, ROUNDPD, roundpd, Vx, Wx, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_SSE, 0);
    302     return FNIEMOP_CALL_1(iemOpCommonSse41Fp_FullFullImm8_To_Full,
     363    return FNIEMOP_CALL_1(iemOpCommonSse41Fp_FullImm8_To_Full,
    303364                          IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_roundpd_u128, iemAImpl_roundpd_u128_fallback));
    304365}
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap3.cpp.h

    r104784 r105274  
    155155/**
    156156 * Common worker for AVX instructions on the forms:
     157 *     - vxxxp{s,d}    xmm0, xmm1/mem128, imm8
     158 *     - vxxxp{s,d}    ymm0, ymm1/mem256, imm8
     159 *
     160 * Exceptions type 4. AVX cpuid check for both 128-bit and 256-bit operation.
     161 */
     162FNIEMOP_DEF_1(iemOpCommonAvxAvx_Vx_Wx_Ib, PCIEMOPMEDIAF2IMM8, pImpl)
     163{
     164    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     165    if (IEM_IS_MODRM_REG_MODE(bRm))
     166    {
     167        /*
     168         * Register, register.
     169         */
     170        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     171        if (pVCpu->iem.s.uVexLength)
     172        {
     173            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     174            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     175            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     176            IEM_MC_PREPARE_AVX_USAGE();
     177            IEM_MC_LOCAL(X86YMMREG,             uDst);
     178            IEM_MC_ARG_LOCAL_REF(PX86YMMREG,    puDst,  uDst,         0);
     179            IEM_MC_LOCAL(X86YMMREG,             uSrc);
     180            IEM_MC_ARG_LOCAL_REF(PCX86YMMREG,   puSrc,  uSrc,         1);
     181            IEM_MC_FETCH_YREG_YMM(uSrc,        IEM_GET_MODRM_RM(pVCpu, bRm));
     182            IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm,  2);
     183            IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU256, puDst, puSrc, bImmArg);
     184            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     185            IEM_MC_STORE_YREG_YMM_ZX_VLMAX(    IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     186            IEM_MC_ADVANCE_RIP_AND_FINISH();
     187            IEM_MC_END();
     188        }
     189        else
     190        {
     191            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     192            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     193            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     194            IEM_MC_PREPARE_AVX_USAGE();
     195            IEM_MC_LOCAL(X86XMMREG,             uDst);
     196            IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    puDst,  uDst,         0);
     197            IEM_MC_ARG(PCX86XMMREG,             puSrc,                1);
     198            IEM_MC_REF_XREG_XMM_CONST(puSrc,   IEM_GET_MODRM_RM(pVCpu, bRm));
     199            IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm,  2);
     200            IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU128, puDst, puSrc, bImmArg);
     201            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     202            IEM_MC_STORE_XREG_XMM(             IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     203            IEM_MC_CLEAR_YREG_128_UP(          IEM_GET_MODRM_REG(pVCpu, bRm));
     204            IEM_MC_ADVANCE_RIP_AND_FINISH();
     205            IEM_MC_END();
     206        }
     207    }
     208    else
     209    {
     210        /*
     211         * Register, memory.
     212         */
     213        if (pVCpu->iem.s.uVexLength)
     214        {
     215            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     216            IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     217            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
     218            uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     219            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     220            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     221            IEM_MC_PREPARE_AVX_USAGE();
     222            IEM_MC_LOCAL(X86YMMREG,             uDst);
     223            IEM_MC_ARG_LOCAL_REF(PX86YMMREG,    puDst,          uDst, 0);
     224            IEM_MC_LOCAL(X86YMMREG,             uSrc);
     225            IEM_MC_ARG_LOCAL_REF(PCX86YMMREG,   puSrc,          uSrc, 1);
     226            IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm,  2);
     227            IEM_MC_FETCH_MEM_YMM_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     228            IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU256, puDst, puSrc, bImmArg);
     229            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     230            IEM_MC_STORE_YREG_YMM_ZX_VLMAX(    IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     231            IEM_MC_ADVANCE_RIP_AND_FINISH();
     232            IEM_MC_END();
     233        }
     234        else
     235        {
     236            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     237            IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     238            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
     239            uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     240            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     241            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     242            IEM_MC_PREPARE_AVX_USAGE();
     243            IEM_MC_LOCAL(X86XMMREG,             uDst);
     244            IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    puDst,  uDst,         0);
     245            IEM_MC_LOCAL(X86XMMREG,             uSrc);
     246            IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,   puSrc, uSrc,          1);
     247            IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm,  2);
     248            IEM_MC_FETCH_MEM_XMM_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     249            IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU128, puDst, puSrc, bImmArg);
     250            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     251            IEM_MC_STORE_XREG_XMM(             IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     252            IEM_MC_CLEAR_YREG_128_UP(          IEM_GET_MODRM_REG(pVCpu, bRm));
     253            IEM_MC_ADVANCE_RIP_AND_FINISH();
     254            IEM_MC_END();
     255        }
     256    }
     257}
     258
     259
     260/**
     261 * Common worker for AVX instructions on the forms:
    157262 *     - vpermilps/d    xmm0, xmm1/mem128, imm8
    158263 *     - vpermilps/d    ymm0, ymm1/mem256, imm8
     
    480585
    481586/*  Opcode VEX.66.0F3A 0x07 - invalid */
     587
     588
    482589/** Opcode VEX.66.0F3A 0x08. */
    483 FNIEMOP_STUB(iemOp_vroundps_Vx_Wx_Ib);
     590FNIEMOP_DEF(iemOp_vroundps_Vx_Wx_Ib)
     591{
     592    IEMOP_MNEMONIC3(VEX_RMI, VROUNDPS, vroundps, Vx_WO, Wx, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_V_ZERO);
     593    IEMOPMEDIAF2IMM8_INIT_VARS(        vroundps);
     594    return FNIEMOP_CALL_1(iemOpCommonAvxAvx_Vx_Wx_Ib, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback));
     595}
     596
     597
    484598/** Opcode VEX.66.0F3A 0x09. */
    485 FNIEMOP_STUB(iemOp_vroundpd_Vx_Wx_Ib);
     599FNIEMOP_DEF(iemOp_vroundpd_Vx_Wx_Ib)
     600{
     601    IEMOP_MNEMONIC3(VEX_RMI, VROUNDPD, vroundpd, Vx_WO, Wx, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_V_ZERO);
     602    IEMOPMEDIAF2IMM8_INIT_VARS(        vroundpd);
     603    return FNIEMOP_CALL_1(iemOpCommonAvxAvx_Vx_Wx_Ib, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback));
     604}
     605
     606
    486607/** Opcode VEX.66.0F3A 0x0a. */
    487608FNIEMOP_STUB(iemOp_vroundss_Vss_Wss_Ib);
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r105261 r105274  
    41544154typedef const IEMMEDIAF2XMMSRC *PCIEMMEDIAF2XMMSRC;
    41554155
    4156 typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMXCSRF2XMMIMM8,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC puSrc, uint8_t bEvil));
    4157 typedef FNIEMAIMPLMXCSRF2XMMIMM8 *PFNIEMAIMPLMXCSRF2XMMIMM8;
    4158 
    4159 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_cmpps_u128;
    4160 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_cmppd_u128;
    4161 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_cmpss_u128;
    4162 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_cmpsd_u128;
    4163 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_roundss_u128;
    4164 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_roundsd_u128;
    4165 
    4166 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_roundps_u128, iemAImpl_roundps_u128_fallback;
    4167 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_roundpd_u128, iemAImpl_roundpd_u128_fallback;
    4168 
    4169 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_dpps_u128, iemAImpl_dpps_u128_fallback;
    4170 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_dppd_u128, iemAImpl_dppd_u128_fallback;
     4156typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF3XMMIMM8,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC puSrc, uint8_t bEvil));
     4157typedef FNIEMAIMPLMEDIAF3XMMIMM8 *PFNIEMAIMPLMEDIAF3XMMIMM8;
     4158
     4159
     4160FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_cmpps_u128;
     4161FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_cmppd_u128;
     4162FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_cmpss_u128;
     4163FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_cmpsd_u128;
     4164FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_roundss_u128;
     4165FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_roundsd_u128;
     4166
     4167FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_dpps_u128,     iemAImpl_dpps_u128_fallback;
     4168FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_dppd_u128,     iemAImpl_dppd_u128_fallback;
     4169
     4170
     4171typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF2XMMIMM8,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc, uint8_t bEvil));
     4172typedef FNIEMAIMPLMEDIAF2XMMIMM8 *PFNIEMAIMPLMEDIAF2XMMIMM8;
     4173
     4174
     4175typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF2YMMIMM8,(uint32_t uMxCsrIn, PX86YMMREG puDst, PCX86YMMREG puSrc, uint8_t bEvil));
     4176typedef FNIEMAIMPLMEDIAF2YMMIMM8 *PFNIEMAIMPLMEDIAF2YMMIMM8;
     4177
     4178
     4179FNIEMAIMPLMEDIAF2XMMIMM8 iemAImpl_roundps_u128,  iemAImpl_roundps_u128_fallback;
     4180FNIEMAIMPLMEDIAF2XMMIMM8 iemAImpl_roundpd_u128,  iemAImpl_roundpd_u128_fallback;
     4181
     4182FNIEMAIMPLMEDIAF2XMMIMM8 iemAImpl_vroundps_u128, iemAImpl_vroundps_u128_fallback;
     4183FNIEMAIMPLMEDIAF2XMMIMM8 iemAImpl_vroundpd_u128, iemAImpl_vroundpd_u128_fallback;
     4184
     4185FNIEMAIMPLMEDIAF2YMMIMM8 iemAImpl_vroundps_u256, iemAImpl_vroundps_u256_fallback;
     4186FNIEMAIMPLMEDIAF2YMMIMM8 iemAImpl_vroundpd_u256, iemAImpl_vroundpd_u256_fallback;
     4187
    41714188
    41724189typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMXCSRU64U128,(uint32_t fMxCsrIn, uint64_t *pu64Dst, PCX86XMMREG pSrc));
     
    44114428    IEMOPMEDIAOPTF2_INIT_VARS_EX(RT_CONCAT3(iemAImpl_,a_InstrNm,_u128),           RT_CONCAT3(iemAImpl_,a_InstrNm,_u256),\
    44124429                                 RT_CONCAT3(iemAImpl_,a_InstrNm,_u128_fallback),  RT_CONCAT3(iemAImpl_,a_InstrNm,_u256_fallback))
     4430
     4431
     4432/**
     4433 * Function table for media instruction taking one full sized media source
     4434 * register and one full sized destination register and an 8-bit immediate (AVX).
     4435 */
     4436typedef struct IEMOPMEDIAF2IMM8
     4437{
     4438    PFNIEMAIMPLMEDIAF2XMMIMM8 pfnU128;
     4439    PFNIEMAIMPLMEDIAF2YMMIMM8 pfnU256;
     4440} IEMOPMEDIAF2IMM8;
     4441/** Pointer to a media operation function table for 2 full sized ops (AVX). */
     4442typedef IEMOPMEDIAF2IMM8 const *PCIEMOPMEDIAF2IMM8;
     4443
     4444/** @def IEMOPMEDIAF2IMM8_INIT_VARS_EX
     4445 * Declares a s_Host (x86 & amd64 only) and a s_Fallback variable with the
     4446 * given functions as initializers.  For use in AVX functions where a pair of
     4447 * functions are only used once and the function table need not be public. */
     4448#ifndef TST_IEM_CHECK_MC
     4449# if (defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)) && !defined(IEM_WITHOUT_ASSEMBLY)
     4450#  define IEMOPMEDIAF2IMM8_INIT_VARS_EX(a_pfnHostU128, a_pfnHostU256, a_pfnFallbackU128, a_pfnFallbackU256) \
     4451    static IEMOPMEDIAF2IMM8 const s_Host     = { a_pfnHostU128,     a_pfnHostU256 }; \
     4452    static IEMOPMEDIAF2IMM8 const s_Fallback = { a_pfnFallbackU128, a_pfnFallbackU256 }
     4453# else
     4454#  define IEMOPMEDIAF2IMM8_INIT_VARS_EX(a_pfnU128, a_pfnU256, a_pfnFallbackU128, a_pfnFallbackU256) \
     4455    static IEMOPMEDIAF2IMM8 const s_Fallback = { a_pfnFallbackU128, a_pfnFallbackU256 }
     4456# endif
     4457#else
     4458# define IEMOPMEDIAF2IMM8_INIT_VARS_EX(a_pfnU128, a_pfnU256, a_pfnFallbackU128, a_pfnFallbackU256) (void)0
     4459#endif
     4460/** @def IEMOPMEDIAF2IMM8_INIT_VARS
     4461 * Generate AVX function tables for the @a a_InstrNm instruction.
     4462 * @sa IEMOPMEDIAF2IMM8_INIT_VARS_EX */
     4463#define IEMOPMEDIAF2IMM8_INIT_VARS(a_InstrNm) \
     4464    IEMOPMEDIAF2IMM8_INIT_VARS_EX(RT_CONCAT3(iemAImpl_,a_InstrNm,_u128),           RT_CONCAT3(iemAImpl_,a_InstrNm,_u256),\
     4465                                  RT_CONCAT3(iemAImpl_,a_InstrNm,_u128_fallback),  RT_CONCAT3(iemAImpl_,a_InstrNm,_u256_fallback))
     4466
    44134467
    44144468/**
  • trunk/src/VBox/VMM/testcase/tstIEMAImpl.cpp

    r104521 r105274  
    78377837#define SSE_COMPARE_F2_XMM_IMM8_MAX 0x1f
    78387838
    7839 TYPEDEF_SUBTEST_TYPE(SSE_COMPARE_F2_XMM_IMM8_T, SSE_COMPARE_F2_XMM_IMM8_TEST_T, PFNIEMAIMPLMXCSRF2XMMIMM8);
    7840 
    7841 static SSE_COMPARE_F2_XMM_IMM8_T g_aSseCompareF2XmmR32Imm8[] =
     7839TYPEDEF_SUBTEST_TYPE(SSE_COMPARE_F3_XMM_IMM8_T, SSE_COMPARE_F3_XMM_IMM8_TEST_T, PFNIEMAIMPLMEDIAF3XMMIMM8);
     7840
     7841static SSE_COMPARE_F3_XMM_IMM8_T g_aSseCompareF3XmmR32Imm8[] =
    78427842{
    78437843    ENTRY_BIN(cmpps_u128),
     
    78467846
    78477847#ifdef TSTIEMAIMPL_WITH_GENERATOR
    7848 DUMP_ALL_FN(SseCompareF2XmmR32Imm8, g_aSseCompareF2XmmR32Imm8)
    7849 static RTEXITCODE SseCompareF2XmmR32Imm8Generate(uint32_t cTests, const char * const *papszNameFmts)
     7848DUMP_ALL_FN(SseCompareF3XmmR32Imm8, g_aSseCompareF3XmmR32Imm8)
     7849static RTEXITCODE SseCompareF3XmmR32Imm8Generate(uint32_t cTests, const char * const *papszNameFmts)
    78507850{
    78517851    cTests = RT_MAX(192, cTests); /* there are 144 standard input variations */
     
    78657865
    78667866    uint32_t cMinNormalPairs       = (cTests - 144) / 4;
    7867     for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF2XmmR32Imm8); iFn++)
    7868     {
    7869         PFNIEMAIMPLMXCSRF2XMMIMM8 const pfn = g_aSseCompareF2XmmR32Imm8[iFn].pfnNative ? g_aSseCompareF2XmmR32Imm8[iFn].pfnNative : g_aSseCompareF2XmmR32Imm8[iFn].pfn;
     7867    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF3XmmR32Imm8); iFn++)
     7868    {
     7869        PFNIEMAIMPLMEDIAF3XMMIMM8 const pfn = g_aSseCompareF3XmmR32Imm8[iFn].pfnNative ? g_aSseCompareF3XmmR32Imm8[iFn].pfnNative : g_aSseCompareF3XmmR32Imm8[iFn].pfn;
    78707870
    78717871        IEMBINARYOUTPUT BinOut;
    7872         AssertReturn(GENERATE_BINARY_OPEN(&BinOut, papszNameFmts, g_aSseCompareF2XmmR32Imm8[iFn]), RTEXITCODE_FAILURE);
     7872        AssertReturn(GENERATE_BINARY_OPEN(&BinOut, papszNameFmts, g_aSseCompareF3XmmR32Imm8[iFn]), RTEXITCODE_FAILURE);
    78737873
    78747874        uint32_t cNormalInputPairs  = 0;
    78757875        for (uint32_t iTest = 0; iTest < cTests + RT_ELEMENTS(s_aSpecials); iTest += 1)
    78767876        {
    7877             SSE_COMPARE_F2_XMM_IMM8_TEST_T TestData; RT_ZERO(TestData);
     7877            SSE_COMPARE_F3_XMM_IMM8_TEST_T TestData; RT_ZERO(TestData);
    78787878
    78797879            TestData.InVal1.ar32[0] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].Val1;
     
    79807980#endif
    79817981
    7982 static void SseCompareF2XmmR32Imm8Test(void)
    7983 {
    7984     for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF2XmmR32Imm8); iFn++)
    7985     {
    7986         if (!SUBTEST_CHECK_IF_ENABLED_AND_DECOMPRESS(g_aSseCompareF2XmmR32Imm8[iFn]))
     7982static void SseCompareF3XmmR32Imm8Test(void)
     7983{
     7984    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF3XmmR32Imm8); iFn++)
     7985    {
     7986        if (!SUBTEST_CHECK_IF_ENABLED_AND_DECOMPRESS(g_aSseCompareF3XmmR32Imm8[iFn]))
    79877987            continue;
    79887988
    7989         SSE_COMPARE_F2_XMM_IMM8_TEST_T const * const    paTests = g_aSseCompareF2XmmR32Imm8[iFn].paTests;
    7990         uint32_t const                                  cTests  = g_aSseCompareF2XmmR32Imm8[iFn].cTests;
    7991         PFNIEMAIMPLMXCSRF2XMMIMM8                       pfn     = g_aSseCompareF2XmmR32Imm8[iFn].pfn;
    7992         uint32_t const                                  cVars   = COUNT_VARIATIONS(g_aSseCompareF2XmmR32Imm8[iFn]);
     7989        SSE_COMPARE_F3_XMM_IMM8_TEST_T const * const    paTests = g_aSseCompareF3XmmR32Imm8[iFn].paTests;
     7990        uint32_t const                                  cTests  = g_aSseCompareF3XmmR32Imm8[iFn].cTests;
     7991        PFNIEMAIMPLMEDIAF3XMMIMM8                       pfn     = g_aSseCompareF3XmmR32Imm8[iFn].pfn;
     7992        uint32_t const                                  cVars   = COUNT_VARIATIONS(g_aSseCompareF3XmmR32Imm8[iFn]);
    79937993        if (!cTests) RTTestSkipped(g_hTest, "no tests");
    79947994        for (uint32_t iVar = 0; iVar < cVars; iVar++)
     
    80308030        }
    80318031
    8032         FREE_DECOMPRESSED_TESTS(g_aSseCompareF2XmmR32Imm8[iFn]);
     8032        FREE_DECOMPRESSED_TESTS(g_aSseCompareF3XmmR32Imm8[iFn]);
    80338033    }
    80348034}
     
    80388038 * Compare SSE operations on packed and single double-precision floating point values - outputting a mask.
    80398039 */
    8040 static SSE_COMPARE_F2_XMM_IMM8_T g_aSseCompareF2XmmR64Imm8[] =
     8040static SSE_COMPARE_F3_XMM_IMM8_T g_aSseCompareF3XmmR64Imm8[] =
    80418041{
    80428042    ENTRY_BIN(cmppd_u128),
     
    80458045
    80468046#ifdef TSTIEMAIMPL_WITH_GENERATOR
    8047 DUMP_ALL_FN(SseCompareF2XmmR64Imm8, g_aSseCompareF2XmmR64Imm8)
    8048 static RTEXITCODE SseCompareF2XmmR64Imm8Generate(uint32_t cTests, const char * const *papszNameFmts)
     8047DUMP_ALL_FN(SseCompareF3XmmR64Imm8, g_aSseCompareF3XmmR64Imm8)
     8048static RTEXITCODE SseCompareF3XmmR64Imm8Generate(uint32_t cTests, const char * const *papszNameFmts)
    80498049{
    80508050    cTests = RT_MAX(192, cTests); /* there are 144 standard input variations */
     
    80648064
    80658065    uint32_t cMinNormalPairs       = (cTests - 144) / 4;
    8066     for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF2XmmR64Imm8); iFn++)
    8067     {
    8068         PFNIEMAIMPLMXCSRF2XMMIMM8 const pfn = g_aSseCompareF2XmmR64Imm8[iFn].pfnNative ? g_aSseCompareF2XmmR64Imm8[iFn].pfnNative : g_aSseCompareF2XmmR64Imm8[iFn].pfn;
     8066    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF3XmmR64Imm8); iFn++)
     8067    {
     8068        PFNIEMAIMPLMEDIAF3XMMIMM8 const pfn = g_aSseCompareF3XmmR64Imm8[iFn].pfnNative ? g_aSseCompareF3XmmR64Imm8[iFn].pfnNative : g_aSseCompareF3XmmR64Imm8[iFn].pfn;
    80698069
    80708070        IEMBINARYOUTPUT BinOut;
    8071         AssertReturn(GENERATE_BINARY_OPEN(&BinOut, papszNameFmts, g_aSseCompareF2XmmR64Imm8[iFn]), RTEXITCODE_FAILURE);
     8071        AssertReturn(GENERATE_BINARY_OPEN(&BinOut, papszNameFmts, g_aSseCompareF3XmmR64Imm8[iFn]), RTEXITCODE_FAILURE);
    80728072
    80738073        uint32_t cNormalInputPairs  = 0;
    80748074        for (uint32_t iTest = 0; iTest < cTests + RT_ELEMENTS(s_aSpecials); iTest += 1)
    80758075        {
    8076             SSE_COMPARE_F2_XMM_IMM8_TEST_T TestData; RT_ZERO(TestData);
     8076            SSE_COMPARE_F3_XMM_IMM8_TEST_T TestData; RT_ZERO(TestData);
    80778077
    80788078            TestData.InVal1.ar64[0] = iTest < cTests ? RandR64Src(iTest) : s_aSpecials[iTest - cTests].Val1;
     
    81718171#endif
    81728172
    8173 static void SseCompareF2XmmR64Imm8Test(void)
    8174 {
    8175     for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF2XmmR64Imm8); iFn++)
    8176     {
    8177         if (!SUBTEST_CHECK_IF_ENABLED_AND_DECOMPRESS(g_aSseCompareF2XmmR64Imm8[iFn]))
     8173static void SseCompareF3XmmR64Imm8Test(void)
     8174{
     8175    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF3XmmR64Imm8); iFn++)
     8176    {
     8177        if (!SUBTEST_CHECK_IF_ENABLED_AND_DECOMPRESS(g_aSseCompareF3XmmR64Imm8[iFn]))
    81788178            continue;
    81798179
    8180         SSE_COMPARE_F2_XMM_IMM8_TEST_T const * const    paTests = g_aSseCompareF2XmmR64Imm8[iFn].paTests;
    8181         uint32_t const                                  cTests  = g_aSseCompareF2XmmR64Imm8[iFn].cTests;
    8182         PFNIEMAIMPLMXCSRF2XMMIMM8                       pfn     = g_aSseCompareF2XmmR64Imm8[iFn].pfn;
    8183         uint32_t const                                  cVars   = COUNT_VARIATIONS(g_aSseCompareF2XmmR64Imm8[iFn]);
     8180        SSE_COMPARE_F3_XMM_IMM8_TEST_T const * const    paTests = g_aSseCompareF3XmmR64Imm8[iFn].paTests;
     8181        uint32_t const                                  cTests  = g_aSseCompareF3XmmR64Imm8[iFn].cTests;
     8182        PFNIEMAIMPLMEDIAF3XMMIMM8                       pfn     = g_aSseCompareF3XmmR64Imm8[iFn].pfn;
     8183        uint32_t const                                  cVars   = COUNT_VARIATIONS(g_aSseCompareF3XmmR64Imm8[iFn]);
    81848184        if (!cTests) RTTestSkipped(g_hTest, "no tests");
    81858185        for (uint32_t iVar = 0; iVar < cVars; iVar++)
     
    82148214        }
    82158215
    8216         FREE_DECOMPRESSED_TESTS(g_aSseCompareF2XmmR64Imm8[iFn]);
     8216        FREE_DECOMPRESSED_TESTS(g_aSseCompareF3XmmR64Imm8[iFn]);
    82178217    }
    82188218}
     
    1023710237        GROUP_ENTRY(CATEGORY_SSE_FP_OTHER,  SseCompareEflR32R32,    "tstIEMAImplDataSseCompare-%s.bin.gz", 0),
    1023810238        GROUP_ENTRY(CATEGORY_SSE_FP_OTHER,  SseCompareEflR64R64,    "tstIEMAImplDataSseCompare-%s.bin.gz", 0),
    10239         GROUP_ENTRY(CATEGORY_SSE_FP_OTHER,  SseCompareF2XmmR32Imm8, "tstIEMAImplDataSseCompare-%s.bin.gz", 0),
    10240         GROUP_ENTRY(CATEGORY_SSE_FP_OTHER,  SseCompareF2XmmR64Imm8, "tstIEMAImplDataSseCompare-%s.bin.gz", 0),
     10239        GROUP_ENTRY(CATEGORY_SSE_FP_OTHER,  SseCompareF3XmmR32Imm8, "tstIEMAImplDataSseCompare-%s.bin.gz", 0),
     10240        GROUP_ENTRY(CATEGORY_SSE_FP_OTHER,  SseCompareF3XmmR64Imm8, "tstIEMAImplDataSseCompare-%s.bin.gz", 0),
    1024110241
    1024210242        GROUP_ENTRY(CATEGORY_SSE_FP_OTHER,  SseConvertXmmI32R32,    "tstIEMAImplDataSseConvert-%s.bin.gz", 0),
  • trunk/src/VBox/VMM/testcase/tstIEMAImpl.h

    r104521 r105274  
    473473} SSE_COMPARE_EFL_R64_R64_TEST_T;
    474474
    475 typedef struct SSE_COMPARE_F2_XMM_IMM8_TEST_T
     475typedef struct SSE_COMPARE_F3_XMM_IMM8_TEST_T
    476476{
    477477    uint32_t                fMxcsrIn;
     
    483483    X86XMMREG               InVal2;
    484484    X86XMMREG               OutVal;
    485 } SSE_COMPARE_F2_XMM_IMM8_TEST_T;
     485} SSE_COMPARE_F3_XMM_IMM8_TEST_T;
    486486
    487487typedef struct SSE_CONVERT_XMM_TEST_T
     
    10041004TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_EFL_R64_R64_TEST_T, vcomisd_u128         );
    10051005
    1006 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_F2_XMM_IMM8_TEST_T, cmpps_u128           );
    1007 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_F2_XMM_IMM8_TEST_T, cmppd_u128           );
    1008 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_F2_XMM_IMM8_TEST_T, cmpss_u128           );
    1009 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_F2_XMM_IMM8_TEST_T, cmpsd_u128           );
     1006TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_F3_XMM_IMM8_TEST_T, cmpps_u128           );
     1007TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_F3_XMM_IMM8_TEST_T, cmppd_u128           );
     1008TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_F3_XMM_IMM8_TEST_T, cmpss_u128           );
     1009TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_F3_XMM_IMM8_TEST_T, cmpsd_u128           );
    10101010
    10111011TSTIEM_DECLARE_TEST_ARRAY_BIN(SseConvert,   SSE_CONVERT_XMM_TEST_T,         cvtdq2ps_u128        );
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