Changeset 96931 in vbox
- Timestamp:
- Sep 29, 2022 9:55:49 AM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 153842
- Location:
- trunk/src/VBox/VMM/testcase
- Files:
-
- 2 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/testcase/Makefile.kmk
r96922 r96931 314 314 tstIEMAImplDataSseConvert-cvttpd2pi_u128.bin \ 315 315 tstIEMAImplDataSseConvert-cvtpi2ps_u128.bin \ 316 tstIEMAImplDataSseConvert-cvtpi2pd_u128.bin 316 tstIEMAImplDataSseConvert-cvtpi2pd_u128.bin \ 317 tstIEMAImplDataSseConvert-cvtps2pi_u128.bin \ 318 tstIEMAImplDataSseConvert-cvttps2pi_u128.bin 317 319 318 320 tstIEMAImpl_TEMPLATE = VBOXR3TSTEXE -
trunk/src/VBox/VMM/testcase/tstIEMAImpl.cpp
r96922 r96931 8560 8560 8561 8561 8562 /* 8563 * Convert SSE operations converting single-precision floating point values to signed double-word values. 8564 */ 8565 TYPEDEF_SUBTEST_TYPE(SSE_CONVERT_MM_I32_XMM_R32_T, SSE_CONVERT_MM_R32_TEST_T, PFNIEMAIMPLMXCSRU64U64); 8566 8567 static const SSE_CONVERT_MM_I32_XMM_R32_T g_aSseConvertMmI32XmmR32[] = 8568 { 8569 ENTRY_BIN(cvtps2pi_u128), 8570 ENTRY_BIN(cvttps2pi_u128) 8571 }; 8572 8573 #ifdef TSTIEMAIMPL_WITH_GENERATOR 8574 static RTEXITCODE SseConvertMmI32XmmR32Generate(const char *pszDataFileFmt, uint32_t cTests) 8575 { 8576 cTests = RT_MAX(192, cTests); /* there are 144 standard input variations */ 8577 8578 static struct { RTFLOAT32U aVal1[2]; } const s_aSpecials[] = 8579 { 8580 { { RTFLOAT32U_INIT_ZERO(0), RTFLOAT32U_INIT_ZERO(0) } }, 8581 { { RTFLOAT32U_INIT_ZERO(1), RTFLOAT32U_INIT_ZERO(1) } }, 8582 { { RTFLOAT32U_INIT_INF(0), RTFLOAT32U_INIT_INF(0) } }, 8583 { { RTFLOAT32U_INIT_INF(1), RTFLOAT32U_INIT_INF(1) } } 8584 /** @todo More specials. */ 8585 }; 8586 8587 uint32_t cMinNormalPairs = (cTests - 144) / 4; 8588 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseConvertMmI32XmmR32); iFn++) 8589 { 8590 PFNIEMAIMPLMXCSRU64U64 const pfn = g_aSseConvertMmI32XmmR32[iFn].pfnNative ? g_aSseConvertMmI32XmmR32[iFn].pfnNative : g_aSseConvertMmI32XmmR32[iFn].pfn; 8591 8592 PRTSTREAM pStrmOut = NULL; 8593 int rc = RTStrmOpenF("wb", &pStrmOut, pszDataFileFmt, g_aSseConvertMmI32XmmR32[iFn].pszName); 8594 if (RT_FAILURE(rc)) 8595 { 8596 RTMsgError("Failed to open data file for %s for writing: %Rrc", g_aSseConvertMmI32XmmR32[iFn].pszName, rc); 8597 return RTEXITCODE_FAILURE; 8598 } 8599 8600 uint32_t cNormalInputPairs = 0; 8601 for (uint32_t iTest = 0; iTest < cTests + RT_ELEMENTS(s_aSpecials); iTest += 1) 8602 { 8603 SSE_CONVERT_MM_R32_TEST_T TestData; RT_ZERO(TestData); 8604 8605 TestData.ar32InVal[0] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].aVal1[0]; 8606 TestData.ar32InVal[1] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].aVal1[1]; 8607 8608 if ( RTFLOAT32U_IS_NORMAL(&TestData.ar32InVal[0]) 8609 && RTFLOAT32U_IS_NORMAL(&TestData.ar32InVal[1])) 8610 cNormalInputPairs++; 8611 else if (cNormalInputPairs < cMinNormalPairs && iTest + cMinNormalPairs >= cTests && iTest < cTests) 8612 { 8613 iTest -= 1; 8614 continue; 8615 } 8616 8617 RTFLOAT64U TestVal; 8618 TestVal.au32[0] = TestData.ar32InVal[0].u; 8619 TestVal.au32[1] = TestData.ar32InVal[1].u; 8620 8621 uint32_t const fMxcsr = RandMxcsr() & X86_MXCSR_XCPT_FLAGS; 8622 for (uint16_t iRounding = 0; iRounding < 4; iRounding++) 8623 for (uint8_t iDaz = 0; iDaz < 2; iDaz++) 8624 for (uint8_t iFz = 0; iFz < 2; iFz++) 8625 { 8626 uint32_t fMxcsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK) 8627 | (iRounding << X86_MXCSR_RC_SHIFT) 8628 | (iDaz ? X86_MXCSR_DAZ : 0) 8629 | (iFz ? X86_MXCSR_FZ : 0) 8630 | X86_MXCSR_XCPT_MASK; 8631 uint32_t fMxcsrM = fMxcsrIn; 8632 uint64_t u64ResM; 8633 pfn(&fMxcsrM, &u64ResM, TestVal.u); 8634 TestData.fMxcsrIn = fMxcsrIn; 8635 TestData.fMxcsrOut = fMxcsrM; 8636 TestData.OutVal.u = u64ResM; 8637 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 8638 8639 fMxcsrIn &= ~X86_MXCSR_XCPT_MASK; 8640 uint32_t fMxcsrU = fMxcsrIn; 8641 uint64_t u64ResU; 8642 pfn(&fMxcsrU, &u64ResU, TestVal.u); 8643 TestData.fMxcsrIn = fMxcsrIn; 8644 TestData.fMxcsrOut = fMxcsrU; 8645 TestData.OutVal.u = u64ResU; 8646 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 8647 8648 uint16_t fXcpt = (fMxcsrM | fMxcsrU) & X86_MXCSR_XCPT_FLAGS; 8649 if (fXcpt) 8650 { 8651 fMxcsrIn = (fMxcsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt; 8652 uint32_t fMxcsr1 = fMxcsrIn; 8653 uint64_t u64Res1; 8654 pfn(&fMxcsr1, &u64Res1, TestVal.u); 8655 TestData.fMxcsrIn = fMxcsrIn; 8656 TestData.fMxcsrOut = fMxcsr1; 8657 TestData.OutVal.u = u64Res1; 8658 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 8659 8660 if (((fMxcsr1 & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (fMxcsr1 & X86_MXCSR_XCPT_FLAGS)) 8661 { 8662 fXcpt |= fMxcsr1 & X86_MXCSR_XCPT_FLAGS; 8663 fMxcsrIn = (fMxcsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT); 8664 uint32_t fMxcsr2 = fMxcsrIn; 8665 uint64_t u64Res2; 8666 pfn(&fMxcsr2, &u64Res2, TestVal.u); 8667 TestData.fMxcsrIn = fMxcsrIn; 8668 TestData.fMxcsrOut = fMxcsr2; 8669 TestData.OutVal.u = u64Res2; 8670 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 8671 } 8672 if (!RT_IS_POWER_OF_TWO(fXcpt)) 8673 for (uint16_t fUnmasked = 1; fUnmasked <= X86_MXCSR_PE; fUnmasked <<= 1) 8674 if (fUnmasked & fXcpt) 8675 { 8676 fMxcsrIn = (fMxcsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT); 8677 uint32_t fMxcsr3 = fMxcsrIn; 8678 uint64_t u64Res3; 8679 pfn(&fMxcsr3, &u64Res3, TestVal.u); 8680 TestData.fMxcsrIn = fMxcsrIn; 8681 TestData.fMxcsrOut = fMxcsr3; 8682 TestData.OutVal.u = u64Res3; 8683 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 8684 } 8685 } 8686 } 8687 } 8688 rc = RTStrmClose(pStrmOut); 8689 if (RT_FAILURE(rc)) 8690 { 8691 RTMsgError("Failed to close data file for %s: %Rrc", g_aSseConvertMmI32XmmR32[iFn].pszName, rc); 8692 return RTEXITCODE_FAILURE; 8693 } 8694 } 8695 8696 return RTEXITCODE_SUCCESS; 8697 } 8698 #endif 8699 8700 static void SseConvertMmI32XmmR32Test(void) 8701 { 8702 X86FXSTATE State; 8703 RT_ZERO(State); 8704 8705 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseConvertMmI32XmmR32); iFn++) 8706 { 8707 if (!SubTestAndCheckIfEnabled(g_aSseConvertMmI32XmmR32[iFn].pszName)) 8708 continue; 8709 8710 uint32_t const cTests = *g_aSseConvertMmI32XmmR32[iFn].pcTests; 8711 SSE_CONVERT_MM_R32_TEST_T const * const paTests = g_aSseConvertMmI32XmmR32[iFn].paTests; 8712 PFNIEMAIMPLMXCSRU64U64 pfn = g_aSseConvertMmI32XmmR32[iFn].pfn; 8713 uint32_t const cVars = COUNT_VARIATIONS(g_aSseConvertMmI32XmmR32[iFn]); 8714 if (!cTests) RTTestSkipped(g_hTest, "no tests"); 8715 for (uint32_t iVar = 0; iVar < cVars; iVar++) 8716 { 8717 for (uint32_t iTest = 0; iTest < cTests / sizeof(*paTests); iTest++) 8718 { 8719 RTUINT64U ValOut; 8720 RTUINT64U ValIn; 8721 8722 ValIn.au32[0] = paTests[iTest].ar32InVal[0].u; 8723 ValIn.au32[1] = paTests[iTest].ar32InVal[1].u; 8724 8725 uint32_t fMxcsr = paTests[iTest].fMxcsrIn; 8726 pfn(&fMxcsr, &ValOut.u, ValIn.u); 8727 if ( fMxcsr != paTests[iTest].fMxcsrOut 8728 || ValOut.ai32[0] != paTests[iTest].OutVal.ai32[0] 8729 || ValOut.ai32[1] != paTests[iTest].OutVal.ai32[1]) 8730 RTTestFailed(g_hTest, "#%04u%s: mxcsr=%#08x in1=%s'%s \n" 8731 "%s -> mxcsr=%#08x %RI32'%RI32\n" 8732 "%s expected %#08x %RI32'%RI32%s%s (%s)\n", 8733 iTest, iVar ? "/n" : "", paTests[iTest].fMxcsrIn, 8734 FormatR32(&paTests[iTest].ar32InVal[0]), FormatR32(&paTests[iTest].ar32InVal[1]), 8735 iVar ? " " : "", fMxcsr, 8736 ValOut.ai32[0], ValOut.ai32[1], 8737 iVar ? " " : "", paTests[iTest].fMxcsrOut, 8738 paTests[iTest].OutVal.ai32[0], paTests[iTest].OutVal.ai32[1], 8739 MxcsrDiff(fMxcsr, paTests[iTest].fMxcsrOut), 8740 ( ValOut.ai32[0] != paTests[iTest].OutVal.ai32[0] 8741 || ValOut.ai32[1] != paTests[iTest].OutVal.ai32[1]) 8742 ? " - val" : "", 8743 FormatMxcsr(paTests[iTest].fMxcsrIn)); 8744 } 8745 } 8746 } 8747 } 8748 8749 8562 8750 8563 8751 int main(int argc, char **argv) … … 8959 9147 if (rcExit == RTEXITCODE_SUCCESS) 8960 9148 rcExit = SseConvertXmmR64MmGenerate(pszDataFileFmtConv, cTests); 9149 if (rcExit == RTEXITCODE_SUCCESS) 9150 rcExit = SseConvertMmI32XmmR32Generate(pszDataFileFmtConv, cTests); 8961 9151 if (rcExit != RTEXITCODE_SUCCESS) 8962 9152 return rcExit; … … 9084 9274 SseConvertXmmR32MmTest(); 9085 9275 SseConvertXmmR64MmTest(); 9276 SseConvertMmI32XmmR32Test(); 9086 9277 } 9087 9278 } -
trunk/src/VBox/VMM/testcase/tstIEMAImpl.h
r96922 r96931 509 509 X86XMMREG OutVal; 510 510 } SSE_CONVERT_XMM_MM_TEST_T; 511 512 typedef struct SSE_CONVERT_MM_R32_TEST_T 513 { 514 uint32_t fMxcsrIn; 515 uint32_t fMxcsrOut; 516 RTFLOAT32U ar32InVal[2]; 517 RTUINT64U OutVal; 518 } SSE_CONVERT_MM_R32_TEST_T; 511 519 512 520 /** @} */ … … 975 983 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseConvert, SSE_CONVERT_XMM_MM_TEST_T, cvtpi2pd_u128 ); 976 984 985 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseConvert, SSE_CONVERT_MM_R32_TEST_T, cvtps2pi_u128 ); 986 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseConvert, SSE_CONVERT_MM_R32_TEST_T, cvttps2pi_u128 ); 987 977 988 RT_C_DECLS_END 978 989 -
trunk/src/VBox/VMM/testcase/tstIEMAImplDataSseBinary.S
r96922 r96931 148 148 IEM_TEST_DATA cvtpi2ps_u128, "tstIEMAImplDataSseConvert-cvtpi2ps_u128.bin" 149 149 IEM_TEST_DATA cvtpi2pd_u128, "tstIEMAImplDataSseConvert-cvtpi2pd_u128.bin" 150 151 IEM_TEST_DATA cvtps2pi_u128, "tstIEMAImplDataSseConvert-cvtps2pi_u128.bin" 152 IEM_TEST_DATA cvttps2pi_u128, "tstIEMAImplDataSseConvert-cvttps2pi_u128.bin" -
trunk/src/VBox/VMM/testcase/tstIEMAImplDataSseBinary.asm
r96922 r96931 146 146 IEM_TEST_DATA cvtpi2ps_u128, "tstIEMAImplDataSseConvert-cvtpi2ps_u128.bin" 147 147 IEM_TEST_DATA cvtpi2pd_u128, "tstIEMAImplDataSseConvert-cvtpi2pd_u128.bin" 148 149 IEM_TEST_DATA cvtps2pi_u128, "tstIEMAImplDataSseConvert-cvtps2pi_u128.bin" 150 IEM_TEST_DATA cvttps2pi_u128, "tstIEMAImplDataSseConvert-cvttps2pi_u128.bin"
Note:
See TracChangeset
for help on using the changeset viewer.