Changeset 98821 in vbox
- Timestamp:
- Mar 2, 2023 3:00:34 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 156141
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r98781 r98821 5305 5305 %rep 256 5306 5306 .imm %+ bImm: 5307 db 0x48 ; Use the REX.W prefix to make pcmpestr{i,m} use full RAX/RDX (would use EAX/EDX only otherwise.) 5307 5308 pcmpestri xmm0, xmm1, bImm 5308 5309 ret 5309 int35310 5310 %assign bImm bImm + 1 5311 5311 %endrep … … 5364 5364 IEMIMPL_SSE_PROLOGUE 5365 5365 5366 push xAX5367 push xDX5368 5366 movdqu xmm1, [A2 + IEMPCMPESTRXSRC.uSrc1] 5369 5367 movdqu xmm2, [A2 + IEMPCMPESTRXSRC.uSrc2] 5370 mov xAX, [A2 + IEMPCMPESTRXSRC.u64Rax]5371 mov xDX, [A2 + IEMPCMPESTRXSRC.u64Rdx]5372 5368 lea T1, [.imm0 xWrtRIP] 5373 5369 lea T0, [A3 + A3*3] ; sizeof(insnX+ret) == 8: (A3 * 4) * 2 5374 5370 lea T1, [T1 + T0*2] 5371 push xDX ; xDX can be A1 or A2 depending on the calling convention 5372 mov xAX, [A2 + IEMPCMPESTRXSRC.u64Rax] ; T0 is rax, so only overwrite it after we're done using it 5373 mov xDX, [A2 + IEMPCMPESTRXSRC.u64Rdx] 5375 5374 call T1 5376 5375 5376 pop xDX 5377 5377 IEM_SAVE_FLAGS A1, X86_EFL_STATUS_BITS, 0 5378 5378 movdqu [A0], xmm0 5379 pop xDX5380 pop xAX5381 5379 5382 5380 IEMIMPL_SSE_EPILOGUE … … 5385 5383 %rep 256 5386 5384 .imm %+ bImm: 5385 db 0x48 ; Use the REX.W prefix to make pcmpestr{i,m} use full RAX/RDX (would use EAX/EDX only otherwise.) 5387 5386 pcmpestrm xmm1, xmm2, bImm 5388 5387 ret 5389 int35390 5388 %assign bImm bImm + 1 5391 5389 %endrep -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r98812 r98821 16487 16487 case 3: \ 16488 16488 afCmpRes[idxSrc2][idxSrc1] = (a_puSrc1)->a_SrcMember[idxSrc1] == (a_puSrc2)->a_SrcMember[idxSrc2]; \ 16489 afCmpRes[idxSrc2][idxSrc1 + 1] = (a_puSrc1)->a_SrcMember[idxSrc1 + 1] == (a_puSrc2)->a_SrcMember[idxSrc2 + 1]; \16489 afCmpRes[idxSrc2][idxSrc1 + 1] = (a_puSrc1)->a_SrcMember[idxSrc1 + 1] == (a_puSrc2)->a_SrcMember[idxSrc2]; \ 16490 16490 break; \ 16491 16491 case 1: \ 16492 afCmpRes[idxSrc2][idxSrc1] = (a_puSrc1)->a_SrcMember[idxSrc1] >= (a_puSrc2)->a_SrcMember[idxSrc2]; \16493 afCmpRes[idxSrc2][idxSrc1 + 1] = (a_puSrc1)->a_SrcMember[idxSrc1 + 1] <= (a_puSrc2)->a_SrcMember[idxSrc2 + 1]; \16492 afCmpRes[idxSrc2][idxSrc1] = (a_puSrc1)->a_SrcMember[idxSrc1] <= (a_puSrc2)->a_SrcMember[idxSrc2]; \ 16493 afCmpRes[idxSrc2][idxSrc1 + 1] = (a_puSrc1)->a_SrcMember[idxSrc1 + 1] >= (a_puSrc2)->a_SrcMember[idxSrc2]; \ 16494 16494 break; \ 16495 16495 default: \ … … 16582 16582 } 16583 16583 16584 static uint16_t iemAImpl_pcmpxstrx_cmp_aggregate(bool afCmpRes[16][16], uint8_t idxLen1, uint8_t idxLen2, uint8_t bImm) 16585 { 16586 uint8_t cElems = (bImm & 0x1) ? 8 : 16; 16584 static uint16_t iemAImpl_pcmpxstrx_cmp_aggregate(bool afCmpRes[16][16], uint8_t idxLen1, uint8_t idxLen2, uint8_t cElems, uint8_t bImm) 16585 { 16587 16586 uint8_t bAggOp = (bImm >> 2) & 0x3; 16588 16587 uint16_t u16Result = 0; … … 16646 16645 16647 16646 case 3: /* Equal ordered */ 16648 u16Result = cElems == 8 ? 0xff : 0xffff;16647 u16Result = 0; 16649 16648 for (uint8_t idxSrc2 = 0; idxSrc2 < cElems; idxSrc2++) 16650 16649 { 16651 uint16_t u16Res = 0;16652 for (uint8_t idxSrc1 = 0, k = idxSrc2; (idxSrc1 < cElems - idxSrc2) && (k < cElems); idxSrc1++, k++)16650 uint16_t u16Res = RT_BIT(idxSrc2); 16651 for (uint8_t idxSrc1 = 0, k = idxSrc2; (idxSrc1 < (cElems - idxSrc2)) && (k < cElems); idxSrc1++, k++) 16653 16652 { 16654 if ( iemAImpl_pcmpxstrx_cmp_override_if_invalid(afCmpRes[k][idxSrc1],16655 idxSrc1 < idxLen1,16656 k < idxLen2,16657 bAggOp))16653 if (!iemAImpl_pcmpxstrx_cmp_override_if_invalid(afCmpRes[k][idxSrc1], 16654 idxSrc1 < idxLen1, 16655 k < idxLen2, 16656 bAggOp)) 16658 16657 { 16659 u16Res = RT_BIT(idxSrc2);16658 u16Res = 0; 16660 16659 break; 16661 16660 } 16662 16661 } 16663 16662 16664 u16Result &= ~u16Res;16663 u16Result |= u16Res; 16665 16664 } 16666 16665 break; … … 16678 16677 break; 16679 16678 case 3: 16680 for (uint8_t i = 0; i < cElems; i++) 16681 if (i < idxLen2) 16682 u16Result ^= RT_BIT(i); 16679 u16Result ^= RT_BIT(idxLen2) - 1; 16683 16680 break; 16684 16681 default: … … 16704 16701 } 16705 16702 16706 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistri_u128_fallback,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPISTRXSRC pSrc, uint8_t bEvil)) 16703 DECL_FORCE_INLINE(uint16_t) iemAImpl_pcmpxstrx_worker(uint32_t *pEFlags, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2, 16704 uint8_t cLen1, uint8_t cLen2, uint8_t bEvil) 16707 16705 { 16708 16706 bool afCmpRes[16][16]; 16709 16707 uint8_t cElems = (bEvil & RT_BIT(0)) ? 8 : 16; 16710 iemAImpl_pcmpxstrx_cmp(afCmpRes, &pSrc->uSrc1, &pSrc->uSrc2, bEvil); 16711 uint8_t cLen1 = iemAImpl_pcmpistrx_get_str_len_implicit(&pSrc->uSrc1, bEvil); 16712 uint8_t cLen2 = iemAImpl_pcmpistrx_get_str_len_implicit(&pSrc->uSrc2, bEvil); 16713 16714 uint16_t u16Result = iemAImpl_pcmpxstrx_cmp_aggregate(afCmpRes, cLen1, cLen2, bEvil); 16715 if (bEvil & RT_BIT(6)) 16708 16709 iemAImpl_pcmpxstrx_cmp(afCmpRes, puSrc1, puSrc2, bEvil); 16710 uint16_t u16Result = iemAImpl_pcmpxstrx_cmp_aggregate(afCmpRes, cLen1, cLen2, cElems, bEvil); 16711 iemAImpl_pcmpxstrx_set_eflags(pEFlags, u16Result, cLen1, cLen2, cElems); 16712 16713 return u16Result; 16714 } 16715 16716 DECL_FORCE_INLINE(void) iemAImpl_pcmpxstri_set_result_index(uint32_t *pu32Ecx, uint16_t u16Result, uint8_t cElems, uint8_t bImm) 16717 { 16718 if (bImm & RT_BIT(6)) 16716 16719 { 16717 16720 /* Index for MSB set. */ 16718 16721 uint32_t idxMsb = ASMBitLastSetU16(u16Result); 16719 16722 if (idxMsb) 16720 *pu32Ecx = idxMsb ;16723 *pu32Ecx = idxMsb - 1; 16721 16724 else 16722 16725 *pu32Ecx = cElems; … … 16727 16730 uint32_t idxLsb = ASMBitFirstSetU16(u16Result); 16728 16731 if (idxLsb) 16729 *pu32Ecx = idxLsb ;16732 *pu32Ecx = idxLsb - 1; 16730 16733 else 16731 16734 *pu32Ecx = cElems; 16732 16735 } 16733 16734 iemAImpl_pcmpxstrx_set_eflags(pEFlags, u16Result, cLen1, cLen2, cElems); 16736 } 16737 16738 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistri_u128_fallback,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPISTRXSRC pSrc, uint8_t bEvil)) 16739 { 16740 uint8_t cElems = (bEvil & RT_BIT(0)) ? 8 : 16; 16741 uint8_t cLen1 = iemAImpl_pcmpistrx_get_str_len_implicit(&pSrc->uSrc1, bEvil); 16742 uint8_t cLen2 = iemAImpl_pcmpistrx_get_str_len_implicit(&pSrc->uSrc2, bEvil); 16743 16744 uint16_t u16Result = iemAImpl_pcmpxstrx_worker(pEFlags, &pSrc->uSrc1, &pSrc->uSrc2, cLen1, cLen2, bEvil); 16745 iemAImpl_pcmpxstri_set_result_index(pu32Ecx, u16Result, cElems, bEvil); 16735 16746 } 16736 16747 … … 16741 16752 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpestri_u128_fallback,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPESTRXSRC pSrc, uint8_t bEvil)) 16742 16753 { 16743 bool afCmpRes[16][16];16744 16754 uint8_t cElems = (bEvil & RT_BIT(0)) ? 8 : 16; 16745 iemAImpl_pcmpxstrx_cmp(afCmpRes, &pSrc->uSrc1, &pSrc->uSrc2, bEvil);16746 16755 uint8_t cLen1 = iemAImpl_pcmpistrx_get_str_len_explicit((int64_t)pSrc->u64Rax, bEvil); 16747 16756 uint8_t cLen2 = iemAImpl_pcmpistrx_get_str_len_explicit((int64_t)pSrc->u64Rdx, bEvil); 16748 16757 16749 uint16_t u16Result = iemAImpl_pcmpxstrx_cmp_aggregate(afCmpRes, cLen1, cLen2, bEvil); 16750 if (bEvil & RT_BIT(6)) 16751 { 16752 /* Index for MSB set. */ 16753 uint32_t idxMsb = ASMBitLastSetU16(u16Result); 16754 if (idxMsb) 16755 *pu32Ecx = idxMsb; 16756 else 16757 *pu32Ecx = cElems; 16758 } 16759 else 16760 { 16761 /* Index for LSB set. */ 16762 uint32_t idxLsb = ASMBitFirstSetU16(u16Result); 16763 if (idxLsb) 16764 *pu32Ecx = idxLsb; 16765 else 16766 *pu32Ecx = cElems; 16767 } 16768 16769 iemAImpl_pcmpxstrx_set_eflags(pEFlags, u16Result, cLen1, cLen2, cElems); 16758 uint16_t u16Result = iemAImpl_pcmpxstrx_worker(pEFlags, &pSrc->uSrc1, &pSrc->uSrc2, cLen1, cLen2, bEvil); 16759 iemAImpl_pcmpxstri_set_result_index(pu32Ecx, u16Result, cElems, bEvil); 16770 16760 } 16771 16761 … … 16774 16764 * [V]PCMPISTRM 16775 16765 */ 16776 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistrm_u128_fallback,(PRTUINT128U puDst, uint32_t *pEFlags, PCIEMPCMPISTRXSRC pSrc, uint8_t bEvil)) 16777 { 16778 bool afCmpRes[16][16]; 16779 uint8_t cElems = (bEvil & RT_BIT(0)) ? 8 : 16; 16780 iemAImpl_pcmpxstrx_cmp(afCmpRes, &pSrc->uSrc1, &pSrc->uSrc2, bEvil); 16781 uint8_t cLen1 = iemAImpl_pcmpistrx_get_str_len_implicit(&pSrc->uSrc1, bEvil); 16782 uint8_t cLen2 = iemAImpl_pcmpistrx_get_str_len_implicit(&pSrc->uSrc2, bEvil); 16783 16784 uint16_t u16Result = iemAImpl_pcmpxstrx_cmp_aggregate(afCmpRes, cLen1, cLen2, bEvil); 16785 if (bEvil & RT_BIT(6)) 16766 DECL_FORCE_INLINE(void) iemAImpl_pcmpxstrm_set_result_mask(PRTUINT128U puDst, uint16_t u16Result, uint8_t cElems, uint8_t bImm) 16767 { 16768 if (bImm & RT_BIT(6)) 16786 16769 { 16787 16770 /* Generate a mask. */ … … 16809 16792 puDst->au64[1] = 0; 16810 16793 } 16811 16812 iemAImpl_pcmpxstrx_set_eflags(pEFlags, u16Result, cLen1, cLen2, cElems); 16794 } 16795 16796 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistrm_u128_fallback,(PRTUINT128U puDst, uint32_t *pEFlags, PCIEMPCMPISTRXSRC pSrc, uint8_t bEvil)) 16797 { 16798 uint8_t cElems = (bEvil & RT_BIT(0)) ? 8 : 16; 16799 uint8_t cLen1 = iemAImpl_pcmpistrx_get_str_len_implicit(&pSrc->uSrc1, bEvil); 16800 uint8_t cLen2 = iemAImpl_pcmpistrx_get_str_len_implicit(&pSrc->uSrc2, bEvil); 16801 16802 uint16_t u16Result = iemAImpl_pcmpxstrx_worker(pEFlags, &pSrc->uSrc1, &pSrc->uSrc2, cLen1, cLen2, bEvil); 16803 iemAImpl_pcmpxstrm_set_result_mask(puDst, u16Result, cElems, bEvil); 16813 16804 } 16814 16805 … … 16819 16810 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpestrm_u128_fallback,(PRTUINT128U puDst, uint32_t *pEFlags, PCIEMPCMPESTRXSRC pSrc, uint8_t bEvil)) 16820 16811 { 16821 bool afCmpRes[16][16];16822 16812 uint8_t cElems = (bEvil & RT_BIT(0)) ? 8 : 16; 16823 iemAImpl_pcmpxstrx_cmp(afCmpRes, &pSrc->uSrc1, &pSrc->uSrc2, bEvil);16824 16813 uint8_t cLen1 = iemAImpl_pcmpistrx_get_str_len_explicit((int64_t)pSrc->u64Rax, bEvil); 16825 16814 uint8_t cLen2 = iemAImpl_pcmpistrx_get_str_len_explicit((int64_t)pSrc->u64Rdx, bEvil); 16826 16815 16827 uint16_t u16Result = iemAImpl_pcmpxstrx_cmp_aggregate(afCmpRes, cLen1, cLen2, bEvil); 16828 if (bEvil & RT_BIT(6)) 16829 { 16830 /* Generate a mask. */ 16831 if (cElems == 8) 16832 { 16833 for (uint8_t i = 0; i < RT_ELEMENTS(puDst->au16); i++) 16834 if (u16Result & RT_BIT(i)) 16835 puDst->au16[i] = 0xffff; 16836 else 16837 puDst->au16[i] = 0; 16838 } 16839 else 16840 { 16841 for (uint8_t i = 0; i < RT_ELEMENTS(puDst->au8); i++) 16842 if (u16Result & RT_BIT(i)) 16843 puDst->au8[i] = 0xff; 16844 else 16845 puDst->au8[i] = 0; 16846 } 16847 } 16848 else 16849 { 16850 /* Store the result. */ 16851 puDst->au64[0] = u16Result; 16852 puDst->au64[1] = 0; 16853 } 16854 16855 iemAImpl_pcmpxstrx_set_eflags(pEFlags, u16Result, cLen1, cLen2, cElems); 16816 uint16_t u16Result = iemAImpl_pcmpxstrx_worker(pEFlags, &pSrc->uSrc1, &pSrc->uSrc2, cLen1, cLen2, bEvil); 16817 iemAImpl_pcmpxstrm_set_result_mask(puDst, u16Result, cElems, bEvil); 16856 16818 } 16857 16819 -
trunk/src/VBox/VMM/include/IEMInternal.h
r98797 r98821 2405 2405 typedef const IEMPCMPESTRXSRC *PCIEMPCMPESTRXSRC; 2406 2406 2407 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistri_u128,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPISTRXSRC pSrc, uint8_t bEvil)); 2408 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistri_u128_fallback,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPISTRXSRC pSrc, uint8_t bEvil)); 2409 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpestri_u128,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPESTRXSRC pSrc, uint8_t bEvil)); 2410 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpestri_u128_fallback,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPESTRXSRC pSrc, uint8_t bEvil)); 2411 2412 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistrm_u128,(PRTUINT128U puDst, uint32_t *pEFlags, PCIEMPCMPISTRXSRC pSrc, uint8_t bEvil)); 2413 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpistrm_u128_fallback,(PRTUINT128U puDst, uint32_t *pEFlags, PCIEMPCMPISTRXSRC pSrc, uint8_t bEvil)); 2414 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpestrm_u128,(PRTUINT128U puDst, uint32_t *pEFlags, PCIEMPCMPESTRXSRC pSrc, uint8_t bEvil)); 2415 IEM_DECL_IMPL_DEF(void, iemAImpl_pcmpestrm_u128_fallback,(PRTUINT128U puDst, uint32_t *pEFlags, PCIEMPCMPESTRXSRC pSrc, uint8_t bEvil)); 2407 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLPCMPISTRIU128IMM8,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPISTRXSRC pSrc, uint8_t bEvil)); 2408 typedef FNIEMAIMPLPCMPISTRIU128IMM8 *PFNIEMAIMPLPCMPISTRIU128IMM8; 2409 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLPCMPESTRIU128IMM8,(uint32_t *pu32Ecx, uint32_t *pEFlags, PCIEMPCMPESTRXSRC pSrc, uint8_t bEvil)); 2410 typedef FNIEMAIMPLPCMPESTRIU128IMM8 *PFNIEMAIMPLPCMPESTRIU128IMM8; 2411 2412 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLPCMPISTRMU128IMM8,(PRTUINT128U puDst, uint32_t *pEFlags, PCIEMPCMPISTRXSRC pSrc, uint8_t bEvil)); 2413 typedef FNIEMAIMPLPCMPISTRMU128IMM8 *PFNIEMAIMPLPCMPISTRMU128IMM8; 2414 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLPCMPESTRMU128IMM8,(PRTUINT128U puDst, uint32_t *pEFlags, PCIEMPCMPESTRXSRC pSrc, uint8_t bEvil)); 2415 typedef FNIEMAIMPLPCMPESTRMU128IMM8 *PFNIEMAIMPLPCMPESTRMU128IMM8; 2416 2417 FNIEMAIMPLPCMPISTRIU128IMM8 iemAImpl_pcmpistri_u128, iemAImpl_pcmpistri_u128_fallback; 2418 FNIEMAIMPLPCMPESTRIU128IMM8 iemAImpl_pcmpestri_u128, iemAImpl_pcmpestri_u128_fallback; 2419 FNIEMAIMPLPCMPISTRMU128IMM8 iemAImpl_pcmpistrm_u128, iemAImpl_pcmpistrm_u128_fallback; 2420 FNIEMAIMPLPCMPESTRMU128IMM8 iemAImpl_pcmpestrm_u128, iemAImpl_pcmpestrm_u128_fallback; 2416 2421 2417 2422 FNIEMAIMPLMEDIAOPTF2U128IMM8 iemAImpl_pclmulqdq_u128, iemAImpl_pclmulqdq_u128_fallback;
Note:
See TracChangeset
for help on using the changeset viewer.