VirtualBox

Changeset 103556 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 24, 2024 11:04:39 AM (12 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implement vpermilps instruction emulations, bugref:9898

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

Legend:

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

    r103267 r103556  
    44264426IEMIMPL_MEDIA_OPT_F3 vpaddsb
    44274427IEMIMPL_MEDIA_OPT_F3 vpaddsw
     4428IEMIMPL_MEDIA_OPT_F3 vpermilps
    44284429
    44294430;;
     
    55065507
    55075508;;
     5509; AVX instructions with 8-bit immediates of the form
     5510;    xxx {x,y}mm1, {x,y}mm2, imm8.
     5511; where the instruction encoding takes up 6 bytes.
     5512;
     5513; @param    1       The instruction name.
     5514; @param    2       Whether the instruction has a 128-bit variant (1) or not (0).
     5515; @param    3       Whether the instruction has a 256-bit variant (1) or not (0).
     5516;
     5517; @param    A0      Pointer to the destination media register size operand (output).
     5518; @param    A1      Pointer to the first source media register size operand (input).
     5519; @param    A2      The 8-bit immediate
     5520;
     5521%macro IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP_6 3
     5522 %if %2 == 1
     5523BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _imm_u128, 16
     5524        PROLOGUE_4_ARGS
     5525        IEMIMPL_AVX_PROLOGUE
     5526
     5527        movzx   A2, A2_8                ; must clear top bits
     5528        movdqu  xmm1, [A1]
     5529        lea     T1, [.imm0 xWrtRIP]
     5530 %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
     5531        lea     T0, [A2 + A2*2]         ; sizeof(endbrxx+insnX+ret+int3) == 12: A2 * 12 = (A2 * 3) * 4
     5532        lea     T1, [T1 + T0*4]
     5533 %else
     5534        lea     T1, [T1 + A2*8]         ; sizeof(insnX+ret+int3)         ==  8: A2 * 8
     5535 %endif
     5536        IBT_NOTRACK
     5537        call    T1
     5538        movdqu  [A0], xmm0
     5539
     5540        IEMIMPL_AVX_EPILOGUE
     5541        EPILOGUE_4_ARGS
     5542 %assign bImm 0
     5543 %rep 256
     5544.imm %+ bImm:
     5545        IBT_ENDBRxx_WITHOUT_NOTRACK
     5546        %1      xmm0, xmm1, bImm
     5547        ret
     5548        int3
     5549  %assign bImm bImm + 1
     5550 %endrep
     5551.immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800
     5552ENDPROC iemAImpl_ %+ %1 %+ _imm_u128
     5553 %endif
     5554
     5555 %if %3 == 1
     5556BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _imm_u256, 16
     5557        PROLOGUE_4_ARGS
     5558        IEMIMPL_AVX_PROLOGUE
     5559
     5560        movzx   A2, A2_8                ; must clear top bits
     5561        vmovdqu ymm1, [A1]
     5562        lea     T1, [.imm0 xWrtRIP]
     5563 %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
     5564        lea     T0, [A2 + A2*2]         ; sizeof(endbrxx+insnX+ret+int3) == 12: A2 * 12 = (A2 * 3) * 4
     5565        lea     T1, [T1 + T0*4]
     5566 %else
     5567        lea     T1, [T1 + A2*8]         ; sizeof(insnX+ret+int3)         ==  8: A2 *  8
     5568 %endif
     5569        IBT_NOTRACK
     5570        call    T1
     5571        vmovdqu [A0], ymm0
     5572
     5573        IEMIMPL_AVX_EPILOGUE
     5574        EPILOGUE_4_ARGS
     5575 %assign bImm 0
     5576 %rep 256
     5577.imm %+ bImm:
     5578        IBT_ENDBRxx_WITHOUT_NOTRACK
     5579        %1      ymm0, ymm1, bImm
     5580        ret
     5581        int3
     5582  %assign bImm bImm + 1
     5583 %endrep
     5584.immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800
     5585ENDPROC iemAImpl_ %+ %1 %+ _imm_u256
     5586 %endif
     5587%endmacro
     5588
     5589IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP_6 vpermilps,  1, 1
     5590
     5591
     5592;;
    55085593; Need to move this as well somewhere better?
    55095594;
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r103361 r103556  
    1699016990
    1699116991
     16992/**
     16993 * VPERMILPS
     16994 */
     16995#ifdef IEM_WITHOUT_ASSEMBLY
     16996IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_imm_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t bEvil))
     16997{
     16998    RTUINT128U const uSrc = *puSrc;
     16999    ASMCompilerBarrier();
     17000
     17001    puDst->au32[0] = uSrc.au32[bEvil & 0x3];
     17002    puDst->au32[1] = uSrc.au32[(bEvil >> 2) & 0x3];
     17003    puDst->au32[2] = uSrc.au32[(bEvil >> 4) & 0x3];
     17004    puDst->au32[3] = uSrc.au32[(bEvil >> 6) & 0x3];
     17005}
     17006
     17007
     17008IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_imm_u256,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t bEvil))
     17009{
     17010    RTUINT256U const uSrc = *puSrc;
     17011    ASMCompilerBarrier();
     17012
     17013    puDst->au32[0] = uSrc.au32[bEvil & 0x3];
     17014    puDst->au32[1] = uSrc.au32[(bEvil >> 2) & 0x3];
     17015    puDst->au32[2] = uSrc.au32[(bEvil >> 4) & 0x3];
     17016    puDst->au32[3] = uSrc.au32[(bEvil >> 6) & 0x3];
     17017
     17018    puDst->au32[4] = uSrc.au32[4 + (bEvil & 0x3)];
     17019    puDst->au32[5] = uSrc.au32[4 + ((bEvil >> 2) & 0x3)];
     17020    puDst->au32[6] = uSrc.au32[4 + ((bEvil >> 4) & 0x3)];
     17021    puDst->au32[7] = uSrc.au32[4 + ((bEvil >> 6) & 0x3)];
     17022}
     17023
     17024IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     17025{
     17026    RTUINT128U const uSrc1 = *puSrc1;
     17027    RTUINT128U const uSrc2 = *puSrc2;
     17028    ASMCompilerBarrier();
     17029
     17030    puDst->au32[0] = uSrc1.au32[uSrc2.au8[0] & 0x3];
     17031    puDst->au32[1] = uSrc1.au32[uSrc2.au8[4] & 0x3];
     17032    puDst->au32[2] = uSrc1.au32[uSrc2.au8[8] & 0x3];
     17033    puDst->au32[3] = uSrc1.au32[uSrc2.au8[12] & 0x3];
     17034}
     17035
     17036IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_u256,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     17037{
     17038    RTUINT256U const uSrc1 = *puSrc1;
     17039    RTUINT256U const uSrc2 = *puSrc2;
     17040    ASMCompilerBarrier();
     17041
     17042    puDst->au32[0] = uSrc1.au32[uSrc2.au8[0] & 0x3];
     17043    puDst->au32[1] = uSrc1.au32[uSrc2.au8[4] & 0x3];
     17044    puDst->au32[2] = uSrc1.au32[uSrc2.au8[8] & 0x3];
     17045    puDst->au32[3] = uSrc1.au32[uSrc2.au8[12] & 0x3];
     17046
     17047    puDst->au32[4] = uSrc1.au32[4 + (uSrc2.au8[16] & 0x3)];
     17048    puDst->au32[5] = uSrc1.au32[4 + (uSrc2.au8[20] & 0x3)];
     17049    puDst->au32[6] = uSrc1.au32[4 + (uSrc2.au8[24] & 0x3)];
     17050    puDst->au32[7] = uSrc1.au32[4 + (uSrc2.au8[28] & 0x3)];
     17051}
     17052#endif
     17053
     17054
     17055IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_imm_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t bEvil))
     17056{
     17057    RTUINT128U const uSrc = *puSrc;
     17058    ASMCompilerBarrier();
     17059
     17060    puDst->au32[0] = uSrc.au32[bEvil & 0x3];
     17061    puDst->au32[1] = uSrc.au32[(bEvil >> 2) & 0x3];
     17062    puDst->au32[2] = uSrc.au32[(bEvil >> 4) & 0x3];
     17063    puDst->au32[3] = uSrc.au32[(bEvil >> 6) & 0x3];
     17064}
     17065
     17066
     17067IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_imm_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t bEvil))
     17068{
     17069    RTUINT256U const uSrc = *puSrc;
     17070    ASMCompilerBarrier();
     17071
     17072    puDst->au32[0] = uSrc.au32[bEvil & 0x3];
     17073    puDst->au32[1] = uSrc.au32[(bEvil >> 2) & 0x3];
     17074    puDst->au32[2] = uSrc.au32[(bEvil >> 4) & 0x3];
     17075    puDst->au32[3] = uSrc.au32[(bEvil >> 6) & 0x3];
     17076
     17077    puDst->au32[4] = uSrc.au32[4 + (bEvil & 0x3)];
     17078    puDst->au32[5] = uSrc.au32[4 + ((bEvil >> 2) & 0x3)];
     17079    puDst->au32[6] = uSrc.au32[4 + ((bEvil >> 4) & 0x3)];
     17080    puDst->au32[7] = uSrc.au32[4 + ((bEvil >> 6) & 0x3)];
     17081}
     17082
     17083IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     17084{
     17085    RTUINT128U const uSrc1 = *puSrc1;
     17086    RTUINT128U const uSrc2 = *puSrc2;
     17087    ASMCompilerBarrier();
     17088
     17089    puDst->au32[0] = uSrc1.au32[uSrc2.au8[0] & 0x3];
     17090    puDst->au32[1] = uSrc1.au32[uSrc2.au8[4] & 0x3];
     17091    puDst->au32[2] = uSrc1.au32[uSrc2.au8[8] & 0x3];
     17092    puDst->au32[3] = uSrc1.au32[uSrc2.au8[12] & 0x3];
     17093}
     17094
     17095IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     17096{
     17097    RTUINT256U const uSrc1 = *puSrc1;
     17098    RTUINT256U const uSrc2 = *puSrc2;
     17099    ASMCompilerBarrier();
     17100
     17101    puDst->au32[0] = uSrc1.au32[uSrc2.au8[0] & 0x3];
     17102    puDst->au32[1] = uSrc1.au32[uSrc2.au8[4] & 0x3];
     17103    puDst->au32[2] = uSrc1.au32[uSrc2.au8[8] & 0x3];
     17104    puDst->au32[3] = uSrc1.au32[uSrc2.au8[12] & 0x3];
     17105
     17106    puDst->au32[4] = uSrc1.au32[4 + (uSrc2.au8[16] & 0x3)];
     17107    puDst->au32[5] = uSrc1.au32[4 + (uSrc2.au8[20] & 0x3)];
     17108    puDst->au32[6] = uSrc1.au32[4 + (uSrc2.au8[24] & 0x3)];
     17109    puDst->au32[7] = uSrc1.au32[4 + (uSrc2.au8[28] & 0x3)];
     17110}
     17111
     17112
    1699217113/*
    1699317114 * [V]PBLENDVB
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap2.cpp.h

    r103256 r103556  
    179179
    180180/*  Opcode VEX.0F38 0x0c - invalid. */
    181 /**  Opcode VEX.66.0F38 0x0c. */
    182 FNIEMOP_STUB(iemOp_vpermilps_Vx_Hx_Wx);
     181
     182
     183/** Opcode VEX.66.0F38 0x0c.
     184 * AVX,AVX  */
     185FNIEMOP_DEF(iemOp_vpermilps_Vx_Hx_Wx)
     186{
     187    IEMOP_MNEMONIC3(VEX_RVM, VPERMILPS, vpermilps, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0); /* @todo */
     188    IEMOPMEDIAOPTF3_INIT_VARS(vpermilps);
     189    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     190}
     191
     192
    183193/*  Opcode VEX.0F38 0x0d - invalid. */
    184194/**  Opcode VEX.66.0F38 0x0d. */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap3.cpp.h

    r103256 r103556  
    154154/**
    155155 * Common worker for AVX instructions on the forms:
     156 *     - vpermilps/d    xmm0, xmm1/mem128, imm8
     157 *     - vpermilps/d    ymm0, ymm1/mem256, imm8
     158 *
     159 * Takes function table for function w/o implicit state parameter.
     160 *
     161 * Exceptions type 4. AVX cpuid check for both 128-bit and 256-bit operation.
     162 */
     163FNIEMOP_DEF_1(iemOpCommonAvxAvx_Vx_Wx_Ib_Opt, PCIEMOPMEDIAOPTF2IMM8, pImpl)
     164{
     165    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     166    if (IEM_IS_MODRM_REG_MODE(bRm))
     167    {
     168        /*
     169         * Register, register.
     170         */
     171        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     172        if (pVCpu->iem.s.uVexLength)
     173        {
     174            IEM_MC_BEGIN(3, 2, IEM_MC_F_NOT_286_OR_OLDER, 0);
     175            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     176            IEM_MC_LOCAL(RTUINT256U,            uDst);
     177            IEM_MC_LOCAL(RTUINT256U,            uSrc);
     178            IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst,  uDst,         0);
     179            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc,  uSrc,         1);
     180            IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm,  2);
     181            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     182            IEM_MC_PREPARE_AVX_USAGE();
     183            IEM_MC_FETCH_YREG_U256(uSrc,        IEM_GET_MODRM_RM(pVCpu, bRm));
     184            IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnU256, puDst, puSrc, bImmArg);
     185            IEM_MC_STORE_YREG_U256_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(3, 0, IEM_MC_F_NOT_286_OR_OLDER, 0);
     192            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     193            IEM_MC_ARG(PRTUINT128U,             puDst,                0);
     194            IEM_MC_ARG(PCRTUINT128U,            puSrc,                1);
     195            IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm,  2);
     196            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     197            IEM_MC_PREPARE_AVX_USAGE();
     198            IEM_MC_REF_XREG_U128(puDst,         IEM_GET_MODRM_REG(pVCpu, bRm));
     199            IEM_MC_REF_XREG_U128_CONST(puSrc,   IEM_GET_MODRM_RM(pVCpu, bRm));
     200            IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnU128, puDst, puSrc, bImmArg);
     201            IEM_MC_CLEAR_YREG_128_UP(           IEM_GET_MODRM_REG(pVCpu, bRm));
     202            IEM_MC_ADVANCE_RIP_AND_FINISH();
     203            IEM_MC_END();
     204        }
     205    }
     206    else
     207    {
     208        /*
     209         * Register, memory.
     210         */
     211        if (pVCpu->iem.s.uVexLength)
     212        {
     213            IEM_MC_BEGIN(3, 3, IEM_MC_F_NOT_286_OR_OLDER, 0);
     214            IEM_MC_LOCAL(RTUINT256U,            uDst);
     215            IEM_MC_LOCAL(RTUINT256U,            uSrc);
     216            IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     217            IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst,          uDst, 0);
     218            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc,          uSrc, 1);
     219
     220            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
     221            uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     222            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     223            IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm,  2);
     224            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     225            IEM_MC_PREPARE_AVX_USAGE();
     226
     227            IEM_MC_FETCH_MEM_U256_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     228            IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnU256, puDst, puSrc, bImmArg);
     229            IEM_MC_STORE_YREG_U256_ZX_VLMAX(    IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     230
     231            IEM_MC_ADVANCE_RIP_AND_FINISH();
     232            IEM_MC_END();
     233        }
     234        else
     235        {
     236            IEM_MC_BEGIN(3, 2, IEM_MC_F_NOT_286_OR_OLDER, 0);
     237            IEM_MC_LOCAL(RTUINT128U,            uSrc);
     238            IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     239            IEM_MC_ARG(PRTUINT128U,             puDst,                0);
     240            IEM_MC_ARG_LOCAL_REF(PCRTUINT128U,  puSrc, uSrc,          1);
     241
     242            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
     243            uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     244            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     245            IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm,  2);
     246            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     247            IEM_MC_PREPARE_AVX_USAGE();
     248
     249            IEM_MC_FETCH_MEM_U128_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     250            IEM_MC_REF_XREG_U128(puDst,         IEM_GET_MODRM_REG(pVCpu, bRm));
     251            IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnU128, puDst, puSrc, bImmArg);
     252            IEM_MC_CLEAR_YREG_128_UP(           IEM_GET_MODRM_REG(pVCpu, bRm));
     253
     254            IEM_MC_ADVANCE_RIP_AND_FINISH();
     255            IEM_MC_END();
     256        }
     257    }
     258}
     259
     260
     261/**
     262 * Common worker for AVX instructions on the forms:
    156263 *     - vblendps/d    xmm0, xmm1, xmm2/mem128, imm8
    157264 *     - vblendps/d    ymm0, ymm1, ymm2/mem256, imm8
     
    276383FNIEMOP_STUB(iemOp_vpblendd_Vx_Wx_Ib);
    277384/*  Opcode VEX.66.0F3A 0x03 - invalid */
    278 /** Opcode VEX.66.0F3A 0x04. */
    279 FNIEMOP_STUB(iemOp_vpermilps_Vx_Wx_Ib);
     385
     386
     387/** Opcode VEX.66.0F3A 0x04.
     388 * AVX,AVX  */
     389FNIEMOP_DEF(iemOp_vpermilps_Vx_Wx_Ib)
     390{
     391    IEMOP_MNEMONIC3(VEX_RMI, VPERMILPS, vpermilps, Vx, Wx, Ib, DISOPTYPE_HARMLESS, 0); /* @todo */
     392    IEMOPMEDIAOPTF2IMM8_INIT_VARS(vpermilps);
     393    return FNIEMOP_CALL_1(iemOpCommonAvxAvx_Vx_Wx_Ib_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback));
     394}
     395
     396
    280397/** Opcode VEX.66.0F3A 0x05. */
    281398FNIEMOP_STUB(iemOp_vpermilpd_Vx_Wx_Ib);
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r103554 r103556  
    35373537typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAOPTF2U128IMM8,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t bEvil));
    35383538typedef FNIEMAIMPLMEDIAOPTF2U128IMM8 *PFNIEMAIMPLMEDIAOPTF2U128IMM8;
     3539typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAOPTF2U256IMM8,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t bEvil));
     3540typedef FNIEMAIMPLMEDIAOPTF2U256IMM8 *PFNIEMAIMPLMEDIAOPTF2U256IMM8;
    35393541typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAOPTF3U128IMM8,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2, uint8_t bEvil));
    35403542typedef FNIEMAIMPLMEDIAOPTF3U128IMM8 *PFNIEMAIMPLMEDIAOPTF3U128IMM8;
     
    36423644FNIEMAIMPLMEDIAPSHUFU128 iemAImpl_vpsrlq_imm_u128, iemAImpl_vpsrlq_imm_u128_fallback;
    36433645FNIEMAIMPLMEDIAPSHUFU256 iemAImpl_vpsrlq_imm_u256, iemAImpl_vpsrlq_imm_u256_fallback;
     3646
     3647FNIEMAIMPLMEDIAOPTF3U128     iemAImpl_vpermilps_u128,     iemAImpl_vpermilps_u128_fallback;
     3648FNIEMAIMPLMEDIAOPTF2U128IMM8 iemAImpl_vpermilps_imm_u128, iemAImpl_vpermilps_imm_u128_fallback;
     3649FNIEMAIMPLMEDIAOPTF3U256     iemAImpl_vpermilps_u256,     iemAImpl_vpermilps_u256_fallback;
     3650FNIEMAIMPLMEDIAOPTF2U256IMM8 iemAImpl_vpermilps_imm_u256, iemAImpl_vpermilps_imm_u256_fallback;
    36443651/** @} */
    36453652
     
    39423949    IEMOPMEDIAOPTF2_INIT_VARS_EX(RT_CONCAT3(iemAImpl_,a_InstrNm,_u128),           RT_CONCAT3(iemAImpl_,a_InstrNm,_u256),\
    39433950                                 RT_CONCAT3(iemAImpl_,a_InstrNm,_u128_fallback),  RT_CONCAT3(iemAImpl_,a_InstrNm,_u256_fallback))
     3951
     3952/**
     3953 * Function table for media instruction taking one full sized media source
     3954 * register and one full sized destination register and an 8-bit immediate, but no additional state
     3955 * (AVX).
     3956 */
     3957typedef struct IEMOPMEDIAOPTF2IMM8
     3958{
     3959    PFNIEMAIMPLMEDIAOPTF2U128IMM8 pfnU128;
     3960    PFNIEMAIMPLMEDIAOPTF2U256IMM8 pfnU256;
     3961} IEMOPMEDIAOPTF2IMM8;
     3962/** Pointer to a media operation function table for 2 full sized ops (AVX). */
     3963typedef IEMOPMEDIAOPTF2IMM8 const *PCIEMOPMEDIAOPTF2IMM8;
     3964
     3965/** @def IEMOPMEDIAOPTF2IMM8_INIT_VARS_EX
     3966 * Declares a s_Host (x86 & amd64 only) and a s_Fallback variable with the
     3967 * given functions as initializers.  For use in AVX functions where a pair of
     3968 * functions are only used once and the function table need not be public. */
     3969#ifndef TST_IEM_CHECK_MC
     3970# if (defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)) && !defined(IEM_WITHOUT_ASSEMBLY)
     3971#  define IEMOPMEDIAOPTF2IMM8_INIT_VARS_EX(a_pfnHostU128, a_pfnHostU256, a_pfnFallbackU128, a_pfnFallbackU256) \
     3972    static IEMOPMEDIAOPTF2IMM8 const s_Host     = { a_pfnHostU128,     a_pfnHostU256 }; \
     3973    static IEMOPMEDIAOPTF2IMM8 const s_Fallback = { a_pfnFallbackU128, a_pfnFallbackU256 }
     3974# else
     3975#  define IEMOPMEDIAOPTF2IMM8_INIT_VARS_EX(a_pfnU128, a_pfnU256, a_pfnFallbackU128, a_pfnFallbackU256) \
     3976    static IEMOPMEDIAOPTF2IMM8 const s_Fallback = { a_pfnFallbackU128, a_pfnFallbackU256 }
     3977# endif
     3978#else
     3979# define IEMOPMEDIAOPTF2IMM8_INIT_VARS_EX(a_pfnU128, a_pfnU256, a_pfnFallbackU128, a_pfnFallbackU256) (void)0
     3980#endif
     3981/** @def IEMOPMEDIAOPTF2IMM8_INIT_VARS
     3982 * Generate AVX function tables for the @a a_InstrNm instruction.
     3983 * @sa IEMOPMEDIAOPTF2IMM8_INIT_VARS_EX */
     3984#define IEMOPMEDIAOPTF2IMM8_INIT_VARS(a_InstrNm) \
     3985    IEMOPMEDIAOPTF2IMM8_INIT_VARS_EX(RT_CONCAT3(iemAImpl_,a_InstrNm,_imm_u128),           RT_CONCAT3(iemAImpl_,a_InstrNm,_imm_u256),\
     3986                                     RT_CONCAT3(iemAImpl_,a_InstrNm,_imm_u128_fallback),  RT_CONCAT3(iemAImpl_,a_InstrNm,_imm_u256_fallback))
     3987/** @} */
    39443988
    39453989/**
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