VirtualBox

Changeset 103558 in vbox


Ignore:
Timestamp:
Feb 24, 2024 11:06:53 AM (7 months ago)
Author:
vboxsync
Message:

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

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

Legend:

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

    r103556 r103558  
    44274427IEMIMPL_MEDIA_OPT_F3 vpaddsw
    44284428IEMIMPL_MEDIA_OPT_F3 vpermilps
     4429IEMIMPL_MEDIA_OPT_F3 vpermilpd
    44294430
    44304431;;
     
    55885589
    55895590IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP_6 vpermilps,  1, 1
     5591IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP_6 vpermilpd,  1, 1
    55905592
    55915593
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r103556 r103558  
    1711117111
    1711217112
     17113/**
     17114 * VPERMILPD
     17115 */
     17116#ifdef IEM_WITHOUT_ASSEMBLY
     17117IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilpd_imm_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t bEvil))
     17118{
     17119    RTUINT128U const uSrc = *puSrc;
     17120    ASMCompilerBarrier();
     17121
     17122    puDst->au64[0] = uSrc.au64[bEvil & 0x1];
     17123    puDst->au64[1] = uSrc.au64[(bEvil >> 1) & 0x1];
     17124}
     17125
     17126
     17127IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilpd_imm_u256,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t bEvil))
     17128{
     17129    RTUINT256U const uSrc = *puSrc;
     17130    ASMCompilerBarrier();
     17131
     17132    puDst->au64[0] = uSrc.au64[bEvil & 0x1];
     17133    puDst->au64[1] = uSrc.au64[(bEvil >> 1) & 0x1];
     17134
     17135    puDst->au64[2] = uSrc.au64[2 + ((bEvil >> 2) & 0x1)];
     17136    puDst->au64[3] = uSrc.au64[2 + ((bEvil >> 3) & 0x1)];
     17137}
     17138
     17139IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilpd_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     17140{
     17141    RTUINT128U const uSrc1 = *puSrc1;
     17142    RTUINT128U const uSrc2 = *puSrc2;
     17143    ASMCompilerBarrier();
     17144
     17145    puDst->au64[0] = uSrc1.au64[(uSrc2.au8[0] & 0x2) >> 1];
     17146    puDst->au64[1] = uSrc1.au64[(uSrc2.au8[8] & 0x2) >> 1];
     17147}
     17148
     17149IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilpd_u256,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     17150{
     17151    RTUINT256U const uSrc1 = *puSrc1;
     17152    RTUINT256U const uSrc2 = *puSrc2;
     17153    ASMCompilerBarrier();
     17154
     17155    puDst->au64[0] = uSrc1.au64[(uSrc2.au8[0] & 0x2) >> 1];
     17156    puDst->au64[1] = uSrc1.au64[(uSrc2.au8[8] & 0x2) >> 1];
     17157
     17158    puDst->au64[2] = uSrc1.au64[2 + ((uSrc2.au8[16] & 0x2) >> 1)];
     17159    puDst->au64[3] = uSrc1.au64[2 + ((uSrc2.au8[24] & 0x2) >> 1)];
     17160}
     17161#endif
     17162
     17163
     17164IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilpd_imm_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t bEvil))
     17165{
     17166    RTUINT128U const uSrc = *puSrc;
     17167    ASMCompilerBarrier();
     17168
     17169    puDst->au64[0] = uSrc.au64[bEvil & 0x1];
     17170    puDst->au64[1] = uSrc.au64[(bEvil >> 1) & 0x1];
     17171}
     17172
     17173
     17174IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilpd_imm_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t bEvil))
     17175{
     17176    RTUINT256U const uSrc = *puSrc;
     17177    ASMCompilerBarrier();
     17178
     17179    puDst->au64[0] = uSrc.au64[bEvil & 0x1];
     17180    puDst->au64[1] = uSrc.au64[(bEvil >> 1) & 0x1];
     17181
     17182    puDst->au64[2] = uSrc.au64[2 + ((bEvil >> 2) & 0x1)];
     17183    puDst->au64[3] = uSrc.au64[2 + ((bEvil >> 3) & 0x1)];
     17184}
     17185
     17186IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilpd_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     17187{
     17188    RTUINT128U const uSrc1 = *puSrc1;
     17189    RTUINT128U const uSrc2 = *puSrc2;
     17190    ASMCompilerBarrier();
     17191
     17192    puDst->au64[0] = uSrc1.au64[(uSrc2.au8[0] & 0x2) >> 1];
     17193    puDst->au64[1] = uSrc1.au64[(uSrc2.au8[8] & 0x2) >> 1];
     17194}
     17195
     17196IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilpd_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     17197{
     17198    RTUINT256U const uSrc1 = *puSrc1;
     17199    RTUINT256U const uSrc2 = *puSrc2;
     17200    ASMCompilerBarrier();
     17201
     17202    puDst->au64[0] = uSrc1.au64[(uSrc2.au8[0] & 0x2) >> 1];
     17203    puDst->au64[1] = uSrc1.au64[(uSrc2.au8[8] & 0x2) >> 1];
     17204
     17205    puDst->au64[2] = uSrc1.au64[2 + ((uSrc2.au8[16] & 0x2) >> 1)];
     17206    puDst->au64[3] = uSrc1.au64[2 + ((uSrc2.au8[24] & 0x2) >> 1)];
     17207}
     17208
     17209
    1711317210/*
    1711417211 * [V]PBLENDVB
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap2.cpp.h

    r103556 r103558  
    192192
    193193/*  Opcode VEX.0F38 0x0d - invalid. */
    194 /**  Opcode VEX.66.0F38 0x0d. */
    195 FNIEMOP_STUB(iemOp_vpermilpd_Vx_Hx_Wx);
     194
     195
     196/** Opcode VEX.66.0F38 0x0d.
     197 * AVX,AVX  */
     198FNIEMOP_DEF(iemOp_vpermilpd_Vx_Hx_Wx)
     199{
     200    IEMOP_MNEMONIC3(VEX_RVM, VPERMILPD, vpermilpd, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0); /* @todo */
     201    IEMOPMEDIAOPTF3_INIT_VARS(vpermilpd);
     202    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     203}
     204
     205
    196206/*  Opcode VEX.0F38 0x0e - invalid. */
    197207/**  Opcode VEX.66.0F38 0x0e. */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap3.cpp.h

    r103556 r103558  
    395395
    396396
    397 /** Opcode VEX.66.0F3A 0x05. */
    398 FNIEMOP_STUB(iemOp_vpermilpd_Vx_Wx_Ib);
     397/** Opcode VEX.66.0F3A 0x05.
     398 * AVX,AVX  */
     399FNIEMOP_DEF(iemOp_vpermilpd_Vx_Wx_Ib)
     400{
     401    IEMOP_MNEMONIC3(VEX_RMI, VPERMILPD, vpermilpd, Vx, Wx, Ib, DISOPTYPE_HARMLESS, 0); /* @todo */
     402    IEMOPMEDIAOPTF2IMM8_INIT_VARS(vpermilpd);
     403    return FNIEMOP_CALL_1(iemOpCommonAvxAvx_Vx_Wx_Ib_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback));
     404}
    399405
    400406
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r103556 r103558  
    36493649FNIEMAIMPLMEDIAOPTF3U256     iemAImpl_vpermilps_u256,     iemAImpl_vpermilps_u256_fallback;
    36503650FNIEMAIMPLMEDIAOPTF2U256IMM8 iemAImpl_vpermilps_imm_u256, iemAImpl_vpermilps_imm_u256_fallback;
     3651
     3652FNIEMAIMPLMEDIAOPTF3U128     iemAImpl_vpermilpd_u128,     iemAImpl_vpermilpd_u128_fallback;
     3653FNIEMAIMPLMEDIAOPTF2U128IMM8 iemAImpl_vpermilpd_imm_u128, iemAImpl_vpermilpd_imm_u128_fallback;
     3654FNIEMAIMPLMEDIAOPTF3U256     iemAImpl_vpermilpd_u256,     iemAImpl_vpermilpd_u256_fallback;
     3655FNIEMAIMPLMEDIAOPTF2U256IMM8 iemAImpl_vpermilpd_imm_u256, iemAImpl_vpermilpd_imm_u256_fallback;
    36513656/** @} */
    36523657
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