VirtualBox

Changeset 96790 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Sep 19, 2022 1:04:41 PM (2 years ago)
Author:
vboxsync
Message:

VMM/testcase/tstIEMAImpl: Implement basic cmpps/cmpss/cmppd/cmpsd testcases, bugref:9898

Location:
trunk/src/VBox/VMM/testcase
Files:
4 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/testcase/Makefile.kmk

    r96749 r96790  
    300300        tstIEMAImplDataSseCompare-vucomisd_u128.bin \
    301301        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
    303307
    304308tstIEMAImpl_TEMPLATE  = VBOXR3TSTEXE
  • trunk/src/VBox/VMM/testcase/tstIEMAImpl.cpp

    r96749 r96790  
    69536953
    69546954
     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
     6961TYPEDEF_SUBTEST_TYPE(SSE_COMPARE_F2_XMM_IMM8_T, SSE_COMPARE_F2_XMM_IMM8_TEST_T, PFNIEMAIMPLMXCSRF2XMMIMM8);
     6962
     6963static 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
     6970static 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
     7118static 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 */
     7175static 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
     7182static 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
     7322static 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
    69557369
    69567370int main(int argc, char **argv)
     
    73337747            if (rcExit == RTEXITCODE_SUCCESS)
    73347748                rcExit = SseCompareEflR64R64Generate(pszDataFileFmt, cTests);
     7749            if (rcExit == RTEXITCODE_SUCCESS)
     7750                rcExit = SseCompareF2XmmR32Imm8Generate(pszDataFileFmt, cTests);
     7751            if (rcExit == RTEXITCODE_SUCCESS)
     7752                rcExit = SseCompareF2XmmR64Imm8Generate(pszDataFileFmt, cTests);
    73357753            if (rcExit != RTEXITCODE_SUCCESS)
    73367754                return rcExit;
     
    74487866                SseCompareEflR32R32Test();
    74497867                SseCompareEflR64R64Test();
     7868                SseCompareEflR64R64Test();
     7869                SseCompareF2XmmR32Imm8Test();
     7870                SseCompareF2XmmR64Imm8Test();
    74507871            }
    74517872        }
  • trunk/src/VBox/VMM/testcase/tstIEMAImpl.h

    r96749 r96790  
    472472    RTFLOAT64U              r64ValIn2;
    473473} SSE_COMPARE_EFL_R64_R64_TEST_T;
     474
     475typedef 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;
    474486
    475487/** @} */
     
    919931TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_EFL_R64_R64_TEST_T, vcomisd_u128         );
    920932
     933TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_F2_XMM_IMM8_TEST_T, cmpps_u128           );
     934TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_F2_XMM_IMM8_TEST_T, cmppd_u128           );
     935TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_F2_XMM_IMM8_TEST_T, cmpss_u128           );
     936TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare,   SSE_COMPARE_F2_XMM_IMM8_TEST_T, cmpsd_u128           );
     937
    921938RT_C_DECLS_END
    922939
  • trunk/src/VBox/VMM/testcase/tstIEMAImplDataSseBinary.S

    r96749 r96790  
    129129IEM_TEST_DATA comisd_u128,       "tstIEMAImplDataSseCompare-comisd_u128.bin"
    130130IEM_TEST_DATA vcomisd_u128,      "tstIEMAImplDataSseCompare-vcomisd_u128.bin"
     131
     132IEM_TEST_DATA cmpps_u128,        "tstIEMAImplDataSseCompare-cmpps_u128.bin"
     133IEM_TEST_DATA cmpss_u128,        "tstIEMAImplDataSseCompare-cmpss_u128.bin"
     134IEM_TEST_DATA cmppd_u128,        "tstIEMAImplDataSseCompare-cmppd_u128.bin"
     135IEM_TEST_DATA cmpsd_u128,        "tstIEMAImplDataSseCompare-cmpsd_u128.bin"
  • trunk/src/VBox/VMM/testcase/tstIEMAImplDataSseBinary.asm

    r96749 r96790  
    127127IEM_TEST_DATA comisd_u128,          "tstIEMAImplDataSseCompare-comisd_u128.bin"
    128128IEM_TEST_DATA vcomisd_u128,         "tstIEMAImplDataSseCompare-vcomisd_u128.bin"
     129
     130IEM_TEST_DATA cmpps_u128,           "tstIEMAImplDataSseCompare-cmpps_u128.bin"
     131IEM_TEST_DATA cmpss_u128,           "tstIEMAImplDataSseCompare-cmpss_u128.bin"
     132IEM_TEST_DATA cmppd_u128,           "tstIEMAImplDataSseCompare-cmppd_u128.bin"
     133IEM_TEST_DATA cmpsd_u128,           "tstIEMAImplDataSseCompare-cmpsd_u128.bin"
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