VirtualBox

Changeset 105275 in vbox


Ignore:
Timestamp:
Jul 11, 2024 4:56:45 PM (7 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
163927
Message:

VMM/IEM: Implement testcase for vpcmpestrm, vpcmpestri, vpcmpistrm, vpcmpistri, bugref:9898

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

Legend:

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

    r105274 r105275  
    59695969
    59705970;;
    5971 ; The pcmpistri instruction.
     5971; The pcmpistri/vcmpistri instruction.
     5972;
     5973; @param    1       The instruction name
    59725974;
    59735975; @return   R0_32   The new ECX value.
     
    59775979; @param    A3      The 8-bit immediate
    59785980;
    5979 BEGINPROC_FASTCALL iemAImpl_pcmpistri_u128, 16
     5981%macro IEMIMPL_MEDIA_V_CMPISTRI 1
     5982BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16
    59805983        PROLOGUE_4_ARGS
    59815984        IEMIMPL_SSE_PROLOGUE
     
    59965999.imm %+ bImm:
    59976000        IBT_ENDBRxx_WITHOUT_NOTRACK
    5998         pcmpistri xmm0, xmm1, bImm
     6001        %1 xmm0, xmm1, bImm
    59996002        ret
    60006003        int3
     
    60026005 %endrep
    60036006.immEnd:
    6004 ENDPROC iemAImpl_pcmpistri_u128
     6007ENDPROC iemAImpl_ %+ %1 %+ _u128
     6008%endmacro
     6009
     6010IEMIMPL_MEDIA_V_CMPISTRI pcmpistri
     6011IEMIMPL_MEDIA_V_CMPISTRI vpcmpistri
     6012
    60056013
    60066014;;
    60076015; The pcmpestri instruction.
     6016;
     6017; @param    1       The instruction name
    60086018;
    60096019; @param    A0      Pointer to the ECX register to store the result to (output).
     
    60456055ENDPROC iemAImpl_pcmpestri_u128
    60466056
    6047 ;;
    6048 ; The pcmpistrm instruction template.
    6049 ;
    6050 ; @param    A0      Pointer to the XMM0 register to store the result to (output).
     6057
     6058;;
     6059; The vpcmpestri instruction.
     6060;
     6061; @param    1       The instruction name
     6062;
     6063; @param    A0      Pointer to the ECX register to store the result to (output).
    60516064; @param    A1      Pointer to the EFLAGS register.
    60526065; @param    A2      Pointer to the structure containing the source operands (input).
    60536066; @param    A3      The 8-bit immediate
    60546067;
    6055 BEGINPROC_FASTCALL iemAImpl_pcmpistrm_u128, 16
     6068BEGINPROC_FASTCALL iemAImpl_vpcmpestri_u128, 16
    60566069        PROLOGUE_4_ARGS
    60576070        IEMIMPL_SSE_PROLOGUE
    60586071
    60596072        movzx   A3, A3_8                ; must clear top bits
    6060         movdqu  xmm1, [A2 + IEMPCMPISTRXSRC.uSrc1]
    6061         movdqu  xmm2, [A2 + IEMPCMPISTRXSRC.uSrc2]
    6062         IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8
    6063 
     6073        movdqu  xmm0, [A2 + IEMPCMPESTRXSRC.uSrc1]
     6074        movdqu  xmm1, [A2 + IEMPCMPESTRXSRC.uSrc2]
     6075        mov     T2, A0                  ; A0 can be ecx/rcx in some calling conventions which gets overwritten later (T2 only available on AMD64)
     6076        IEMIMPL_JUMP_TABLE_TARGET T1, A3, 8
     6077        push    xDX                                 ; xDX can be A1 or A2 depending on the calling convention
     6078        mov     xAX, [A2 + IEMPCMPESTRXSRC.u64Rax]  ; T0 is rax, so only overwrite it after we're done using it
     6079        mov     xDX, [A2 + IEMPCMPESTRXSRC.u64Rdx]
     6080        IBT_NOTRACK
     6081        call    T1
     6082
     6083        pop     xDX
    60646084        IEM_SAVE_FLAGS_OLD A1, X86_EFL_CF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF, 0, X86_EFL_AF | X86_EFL_PF
    6065         movdqu  [A0], xmm0
     6085        mov    [T2], ecx
    60666086
    60676087        IEMIMPL_SSE_EPILOGUE
     
    60716091.imm %+ bImm:
    60726092        IBT_ENDBRxx_WITHOUT_NOTRACK
    6073         pcmpistrm xmm1, xmm2, bImm
     6093        db 0xc4, 0xe3, 0xf9, 0x61, 0xc1, bImm ; vpcmpestri xmm0,xmm1,0x1 with VEX.W set
    60746094        ret
    60756095        int3
     
    60776097 %endrep
    60786098.immEnd:
    6079 ENDPROC iemAImpl_pcmpistrm_u128
    6080 
    6081 ;;
    6082 ; The pcmpestrm instruction template.
     6099ENDPROC iemAImpl_vpcmpestri_u128
     6100
     6101
     6102;;
     6103; The pcmpistrm/vpcmpistrm instruction template.
     6104;
     6105; @param    1       The instruction name
     6106;
     6107; @param    A0      Pointer to the XMM0 register to store the result to (output).
     6108; @param    A1      Pointer to the EFLAGS register.
     6109; @param    A2      Pointer to the structure containing the source operands (input).
     6110; @param    A3      The 8-bit immediate
     6111;
     6112%macro IEMIMPL_MEDIA_V_CMPISTRM 1
     6113BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16
     6114        PROLOGUE_4_ARGS
     6115        IEMIMPL_SSE_PROLOGUE
     6116
     6117        movzx   A3, A3_8                ; must clear top bits
     6118        movdqu  xmm1, [A2 + IEMPCMPISTRXSRC.uSrc1]
     6119        movdqu  xmm2, [A2 + IEMPCMPISTRXSRC.uSrc2]
     6120        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8
     6121
     6122        IEM_SAVE_FLAGS_OLD A1, X86_EFL_CF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF, 0, X86_EFL_AF | X86_EFL_PF
     6123        movdqu  [A0], xmm0
     6124
     6125        IEMIMPL_SSE_EPILOGUE
     6126        EPILOGUE_4_ARGS
     6127 %assign bImm 0
     6128 %rep 256
     6129.imm %+ bImm:
     6130        IBT_ENDBRxx_WITHOUT_NOTRACK
     6131        %1 xmm1, xmm2, bImm
     6132        ret
     6133        int3
     6134  %assign bImm bImm + 1
     6135 %endrep
     6136.immEnd:
     6137ENDPROC iemAImpl_ %+ %1 %+ _u128
     6138%endmacro
     6139
     6140IEMIMPL_MEDIA_V_CMPISTRM pcmpistrm
     6141IEMIMPL_MEDIA_V_CMPISTRM vpcmpistrm
     6142
     6143
     6144;;
     6145; The pcmpestrm instruction.
    60836146;
    60846147; @param    A0      Pointer to the XMM0 register to store the result to (output).
     
    61216184
    61226185;;
     6186; The vpcmpestrm instruction.
     6187;
     6188; @param    A0      Pointer to the XMM0 register to store the result to (output).
     6189; @param    A1      Pointer to the EFLAGS register.
     6190; @param    A2      Pointer to the structure containing the source operands (input).
     6191; @param    A3      The 8-bit immediate
     6192;
     6193BEGINPROC_FASTCALL iemAImpl_vpcmpestrm_u128, 16
     6194        PROLOGUE_4_ARGS
     6195        IEMIMPL_SSE_PROLOGUE
     6196
     6197        movzx   A3, A3_8                ; must clear top bits
     6198        movdqu  xmm1, [A2 + IEMPCMPESTRXSRC.uSrc1]
     6199        movdqu  xmm2, [A2 + IEMPCMPESTRXSRC.uSrc2]
     6200        IEMIMPL_JUMP_TABLE_TARGET T1, A3, 8
     6201        push    xDX                                 ; xDX can be A1 or A2 depending on the calling convention
     6202        mov     xAX, [A2 + IEMPCMPESTRXSRC.u64Rax]  ; T0 is rax, so only overwrite it after we're done using it
     6203        mov     xDX, [A2 + IEMPCMPESTRXSRC.u64Rdx]
     6204        IBT_NOTRACK
     6205        call    T1
     6206
     6207        pop     xDX
     6208        IEM_SAVE_FLAGS_OLD A1, X86_EFL_CF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF, 0, X86_EFL_AF | X86_EFL_PF
     6209        movdqu  [A0], xmm0
     6210
     6211        IEMIMPL_SSE_EPILOGUE
     6212        EPILOGUE_4_ARGS
     6213 %assign bImm 0
     6214 %rep 256
     6215.imm %+ bImm:
     6216        IBT_ENDBRxx_WITHOUT_NOTRACK
     6217        db 0xc4, 0xe3, 0xf9, 0x60, 0xca, bImm ; vpcmpestrm xmm1, xmm2, bImm with VEX.W set
     6218        ret
     6219        int3
     6220  %assign bImm bImm + 1
     6221 %endrep
     6222.immEnd:
     6223ENDPROC iemAImpl_vpcmpestrm_u128
     6224
     6225
     6226;;
    61236227; movmskp{s,d} SSE instruction template
    61246228;
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r105274 r105275  
    1869818698
    1869918699
     18700IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vpcmpistri_u128_fallback,(uint32_t *pEFlags, PCRTUINT128U pSrc1, PCRTUINT128U pSrc2, uint8_t bEvil))
     18701{
     18702    return iemAImpl_pcmpistri_u128_fallback(pEFlags, pSrc1, pSrc2, bEvil);
     18703}
     18704
     18705
    1870018706/**
    1870118707 * [V]PCMPESTRI
     
    1870918715    uint16_t u16Result = iemAImpl_pcmpxstrx_worker(pEFlags, &pSrc->uSrc1, &pSrc->uSrc2, cLen1, cLen2, bEvil);
    1871018716    *pu32Ecx = iemAImpl_pcmpxstri_set_result_index(u16Result, cElems, bEvil);
     18717}
     18718
     18719
     18720IEM_DECL_IMPL_DEF(void, iemAImpl_vpcmpestri_u128_fallback,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPESTRXSRC pSrc, uint8_t bEvil))
     18721{
     18722    iemAImpl_pcmpestri_u128_fallback(pu32Ecx, pEFlags, pSrc, bEvil);
    1871118723}
    1871218724
     
    1875618768
    1875718769
     18770IEM_DECL_IMPL_DEF(void, iemAImpl_vpcmpistrm_u128_fallback,(PRTUINT128U puDst, uint32_t *pEFlags, PCIEMPCMPISTRXSRC pSrc, uint8_t bEvil))
     18771{
     18772    iemAImpl_pcmpistrm_u128_fallback(puDst, pEFlags, pSrc, bEvil);
     18773}
     18774
     18775
    1875818776/**
    1875918777 * [V]PCMPESTRM
     
    1876718785    uint16_t u16Result = iemAImpl_pcmpxstrx_worker(pEFlags, &pSrc->uSrc1, &pSrc->uSrc2, cLen1, cLen2, bEvil);
    1876818786    iemAImpl_pcmpxstrm_set_result_mask(puDst, u16Result, cElems, bEvil);
     18787}
     18788
     18789
     18790IEM_DECL_IMPL_DEF(void, iemAImpl_vpcmpestrm_u128_fallback,(PRTUINT128U puDst, uint32_t *pEFlags, PCIEMPCMPESTRXSRC pSrc, uint8_t bEvil))
     18791{
     18792    iemAImpl_pcmpestrm_u128_fallback(puDst, pEFlags, pSrc, bEvil);
    1876918793}
    1877018794
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r105274 r105275  
    40064006typedef FNIEMAIMPLPCMPESTRMU128IMM8 *PFNIEMAIMPLPCMPESTRMU128IMM8;
    40074007
    4008 FNIEMAIMPLPCMPISTRIU128IMM8 iemAImpl_pcmpistri_u128, iemAImpl_pcmpistri_u128_fallback;
    4009 FNIEMAIMPLPCMPESTRIU128IMM8 iemAImpl_pcmpestri_u128, iemAImpl_pcmpestri_u128_fallback;
    4010 FNIEMAIMPLPCMPISTRMU128IMM8 iemAImpl_pcmpistrm_u128, iemAImpl_pcmpistrm_u128_fallback;
    4011 FNIEMAIMPLPCMPESTRMU128IMM8 iemAImpl_pcmpestrm_u128, iemAImpl_pcmpestrm_u128_fallback;
     4008FNIEMAIMPLPCMPISTRIU128IMM8 iemAImpl_pcmpistri_u128,  iemAImpl_pcmpistri_u128_fallback;
     4009FNIEMAIMPLPCMPESTRIU128IMM8 iemAImpl_pcmpestri_u128,  iemAImpl_pcmpestri_u128_fallback;
     4010FNIEMAIMPLPCMPISTRMU128IMM8 iemAImpl_pcmpistrm_u128,  iemAImpl_pcmpistrm_u128_fallback;
     4011FNIEMAIMPLPCMPESTRMU128IMM8 iemAImpl_pcmpestrm_u128,  iemAImpl_pcmpestrm_u128_fallback;
     4012FNIEMAIMPLPCMPISTRIU128IMM8 iemAImpl_vpcmpistri_u128, iemAImpl_vpcmpistri_u128_fallback;
     4013FNIEMAIMPLPCMPESTRIU128IMM8 iemAImpl_vpcmpestri_u128, iemAImpl_vpcmpestri_u128_fallback;
     4014FNIEMAIMPLPCMPISTRMU128IMM8 iemAImpl_vpcmpistrm_u128, iemAImpl_vpcmpistrm_u128_fallback;
     4015FNIEMAIMPLPCMPESTRMU128IMM8 iemAImpl_vpcmpestrm_u128, iemAImpl_vpcmpestrm_u128_fallback;
     4016
    40124017
    40134018FNIEMAIMPLMEDIAOPTF2U128IMM8 iemAImpl_pclmulqdq_u128, iemAImpl_pclmulqdq_u128_fallback;
  • trunk/src/VBox/VMM/testcase/tstIEMAImpl.cpp

    r105274 r105275  
    94619461{
    94629462    ENTRY_BIN_SSE_OPT(pcmpistri_u128),
     9463    ENTRY_BIN_SSE_OPT(vpcmpistri_u128),
    94639464};
    94649465
     
    95639564{
    95649565    ENTRY_BIN_SSE_OPT(pcmpistrm_u128),
     9566    ENTRY_BIN_SSE_OPT(vpcmpistrm_u128),
    95659567};
    95669568
     
    96809682{
    96819683    ENTRY_BIN_SSE_OPT(pcmpestri_u128),
     9684    ENTRY_BIN_SSE_OPT(vpcmpestri_u128),
    96829685};
    96839686
     
    98089811{
    98099812    ENTRY_BIN_SSE_OPT(pcmpestrm_u128),
     9813    ENTRY_BIN_SSE_OPT(vpcmpestrm_u128),
    98109814};
    98119815
  • trunk/src/VBox/VMM/testcase/tstIEMAImpl.h

    r105274 r105275  
    10271027
    10281028TSTIEM_DECLARE_TEST_ARRAY_BIN(SsePcmpxstrx, SSE_PCMPISTRI_TEST_T,           pcmpistri_u128       );
     1029TSTIEM_DECLARE_TEST_ARRAY_BIN(SsePcmpxstrx, SSE_PCMPISTRI_TEST_T,           vpcmpistri_u128      );
    10291030TSTIEM_DECLARE_TEST_ARRAY_BIN(SsePcmpxstrx, SSE_PCMPESTRI_TEST_T,           pcmpestri_u128       );
     1031TSTIEM_DECLARE_TEST_ARRAY_BIN(SsePcmpxstrx, SSE_PCMPESTRI_TEST_T,           vpcmpestri_u128      );
    10301032TSTIEM_DECLARE_TEST_ARRAY_BIN(SsePcmpxstrx, SSE_PCMPISTRM_TEST_T,           pcmpistrm_u128       );
     1033TSTIEM_DECLARE_TEST_ARRAY_BIN(SsePcmpxstrx, SSE_PCMPISTRM_TEST_T,           vpcmpistrm_u128      );
    10311034TSTIEM_DECLARE_TEST_ARRAY_BIN(SsePcmpxstrx, SSE_PCMPESTRM_TEST_T,           pcmpestrm_u128       );
     1035TSTIEM_DECLARE_TEST_ARRAY_BIN(SsePcmpxstrx, SSE_PCMPESTRM_TEST_T,           vpcmpestrm_u128      );
    10321036
    10331037RT_C_DECLS_END
  • trunk/src/VBox/VMM/testcase/tstIEMAImplDataSseBinary.S

    r104521 r105275  
    156156IEM_TEST_DATA pcmpestri_u128,    "tstIEMAImplDataSsePcmpxstrx-pcmpestri_u128.bin.gz"
    157157IEM_TEST_DATA pcmpestrm_u128,    "tstIEMAImplDataSsePcmpxstrx-pcmpestrm_u128.bin.gz"
     158
     159IEM_TEST_DATA vpcmpistri_u128,   "tstIEMAImplDataSsePcmpxstrx-vpcmpistri_u128.bin.gz"
     160IEM_TEST_DATA vpcmpistrm_u128,   "tstIEMAImplDataSsePcmpxstrx-vpcmpistrm_u128.bin.gz"
     161IEM_TEST_DATA vpcmpestri_u128,   "tstIEMAImplDataSsePcmpxstrx-vpcmpestri_u128.bin.gz"
     162IEM_TEST_DATA vpcmpestrm_u128,   "tstIEMAImplDataSsePcmpxstrx-vpcmpestrm_u128.bin.gz"
    158163
    159164
  • trunk/src/VBox/VMM/testcase/tstIEMAImplDataSseBinary.asm

    r104521 r105275  
    155155IEM_TEST_DATA pcmpestri_u128,       "tstIEMAImplDataSsePcmpxstrx-pcmpestri_u128.bin.gz"
    156156IEM_TEST_DATA pcmpestrm_u128,       "tstIEMAImplDataSsePcmpxstrx-pcmpestrm_u128.bin.gz"
     157
     158IEM_TEST_DATA vpcmpistri_u128,       "tstIEMAImplDataSsePcmpxstrx-vpcmpistri_u128.bin.gz"
     159IEM_TEST_DATA vpcmpistrm_u128,       "tstIEMAImplDataSsePcmpxstrx-vpcmpistrm_u128.bin.gz"
     160IEM_TEST_DATA vpcmpestri_u128,       "tstIEMAImplDataSsePcmpxstrx-vpcmpestri_u128.bin.gz"
     161IEM_TEST_DATA vpcmpestrm_u128,       "tstIEMAImplDataSsePcmpxstrx-vpcmpestrm_u128.bin.gz"
     162
    157163
    158164;
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