VirtualBox

Changeset 96624 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Sep 7, 2022 10:20:13 AM (2 years ago)
Author:
vboxsync
Message:

VMM/IEM: Current state of the pcmpistri isntruction (missing the C only implementation right now), bugref:9898

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

Legend:

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

    r96537 r96624  
    51825182IEMIMPL_MEDIA_AVX_INSN_IMM8_6 vpblendw
    51835183IEMIMPL_MEDIA_AVX_INSN_IMM8_6 vpalignr
     5184
     5185
     5186;;
     5187; Need to move this as well somewhere better?
     5188;
     5189struc IEMPCMPISTRISRC
     5190    .uSrc1        resd 4
     5191    .uSrc2        resd 4
     5192endstruc
     5193
     5194;;
     5195; The pcmpistri instruction.
     5196;
     5197; @param    A0      Pointer to the ECX register to store the result to (output).
     5198; @param    A1      Pointer to the EFLAGS register.
     5199; @param    A2      Pointer to the structure containing the source operands (input).
     5200; @param    A3      The 8-bit immediate
     5201;
     5202BEGINPROC_FASTCALL iemAImpl_pcmpistri_u128, 16
     5203        PROLOGUE_4_ARGS
     5204        IEMIMPL_SSE_PROLOGUE
     5205
     5206        movdqu  xmm0, [A2 + IEMPCMPISTRISRC.uSrc1]
     5207        movdqu  xmm1, [A2 + IEMPCMPISTRISRC.uSrc2]
     5208        mov     T2, A0                  ; A0 can be ecx/rcx in some calling conventions which gets overwritten later (T2 only available on AMD64)
     5209        lea     T1, [.imm0 xWrtRIP]
     5210        lea     T0, [A3 + A3*3]         ; sizeof(insnX+ret) == 8: (A3 * 4) * 2
     5211        lea     T1, [T1 + T0*2]
     5212        call    T1
     5213
     5214        IEM_SAVE_FLAGS A1, X86_EFL_STATUS_BITS, 0
     5215        mov    [T2], ecx
     5216
     5217        IEMIMPL_SSE_EPILOGUE
     5218        EPILOGUE_4_ARGS
     5219 %assign bImm 0
     5220 %rep 256
     5221.imm %+ bImm:
     5222       pcmpistri xmm0, xmm1, bImm
     5223       ret
     5224       int3
     5225  %assign bImm bImm + 1
     5226 %endrep
     5227.immEnd:                                ; 256*8 == 0x800
     5228dw 0xf7ff  + (.immEnd - .imm0)          ; will cause warning if entries are too big.
     5229dw 0x107ff - (.immEnd - .imm0)          ; will cause warning if entries are too small.
     5230ENDPROC iemAImpl_pcmpistri_u128
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96537 r96624  
    1541015410            puDst->au64[i] = puSrc1->au64[i];
    1541115411}
     15412
     15413
     15414/**
     15415 * [V]PCMPISTRI
     15416 */
     15417IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistri_u128_fallback,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPISTRISRC pSrc, uint8_t bEvil))
     15418{
     15419    RT_NOREF(pu32Ecx, pEFlags, pSrc, bEvil);
     15420    AssertReleaseFailed();
     15421}
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f3a.cpp.h

    r96592 r96624  
    375375/** Opcode 0x66 0x0f 0x62. */
    376376FNIEMOP_STUB(iemOp_pcmpistrm_Vdq_Wdq_Ib);
     377
     378
    377379/** Opcode 0x66 0x0f 0x63*/
    378 FNIEMOP_STUB(iemOp_pcmpistri_Vdq_Wdq_Ib);
     380FNIEMOP_DEF(iemOp_pcmpistri_Vdq_Wdq_Ib)
     381{
     382    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     383    if (IEM_IS_MODRM_REG_MODE(bRm))
     384    {
     385        /*
     386         * Register, register.
     387         */
     388        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     389        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     390        IEM_MC_BEGIN(4, 1);
     391        IEM_MC_ARG(uint32_t *,                 pu32Ecx,             0);
     392        IEM_MC_ARG(uint32_t *,                 pEFlags,             1);
     393        IEM_MC_LOCAL(IEMPCMPISTRISRC,          Src);
     394        IEM_MC_ARG_LOCAL_REF(PIEMPCMPISTRISRC, pSrc,           Src, 2);
     395        IEM_MC_ARG_CONST(uint8_t,              bImmArg, /*=*/ bImm, 3);
     396        IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
     397        IEM_MC_PREPARE_SSE_USAGE();
     398        IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
     399        IEM_MC_FETCH_XREG_U128(Src.uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm));
     400        IEM_MC_FETCH_XREG_U128(Src.uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
     401        IEM_MC_REF_EFLAGS(pEFlags);
     402        IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse41,
     403                                                             iemAImpl_pcmpistri_u128,
     404                                                             iemAImpl_pcmpistri_u128_fallback),
     405                                 pu32Ecx, pEFlags, pSrc, bImmArg);
     406        IEM_MC_ADVANCE_RIP();
     407        IEM_MC_END();
     408    }
     409    else
     410    {
     411        /*
     412         * Register, memory.
     413         */
     414        IEM_MC_BEGIN(4, 3);
     415        IEM_MC_ARG(uint32_t *,                  pu32Ecx,             0);
     416        IEM_MC_ARG(uint32_t *,                  pEFlags,             1);
     417        IEM_MC_LOCAL(IEMPCMPISTRISRC,           Src);
     418        IEM_MC_ARG_LOCAL_REF(PIEMPCMPISTRISRC,  pSrc,           Src, 2);
     419        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     420
     421        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     422        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     423        IEM_MC_ARG_CONST(uint8_t,               bImmArg, /*=*/ bImm, 3);
     424        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     425        IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
     426        IEM_MC_FETCH_MEM_U128_ALIGN_SSE(Src.uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     427
     428        IEM_MC_PREPARE_SSE_USAGE();
     429        IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
     430        IEM_MC_FETCH_XREG_U128(Src.uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm));
     431        IEM_MC_REF_EFLAGS(pEFlags);
     432        IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse41,
     433                                                             iemAImpl_pcmpistri_u128,
     434                                                             iemAImpl_pcmpistri_u128_fallback),
     435                                 pu32Ecx, pEFlags, pSrc, bImmArg);
     436        IEM_MC_ADVANCE_RIP();
     437        IEM_MC_END();
     438    }
     439    return VINF_SUCCESS;
     440}
     441
     442
    379443/*  Opcode 0x66 0x0f 0x64 - invalid */
    380444/*  Opcode 0x66 0x0f 0x65 - invalid */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96537 r96624  
    22302230FNIEMAIMPLMEDIAOPTF3U256IMM8 iemAImpl_vblendps_u256, iemAImpl_vblendps_u256_fallback;
    22312231FNIEMAIMPLMEDIAOPTF3U256IMM8 iemAImpl_vblendpd_u256, iemAImpl_vblendpd_u256_fallback;
     2232
     2233
     2234typedef struct IEMPCMPISTRISRC
     2235{
     2236    RTUINT128U              uSrc1;
     2237    RTUINT128U              uSrc2;
     2238} IEMPCMPISTRISRC;
     2239typedef IEMPCMPISTRISRC *PIEMPCMPISTRISRC;
     2240typedef const IEMPCMPISTRISRC *PCIEMPCMPISTRISRC;
     2241
     2242IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistri_u128,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPISTRISRC pSrc, uint8_t bEvil));
     2243IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistri_u128_fallback,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPISTRISRC pSrc, uint8_t bEvil));
     2244
    22322245/** @} */
    22332246
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