Changeset 96327 in vbox
- Timestamp:
- Aug 19, 2022 9:14:09 AM (3 years ago)
- svn:sync-xref-src-repo-rev:
- 153141
- Location:
- trunk/src/VBox/VMM/testcase
- Files:
-
- 6 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/testcase/Makefile.kmk
r96248 r96327 249 249 $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuOther.cpp \ 250 250 $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuOther-Amd.cpp \ 251 $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuOther-Intel.cpp \ 252 $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataSseBinary.cpp 251 $(tstIEMAImpl_0_OUTDIR)/tstIEMAImplDataFpuOther-Intel.cpp 253 252 tstIEMAImpl_SOURCES = \ 254 253 tstIEMAImpl.cpp \ 255 254 ../VMMAll/IEMAllAImplC.cpp \ 256 255 $(tstIEMAImpl_CLEAN) 256 tstIEMAImpl_SOURCES.x86 += tstIEMAImplDataSseBinary.asm 257 tstIEMAImpl_SOURCES.amd64 += tstIEMAImplDataSseBinary.asm 258 tstIEMAImplDataSseBinary.asm_DEPS = \ 259 tstIEMAImplDataSseBinary-addps_u128.bin \ 260 tstIEMAImplDataSseBinary-mulps_u128.bin \ 261 tstIEMAImplDataSseBinary-subps_u128.bin \ 262 tstIEMAImplDataSseBinary-addpd_u128.bin \ 263 tstIEMAImplDataSseBinary-mulpd_u128.bin \ 264 tstIEMAImplDataSseBinary-subpd_u128.bin 265 266 tstIEMAImpl_SOURCES.arm64 += tstIEMAImplDataSseBinary.S 267 tstIEMAImplDataSseBinary.S_DEPS = \ 268 tstIEMAImplDataSseBinary-addps_u128.bin \ 269 tstIEMAImplDataSseBinary-mulps_u128.bin \ 270 tstIEMAImplDataSseBinary-subps_u128.bin \ 271 tstIEMAImplDataSseBinary-addpd_u128.bin \ 272 tstIEMAImplDataSseBinary-mulpd_u128.bin \ 273 tstIEMAImplDataSseBinary-subpd_u128.bin 257 274 $(call KB_FN_DO_PASS0_ON_TARGET,tstIEMAImpl) 258 275 … … 267 284 ../VMMAll/IEMAllAImplC.cpp \ 268 285 $(tstIEMAImpl_CLEAN) 286 tstIEMAImplAsm_SOURCES.x86 += tstIEMAImplDataSseBinary.asm 287 tstIEMAImplAsm_SOURCES.amd64 += tstIEMAImplDataSseBinary.asm 288 tstIEMAImplDataSseBinary.asm_DEPS = \ 289 tstIEMAImplDataSseBinary-addps_u128.bin \ 290 tstIEMAImplDataSseBinary-mulps_u128.bin \ 291 tstIEMAImplDataSseBinary-subps_u128.bin \ 292 tstIEMAImplDataSseBinary-addpd_u128.bin \ 293 tstIEMAImplDataSseBinary-mulpd_u128.bin \ 294 tstIEMAImplDataSseBinary-subpd_u128.bin 295 296 tstIEMAImplAsm_SOURCES.arm64 += tstIEMAImplDataSseBinary.S 297 tstIEMAImplDataSseBinary.S_DEPS = \ 298 tstIEMAImplDataSseBinary-addps_u128.bin \ 299 tstIEMAImplDataSseBinary-mulps_u128.bin \ 300 tstIEMAImplDataSseBinary-subps_u128.bin \ 301 tstIEMAImplDataSseBinary-addpd_u128.bin \ 302 tstIEMAImplDataSseBinary-mulpd_u128.bin \ 303 tstIEMAImplDataSseBinary-subpd_u128.bin 269 304 270 305 ## @param 1 The sub-name of the file in question. … … 297 332 $(evalcall2 def_tstIEMAImplData_adjust,FpuOther-Amd) 298 333 $(evalcall2 def_tstIEMAImplData_adjust,FpuOther-Intel) 299 $(evalcall2 def_tstIEMAImplData_adjust,SseBinary)300 334 301 335 -
trunk/src/VBox/VMM/testcase/tstIEMAImpl.cpp
r96291 r96327 45 45 { RT_XSTR(a_Name), iemAImpl_ ## a_Name, NULL, \ 46 46 g_aTests_ ## a_Name, &g_cTests_ ## a_Name, \ 47 a_uExtra, IEMTARGETCPU_EFL_BEHAVIOR_NATIVE /* means same for all here */ } 48 49 #define ENTRY_BIN(a_Name) ENTRY_EX_BIN(a_Name, 0) 50 #define ENTRY_EX_BIN(a_Name, a_uExtra) \ 51 { RT_XSTR(a_Name), iemAImpl_ ## a_Name, NULL, \ 52 g_aTests_ ## a_Name, &g_cbTests_ ## a_Name, \ 47 53 a_uExtra, IEMTARGETCPU_EFL_BEHAVIOR_NATIVE /* means same for all here */ } 48 54 … … 4460 4466 * Binary SSE operations on packed single precision floating point values. 4461 4467 */ 4462 TYPEDEF_SUBTEST_TYPE(SSE_BINARY_R32_T, SSE_BINARY_ R32_TEST_T, PFNIEMAIMPLFPSSEF2U128);4468 TYPEDEF_SUBTEST_TYPE(SSE_BINARY_R32_T, SSE_BINARY_TEST_T, PFNIEMAIMPLFPSSEF2U128); 4463 4469 4464 4470 static const SSE_BINARY_R32_T g_aSseBinaryR32[] = 4465 4471 { 4466 ENTRY(addps_u128), 4467 ENTRY(mulps_u128), 4472 ENTRY_BIN(addps_u128), 4473 ENTRY_BIN(mulps_u128), 4474 ENTRY_BIN(subps_u128), 4468 4475 }; 4469 4476 4470 4477 #ifdef TSTIEMAIMPL_WITH_GENERATOR 4471 static void SseBinaryR32Generate(PRTSTREAM pOut, PRTSTREAM pOutCpu, uint32_t cTests)4478 static RTEXITCODE SseBinaryR32Generate(const char *pszDataFileFmt, uint32_t cTests) 4472 4479 { 4473 4480 cTests = RT_MAX(192, cTests); /* there are 144 standard input variations */ … … 4486 4493 { 4487 4494 PFNIEMAIMPLFPSSEF2U128 const pfn = g_aSseBinaryR32[iFn].pfnNative ? g_aSseBinaryR32[iFn].pfnNative : g_aSseBinaryR32[iFn].pfn; 4488 PRTSTREAM pOutFn = pOut; 4489 if (g_aSseBinaryR32[iFn].idxCpuEflFlavour != IEMTARGETCPU_EFL_BEHAVIOR_NATIVE) 4495 4496 PRTSTREAM pStrmOut = NULL; 4497 int rc = RTStrmOpenF("wb", &pStrmOut, pszDataFileFmt, g_aSseBinaryR32[iFn].pszName); 4498 if (RT_FAILURE(rc)) 4490 4499 { 4491 if (g_aSseBinaryR32[iFn].idxCpuEflFlavour != g_idxCpuEflFlavour) 4492 continue; 4493 pOutFn = pOutCpu; 4500 RTMsgError("Failed to open data file for %s for writing: %Rrc", g_aSseBinaryR32[iFn].pszName, rc); 4501 return RTEXITCODE_FAILURE; 4494 4502 } 4495 4503 4496 GenerateArrayStart(pOutFn, g_aSseBinaryR32[iFn].pszName, "SSE_BINARY_R32_TEST_T");4497 uint32_t iTestOutput = 0;4498 4504 uint32_t cNormalInputPairs = 0; 4499 4505 for (uint32_t iTest = 0; iTest < cTests + RT_ELEMENTS(s_aSpecials); iTest += 1) 4500 4506 { 4501 RTFLOAT32U InVal1_1 = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].aVal1[0];4502 RTFLOAT32U InVal1_2 = iTest < cTests ? RandR32Src2(iTest) : s_aSpecials[iTest - cTests].aVal2[0]; 4503 4504 RTFLOAT32U InVal2_1= iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].aVal1[1];4505 RTFLOAT32U InVal2_2 = iTest < cTests ? RandR32Src2(iTest) : s_aSpecials[iTest - cTests].aVal2[1];4506 4507 RTFLOAT32U InVal3_1 = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].aVal1[2]; 4508 RTFLOAT32U InVal3_2 = iTest < cTests ? RandR32Src2(iTest) : s_aSpecials[iTest - cTests].aVal2[2];4509 4510 RTFLOAT32U InVal4_1 = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].aVal1[3];4511 RTFLOAT32U InVal4_2= iTest < cTests ? RandR32Src2(iTest) : s_aSpecials[iTest - cTests].aVal2[3];4512 4513 if ( RTFLOAT32U_IS_NORMAL(& InVal1_1) && RTFLOAT32U_IS_NORMAL(&InVal1_2)4514 && RTFLOAT32U_IS_NORMAL(& InVal2_1) && RTFLOAT32U_IS_NORMAL(&InVal2_2)4515 && RTFLOAT32U_IS_NORMAL(& InVal3_1) && RTFLOAT32U_IS_NORMAL(&InVal3_2)4516 && RTFLOAT32U_IS_NORMAL(& InVal4_1) && RTFLOAT32U_IS_NORMAL(&InVal4_2))4507 SSE_BINARY_TEST_T TestData; RT_ZERO(TestData); 4508 4509 TestData.InVal1.ar32[0] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].aVal1[0]; 4510 TestData.InVal1.ar32[1] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].aVal1[1]; 4511 TestData.InVal1.ar32[2] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].aVal1[2]; 4512 TestData.InVal1.ar32[3] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].aVal1[3]; 4513 4514 TestData.InVal2.ar32[0] = iTest < cTests ? RandR32Src2(iTest) : s_aSpecials[iTest - cTests].aVal2[0]; 4515 TestData.InVal2.ar32[1] = iTest < cTests ? RandR32Src2(iTest) : s_aSpecials[iTest - cTests].aVal2[1]; 4516 TestData.InVal2.ar32[2] = iTest < cTests ? RandR32Src2(iTest) : s_aSpecials[iTest - cTests].aVal2[2]; 4517 TestData.InVal2.ar32[3] = iTest < cTests ? RandR32Src2(iTest) : s_aSpecials[iTest - cTests].aVal2[3]; 4518 4519 if ( RTFLOAT32U_IS_NORMAL(&TestData.InVal1.ar32[0]) && RTFLOAT32U_IS_NORMAL(&TestData.InVal2.ar32[0]) 4520 && RTFLOAT32U_IS_NORMAL(&TestData.InVal1.ar32[1]) && RTFLOAT32U_IS_NORMAL(&TestData.InVal2.ar32[1]) 4521 && RTFLOAT32U_IS_NORMAL(&TestData.InVal1.ar32[2]) && RTFLOAT32U_IS_NORMAL(&TestData.InVal2.ar32[2]) 4522 && RTFLOAT32U_IS_NORMAL(&TestData.InVal1.ar32[3]) && RTFLOAT32U_IS_NORMAL(&TestData.InVal2.ar32[3])) 4517 4523 cNormalInputPairs++; 4518 4524 else if (cNormalInputPairs < cMinNormalPairs && iTest + cMinNormalPairs >= cTests && iTest < cTests) … … 4521 4527 continue; 4522 4528 } 4523 4524 X86XMMREG XmmVal1; RT_ZERO(XmmVal1);4525 X86XMMREG XmmVal2; RT_ZERO(XmmVal2);4526 4527 XmmVal1.ar32[0] = InVal1_1;4528 XmmVal2.ar32[0] = InVal1_2;4529 XmmVal1.ar32[1] = InVal2_1;4530 XmmVal2.ar32[1] = InVal2_2;4531 XmmVal1.ar32[2] = InVal3_1;4532 XmmVal2.ar32[2] = InVal3_2;4533 XmmVal1.ar32[3] = InVal4_1;4534 XmmVal2.ar32[3] = InVal4_2;4535 4529 4536 4530 uint32_t const fMxcsr = RandMxcsr() & X86_MXCSR_XCPT_FLAGS; … … 4545 4539 | X86_MXCSR_XCPT_MASK; 4546 4540 IEMSSERESULT ResM; RT_ZERO(ResM); 4547 pfn(&State, &ResM, &XmmVal1, &XmmVal2); 4548 RTStrmPrintf(pOutFn, " { %#08x, %#08x, { %s, %s, %s, %s }, { %s, %s, %s, %s }, { %s, %s, %s, %s } }, /* #%u/%u/%c/%c/m = #%u */\n", 4549 State.MXCSR, ResM.MXCSR, 4550 GenFormatR32(&XmmVal1.ar32[0]), GenFormatR32(&XmmVal1.ar32[1]), 4551 GenFormatR32(&XmmVal1.ar32[2]), GenFormatR32(&XmmVal1.ar32[3]), 4552 GenFormatR32(&XmmVal2.ar32[0]), GenFormatR32(&XmmVal2.ar32[1]), 4553 GenFormatR32(&XmmVal2.ar32[2]), GenFormatR32(&XmmVal2.ar32[3]), 4554 GenFormatR32(&ResM.uResult.ar32[0]), GenFormatR32(&ResM.uResult.ar32[1]), 4555 GenFormatR32(&ResM.uResult.ar32[2]), GenFormatR32(&ResM.uResult.ar32[3]), 4556 iTest, iRounding, 4557 iDaz ? 'd' : '0', iFz ? 'f' : '0', 4558 iTestOutput++); 4541 pfn(&State, &ResM, &TestData.InVal1, &TestData.InVal2); 4542 TestData.fMxcsrIn = State.MXCSR; 4543 TestData.fMxcsrOut = ResM.MXCSR; 4544 TestData.OutVal = ResM.uResult; 4545 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 4559 4546 4560 4547 State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK; 4561 4548 IEMSSERESULT ResU; RT_ZERO(ResU); 4562 pfn(&State, &ResU, &XmmVal1, &XmmVal2); 4563 RTStrmPrintf(pOutFn, " { %#08x, %#08x, { %s, %s, %s, %s }, { %s, %s, %s, %s }, { %s, %s, %s, %s } }, /* #%u/%u/%c/%c/u = #%u */\n", 4564 State.MXCSR, ResU.MXCSR, 4565 GenFormatR32(&XmmVal1.ar32[0]), GenFormatR32(&XmmVal1.ar32[1]), 4566 GenFormatR32(&XmmVal1.ar32[2]), GenFormatR32(&XmmVal1.ar32[3]), 4567 GenFormatR32(&XmmVal2.ar32[0]), GenFormatR32(&XmmVal2.ar32[1]), 4568 GenFormatR32(&XmmVal2.ar32[2]), GenFormatR32(&XmmVal2.ar32[3]), 4569 GenFormatR32(&ResU.uResult.ar32[0]), GenFormatR32(&ResU.uResult.ar32[1]), 4570 GenFormatR32(&ResU.uResult.ar32[2]), GenFormatR32(&ResU.uResult.ar32[3]), 4571 iTest, iRounding, 4572 iDaz ? 'd' : '0', iFz ? 'f' : '0', 4573 iTestOutput++); 4549 pfn(&State, &ResU, &TestData.InVal1, &TestData.InVal2); 4550 TestData.fMxcsrIn = State.MXCSR; 4551 TestData.fMxcsrOut = ResU.MXCSR; 4552 TestData.OutVal = ResU.uResult; 4553 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 4574 4554 4575 4555 uint16_t fXcpt = (ResM.MXCSR | ResU.MXCSR) & X86_MXCSR_XCPT_FLAGS; … … 4578 4558 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt; 4579 4559 IEMSSERESULT Res1; RT_ZERO(Res1); 4580 pfn(&State, &Res1, &XmmVal1, &XmmVal2); 4581 RTStrmPrintf(pOutFn, " { %#08x, %#08x, { %s, %s, %s, %s }, { %s, %s, %s, %s }, { %s, %s, %s, %s } }, /* #%u/%u/%c/%c/u = #%u */\n", 4582 State.MXCSR, Res1.MXCSR, 4583 GenFormatR32(&XmmVal1.ar32[0]), GenFormatR32(&XmmVal1.ar32[1]), 4584 GenFormatR32(&XmmVal1.ar32[2]), GenFormatR32(&XmmVal1.ar32[3]), 4585 GenFormatR32(&XmmVal2.ar32[0]), GenFormatR32(&XmmVal2.ar32[1]), 4586 GenFormatR32(&XmmVal2.ar32[2]), GenFormatR32(&XmmVal2.ar32[3]), 4587 GenFormatR32(&Res1.uResult.ar32[0]), GenFormatR32(&Res1.uResult.ar32[1]), 4588 GenFormatR32(&Res1.uResult.ar32[2]), GenFormatR32(&Res1.uResult.ar32[3]), 4589 iTest, iRounding, 4590 iDaz ? 'd' : '0', iFz ? 'f' : '0', 4591 iTestOutput++); 4560 pfn(&State, &Res1, &TestData.InVal1, &TestData.InVal2); 4561 TestData.fMxcsrIn = State.MXCSR; 4562 TestData.fMxcsrOut = Res1.MXCSR; 4563 TestData.OutVal = Res1.uResult; 4564 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 4565 4592 4566 if (((Res1.MXCSR & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (Res1.MXCSR & X86_MXCSR_XCPT_FLAGS)) 4593 4567 { … … 4595 4569 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT); 4596 4570 IEMSSERESULT Res2; RT_ZERO(Res2); 4597 pfn(&State, &Res2, &XmmVal1, &XmmVal2); 4598 RTStrmPrintf(pOutFn, " { %#08x, %#08x, { %s, %s, %s, %s }, { %s, %s, %s, %s }, { %s, %s, %s, %s } }, /* #%u/%u/%c/%c/%#x[!] = #%u */\n", 4599 State.MXCSR, Res2.MXCSR, 4600 GenFormatR32(&XmmVal1.ar32[0]), GenFormatR32(&XmmVal1.ar32[1]), 4601 GenFormatR32(&XmmVal1.ar32[2]), GenFormatR32(&XmmVal1.ar32[3]), 4602 GenFormatR32(&XmmVal2.ar32[0]), GenFormatR32(&XmmVal2.ar32[1]), 4603 GenFormatR32(&XmmVal2.ar32[2]), GenFormatR32(&XmmVal2.ar32[3]), 4604 GenFormatR32(&Res2.uResult.ar32[0]), GenFormatR32(&Res2.uResult.ar32[1]), 4605 GenFormatR32(&Res2.uResult.ar32[2]), GenFormatR32(&Res2.uResult.ar32[3]), 4606 iTest, iRounding, 4607 iDaz ? 'd' : '0', iFz ? 'f' : '0', fXcpt, 4608 iTestOutput++); 4571 pfn(&State, &Res2, &TestData.InVal1, &TestData.InVal2); 4572 TestData.fMxcsrIn = State.MXCSR; 4573 TestData.fMxcsrOut = Res2.MXCSR; 4574 TestData.OutVal = Res2.uResult; 4575 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 4609 4576 } 4610 4577 if (!RT_IS_POWER_OF_TWO(fXcpt)) … … 4614 4581 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT); 4615 4582 IEMSSERESULT Res3; RT_ZERO(Res3); 4616 pfn(&State, &Res3, &XmmVal1, &XmmVal2); 4617 RTStrmPrintf(pOutFn, " { %#08x, %#08x, { %s, %s, %s, %s }, { %s, %s, %s, %s }, { %s, %s, %s, %s } }, /* #%u/%u/%c/%c/u%#x = #%u */\n", 4618 State.MXCSR, Res3.MXCSR, 4619 GenFormatR32(&XmmVal1.ar32[0]), GenFormatR32(&XmmVal1.ar32[1]), 4620 GenFormatR32(&XmmVal1.ar32[2]), GenFormatR32(&XmmVal1.ar32[3]), 4621 GenFormatR32(&XmmVal2.ar32[0]), GenFormatR32(&XmmVal2.ar32[1]), 4622 GenFormatR32(&XmmVal2.ar32[2]), GenFormatR32(&XmmVal2.ar32[3]), 4623 GenFormatR32(&Res3.uResult.ar32[0]), GenFormatR32(&Res3.uResult.ar32[1]), 4624 GenFormatR32(&Res3.uResult.ar32[2]), GenFormatR32(&Res3.uResult.ar32[3]), 4625 iTest, iRounding, 4626 iDaz ? 'd' : '0', iFz ? 'f' : '0', fUnmasked, 4627 iTestOutput++); 4583 pfn(&State, &Res3, &TestData.InVal1, &TestData.InVal2); 4584 TestData.fMxcsrIn = State.MXCSR; 4585 TestData.fMxcsrOut = Res3.MXCSR; 4586 TestData.OutVal = Res3.uResult; 4587 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 4628 4588 } 4629 4589 } 4630 4590 } 4631 4591 } 4632 GenerateArrayEnd(pOutFn, g_aSseBinaryR32[iFn].pszName); 4633 } 4592 rc = RTStrmClose(pStrmOut); 4593 if (RT_FAILURE(rc)) 4594 { 4595 RTMsgError("Failed to close data file for %s: %Rrc", g_aSseBinaryR32[iFn].pszName, rc); 4596 return RTEXITCODE_FAILURE; 4597 } 4598 } 4599 4600 return RTEXITCODE_SUCCESS; 4634 4601 } 4635 4602 #endif … … 4644 4611 continue; 4645 4612 4646 uint32_t const 4647 SSE_BINARY_ R32_TEST_T const * const paTests = g_aSseBinaryR32[iFn].paTests;4648 PFNIEMAIMPLFPSSEF2U128 4649 uint32_t const 4613 uint32_t const cTests = *g_aSseBinaryR32[iFn].pcTests; 4614 SSE_BINARY_TEST_T const * const paTests = g_aSseBinaryR32[iFn].paTests; 4615 PFNIEMAIMPLFPSSEF2U128 pfn = g_aSseBinaryR32[iFn].pfn; 4616 uint32_t const cVars = COUNT_VARIATIONS(g_aSseBinaryR32[iFn]); 4650 4617 if (!cTests) RTTestSkipped(g_hTest, "no tests"); 4651 4618 for (uint32_t iVar = 0; iVar < cVars; iVar++) 4652 4619 { 4653 for (uint32_t iTest = 0; iTest < cTests ; iTest++)4620 for (uint32_t iTest = 0; iTest < cTests / sizeof(SSE_BINARY_TEST_T); iTest++) 4654 4621 { 4655 X86XMMREG InVal1; RT_ZERO(InVal1);4656 X86XMMREG InVal2; RT_ZERO(InVal2);4657 4622 IEMSSERESULT Res; RT_ZERO(Res); 4658 4623 4659 InVal1.ar32[0] = paTests[iTest].aInVal1[0];4660 InVal2.ar32[0] = paTests[iTest].aInVal2[0];4661 InVal1.ar32[1] = paTests[iTest].aInVal1[1];4662 InVal2.ar32[1] = paTests[iTest].aInVal2[1];4663 InVal1.ar32[2] = paTests[iTest].aInVal1[2];4664 InVal2.ar32[2] = paTests[iTest].aInVal2[2];4665 InVal1.ar32[3] = paTests[iTest].aInVal1[3];4666 InVal2.ar32[3] = paTests[iTest].aInVal2[3];4667 4668 4624 State.MXCSR = paTests[iTest].fMxcsrIn; 4669 pfn(&State, &Res, & InVal1, &InVal2);4670 bool fValsIdentical = RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[0], &paTests[iTest]. aOutVal[0])4671 && RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[1], &paTests[iTest]. aOutVal[1])4672 && RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[2], &paTests[iTest]. aOutVal[2])4673 && RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[3], &paTests[iTest]. aOutVal[3]);4625 pfn(&State, &Res, &paTests[iTest].InVal1, &paTests[iTest].InVal2); 4626 bool fValsIdentical = RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[0], &paTests[iTest].OutVal.ar32[0]) 4627 && RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[1], &paTests[iTest].OutVal.ar32[1]) 4628 && RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[2], &paTests[iTest].OutVal.ar32[2]) 4629 && RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[3], &paTests[iTest].OutVal.ar32[3]); 4674 4630 if ( Res.MXCSR != paTests[iTest].fMxcsrOut 4675 4631 || !fValsIdentical) … … 4678 4634 "%s expected %#08x %s'%s'%s'%s%s%s (%s)\n", 4679 4635 iTest, iVar ? "/n" : "", paTests[iTest].fMxcsrIn, 4680 FormatR32(&paTests[iTest]. aInVal1[0]), FormatR32(&paTests[iTest].aInVal1[1]),4681 FormatR32(&paTests[iTest]. aInVal1[2]), FormatR32(&paTests[iTest].aInVal1[3]),4682 FormatR32(&paTests[iTest]. aInVal2[0]), FormatR32(&paTests[iTest].aInVal2[1]),4683 FormatR32(&paTests[iTest]. aInVal2[2]), FormatR32(&paTests[iTest].aInVal2[3]),4636 FormatR32(&paTests[iTest].InVal1.ar32[0]), FormatR32(&paTests[iTest].InVal1.ar32[1]), 4637 FormatR32(&paTests[iTest].InVal1.ar32[2]), FormatR32(&paTests[iTest].InVal1.ar32[3]), 4638 FormatR32(&paTests[iTest].InVal2.ar32[0]), FormatR32(&paTests[iTest].InVal2.ar32[1]), 4639 FormatR32(&paTests[iTest].InVal2.ar32[2]), FormatR32(&paTests[iTest].InVal2.ar32[3]), 4684 4640 iVar ? " " : "", Res.MXCSR, 4685 4641 FormatR32(&Res.uResult.ar32[0]), FormatR32(&Res.uResult.ar32[1]), 4686 4642 FormatR32(&Res.uResult.ar32[2]), FormatR32(&Res.uResult.ar32[3]), 4687 4643 iVar ? " " : "", paTests[iTest].fMxcsrOut, 4688 FormatR32(&paTests[iTest]. aOutVal[0]), FormatR32(&paTests[iTest].aOutVal[1]),4689 FormatR32(&paTests[iTest]. aOutVal[2]), FormatR32(&paTests[iTest].aOutVal[3]),4644 FormatR32(&paTests[iTest].OutVal.ar32[0]), FormatR32(&paTests[iTest].OutVal.ar32[1]), 4645 FormatR32(&paTests[iTest].OutVal.ar32[2]), FormatR32(&paTests[iTest].OutVal.ar32[3]), 4690 4646 MxcsrDiff(Res.MXCSR, paTests[iTest].fMxcsrOut), 4691 4647 !fValsIdentical ? " - val" : "", … … 4698 4654 4699 4655 4700 4701 4656 /* 4702 4657 * Binary SSE operations on packed single precision floating point values. 4703 4658 */ 4704 TYPEDEF_SUBTEST_TYPE(SSE_BINARY_R64_T, SSE_BINARY_ R64_TEST_T, PFNIEMAIMPLFPSSEF2U128);4659 TYPEDEF_SUBTEST_TYPE(SSE_BINARY_R64_T, SSE_BINARY_TEST_T, PFNIEMAIMPLFPSSEF2U128); 4705 4660 4706 4661 static const SSE_BINARY_R64_T g_aSseBinaryR64[] = 4707 4662 { 4708 ENTRY(addpd_u128), 4709 ENTRY(mulpd_u128), 4663 ENTRY_BIN(addpd_u128), 4664 ENTRY_BIN(mulpd_u128), 4665 ENTRY_BIN(subpd_u128), 4710 4666 }; 4711 4667 4712 4668 #ifdef TSTIEMAIMPL_WITH_GENERATOR 4713 static void SseBinaryR64Generate(PRTSTREAM pOut, PRTSTREAM pOutCpu, uint32_t cTests)4669 static RTEXITCODE SseBinaryR64Generate(const char *pszDataFileFmt, uint32_t cTests) 4714 4670 { 4715 4671 cTests = RT_MAX(192, cTests); /* there are 144 standard input variations */ … … 4728 4684 { 4729 4685 PFNIEMAIMPLFPSSEF2U128 const pfn = g_aSseBinaryR64[iFn].pfnNative ? g_aSseBinaryR64[iFn].pfnNative : g_aSseBinaryR64[iFn].pfn; 4730 PRTSTREAM pOutFn = pOut; 4731 if (g_aSseBinaryR64[iFn].idxCpuEflFlavour != IEMTARGETCPU_EFL_BEHAVIOR_NATIVE) 4686 4687 PRTSTREAM pStrmOut = NULL; 4688 int rc = RTStrmOpenF("wb", &pStrmOut, pszDataFileFmt, g_aSseBinaryR64[iFn].pszName); 4689 if (RT_FAILURE(rc)) 4732 4690 { 4733 if (g_aSseBinaryR64[iFn].idxCpuEflFlavour != g_idxCpuEflFlavour) 4734 continue; 4735 pOutFn = pOutCpu; 4691 RTMsgError("Failed to open data file for %s for writing: %Rrc", g_aSseBinaryR32[iFn].pszName, rc); 4692 return RTEXITCODE_FAILURE; 4736 4693 } 4737 4694 4738 GenerateArrayStart(pOutFn, g_aSseBinaryR64[iFn].pszName, "SSE_BINARY_R64_TEST_T");4739 uint32_t iTestOutput = 0;4740 4695 uint32_t cNormalInputPairs = 0; 4741 4696 for (uint32_t iTest = 0; iTest < cTests + RT_ELEMENTS(s_aSpecials); iTest += 1) 4742 4697 { 4743 RTFLOAT64U InVal1_1 = iTest < cTests ? RandR64Src(iTest) : s_aSpecials[iTest - cTests].aVal1[0]; 4744 RTFLOAT64U InVal1_2 = iTest < cTests ? RandR64Src2(iTest) : s_aSpecials[iTest - cTests].aVal2[0]; 4745 RTFLOAT64U InVal2_1 = iTest < cTests ? RandR64Src(iTest) : s_aSpecials[iTest - cTests].aVal1[1]; 4746 RTFLOAT64U InVal2_2 = iTest < cTests ? RandR64Src2(iTest) : s_aSpecials[iTest - cTests].aVal2[1]; 4747 4748 if ( RTFLOAT64U_IS_NORMAL(&InVal1_1) && RTFLOAT64U_IS_NORMAL(&InVal1_2) 4749 && RTFLOAT64U_IS_NORMAL(&InVal2_1) && RTFLOAT64U_IS_NORMAL(&InVal2_1)) 4698 SSE_BINARY_TEST_T TestData; RT_ZERO(TestData); 4699 4700 TestData.InVal1.ar64[0] = iTest < cTests ? RandR64Src(iTest) : s_aSpecials[iTest - cTests].aVal1[0]; 4701 TestData.InVal1.ar64[1] = iTest < cTests ? RandR64Src(iTest) : s_aSpecials[iTest - cTests].aVal1[0]; 4702 TestData.InVal2.ar64[0] = iTest < cTests ? RandR64Src2(iTest) : s_aSpecials[iTest - cTests].aVal2[0]; 4703 TestData.InVal2.ar64[1] = iTest < cTests ? RandR64Src2(iTest) : s_aSpecials[iTest - cTests].aVal2[0]; 4704 4705 if ( RTFLOAT64U_IS_NORMAL(&TestData.InVal1.ar64[0]) && RTFLOAT64U_IS_NORMAL(&TestData.InVal1.ar64[1]) 4706 && RTFLOAT64U_IS_NORMAL(&TestData.InVal2.ar64[0]) && RTFLOAT64U_IS_NORMAL(&TestData.InVal2.ar64[1])) 4750 4707 cNormalInputPairs++; 4751 4708 else if (cNormalInputPairs < cMinNormalPairs && iTest + cMinNormalPairs >= cTests && iTest < cTests) … … 4754 4711 continue; 4755 4712 } 4756 4757 X86XMMREG XmmVal1; RT_ZERO(XmmVal1);4758 X86XMMREG XmmVal2; RT_ZERO(XmmVal2);4759 4760 XmmVal1.ar64[0] = InVal1_1;4761 XmmVal2.ar64[0] = InVal1_2;4762 XmmVal1.ar64[1] = InVal2_1;4763 XmmVal2.ar64[1] = InVal2_2;4764 4713 4765 4714 uint32_t const fMxcsr = RandMxcsr() & X86_MXCSR_XCPT_FLAGS; … … 4774 4723 | X86_MXCSR_XCPT_MASK; 4775 4724 IEMSSERESULT ResM; RT_ZERO(ResM); 4776 pfn(&State, &ResM, &XmmVal1, &XmmVal2); 4777 RTStrmPrintf(pOutFn, " { %#08x, %#08x, { %s, %s }, { %s, %s }, { %s, %s } }, /* #%u/%u/%c/%c/m = #%u */\n", 4778 State.MXCSR, ResM.MXCSR, 4779 GenFormatR64(&XmmVal1.ar64[0]), GenFormatR64(&XmmVal1.ar64[1]), 4780 GenFormatR64(&XmmVal2.ar64[0]), GenFormatR64(&XmmVal2.ar64[1]), 4781 GenFormatR64(&ResM.uResult.ar64[0]), GenFormatR64(&ResM.uResult.ar64[1]), 4782 iTest, iRounding, 4783 iDaz ? 'd' : '0', iFz ? 'f' : '0', 4784 iTestOutput++); 4725 pfn(&State, &ResM, &TestData.InVal1, &TestData.InVal2); 4726 TestData.fMxcsrIn = State.MXCSR; 4727 TestData.fMxcsrOut = ResM.MXCSR; 4728 TestData.OutVal = ResM.uResult; 4729 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 4785 4730 4786 4731 State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK; 4787 4732 IEMSSERESULT ResU; RT_ZERO(ResU); 4788 pfn(&State, &ResU, &XmmVal1, &XmmVal2); 4789 RTStrmPrintf(pOutFn, " { %#08x, %#08x, { %s, %s }, { %s, %s }, { %s, %s } }, /* #%u/%u/%c/%c/u = #%u */\n", 4790 State.MXCSR, ResU.MXCSR, 4791 GenFormatR64(&XmmVal1.ar64[0]), GenFormatR64(&XmmVal1.ar64[1]), 4792 GenFormatR64(&XmmVal2.ar64[0]), GenFormatR64(&XmmVal2.ar64[1]), 4793 GenFormatR64(&ResU.uResult.ar64[0]), GenFormatR64(&ResU.uResult.ar64[1]), 4794 iTest, iRounding, 4795 iDaz ? 'd' : '0', iFz ? 'f' : '0', 4796 iTestOutput++); 4733 pfn(&State, &ResU, &TestData.InVal1, &TestData.InVal2); 4734 TestData.fMxcsrIn = State.MXCSR; 4735 TestData.fMxcsrOut = ResU.MXCSR; 4736 TestData.OutVal = ResU.uResult; 4737 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 4797 4738 4798 4739 uint16_t fXcpt = (ResM.MXCSR | ResU.MXCSR) & X86_MXCSR_XCPT_FLAGS; … … 4801 4742 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt; 4802 4743 IEMSSERESULT Res1; RT_ZERO(Res1); 4803 pfn(&State, &Res1, &XmmVal1, &XmmVal2); 4804 RTStrmPrintf(pOutFn, " { %#08x, %#08x, { %s, %s }, { %s, %s }, { %s, %s } }, /* #%u/%u/%c/%c/u = #%u */\n", 4805 State.MXCSR, Res1.MXCSR, 4806 GenFormatR64(&XmmVal1.ar64[0]), GenFormatR64(&XmmVal1.ar64[1]), 4807 GenFormatR64(&XmmVal2.ar64[0]), GenFormatR64(&XmmVal2.ar64[1]), 4808 GenFormatR64(&Res1.uResult.ar64[0]), GenFormatR64(&Res1.uResult.ar64[1]), 4809 iTest, iRounding, 4810 iDaz ? 'd' : '0', iFz ? 'f' : '0', 4811 iTestOutput++); 4744 pfn(&State, &Res1, &TestData.InVal1, &TestData.InVal2); 4745 TestData.fMxcsrIn = State.MXCSR; 4746 TestData.fMxcsrOut = Res1.MXCSR; 4747 TestData.OutVal = Res1.uResult; 4748 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 4749 4812 4750 if (((Res1.MXCSR & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (Res1.MXCSR & X86_MXCSR_XCPT_FLAGS)) 4813 4751 { … … 4815 4753 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT); 4816 4754 IEMSSERESULT Res2; RT_ZERO(Res2); 4817 pfn(&State, &Res2, &XmmVal1, &XmmVal2); 4818 RTStrmPrintf(pOutFn, " { %#08x, %#08x, { %s, %s }, { %s, %s }, { %s, %s } }, /* #%u/%u/%c/%c/%#x[!] = #%u */\n", 4819 State.MXCSR, Res2.MXCSR, 4820 GenFormatR64(&XmmVal1.ar64[0]), GenFormatR64(&XmmVal1.ar64[1]), 4821 GenFormatR64(&XmmVal2.ar64[0]), GenFormatR64(&XmmVal2.ar64[1]), 4822 GenFormatR64(&Res2.uResult.ar64[0]), GenFormatR64(&Res2.uResult.ar64[1]), 4823 iTest, iRounding, 4824 iDaz ? 'd' : '0', iFz ? 'f' : '0', fXcpt, 4825 iTestOutput++); 4755 pfn(&State, &Res2, &TestData.InVal1, &TestData.InVal2); 4756 TestData.fMxcsrIn = State.MXCSR; 4757 TestData.fMxcsrOut = Res2.MXCSR; 4758 TestData.OutVal = Res2.uResult; 4759 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 4826 4760 } 4827 4761 if (!RT_IS_POWER_OF_TWO(fXcpt)) … … 4831 4765 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT); 4832 4766 IEMSSERESULT Res3; RT_ZERO(Res3); 4833 pfn(&State, &Res3, &XmmVal1, &XmmVal2); 4834 RTStrmPrintf(pOutFn, " { %#08x, %#08x, { %s, %s }, { %s, %s }, { %s, %s } }, /* #%u/%u/%c/%c/u%#x = #%u */\n", 4835 State.MXCSR, Res3.MXCSR, 4836 GenFormatR64(&XmmVal1.ar64[0]), GenFormatR64(&XmmVal1.ar64[1]), 4837 GenFormatR64(&XmmVal2.ar64[0]), GenFormatR64(&XmmVal2.ar64[1]), 4838 GenFormatR64(&Res3.uResult.ar64[0]), GenFormatR64(&Res3.uResult.ar64[1]), 4839 iTest, iRounding, 4840 iDaz ? 'd' : '0', iFz ? 'f' : '0', fUnmasked, 4841 iTestOutput++); 4767 pfn(&State, &Res3, &TestData.InVal1, &TestData.InVal2); 4768 TestData.fMxcsrIn = State.MXCSR; 4769 TestData.fMxcsrOut = Res3.MXCSR; 4770 TestData.OutVal = Res3.uResult; 4771 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 4842 4772 } 4843 4773 } 4844 4774 } 4845 4775 } 4846 GenerateArrayEnd(pOutFn, g_aSseBinaryR64[iFn].pszName); 4847 } 4776 rc = RTStrmClose(pStrmOut); 4777 if (RT_FAILURE(rc)) 4778 { 4779 RTMsgError("Failed to close data file for %s: %Rrc", g_aSseBinaryR32[iFn].pszName, rc); 4780 return RTEXITCODE_FAILURE; 4781 } 4782 } 4783 4784 return RTEXITCODE_SUCCESS; 4848 4785 } 4849 4786 #endif 4787 4850 4788 4851 4789 static void SseBinaryR64Test(void) … … 4858 4796 continue; 4859 4797 4860 uint32_t const 4861 SSE_BINARY_ R64_TEST_T const * const paTests = g_aSseBinaryR64[iFn].paTests;4862 PFNIEMAIMPLFPSSEF2U128 4863 uint32_t const 4798 uint32_t const cTests = *g_aSseBinaryR64[iFn].pcTests; 4799 SSE_BINARY_TEST_T const * const paTests = g_aSseBinaryR64[iFn].paTests; 4800 PFNIEMAIMPLFPSSEF2U128 pfn = g_aSseBinaryR64[iFn].pfn; 4801 uint32_t const cVars = COUNT_VARIATIONS(g_aSseBinaryR64[iFn]); 4864 4802 if (!cTests) RTTestSkipped(g_hTest, "no tests"); 4865 for (uint32_t iVar = 0; iVar < cVars ; iVar++)4803 for (uint32_t iVar = 0; iVar < cVars / sizeof(SSE_BINARY_TEST_T); iVar++) 4866 4804 { 4867 4805 for (uint32_t iTest = 0; iTest < cTests; iTest++) 4868 4806 { 4869 X86XMMREG InVal1; RT_ZERO(InVal1);4870 X86XMMREG InVal2; RT_ZERO(InVal2);4871 4807 IEMSSERESULT Res; RT_ZERO(Res); 4872 4808 4873 InVal1.ar64[0] = paTests[iTest].aInVal1[0];4874 InVal2.ar64[0] = paTests[iTest].aInVal2[0];4875 InVal1.ar64[1] = paTests[iTest].aInVal1[1];4876 InVal2.ar64[1] = paTests[iTest].aInVal2[1];4877 4809 State.MXCSR = paTests[iTest].fMxcsrIn; 4878 pfn(&State, &Res, & InVal1, &InVal2);4810 pfn(&State, &Res, &paTests[iTest].InVal1, &paTests[iTest].InVal2); 4879 4811 if ( Res.MXCSR != paTests[iTest].fMxcsrOut 4880 || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[0], &paTests[iTest]. aOutVal[0])4881 || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[1], &paTests[iTest]. aOutVal[1]))4812 || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[0], &paTests[iTest].OutVal.ar64[0]) 4813 || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[1], &paTests[iTest].OutVal.ar64[1])) 4882 4814 RTTestFailed(g_hTest, "#%04u%s: mxcsr=%#08x in1=%s'%s in2=%s'%s\n" 4883 4815 "%s -> mxcsr=%#08x %s'%s\n" 4884 4816 "%s expected %#08x %s'%s%s%s (%s)\n", 4885 4817 iTest, iVar ? "/n" : "", paTests[iTest].fMxcsrIn, 4886 FormatR64(&paTests[iTest]. aInVal1[0]), FormatR64(&paTests[iTest].aInVal1[1]),4887 FormatR64(&paTests[iTest]. aInVal2[0]), FormatR64(&paTests[iTest].aInVal2[1]),4818 FormatR64(&paTests[iTest].InVal1.ar64[0]), FormatR64(&paTests[iTest].InVal1.ar64[1]), 4819 FormatR64(&paTests[iTest].InVal2.ar64[0]), FormatR64(&paTests[iTest].InVal2.ar64[1]), 4888 4820 iVar ? " " : "", Res.MXCSR, 4889 4821 FormatR64(&Res.uResult.ar64[0]), FormatR64(&Res.uResult.ar64[1]), 4890 4822 iVar ? " " : "", paTests[iTest].fMxcsrOut, 4891 FormatR64(&paTests[iTest]. aOutVal[0]), FormatR64(&paTests[iTest].aOutVal[1]),4823 FormatR64(&paTests[iTest].OutVal.ar64[0]), FormatR64(&paTests[iTest].OutVal.ar64[1]), 4892 4824 MxcsrDiff(Res.MXCSR, paTests[iTest].fMxcsrOut), 4893 ( !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[0], &paTests[iTest]. aOutVal[0])4894 || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[1], &paTests[iTest]. aOutVal[1]))4825 ( !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[0], &paTests[iTest].OutVal.ar64[0]) 4826 || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[1], &paTests[iTest].OutVal.ar64[1])) 4895 4827 ? " - val" : "", 4896 4828 FormatMxcsr(paTests[iTest].fMxcsrIn) ); … … 5235 5167 if (fSseFpBinary) 5236 5168 { 5237 const char *pszDataFile = fCommonData ? "tstIEMAImplDataSseBinary.cpp" : pszBitBucket; 5238 PRTSTREAM pStrmData = GenerateOpenWithHdr(pszDataFile, szCpuDesc, NULL); 5239 const char *pszDataCpuFile = pszBitBucket; /*!fCpuData ? pszBitBucket : g_idxCpuEflFlavour == IEMTARGETCPU_EFL_BEHAVIOR_AMD 5240 ? "tstIEMAImplDataSimdBinary-Amd.cpp" : "tstIEMAImplDataSimdBinary-Intel.cpp"; */ 5241 PRTSTREAM pStrmDataCpu = GenerateOpenWithHdr(pszDataCpuFile, szCpuDesc, pszCpuType); 5242 if (!pStrmData || !pStrmDataCpu) 5243 return RTEXITCODE_FAILURE; 5244 5245 SseBinaryR32Generate(pStrmData, pStrmDataCpu, cTests); 5246 SseBinaryR64Generate(pStrmData, pStrmDataCpu, cTests); 5247 5248 RTEXITCODE rcExit = GenerateFooterAndClose(pStrmDataCpu, pszDataCpuFile, 5249 GenerateFooterAndClose(pStrmData, pszDataFile, RTEXITCODE_SUCCESS)); 5169 const char *pszDataFileFmt = fCommonData ? "tstIEMAImplDataSseBinary-%s.bin" : pszBitBucket; 5170 5171 RTEXITCODE rcExit = SseBinaryR32Generate(pszDataFileFmt, cTests); 5172 if (rcExit == RTEXITCODE_SUCCESS) 5173 rcExit = SseBinaryR64Generate(pszDataFileFmt, cTests); 5250 5174 if (rcExit != RTEXITCODE_SUCCESS) 5251 5175 return rcExit; -
trunk/src/VBox/VMM/testcase/tstIEMAImpl.h
r96290 r96327 23 23 24 24 #include <iprt/types.h> 25 #include <iprt/x86.h> 25 26 26 27 … … 344 345 } FPU_UNARY_TWO_R80_TEST_T; 345 346 346 typedef struct SSE_BINARY_ R32_TEST_T347 typedef struct SSE_BINARY_TEST_T 347 348 { 348 349 uint32_t fMxcsrIn; 349 350 uint32_t fMxcsrOut; 350 RTFLOAT32U aInVal1[4]; 351 RTFLOAT32U aInVal2[4]; 352 RTFLOAT32U aOutVal[4]; 353 } SSE_BINARY_R32_TEST_T; 354 355 typedef struct SSE_BINARY_R64_TEST_T 356 { 357 uint32_t fMxcsrIn; 358 uint32_t fMxcsrOut; 359 RTFLOAT64U aInVal1[2]; 360 RTFLOAT64U aInVal2[2]; 361 RTFLOAT64U aOutVal[2]; 362 } SSE_BINARY_R64_TEST_T; 351 uint32_t au32Padding[2]; 352 X86XMMREG InVal1; 353 X86XMMREG InVal2; 354 X86XMMREG OutVal; 355 } SSE_BINARY_TEST_T; 363 356 364 357 /** @} */ … … 369 362 extern uint32_t const RT_CONCAT(g_cTests_, a_Instr) = 0 370 363 364 #define TSTIEM_DEFINE_EMPTY_TEST_ARRAY_BIN(a_Type, a_Instr) \ 365 extern a_Type const RT_CONCAT(g_aTests_, a_Instr)[] = { {0} }; \ 366 extern uint32_t const RT_CONCAT(g_cbTests_, a_Instr) = 0 367 371 368 #define TSTIEM_DECLARE_TEST_ARRAY(a_szFile, a_Type, a_Instr) \ 372 369 extern a_Type const RT_CONCAT(g_aTests_, a_Instr)[]; \ 373 370 extern uint32_t const RT_CONCAT(g_cTests_, a_Instr) 371 372 #define TSTIEM_DECLARE_TEST_ARRAY_BIN(a_szFile, a_Type, a_Instr) \ 373 extern a_Type const RT_CONCAT(g_aTests_, a_Instr)[]; \ 374 extern uint32_t const RT_CONCAT(g_cbTests_, a_Instr) 374 375 375 376 TSTIEM_DECLARE_TEST_ARRAY(Int, BINU8_TEST_T, add_u8 ); … … 728 729 TSTIEM_DECLARE_TEST_ARRAY(FpuOther-Intel, FPU_UNARY_TWO_R80_TEST_T, fsincos_r80_r80_intel ); 729 730 730 TSTIEM_DECLARE_TEST_ARRAY(SseBinary, SSE_BINARY_R32_TEST_T, addps_u128 ); 731 TSTIEM_DECLARE_TEST_ARRAY(SseBinary, SSE_BINARY_R32_TEST_T, mulps_u128 ); 732 733 TSTIEM_DECLARE_TEST_ARRAY(SseBinary, SSE_BINARY_R64_TEST_T, addpd_u128 ); 734 TSTIEM_DECLARE_TEST_ARRAY(SseBinary, SSE_BINARY_R64_TEST_T, mulpd_u128 ); 731 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseBinary, SSE_BINARY_TEST_T, addps_u128 ); 732 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseBinary, SSE_BINARY_TEST_T, mulps_u128 ); 733 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseBinary, SSE_BINARY_TEST_T, subps_u128 ); 734 735 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseBinary, SSE_BINARY_TEST_T, addpd_u128 ); 736 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseBinary, SSE_BINARY_TEST_T, mulpd_u128 ); 737 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseBinary, SSE_BINARY_TEST_T, subpd_u128 ); 735 738 736 739 #endif /* !VMM_INCLUDED_SRC_testcase_tstIEMAImpl_h */
Note:
See TracChangeset
for help on using the changeset viewer.