VirtualBox

Ignore:
Timestamp:
Oct 14, 2022 9:29:44 AM (2 years ago)
Author:
vboxsync
Message:

IEM: Added AES-NI instructions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f3a.cpp.h

    r97123 r97153  
    141141        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    142142        IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
     143        IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     144
     145        IEM_MC_PREPARE_SSE_USAGE();
     146        IEM_MC_REF_XREG_U128(puDst,             IEM_GET_MODRM_REG(pVCpu, bRm));
     147        IEM_MC_CALL_VOID_AIMPL_3(pfnU128, puDst, puSrc, bImmArg);
     148
     149        IEM_MC_ADVANCE_RIP();
     150        IEM_MC_END();
     151    }
     152    return VINF_SUCCESS;
     153}
     154
     155
     156/**
     157 * Common worker for SSE-style AES-NI instructions of the form:
     158 *      aesxxx  xmm1, xmm2/mem128, imm8
     159 *
     160 * Proper alignment of the 128-bit operand is enforced.
     161 * Exceptions type 4. AES-NI cpuid checks.
     162 *
     163 * @sa  iemOpCommonSsse3_FullFullImm8_To_Full
     164 * @sa  iemOpCommonSse41_FullFullImm8_To_Full
     165 */
     166FNIEMOP_DEF_1(iemOpCommonAesNi_FullFullImm8_To_Full, PFNIEMAIMPLMEDIAOPTF2U128IMM8, pfnU128)
     167{
     168    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     169    if (IEM_IS_MODRM_REG_MODE(bRm))
     170    {
     171        /*
     172         * Register, register.
     173         */
     174        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     175        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     176        IEM_MC_BEGIN(3, 0);
     177        IEM_MC_ARG(PRTUINT128U,                 puDst,               0);
     178        IEM_MC_ARG(PCRTUINT128U,                puSrc,               1);
     179        IEM_MC_ARG_CONST(uint8_t,               bImmArg, /*=*/ bImm, 2);
     180        IEM_MC_MAYBE_RAISE_AESNI_RELATED_XCPT();
     181        IEM_MC_PREPARE_SSE_USAGE();
     182        IEM_MC_REF_XREG_U128(puDst,             IEM_GET_MODRM_REG(pVCpu, bRm));
     183        IEM_MC_REF_XREG_U128_CONST(puSrc,       IEM_GET_MODRM_RM(pVCpu, bRm));
     184        IEM_MC_CALL_VOID_AIMPL_3(pfnU128, puDst, puSrc, bImmArg);
     185        IEM_MC_ADVANCE_RIP();
     186        IEM_MC_END();
     187    }
     188    else
     189    {
     190        /*
     191         * Register, memory.
     192         */
     193        IEM_MC_BEGIN(3, 2);
     194        IEM_MC_ARG(PRTUINT128U,                 puDst,               0);
     195        IEM_MC_LOCAL(RTUINT128U,                uSrc);
     196        IEM_MC_ARG_LOCAL_REF(PCRTUINT128U,      puSrc, uSrc,         1);
     197        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     198
     199        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     200        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     201        IEM_MC_ARG_CONST(uint8_t,               bImmArg, /*=*/ bImm, 2);
     202        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     203        IEM_MC_MAYBE_RAISE_AESNI_RELATED_XCPT();
    143204        IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    144205
     
    553614/*  Opcode 0x66 0x0f 0xdd - invalid */
    554615/*  Opcode 0x66 0x0f 0xde - invalid */
     616
     617
    555618/*  Opcode 0x66 0x0f 0xdf - (aeskeygenassist). */
    556 FNIEMOP_STUB(iemOp_aeskeygen_Vdq_Wdq_Ib);
     619FNIEMOP_DEF(iemOp_aeskeygen_Vdq_Wdq_Ib)
     620{
     621    IEMOP_MNEMONIC3(RMI, AESKEYGEN, aeskeygen, Vdq, Wdq, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0);
     622    return FNIEMOP_CALL_1(iemOpCommonAesNi_FullFullImm8_To_Full,
     623                          IEM_SELECT_HOST_OR_FALLBACK(fAesNi, iemAImpl_aeskeygenassist_u128, iemAImpl_aeskeygenassist_u128_fallback));
     624}
    557625
    558626
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