VirtualBox

Changeset 100602 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jul 17, 2023 12:13:59 PM (19 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158432
Message:

VMM/IEM: Implement vpaddsb/vpaddsw instruction emulations, bugref:9898

Location:
trunk/src/VBox/VMM/VMMAll
Files:
3 edited

Legend:

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

    r100599 r100602  
    43034303IEMIMPL_MEDIA_OPT_F3 vpaddusb
    43044304IEMIMPL_MEDIA_OPT_F3 vpaddusw
     4305IEMIMPL_MEDIA_OPT_F3 vpaddsb
     4306IEMIMPL_MEDIA_OPT_F3 vpaddsw
    43054307
    43064308
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r100599 r100602  
    85298529#endif
    85308530
     8531IEM_DECL_IMPL_DEF(void, iemAImpl_vpaddsb_u128_fallback,(PRTUINT128U puDst,
     8532                                                        PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     8533{
     8534    puDst->au8[0]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[0]  + puSrc2->ai8[0]);
     8535    puDst->au8[1]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[1]  + puSrc2->ai8[1]);
     8536    puDst->au8[2]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[2]  + puSrc2->ai8[2]);
     8537    puDst->au8[3]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[3]  + puSrc2->ai8[3]);
     8538    puDst->au8[4]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[4]  + puSrc2->ai8[4]);
     8539    puDst->au8[5]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[5]  + puSrc2->ai8[5]);
     8540    puDst->au8[6]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[6]  + puSrc2->ai8[6]);
     8541    puDst->au8[7]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[7]  + puSrc2->ai8[7]);
     8542    puDst->au8[8]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[8]  + puSrc2->ai8[8]);
     8543    puDst->au8[9]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[9]  + puSrc2->ai8[9]);
     8544    puDst->au8[10] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[10] + puSrc2->ai8[10]);
     8545    puDst->au8[11] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[11] + puSrc2->ai8[11]);
     8546    puDst->au8[12] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[12] + puSrc2->ai8[12]);
     8547    puDst->au8[13] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[13] + puSrc2->ai8[13]);
     8548    puDst->au8[14] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[14] + puSrc2->ai8[14]);
     8549    puDst->au8[15] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[15] + puSrc2->ai8[15]);
     8550}
     8551
     8552IEM_DECL_IMPL_DEF(void, iemAImpl_vpaddsb_u256_fallback,(PRTUINT256U puDst,
     8553                                                        PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     8554{
     8555    puDst->au8[0]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[0]  + puSrc2->ai8[0]);
     8556    puDst->au8[1]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[1]  + puSrc2->ai8[1]);
     8557    puDst->au8[2]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[2]  + puSrc2->ai8[2]);
     8558    puDst->au8[3]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[3]  + puSrc2->ai8[3]);
     8559    puDst->au8[4]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[4]  + puSrc2->ai8[4]);
     8560    puDst->au8[5]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[5]  + puSrc2->ai8[5]);
     8561    puDst->au8[6]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[6]  + puSrc2->ai8[6]);
     8562    puDst->au8[7]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[7]  + puSrc2->ai8[7]);
     8563    puDst->au8[8]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[8]  + puSrc2->ai8[8]);
     8564    puDst->au8[9]  = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[9]  + puSrc2->ai8[9]);
     8565    puDst->au8[10] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[10] + puSrc2->ai8[10]);
     8566    puDst->au8[11] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[11] + puSrc2->ai8[11]);
     8567    puDst->au8[12] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[12] + puSrc2->ai8[12]);
     8568    puDst->au8[13] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[13] + puSrc2->ai8[13]);
     8569    puDst->au8[14] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[14] + puSrc2->ai8[14]);
     8570    puDst->au8[15] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[15] + puSrc2->ai8[15]);
     8571    puDst->au8[16] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[16] + puSrc2->ai8[16]);
     8572    puDst->au8[17] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[17] + puSrc2->ai8[17]);
     8573    puDst->au8[18] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[18] + puSrc2->ai8[18]);
     8574    puDst->au8[19] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[19] + puSrc2->ai8[19]);
     8575    puDst->au8[20] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[20] + puSrc2->ai8[20]);
     8576    puDst->au8[21] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[21] + puSrc2->ai8[21]);
     8577    puDst->au8[22] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[22] + puSrc2->ai8[22]);
     8578    puDst->au8[23] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[23] + puSrc2->ai8[23]);
     8579    puDst->au8[24] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[24] + puSrc2->ai8[24]);
     8580    puDst->au8[25] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[25] + puSrc2->ai8[25]);
     8581    puDst->au8[26] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[26] + puSrc2->ai8[26]);
     8582    puDst->au8[27] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[27] + puSrc2->ai8[27]);
     8583    puDst->au8[28] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[28] + puSrc2->ai8[28]);
     8584    puDst->au8[29] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[29] + puSrc2->ai8[29]);
     8585    puDst->au8[30] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[30] + puSrc2->ai8[30]);
     8586    puDst->au8[31] = SATURATED_SIGNED_WORD_TO_SIGNED_BYTE(puSrc1->ai8[31] + puSrc2->ai8[31]);
     8587}
     8588
    85318589
    85328590/*
    8533  * PADDSB / VPADDSB
     8591 * PADDUSB / VPADDUSB
    85348592 */
    85358593#define SATURATED_UNSIGNED_WORD_TO_UNSIGNED_BYTE(a_uWord) \
     
    87538811
    87548812#endif
     8813
     8814IEM_DECL_IMPL_DEF(void, iemAImpl_vpaddsw_u128_fallback,(PRTUINT128U puDst,
     8815                                                        PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     8816{
     8817    puDst->au16[0] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[0] + puSrc2->ai16[0]);
     8818    puDst->au16[1] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[1] + puSrc2->ai16[1]);
     8819    puDst->au16[2] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[2] + puSrc2->ai16[2]);
     8820    puDst->au16[3] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[3] + puSrc2->ai16[3]);
     8821    puDst->au16[4] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[4] + puSrc2->ai16[4]);
     8822    puDst->au16[5] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[5] + puSrc2->ai16[5]);
     8823    puDst->au16[6] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[6] + puSrc2->ai16[6]);
     8824    puDst->au16[7] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[7] + puSrc2->ai16[7]);
     8825}
     8826
     8827IEM_DECL_IMPL_DEF(void, iemAImpl_vpaddsw_u256_fallback,(PRTUINT256U puDst,
     8828                                                        PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     8829{
     8830    puDst->au16[0]  = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[0]  + puSrc2->ai16[0]);
     8831    puDst->au16[1]  = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[1]  + puSrc2->ai16[1]);
     8832    puDst->au16[2]  = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[2]  + puSrc2->ai16[2]);
     8833    puDst->au16[3]  = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[3]  + puSrc2->ai16[3]);
     8834    puDst->au16[4]  = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[4]  + puSrc2->ai16[4]);
     8835    puDst->au16[5]  = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[5]  + puSrc2->ai16[5]);
     8836    puDst->au16[6]  = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[6]  + puSrc2->ai16[6]);
     8837    puDst->au16[7]  = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[7]  + puSrc2->ai16[7]);
     8838    puDst->au16[8]  = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[8]  + puSrc2->ai16[8]);
     8839    puDst->au16[9]  = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[9]  + puSrc2->ai16[9]);
     8840    puDst->au16[10] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[10] + puSrc2->ai16[10]);
     8841    puDst->au16[11] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[11] + puSrc2->ai16[11]);
     8842    puDst->au16[12] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[12] + puSrc2->ai16[12]);
     8843    puDst->au16[13] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[13] + puSrc2->ai16[13]);
     8844    puDst->au16[14] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[14] + puSrc2->ai16[14]);
     8845    puDst->au16[15] = SATURATED_SIGNED_DWORD_TO_SIGNED_WORD(puSrc1->ai16[15] + puSrc2->ai16[15]);
     8846}
    87558847
    87568848
     
    91399231
    91409232/*
    9141  * PADDSB / VPADDSB
     9233 * PSUBUSB / VPSUBUSW
    91429234 */
    91439235#define SATURATED_UNSIGNED_WORD_TO_UNSIGNED_BYTE_SUB(a_uWord) \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r100599 r100602  
    51335133
    51345134/*  Opcode VEX.0F 0xec - invalid */
     5135
     5136
    51355137/** Opcode VEX.66.0F 0xec - vpaddsb Vx, Hx, Wx */
    5136 FNIEMOP_STUB(iemOp_vpaddsb_Vx_Hx_Wx);
     5138FNIEMOP_DEF(iemOp_vpaddsb_Vx_Hx_Wx)
     5139{
     5140    IEMOP_MNEMONIC3(VEX_RVM, VPADDSB, vpaddsb, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0);
     5141    IEMOPMEDIAOPTF3_INIT_VARS(vpaddsb);
     5142    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     5143}
     5144
     5145
    51375146/*  Opcode VEX.F3.0F 0xec - invalid */
    51385147/*  Opcode VEX.F2.0F 0xec - invalid */
    51395148
    51405149/*  Opcode VEX.0F 0xed - invalid */
     5150
     5151
    51415152/** Opcode VEX.66.0F 0xed - vpaddsw Vx, Hx, Wx */
    5142 FNIEMOP_STUB(iemOp_vpaddsw_Vx_Hx_Wx);
     5153FNIEMOP_DEF(iemOp_vpaddsw_Vx_Hx_Wx)
     5154{
     5155    IEMOP_MNEMONIC3(VEX_RVM, VPADDSW, vpaddsw, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0);
     5156    IEMOPMEDIAOPTF3_INIT_VARS(vpaddsw);
     5157    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     5158}
     5159
     5160
    51435161/*  Opcode VEX.F3.0F 0xed - invalid */
    51445162/*  Opcode VEX.F2.0F 0xed - invalid */
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