Changeset 96790 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Sep 19, 2022 1:04:41 PM (2 years ago)
- Location:
- trunk/src/VBox/VMM/testcase
- Files:
-
- 4 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/testcase/Makefile.kmk
r96749 r96790 300 300 tstIEMAImplDataSseCompare-vucomisd_u128.bin \ 301 301 tstIEMAImplDataSseCompare-comisd_u128.bin \ 302 tstIEMAImplDataSseCompare-vcomisd_u128.bin 302 tstIEMAImplDataSseCompare-vcomisd_u128.bin \ 303 tstIEMAImplDataSseCompare-cmpps_u128.bin \ 304 tstIEMAImplDataSseCompare-cmpss_u128.bin \ 305 tstIEMAImplDataSseCompare-cmppd_u128.bin \ 306 tstIEMAImplDataSseCompare-cmpsd_u128.bin 303 307 304 308 tstIEMAImpl_TEMPLATE = VBOXR3TSTEXE -
trunk/src/VBox/VMM/testcase/tstIEMAImpl.cpp
r96749 r96790 6953 6953 6954 6954 6955 /* 6956 * Compare SSE operations on packed and single single-precision floating point values - outputting a mask. 6957 */ 6958 /** Maximum immediate to try to keep the testdata size under control (at least a little bit)- */ 6959 #define SSE_COMPARE_F2_XMM_IMM8_MAX 0x1f 6960 6961 TYPEDEF_SUBTEST_TYPE(SSE_COMPARE_F2_XMM_IMM8_T, SSE_COMPARE_F2_XMM_IMM8_TEST_T, PFNIEMAIMPLMXCSRF2XMMIMM8); 6962 6963 static const SSE_COMPARE_F2_XMM_IMM8_T g_aSseCompareF2XmmR32Imm8[] = 6964 { 6965 ENTRY_BIN(cmpps_u128), 6966 ENTRY_BIN(cmpss_u128) 6967 }; 6968 6969 #ifdef TSTIEMAIMPL_WITH_GENERATOR 6970 static RTEXITCODE SseCompareF2XmmR32Imm8Generate(const char *pszDataFileFmt, uint32_t cTests) 6971 { 6972 cTests = RT_MAX(192, cTests); /* there are 144 standard input variations */ 6973 6974 static struct { RTFLOAT32U Val1, Val2; } const s_aSpecials[] = 6975 { 6976 { RTFLOAT32U_INIT_ZERO(0), RTFLOAT32U_INIT_ZERO(0) }, 6977 { RTFLOAT32U_INIT_ZERO(0), RTFLOAT32U_INIT_ZERO(1) }, 6978 { RTFLOAT32U_INIT_ZERO(1), RTFLOAT32U_INIT_ZERO(0) }, 6979 { RTFLOAT32U_INIT_ZERO(1), RTFLOAT32U_INIT_ZERO(1) }, 6980 { RTFLOAT32U_INIT_INF(0), RTFLOAT32U_INIT_INF(0) }, 6981 { RTFLOAT32U_INIT_INF(0), RTFLOAT32U_INIT_INF(1) }, 6982 { RTFLOAT32U_INIT_INF(1), RTFLOAT32U_INIT_INF(0) }, 6983 { RTFLOAT32U_INIT_INF(1), RTFLOAT32U_INIT_INF(1) }, 6984 /** @todo More specials. */ 6985 }; 6986 6987 uint32_t cMinNormalPairs = (cTests - 144) / 4; 6988 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF2XmmR32Imm8); iFn++) 6989 { 6990 PFNIEMAIMPLMXCSRF2XMMIMM8 const pfn = g_aSseCompareF2XmmR32Imm8[iFn].pfnNative ? g_aSseCompareF2XmmR32Imm8[iFn].pfnNative : g_aSseCompareF2XmmR32Imm8[iFn].pfn; 6991 6992 PRTSTREAM pStrmOut = NULL; 6993 int rc = RTStrmOpenF("wb", &pStrmOut, pszDataFileFmt, g_aSseCompareF2XmmR32Imm8[iFn].pszName); 6994 if (RT_FAILURE(rc)) 6995 { 6996 RTMsgError("Failed to open data file for %s for writing: %Rrc", g_aSseCompareF2XmmR32Imm8[iFn].pszName, rc); 6997 return RTEXITCODE_FAILURE; 6998 } 6999 7000 uint32_t cNormalInputPairs = 0; 7001 for (uint32_t iTest = 0; iTest < cTests + RT_ELEMENTS(s_aSpecials); iTest += 1) 7002 { 7003 SSE_COMPARE_F2_XMM_IMM8_TEST_T TestData; RT_ZERO(TestData); 7004 7005 TestData.InVal1.ar32[0] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].Val1; 7006 TestData.InVal1.ar32[1] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].Val1; 7007 TestData.InVal1.ar32[2] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].Val1; 7008 TestData.InVal1.ar32[3] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].Val1; 7009 7010 TestData.InVal2.ar32[0] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].Val2; 7011 TestData.InVal2.ar32[1] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].Val2; 7012 TestData.InVal2.ar32[2] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].Val2; 7013 TestData.InVal2.ar32[3] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].Val2; 7014 7015 if ( RTFLOAT32U_IS_NORMAL(&TestData.InVal1.ar32[0]) 7016 && RTFLOAT32U_IS_NORMAL(&TestData.InVal1.ar32[1]) 7017 && RTFLOAT32U_IS_NORMAL(&TestData.InVal1.ar32[2]) 7018 && RTFLOAT32U_IS_NORMAL(&TestData.InVal1.ar32[3]) 7019 && RTFLOAT32U_IS_NORMAL(&TestData.InVal2.ar32[0]) 7020 && RTFLOAT32U_IS_NORMAL(&TestData.InVal2.ar32[1]) 7021 && RTFLOAT32U_IS_NORMAL(&TestData.InVal2.ar32[2]) 7022 && RTFLOAT32U_IS_NORMAL(&TestData.InVal2.ar32[3])) 7023 cNormalInputPairs++; 7024 else if (cNormalInputPairs < cMinNormalPairs && iTest + cMinNormalPairs >= cTests && iTest < cTests) 7025 { 7026 iTest -= 1; 7027 continue; 7028 } 7029 7030 IEMMEDIAF2XMMSRC Src; 7031 Src.uSrc1 = TestData.InVal1; 7032 Src.uSrc2 = TestData.InVal2; 7033 uint32_t const fMxcsr = RandMxcsr() & X86_MXCSR_XCPT_FLAGS; 7034 for (uint8_t bImm = 0; bImm <= SSE_COMPARE_F2_XMM_IMM8_MAX; bImm++) 7035 for (uint16_t iRounding = 0; iRounding < 4; iRounding++) 7036 for (uint8_t iDaz = 0; iDaz < 2; iDaz++) 7037 for (uint8_t iFz = 0; iFz < 2; iFz++) 7038 { 7039 uint32_t fMxcsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK) 7040 | (iRounding << X86_MXCSR_RC_SHIFT) 7041 | (iDaz ? X86_MXCSR_DAZ : 0) 7042 | (iFz ? X86_MXCSR_FZ : 0) 7043 | X86_MXCSR_XCPT_MASK; 7044 uint32_t fMxcsrM = fMxcsrIn; 7045 X86XMMREG ResM; 7046 pfn(&fMxcsrM, &ResM, &Src, bImm); 7047 TestData.fMxcsrIn = fMxcsrIn; 7048 TestData.fMxcsrOut = fMxcsrM; 7049 TestData.bImm = bImm; 7050 TestData.OutVal = ResM; 7051 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 7052 7053 fMxcsrIn &= ~X86_MXCSR_XCPT_MASK; 7054 uint32_t fMxcsrU = fMxcsrIn; 7055 X86XMMREG ResU; 7056 pfn(&fMxcsrU, &ResU, &Src, bImm); 7057 TestData.fMxcsrIn = fMxcsrIn; 7058 TestData.fMxcsrOut = fMxcsrU; 7059 TestData.bImm = bImm; 7060 TestData.OutVal = ResU; 7061 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 7062 7063 uint16_t fXcpt = (fMxcsrM | fMxcsrU) & X86_MXCSR_XCPT_FLAGS; 7064 if (fXcpt) 7065 { 7066 fMxcsrIn = (fMxcsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt; 7067 uint32_t fMxcsr1 = fMxcsrIn; 7068 X86XMMREG Res1; 7069 pfn(&fMxcsr1, &Res1, &Src, bImm); 7070 TestData.fMxcsrIn = fMxcsrIn; 7071 TestData.fMxcsrOut = fMxcsr1; 7072 TestData.bImm = bImm; 7073 TestData.OutVal = Res1; 7074 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 7075 7076 if (((fMxcsr1 & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (fMxcsr1 & X86_MXCSR_XCPT_FLAGS)) 7077 { 7078 fXcpt |= fMxcsr1 & X86_MXCSR_XCPT_FLAGS; 7079 fMxcsrIn = (fMxcsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT); 7080 uint32_t fMxcsr2 = fMxcsrIn; 7081 X86XMMREG Res2; 7082 pfn(&fMxcsr2, &Res2, &Src, bImm); 7083 TestData.fMxcsrIn = fMxcsrIn; 7084 TestData.fMxcsrOut = fMxcsr2; 7085 TestData.bImm = bImm; 7086 TestData.OutVal = Res2; 7087 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 7088 } 7089 if (!RT_IS_POWER_OF_TWO(fXcpt)) 7090 for (uint16_t fUnmasked = 1; fUnmasked <= X86_MXCSR_PE; fUnmasked <<= 1) 7091 if (fUnmasked & fXcpt) 7092 { 7093 fMxcsrIn = (fMxcsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT); 7094 uint32_t fMxcsr3 = fMxcsrIn; 7095 X86XMMREG Res3; 7096 pfn(&fMxcsr3, &Res3, &Src, bImm); 7097 TestData.fMxcsrIn = fMxcsrIn; 7098 TestData.fMxcsrOut = fMxcsr3; 7099 TestData.bImm = bImm; 7100 TestData.OutVal = Res3; 7101 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 7102 } 7103 } 7104 } 7105 } 7106 rc = RTStrmClose(pStrmOut); 7107 if (RT_FAILURE(rc)) 7108 { 7109 RTMsgError("Failed to close data file for %s: %Rrc", g_aSseCompareF2XmmR32Imm8[iFn].pszName, rc); 7110 return RTEXITCODE_FAILURE; 7111 } 7112 } 7113 7114 return RTEXITCODE_SUCCESS; 7115 } 7116 #endif 7117 7118 static void SseCompareF2XmmR32Imm8Test(void) 7119 { 7120 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF2XmmR32Imm8); iFn++) 7121 { 7122 if (!SubTestAndCheckIfEnabled(g_aSseCompareF2XmmR32Imm8[iFn].pszName)) 7123 continue; 7124 7125 uint32_t const cTests = *g_aSseCompareF2XmmR32Imm8[iFn].pcTests; 7126 SSE_COMPARE_F2_XMM_IMM8_TEST_T const * const paTests = g_aSseCompareF2XmmR32Imm8[iFn].paTests; 7127 PFNIEMAIMPLMXCSRF2XMMIMM8 pfn = g_aSseCompareF2XmmR32Imm8[iFn].pfn; 7128 uint32_t const cVars = COUNT_VARIATIONS(g_aSseCompareF2XmmR32Imm8[iFn]); 7129 if (!cTests) RTTestSkipped(g_hTest, "no tests"); 7130 for (uint32_t iVar = 0; iVar < cVars; iVar++) 7131 { 7132 for (uint32_t iTest = 0; iTest < cTests / sizeof(SSE_COMPARE_F2_XMM_IMM8_TEST_T); iTest++) 7133 { 7134 IEMMEDIAF2XMMSRC Src; 7135 X86XMMREG ValOut; 7136 7137 Src.uSrc1 = paTests[iTest].InVal1; 7138 Src.uSrc2 = paTests[iTest].InVal2; 7139 uint32_t fMxcsr = paTests[iTest].fMxcsrIn; 7140 pfn(&fMxcsr, &ValOut, &Src, paTests[iTest].bImm); 7141 if ( fMxcsr != paTests[iTest].fMxcsrOut 7142 || ValOut.au32[0] != paTests[iTest].OutVal.au32[0] 7143 || ValOut.au32[1] != paTests[iTest].OutVal.au32[1] 7144 || ValOut.au32[2] != paTests[iTest].OutVal.au32[2] 7145 || ValOut.au32[3] != paTests[iTest].OutVal.au32[3]) 7146 RTTestFailed(g_hTest, "#%04u%s: mxcsr=%#08x in1=%s'%s'%s'%s in2=%s'%s'%s'%s imm8=%x\n" 7147 "%s -> mxcsr=%#08x %RX32'%RX32'%RX32'%RX32\n" 7148 "%s expected %#08x %RX32'%RX32'%RX32'%RX32%s%s (%s)\n", 7149 iTest, iVar ? "/n" : "", paTests[iTest].fMxcsrIn, 7150 FormatR32(&paTests[iTest].InVal1.ar32[0]), FormatR32(&paTests[iTest].InVal1.ar32[1]), 7151 FormatR32(&paTests[iTest].InVal1.ar32[2]), FormatR32(&paTests[iTest].InVal1.ar32[3]), 7152 FormatR32(&paTests[iTest].InVal2.ar32[0]), FormatR32(&paTests[iTest].InVal2.ar32[1]), 7153 FormatR32(&paTests[iTest].InVal2.ar32[2]), FormatR32(&paTests[iTest].InVal2.ar32[3]), 7154 paTests[iTest].bImm, 7155 iVar ? " " : "", fMxcsr, ValOut.au32[0], ValOut.au32[1], ValOut.au32[2], ValOut.au32[3], 7156 iVar ? " " : "", paTests[iTest].fMxcsrOut, 7157 paTests[iTest].OutVal.au32[0], paTests[iTest].OutVal.au32[1], 7158 paTests[iTest].OutVal.au32[2], paTests[iTest].OutVal.au32[3], 7159 MxcsrDiff(fMxcsr, paTests[iTest].fMxcsrOut), 7160 ( ValOut.au32[0] != paTests[iTest].OutVal.au32[0] 7161 || ValOut.au32[1] != paTests[iTest].OutVal.au32[1] 7162 || ValOut.au32[2] != paTests[iTest].OutVal.au32[2] 7163 || ValOut.au32[3] != paTests[iTest].OutVal.au32[3]) 7164 ? " - val" : "", 7165 FormatMxcsr(paTests[iTest].fMxcsrIn)); 7166 } 7167 } 7168 } 7169 } 7170 7171 7172 /* 7173 * Compare SSE operations on packed and single double-precision floating point values - outputting a mask. 7174 */ 7175 static const SSE_COMPARE_F2_XMM_IMM8_T g_aSseCompareF2XmmR64Imm8[] = 7176 { 7177 ENTRY_BIN(cmppd_u128), 7178 ENTRY_BIN(cmpsd_u128) 7179 }; 7180 7181 #ifdef TSTIEMAIMPL_WITH_GENERATOR 7182 static RTEXITCODE SseCompareF2XmmR64Imm8Generate(const char *pszDataFileFmt, uint32_t cTests) 7183 { 7184 cTests = RT_MAX(192, cTests); /* there are 144 standard input variations */ 7185 7186 static struct { RTFLOAT64U Val1, Val2; } const s_aSpecials[] = 7187 { 7188 { RTFLOAT64U_INIT_ZERO(0), RTFLOAT64U_INIT_ZERO(0) }, 7189 { RTFLOAT64U_INIT_ZERO(0), RTFLOAT64U_INIT_ZERO(1) }, 7190 { RTFLOAT64U_INIT_ZERO(1), RTFLOAT64U_INIT_ZERO(0) }, 7191 { RTFLOAT64U_INIT_ZERO(1), RTFLOAT64U_INIT_ZERO(1) }, 7192 { RTFLOAT64U_INIT_INF(0), RTFLOAT64U_INIT_INF(0) }, 7193 { RTFLOAT64U_INIT_INF(0), RTFLOAT64U_INIT_INF(1) }, 7194 { RTFLOAT64U_INIT_INF(1), RTFLOAT64U_INIT_INF(0) }, 7195 { RTFLOAT64U_INIT_INF(1), RTFLOAT64U_INIT_INF(1) }, 7196 /** @todo More specials. */ 7197 }; 7198 7199 uint32_t cMinNormalPairs = (cTests - 144) / 4; 7200 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF2XmmR64Imm8); iFn++) 7201 { 7202 PFNIEMAIMPLMXCSRF2XMMIMM8 const pfn = g_aSseCompareF2XmmR64Imm8[iFn].pfnNative ? g_aSseCompareF2XmmR64Imm8[iFn].pfnNative : g_aSseCompareF2XmmR64Imm8[iFn].pfn; 7203 7204 PRTSTREAM pStrmOut = NULL; 7205 int rc = RTStrmOpenF("wb", &pStrmOut, pszDataFileFmt, g_aSseCompareF2XmmR64Imm8[iFn].pszName); 7206 if (RT_FAILURE(rc)) 7207 { 7208 RTMsgError("Failed to open data file for %s for writing: %Rrc", g_aSseCompareF2XmmR64Imm8[iFn].pszName, rc); 7209 return RTEXITCODE_FAILURE; 7210 } 7211 7212 uint32_t cNormalInputPairs = 0; 7213 for (uint32_t iTest = 0; iTest < cTests + RT_ELEMENTS(s_aSpecials); iTest += 1) 7214 { 7215 SSE_COMPARE_F2_XMM_IMM8_TEST_T TestData; RT_ZERO(TestData); 7216 7217 TestData.InVal1.ar64[0] = iTest < cTests ? RandR64Src(iTest) : s_aSpecials[iTest - cTests].Val1; 7218 TestData.InVal1.ar64[1] = iTest < cTests ? RandR64Src(iTest) : s_aSpecials[iTest - cTests].Val1; 7219 7220 TestData.InVal2.ar64[0] = iTest < cTests ? RandR64Src(iTest) : s_aSpecials[iTest - cTests].Val2; 7221 TestData.InVal2.ar64[1] = iTest < cTests ? RandR64Src(iTest) : s_aSpecials[iTest - cTests].Val2; 7222 7223 if ( RTFLOAT64U_IS_NORMAL(&TestData.InVal1.ar64[0]) 7224 && RTFLOAT64U_IS_NORMAL(&TestData.InVal1.ar64[1]) 7225 && RTFLOAT64U_IS_NORMAL(&TestData.InVal2.ar64[0]) 7226 && RTFLOAT64U_IS_NORMAL(&TestData.InVal2.ar64[1])) 7227 cNormalInputPairs++; 7228 else if (cNormalInputPairs < cMinNormalPairs && iTest + cMinNormalPairs >= cTests && iTest < cTests) 7229 { 7230 iTest -= 1; 7231 continue; 7232 } 7233 7234 IEMMEDIAF2XMMSRC Src; 7235 Src.uSrc1 = TestData.InVal1; 7236 Src.uSrc2 = TestData.InVal2; 7237 uint32_t const fMxcsr = RandMxcsr() & X86_MXCSR_XCPT_FLAGS; 7238 for (uint8_t bImm = 0; bImm <= SSE_COMPARE_F2_XMM_IMM8_MAX; bImm++) 7239 for (uint16_t iRounding = 0; iRounding < 4; iRounding++) 7240 for (uint8_t iDaz = 0; iDaz < 2; iDaz++) 7241 for (uint8_t iFz = 0; iFz < 2; iFz++) 7242 { 7243 uint32_t fMxcsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK) 7244 | (iRounding << X86_MXCSR_RC_SHIFT) 7245 | (iDaz ? X86_MXCSR_DAZ : 0) 7246 | (iFz ? X86_MXCSR_FZ : 0) 7247 | X86_MXCSR_XCPT_MASK; 7248 uint32_t fMxcsrM = fMxcsrIn; 7249 X86XMMREG ResM; 7250 pfn(&fMxcsrM, &ResM, &Src, bImm); 7251 TestData.fMxcsrIn = fMxcsrIn; 7252 TestData.fMxcsrOut = fMxcsrM; 7253 TestData.bImm = bImm; 7254 TestData.OutVal = ResM; 7255 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 7256 7257 fMxcsrIn &= ~X86_MXCSR_XCPT_MASK; 7258 uint32_t fMxcsrU = fMxcsrIn; 7259 X86XMMREG ResU; 7260 pfn(&fMxcsrU, &ResU, &Src, bImm); 7261 TestData.fMxcsrIn = fMxcsrIn; 7262 TestData.fMxcsrOut = fMxcsrU; 7263 TestData.bImm = bImm; 7264 TestData.OutVal = ResU; 7265 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 7266 7267 uint16_t fXcpt = (fMxcsrM | fMxcsrU) & X86_MXCSR_XCPT_FLAGS; 7268 if (fXcpt) 7269 { 7270 fMxcsrIn = (fMxcsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt; 7271 uint32_t fMxcsr1 = fMxcsrIn; 7272 X86XMMREG Res1; 7273 pfn(&fMxcsr1, &Res1, &Src, bImm); 7274 TestData.fMxcsrIn = fMxcsrIn; 7275 TestData.fMxcsrOut = fMxcsr1; 7276 TestData.bImm = bImm; 7277 TestData.OutVal = Res1; 7278 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 7279 7280 if (((fMxcsr1 & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (fMxcsr1 & X86_MXCSR_XCPT_FLAGS)) 7281 { 7282 fXcpt |= fMxcsr1 & X86_MXCSR_XCPT_FLAGS; 7283 fMxcsrIn = (fMxcsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT); 7284 uint32_t fMxcsr2 = fMxcsrIn; 7285 X86XMMREG Res2; 7286 pfn(&fMxcsr2, &Res2, &Src, bImm); 7287 TestData.fMxcsrIn = fMxcsrIn; 7288 TestData.fMxcsrOut = fMxcsr2; 7289 TestData.bImm = bImm; 7290 TestData.OutVal = Res2; 7291 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 7292 } 7293 if (!RT_IS_POWER_OF_TWO(fXcpt)) 7294 for (uint16_t fUnmasked = 1; fUnmasked <= X86_MXCSR_PE; fUnmasked <<= 1) 7295 if (fUnmasked & fXcpt) 7296 { 7297 fMxcsrIn = (fMxcsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT); 7298 uint32_t fMxcsr3 = fMxcsrIn; 7299 X86XMMREG Res3; 7300 pfn(&fMxcsr3, &Res3, &Src, bImm); 7301 TestData.fMxcsrIn = fMxcsrIn; 7302 TestData.fMxcsrOut = fMxcsr3; 7303 TestData.bImm = bImm; 7304 TestData.OutVal = Res3; 7305 RTStrmWrite(pStrmOut, &TestData, sizeof(TestData)); 7306 } 7307 } 7308 } 7309 } 7310 rc = RTStrmClose(pStrmOut); 7311 if (RT_FAILURE(rc)) 7312 { 7313 RTMsgError("Failed to close data file for %s: %Rrc", g_aSseCompareF2XmmR64Imm8[iFn].pszName, rc); 7314 return RTEXITCODE_FAILURE; 7315 } 7316 } 7317 7318 return RTEXITCODE_SUCCESS; 7319 } 7320 #endif 7321 7322 static void SseCompareF2XmmR64Imm8Test(void) 7323 { 7324 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF2XmmR64Imm8); iFn++) 7325 { 7326 if (!SubTestAndCheckIfEnabled(g_aSseCompareF2XmmR64Imm8[iFn].pszName)) 7327 continue; 7328 7329 uint32_t const cTests = *g_aSseCompareF2XmmR64Imm8[iFn].pcTests; 7330 SSE_COMPARE_F2_XMM_IMM8_TEST_T const * const paTests = g_aSseCompareF2XmmR64Imm8[iFn].paTests; 7331 PFNIEMAIMPLMXCSRF2XMMIMM8 pfn = g_aSseCompareF2XmmR64Imm8[iFn].pfn; 7332 uint32_t const cVars = COUNT_VARIATIONS(g_aSseCompareF2XmmR64Imm8[iFn]); 7333 if (!cTests) RTTestSkipped(g_hTest, "no tests"); 7334 for (uint32_t iVar = 0; iVar < cVars; iVar++) 7335 { 7336 for (uint32_t iTest = 0; iTest < cTests / sizeof(SSE_COMPARE_F2_XMM_IMM8_TEST_T); iTest++) 7337 { 7338 IEMMEDIAF2XMMSRC Src; 7339 X86XMMREG ValOut; 7340 7341 Src.uSrc1 = paTests[iTest].InVal1; 7342 Src.uSrc2 = paTests[iTest].InVal2; 7343 uint32_t fMxcsr = paTests[iTest].fMxcsrIn; 7344 pfn(&fMxcsr, &ValOut, &Src, paTests[iTest].bImm); 7345 if ( fMxcsr != paTests[iTest].fMxcsrOut 7346 || ValOut.au64[0] != paTests[iTest].OutVal.au64[0] 7347 || ValOut.au64[1] != paTests[iTest].OutVal.au64[1]) 7348 RTTestFailed(g_hTest, "#%04u%s: mxcsr=%#08x in1=%s'%s in2=%s'%s imm8=%x\n" 7349 "%s -> mxcsr=%#08x %RX64'%RX64\n" 7350 "%s expected %#08x %RX64'%RX64%s%s (%s)\n", 7351 iTest, iVar ? "/n" : "", paTests[iTest].fMxcsrIn, 7352 FormatR64(&paTests[iTest].InVal1.ar64[0]), FormatR64(&paTests[iTest].InVal1.ar64[1]), 7353 FormatR64(&paTests[iTest].InVal2.ar64[0]), FormatR64(&paTests[iTest].InVal2.ar64[1]), 7354 paTests[iTest].bImm, 7355 iVar ? " " : "", fMxcsr, ValOut.au64[0], ValOut.au64[1], 7356 iVar ? " " : "", paTests[iTest].fMxcsrOut, 7357 paTests[iTest].OutVal.au64[0], paTests[iTest].OutVal.au64[1], 7358 MxcsrDiff(fMxcsr, paTests[iTest].fMxcsrOut), 7359 ( ValOut.au64[0] != paTests[iTest].OutVal.au64[0] 7360 || ValOut.au64[1] != paTests[iTest].OutVal.au64[1]) 7361 ? " - val" : "", 7362 FormatMxcsr(paTests[iTest].fMxcsrIn)); 7363 } 7364 } 7365 } 7366 } 7367 7368 6955 7369 6956 7370 int main(int argc, char **argv) … … 7333 7747 if (rcExit == RTEXITCODE_SUCCESS) 7334 7748 rcExit = SseCompareEflR64R64Generate(pszDataFileFmt, cTests); 7749 if (rcExit == RTEXITCODE_SUCCESS) 7750 rcExit = SseCompareF2XmmR32Imm8Generate(pszDataFileFmt, cTests); 7751 if (rcExit == RTEXITCODE_SUCCESS) 7752 rcExit = SseCompareF2XmmR64Imm8Generate(pszDataFileFmt, cTests); 7335 7753 if (rcExit != RTEXITCODE_SUCCESS) 7336 7754 return rcExit; … … 7448 7866 SseCompareEflR32R32Test(); 7449 7867 SseCompareEflR64R64Test(); 7868 SseCompareEflR64R64Test(); 7869 SseCompareF2XmmR32Imm8Test(); 7870 SseCompareF2XmmR64Imm8Test(); 7450 7871 } 7451 7872 } -
trunk/src/VBox/VMM/testcase/tstIEMAImpl.h
r96749 r96790 472 472 RTFLOAT64U r64ValIn2; 473 473 } SSE_COMPARE_EFL_R64_R64_TEST_T; 474 475 typedef struct SSE_COMPARE_F2_XMM_IMM8_TEST_T 476 { 477 uint32_t fMxcsrIn; 478 uint32_t fMxcsrOut; 479 uint8_t bImm; 480 uint8_t abPadding0[3]; 481 uint32_t u32Padding1; 482 X86XMMREG InVal1; 483 X86XMMREG InVal2; 484 X86XMMREG OutVal; 485 } SSE_COMPARE_F2_XMM_IMM8_TEST_T; 474 486 475 487 /** @} */ … … 919 931 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_EFL_R64_R64_TEST_T, vcomisd_u128 ); 920 932 933 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_F2_XMM_IMM8_TEST_T, cmpps_u128 ); 934 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_F2_XMM_IMM8_TEST_T, cmppd_u128 ); 935 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_F2_XMM_IMM8_TEST_T, cmpss_u128 ); 936 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_F2_XMM_IMM8_TEST_T, cmpsd_u128 ); 937 921 938 RT_C_DECLS_END 922 939 -
trunk/src/VBox/VMM/testcase/tstIEMAImplDataSseBinary.S
r96749 r96790 129 129 IEM_TEST_DATA comisd_u128, "tstIEMAImplDataSseCompare-comisd_u128.bin" 130 130 IEM_TEST_DATA vcomisd_u128, "tstIEMAImplDataSseCompare-vcomisd_u128.bin" 131 132 IEM_TEST_DATA cmpps_u128, "tstIEMAImplDataSseCompare-cmpps_u128.bin" 133 IEM_TEST_DATA cmpss_u128, "tstIEMAImplDataSseCompare-cmpss_u128.bin" 134 IEM_TEST_DATA cmppd_u128, "tstIEMAImplDataSseCompare-cmppd_u128.bin" 135 IEM_TEST_DATA cmpsd_u128, "tstIEMAImplDataSseCompare-cmpsd_u128.bin" -
trunk/src/VBox/VMM/testcase/tstIEMAImplDataSseBinary.asm
r96749 r96790 127 127 IEM_TEST_DATA comisd_u128, "tstIEMAImplDataSseCompare-comisd_u128.bin" 128 128 IEM_TEST_DATA vcomisd_u128, "tstIEMAImplDataSseCompare-vcomisd_u128.bin" 129 130 IEM_TEST_DATA cmpps_u128, "tstIEMAImplDataSseCompare-cmpps_u128.bin" 131 IEM_TEST_DATA cmpss_u128, "tstIEMAImplDataSseCompare-cmpss_u128.bin" 132 IEM_TEST_DATA cmppd_u128, "tstIEMAImplDataSseCompare-cmppd_u128.bin" 133 IEM_TEST_DATA cmpsd_u128, "tstIEMAImplDataSseCompare-cmpsd_u128.bin"
Note:
See TracChangeset
for help on using the changeset viewer.