VirtualBox

Changeset 106182 in vbox for trunk/src


Ignore:
Timestamp:
Sep 30, 2024 10:58:11 PM (5 months ago)
Author:
vboxsync
Message:

ValidationKit/bootsectors: adapt addpd to auto-MXCSR, with major 'worker 1A' enhancements; bugref:10658

  • 'worker 1A': add BS3_MXCSR_PE_FUZZY flag to allow PE results to vary
  • 'worker 1A': allow MXCSR bits to be marked 'FIXED'
  • 'worker 1A': FIXED bits will not varied by the worker's randomizer
  • addpd: add BS3_MXCSR_PE_FUZZY to 5 entries that need it
  • addpd: fix 5 previously-masked wrong output values
  • addpd: split 2 entries, using FIXED for complex DM vs UM vs UE behavior
  • sqrtps: use new file-wide ROW_UNUSED macro
  • sqrtps: add BS3_MXCSR_PE_FUZZY and un-#ifdef 7 entries
  • sqrtps: remove 5 entries made redundant by mask randomization
  • divsd: add BS3_MXCSR_PE_FUZZY comment (to activate when ported to '1A')
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-4.c32

    r106178 r106182  
    290290/** The maximum denormal value. */
    291291#define FP64_DENORM_MIN(a_Sign)             RTFLOAT64U_INIT_C(a_Sign, FP64_FRAC_DENORM_MIN, 0)
     292
     293/*
     294 * Utility defines for table construction.
     295 */
     296#define FP32_ROW_UNUSED FP32_1(0), FP32_1(0), FP32_1(0), FP32_1(0), FP32_1(0), FP32_1(0), FP32_1(0), FP32_1(0)
     297#define FP64_ROW_UNUSED FP64_1(0), FP64_1(0), FP64_1(0), FP64_1(0)
    292298
    293299
     
    29872993
    29882994/**
     2995 * Constants used in the 'Worker 1A' test value definitions.  These are
     2996 * extra bits which can be set in the ':out' fields of a test value.
     2997 * They are described below in the corresponding code.
     2998 */
     2999#define BS3_MXCSR_FIXED_SHIFT 11
     3000#define BS3_MXCSR_FIXED_MASK  (X86_MXCSR_XCPT_MASK << BS3_MXCSR_FIXED_SHIFT)
     3001#define BS3_MXCSR_IM_FIXED    (X86_MXCSR_IM << BS3_MXCSR_FIXED_SHIFT)
     3002#define BS3_MXCSR_DM_FIXED    (X86_MXCSR_DM << BS3_MXCSR_FIXED_SHIFT)
     3003#define BS3_MXCSR_ZM_FIXED    (X86_MXCSR_ZM << BS3_MXCSR_FIXED_SHIFT)
     3004#define BS3_MXCSR_OM_FIXED    (X86_MXCSR_OM << BS3_MXCSR_FIXED_SHIFT)
     3005#define BS3_MXCSR_UM_FIXED    (X86_MXCSR_UM << BS3_MXCSR_FIXED_SHIFT)
     3006#define BS3_MXCSR_PM_FIXED    (X86_MXCSR_PM << BS3_MXCSR_FIXED_SHIFT)
     3007#define BS3_MXCSR_PE_FUZZY    RT_BIT_32(24)
     3008
     3009/* Confirm all bits we're 'stealing' are actually available */
     3010AssertCompile(BS3_MXCSR_FIXED_MASK == BS3_MXCSR_IM_FIXED | BS3_MXCSR_DM_FIXED | BS3_MXCSR_ZM_FIXED | BS3_MXCSR_OM_FIXED | BS3_MXCSR_UM_FIXED | BS3_MXCSR_PM_FIXED);
     3011AssertCompile((X86_MXCSR_ZERO_MASK & BS3_MXCSR_FIXED_MASK) == BS3_MXCSR_FIXED_MASK);
     3012AssertCompile((X86_MXCSR_ZERO_MASK & BS3_MXCSR_PE_FUZZY) == BS3_MXCSR_PE_FUZZY);
     3013/* Confirm bits we're 'stealing' do not overlap each other */
     3014AssertCompile((BS3_MXCSR_FIXED_MASK & BS3_MXCSR_PE_FUZZY) == 0);
     3015
     3016/**
    29893017 * Worker for bs3CpuInstr4_WorkerTestType1 [new WIP version]
    29903018 */
     
    30153043    uint32_t uSpecifiedMask, uExpectedMask, uImpliedMask, uCombinedMask, uMaskedMask, uUnmaskedMask, uThisMask;
    30163044    uint32_t uExpectedMxCsr_orig, uExpectedExceptions, uExpectedUnmaskedExceptions, uInitialExceptions, uRandTmp;
     3045    bool fFuzzyPE;
     3046    uint32_t uForceOnMask, uForceOffMask;
    30173047    const char *pszMaskType;
    30183048    unsigned iMaskType;
     
    30203050
    30213051    /*
    3022      * An exception may be raised based on the test value (128 vs 256 bits).
    3023      * In addition, we allow setting the exception flags (and mask) prior to
    3024      * executing the instruction, so we cannot use the exception flags to figure
    3025      * out if an exception will be raised. Hence, the input values provide us
    3026      * explicitly whether an exception is expected for 128 and 256-bit variants.
    3027      */  /** @todo rewrite this to reflect 'worker 1a' when ready to commit */
     3052     * Different exceptions may be raised by the same instruction given a
     3053     * particular set of 256-bit inputs vs. the lower 128-bits of the same
     3054     * inputs.  The test value tables therefore provide us with the exceptions
     3055     * expected for each size.  The tables give the maximum exceptions, as
     3056     * would be raised when all exceptions are masked; the test worker then
     3057     * varies the masking configuration and is able to derive the exceptions
     3058     * which will be raised in each scenario.
     3059     *
     3060     * Certain instruction tests give different results with different masks,
     3061     * beyond the scope of the test worker's knowledge.  The test worker may
     3062     * be instructed not to vary a specified set of masks for a particular
     3063     * test; such tests should be duplicated in the test data, once for each
     3064     * different set of fixed masks expected to give different results.  See
     3065     * the 'Denormals' section of instruction `addpd` for an example working.
     3066     * This area is marked for further investigation.
     3067     *
     3068     * There is an additional 'fuzzy PE exception' flag which means that the
     3069     * test worker will ignore the PE exception bit in the instruction results
     3070     * (including whether or not a fault was raised).  This exists due to
     3071     * observed variable behavior in IEM, and even with physical hardware
     3072     * in some instances.  It is not meant to excuse the variable behavior
     3073     * (particularly in IEM!), but to make it tolerable to run tests while the
     3074     * known outage exists.  This is marked for further investigation.
     3075     */
     3076     /** @todo deeper / continued investigation of 'forced mask' situations */
     3077     /** @todo deeper investigation of 'fuzzy PE' situation */
     3078
    30283079    if (pTestCtx->cbOperand > 16)
    3029     {
    30303080        uExpectedMxCsr  = pValues->u256ExpectedMxCsr;
    3031         fFpXcptExpected = pValues->f256FpXcptExpected;
    3032     }
    30333081    else
    3034     {
    30353082        uExpectedMxCsr  = pValues->u128ExpectedMxCsr;
    3036         fFpXcptExpected = pValues->f128FpXcptExpected;
    3037     }
     3083    fFuzzyPE = (uExpectedMxCsr & BS3_MXCSR_PE_FUZZY) != 0;
     3084    uExpectedMxCsr &= ~BS3_MXCSR_PE_FUZZY;
     3085    uSpecifiedMask = pValues->uMxCsr & X86_MXCSR_XCPT_MASK;
     3086    uForceOnMask = ((uExpectedMxCsr & BS3_MXCSR_FIXED_MASK) >> BS3_MXCSR_FIXED_SHIFT) & uSpecifiedMask;
     3087    uForceOffMask = ((uExpectedMxCsr & BS3_MXCSR_FIXED_MASK) >> BS3_MXCSR_FIXED_SHIFT) & (~uSpecifiedMask);
     3088    uExpectedMxCsr = ((uExpectedMxCsr & ~BS3_MXCSR_FIXED_MASK) | uForceOnMask) & ~uForceOffMask;
    30383089
    30393090    /*
     
    30623113    uExpectedMxCsr_orig = uExpectedMxCsr;
    30633114    uInitialExceptions = pValues->uMxCsr & X86_MXCSR_XCPT_FLAGS;
    3064     uSpecifiedMask = pValues->uMxCsr & X86_MXCSR_XCPT_MASK;
    30653115    uExpectedMask = uExpectedMxCsr_orig & X86_MXCSR_XCPT_MASK;
    30663116
     
    30733123    uImpliedMask = (uExpectedMxCsr_orig & X86_MXCSR_XCPT_FLAGS) << X86_MXCSR_XCPT_MASK_SHIFT;
    30743124    uCombinedMask = uSpecifiedMask | uImpliedMask;
    3075     uMaskedMask = X86_MXCSR_XCPT_MASK;
    3076     uUnmaskedMask = 0;
     3125    uMaskedMask = X86_MXCSR_XCPT_MASK & ~uForceOffMask;
     3126    uUnmaskedMask = 0 | uForceOnMask;
    30773127
    30783128   for (iMaskType = 0; iMaskType <= 6; iMaskType++)
     
    31173167            {
    31183168                case X86_MXCSR_RC_ZERO:
    3119                 case X86_MXCSR_RC_NEAREST:
     3169                case X86_MXCSR_RC_NEAREST:  /* Random mask */
    31203170                    uThisMask = uRandTmp & X86_MXCSR_XCPT_MASK;
    31213171                    break;
    3122                 case X86_MXCSR_RC_DOWN:
    3123                     uThisMask = uRandTmp & X86_MXCSR_XCPT_MASK;
     3172                case X86_MXCSR_RC_UP:       /* Random initial exceptions */
     3173                    uThisMask = uSpecifiedMask;
    31243174                    uInitialExceptions = uRandTmp & X86_MXCSR_XCPT_FLAGS;
    31253175                    break;
    3126                 case X86_MXCSR_RC_UP:
    3127                     uThisMask = uSpecifiedMask;
     3176                case X86_MXCSR_RC_DOWN:     /* Random mask & initial exceptions */
     3177                    uThisMask = uRandTmp & X86_MXCSR_XCPT_MASK;
    31283178                    uInitialExceptions = uRandTmp & X86_MXCSR_XCPT_FLAGS;
    31293179                    break;
     
    31333183            pszMaskType = "Random";
    31343184            break;
    3135         /** @todo Consider providing assorted already-set exceptions (WIP) */
    3136         /** @todo Consider only-early exceptions masked; only-late exceptions masked */
    3137         /** @todo Consider only-early-specified exceptions masked; only-late-specified exceptions masked */
    3138         /** -- I think actually this is all covered by the Random case.  Over time. */
    31393185        default:
    31403186            BS3_ASSERT(0);
    31413187    }
     3188    /* No matter what was chosen, honor FIXED mask bits */
     3189    uThisMask = (uThisMask | uForceOnMask) & ~uForceOffMask;
     3190
    31423191    /* This is the input MXCSR value we'll be sending */
    31433192    uMxCsr = (pValues->uMxCsr & ~(X86_MXCSR_XCPT_MASK | X86_MXCSR_XCPT_FLAGS)) | uThisMask | uInitialExceptions;
     
    32503299        pExtCtxOut->Ctx.x.Hdr.bmXState = 0x7;
    32513300#endif
     3301
    32523302    if (bXcptExpect == X86_XCPT_DB)
     3303    {
     3304        if (fFuzzyPE)
     3305        {
     3306            uint32_t const uGotMxCsr = Bs3ExtCtxGetMxCsr(pExtCtxOut);
     3307            uExpectedMxCsr = (uExpectedMxCsr & ~X86_MXCSR_PE) | (uGotMxCsr & X86_MXCSR_PE);
     3308        }
    32533309        Bs3ExtCtxSetMxCsr(pExtCtx, uExpectedMxCsr | (pSavedCfg->uMxCsr & X86_MXCSR_MM));
     3310    }
     3311
    32543312    Bs3TestCheckExtCtx(pExtCtxOut, pExtCtx, 0 /*fFlags*/, pTestCtx->pszMode, pTestCtx->idTestStep);
    32553313
     
    33133371        Bs3TestFailedF("Expected uMemOp %.*Rhxs, got %.*Rhxs", cbMemOp, &MemOpExpect, cbMemOp, puMemOpAlias);
    33143372
    3315     /* Most-not-all of this will be removed once debugged */
    3316     if (cErrors != Bs3TestSubErrorCount()) Bs3TestFailedF("While testing mask mode %s, Spec=%#RX32, Expc=%#RX32, Impl=%#RX32, Comb=%#RX32, Mask=%#RX32, Umsk=%#RX32, This=%#RX32, uMxCsr=%#RX32, uExpectedMxCsr=%#RX32, save=%#RX32, ixcp=%#RX32", pszMaskType, uSpecifiedMask, uExpectedMask, uImpliedMask, uCombinedMask, uMaskedMask, uUnmaskedMask, uThisMask, uMxCsr, uExpectedMxCsr, uExpectedMxCsr_orig, uInitialExceptions);
     3373    if (cErrors != Bs3TestSubErrorCount())
     3374        Bs3TestFailedF("Mask mode %s, mask=%#RX32, in-exceptions=%#RX32, in-MxCsr=%#RX32, expect-MxCsr=%#RX32", pszMaskType, uThisMask, uInitialExceptions, uMxCsr, uExpectedMxCsr);
    33173375   }
    33183376
     
    38453903     * Infinity.
    38463904     */
    3847     /* 5*/{ { /*src2     */ { FP64_INF(0), FP64_0(0), FP64_0(0), FP64_0(0) } },
    3848             { /*src1     */ { FP64_INF(1), FP64_0(0), FP64_0(0), FP64_0(0) } },
    3849             { /* =>      */ { FP64_INF(1), FP64_0(0), FP64_0(0), FP64_0(0) } },
     3905     /*5*/{ { /*src2     */ { FP64_INF(0), FP64_0(0), FP64_0(0), FP64_0(0) } },
     3906            { /*src1     */ { FP64_INF(1),  FP64_0(0), FP64_0(0), FP64_0(0) } },
     3907            { /* =>      */ { FP64_QNAN(1), FP64_0(0), FP64_0(0), FP64_0(0) } },
    38503908              /*mxcsr:in */ X86_MXCSR_DM | X86_MXCSR_ZM | X86_MXCSR_OM | X86_MXCSR_UM | X86_MXCSR_PM,
    38513909              /*128:out  */ X86_MXCSR_DM | X86_MXCSR_ZM | X86_MXCSR_OM | X86_MXCSR_UM | X86_MXCSR_PM | X86_MXCSR_IE,
    38523910              /*256:out  */ X86_MXCSR_DM | X86_MXCSR_ZM | X86_MXCSR_OM | X86_MXCSR_UM | X86_MXCSR_PM | X86_MXCSR_IE,
    38533911              /*xcpt?    */ true, true },
    3854           { { /*src2     */ { FP64_0(0), FP64_INF(1), FP64_0(0), FP64_0(0) } },
    3855             { /*src1     */ { FP64_0(0), FP64_INF(0), FP64_0(0), FP64_0(0) } },
    3856             { /* =>      */ { FP64_0(0), FP64_INF(0), FP64_0(0), FP64_0(0) } },
     3912          { { /*src2     */ { FP64_0(0), FP64_INF(1),  FP64_0(0), FP64_0(0) } },
     3913            { /*src1     */ { FP64_0(0), FP64_INF(0),  FP64_0(0), FP64_0(0) } },
     3914            { /* =>      */ { FP64_0(0), FP64_QNAN(1), FP64_0(0), FP64_0(0) } },
    38573915              /*mxcsr:in */ X86_MXCSR_DM | X86_MXCSR_ZM | X86_MXCSR_OM | X86_MXCSR_UM | X86_MXCSR_PM | X86_MXCSR_FZ | X86_MXCSR_RC_DOWN,
    38583916              /*128:out  */ X86_MXCSR_DM | X86_MXCSR_ZM | X86_MXCSR_OM | X86_MXCSR_UM | X86_MXCSR_PM | X86_MXCSR_FZ | X86_MXCSR_RC_DOWN | X86_MXCSR_IE,
    38593917              /*256:out  */ X86_MXCSR_DM | X86_MXCSR_ZM | X86_MXCSR_OM | X86_MXCSR_UM | X86_MXCSR_PM | X86_MXCSR_FZ | X86_MXCSR_RC_DOWN | X86_MXCSR_IE,
    38603918              /*xcpt?    */ true, true },
    3861           { { /*src2     */ { FP64_0(0), FP64_INF(1), FP64_0(0), FP64_0(0) } },
    3862             { /*src1     */ { FP64_0(0), FP64_INF(0), FP64_0(0), FP64_0(0) } },
    3863             { /* =>      */ { FP64_0(0), FP64_INF(0), FP64_0(0), FP64_0(0) } },
     3919          { { /*src2     */ { FP64_0(0), FP64_INF(1),  FP64_0(0), FP64_0(0) } },
     3920            { /*src1     */ { FP64_0(0), FP64_INF(0),  FP64_0(0), FP64_0(0) } },
     3921            { /* =>      */ { FP64_0(0), FP64_QNAN(1), FP64_0(0), FP64_0(0) } },
    38643922              /*mxcsr:in */ X86_MXCSR_DM | X86_MXCSR_ZM | X86_MXCSR_OM | X86_MXCSR_UM | X86_MXCSR_PM | X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_RC_UP,
    38653923              /*128:out  */ X86_MXCSR_DM | X86_MXCSR_ZM | X86_MXCSR_OM | X86_MXCSR_UM | X86_MXCSR_PM | X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_RC_UP | X86_MXCSR_IE,
     
    38853943    /*10*/{ { /*src2     */ { FP64_0(0), FP64_NORM_MAX(1), FP64_0(0), FP64_NORM_MAX(1) } },
    38863944            { /*src1     */ { FP64_0(0), FP64_NORM_MAX(1), FP64_0(0), FP64_NORM_MAX(1) } },
    3887             { /* =>      */ { FP64_0(0), FP64_0(0),        FP64_0(0), FP64_0(0)        } },
     3945            { /* =>      */ { FP64_0(0), FP64_INF(1),      FP64_0(0), FP64_INF(1)      } },
    38883946              /*mxcsr:in */ 0,
    3889               /*128:out  */ X86_MXCSR_OE,
    3890               /*256:out  */ X86_MXCSR_OE,
     3947              /*128:out  */ X86_MXCSR_OE | X86_MXCSR_PE | BS3_MXCSR_PE_FUZZY /* i7-10700, IEM */,
     3948              /*256:out  */ X86_MXCSR_OE | X86_MXCSR_PE | BS3_MXCSR_PE_FUZZY /* i7-10700, IEM */,
    38913949              /*xcpt?    */ true, true },
    38923950          { { /*src2     */ { FP64_NORM_MAX(0), FP64_NORM_MAX(0), FP64_0(0), FP64_0(0) } },
    38933951            { /*src1     */ { FP64_NORM_MAX(0), FP64_NORM_MAX(1), FP64_0(0), FP64_0(0) } },
    3894             { /* =>      */ { FP64_NORM_MAX(0), FP64_NORM_MAX(1), FP64_0(0), FP64_0(0) } },
     3952            { /* =>      */ { FP64_INF(0),      FP64_0(0),        FP64_0(0), FP64_0(0) } },
    38953953              /*mxcsr:in */ 0,
    3896               /*128:out  */ X86_MXCSR_OE,
    3897               /*256:out  */ X86_MXCSR_OE,
     3954              /*128:out  */ X86_MXCSR_OE | X86_MXCSR_PE | BS3_MXCSR_PE_FUZZY /* i7-10700, IEM */,
     3955              /*256:out  */ X86_MXCSR_OE | X86_MXCSR_PE | BS3_MXCSR_PE_FUZZY /* i7-10700, IEM */,
    38983956              /*xcpt?    */ true, true },
    38993957          { { /*src2     */ { FP64_NORM_MAX(0), FP64_NORM_MIN(1),                     FP64_0(0), FP64_NORM_MAX(0) } },
     
    39013959            { /* =>      */ { FP64_INF(0),      FP64_V(1, 0, FP32_EXP_NORM_MIN + 1),  FP64_0(0), FP64_INF(0)      } },
    39023960              /*mxcsr:in */ X86_MXCSR_OM | X86_MXCSR_PM | X86_MXCSR_DAZ | X86_MXCSR_FZ,
    3903               /*128:out  */ X86_MXCSR_OM | X86_MXCSR_PM | X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_OE | X86_MXCSR_PE,
    3904               /*256:out  */ X86_MXCSR_OM | X86_MXCSR_PM | X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_OE | X86_MXCSR_PE,
     3961              /*128:out  */ X86_MXCSR_OM | X86_MXCSR_PM | X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_OE | X86_MXCSR_PE | BS3_MXCSR_PE_FUZZY /* i7-10700, IEM */,
     3962              /*256:out  */ X86_MXCSR_OM | X86_MXCSR_PM | X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_OE | X86_MXCSR_PE | BS3_MXCSR_PE_FUZZY /* i7-10700, IEM */,
    39053963              /*xcpt?    */ false, false },
    39063964          { { /*src2     */ { FP64_NORM_MIN(1),                     FP64_NORM_MAX(0), FP64_NORM_MAX(0), FP64_0(0) } },
     
    39083966            { /* =>      */ { FP64_V(1, 0, FP32_EXP_NORM_MIN + 1),  FP64_INF(0),      FP64_0(0),        FP64_0(0) } },
    39093967              /*mxcsr:in */ X86_MXCSR_OM | X86_MXCSR_PM | X86_MXCSR_FZ,
    3910               /*128:out  */ X86_MXCSR_OM | X86_MXCSR_PM | X86_MXCSR_FZ | X86_MXCSR_OE | X86_MXCSR_PE,
    3911               /*256:out  */ X86_MXCSR_OM | X86_MXCSR_PM | X86_MXCSR_FZ | X86_MXCSR_OE | X86_MXCSR_PE,
     3968              /*128:out  */ X86_MXCSR_OM | X86_MXCSR_PM | X86_MXCSR_FZ | X86_MXCSR_OE | X86_MXCSR_PE | BS3_MXCSR_PE_FUZZY /* i7-10700, IEM */,
     3969              /*256:out  */ X86_MXCSR_OM | X86_MXCSR_PM | X86_MXCSR_FZ | X86_MXCSR_OE | X86_MXCSR_PE | BS3_MXCSR_PE_FUZZY /* i7-10700, IEM */,
    39123970              /*xcpt?    */ false, false },
    39133971          { { /*src2     */ { FP64_NORM_MAX(0), FP64_NORM_MAX(1), FP64_NORM_MAX(1), FP64_NORM_MAX(0) } },
     
    39153973            { /* =>      */ { FP64_NORM_MAX(0), FP64_NORM_MAX(1), FP64_NORM_MAX(1), FP64_NORM_MAX(0) } },
    39163974              /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_RC_ZERO,
    3917               /*128:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_RC_ZERO | X86_MXCSR_OE | X86_MXCSR_PE,
    3918               /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_RC_ZERO | X86_MXCSR_OE | X86_MXCSR_PE,
     3975              /*128:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_RC_ZERO | X86_MXCSR_OE | X86_MXCSR_PE | BS3_MXCSR_PE_FUZZY /* i7-10700, IEM */,
     3976              /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_RC_ZERO | X86_MXCSR_OE | X86_MXCSR_PE | BS3_MXCSR_PE_FUZZY /* i7-10700, IEM */,
    39193977              /*xcpt?    */ false, false },
    39203978          { { /*src2     */ { FP64_NORM_SAFE_INT_MIN(0),                            FP64_NORM_MAX(0), FP64_0(0), FP64_NORM_SAFE_INT_MAX(1)                                } },
     
    39894047    /*24*/{ { /*src2     */ { FP64_DENORM_MAX(0), FP64_0(0), FP64_0(0), FP64_0(0) } },
    39904048            { /*src1     */ { FP64_0(0),          FP64_0(0), FP64_0(0), FP64_0(0) } },
    3991             { /* =>      */ { FP64_0(0),          FP64_0(0), FP64_0(0), FP64_0(0) } },
    3992               /*mxcsr:in */ 0,
    3993               /*128:out  */ X86_MXCSR_DE,
    3994               /*256:out  */ X86_MXCSR_DE,
     4049            { /* =>      */ { FP64_DENORM_MAX(0), FP64_0(0), FP64_0(0), FP64_0(0) } },
     4050              /*mxcsr:in */ 0,                            /* DM off, UM can vary */
     4051              /*128:out  */ BS3_MXCSR_DM_FIXED | X86_MXCSR_DE,
     4052              /*256:out  */ BS3_MXCSR_DM_FIXED | X86_MXCSR_DE,
    39954053              /*xcpt?    */ true, true },
    3996           { { /*src2     */ { FP64_0(0), FP64_0(0),          FP64_0(0), FP64_0(0) } },
    3997             { /*src1     */ { FP64_0(0), FP64_DENORM_MAX(0), FP64_0(0), FP64_0(0) } },
    3998             { /* =>      */ { FP64_0(0), FP64_DENORM_MAX(0), FP64_0(0), FP64_0(0) } },
    3999               /*mxcsr:in */ X86_MXCSR_XCPT_MASK,
    4000               /*128:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE,
    4001               /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE,
    4002               /*xcpt?    */ false, false },
     4054#ifdef TODO_X86_MXCSR_UE_HW /** @todo THIS FAILS ON IEM: X86_MXCSR_UE not set in 128:out or 256:out */
     4055          /* this is what works on HW (i7-10700) (same as below, plus out:_UE) */
     4056 /*--|25*/{ { /*src2     */ { FP64_DENORM_MAX(0), FP64_0(0), FP64_0(0), FP64_0(0) } },
     4057            { /*src1     */ { FP64_0(0),          FP64_0(0), FP64_0(0), FP64_0(0) } },
     4058            { /* =>      */ { FP64_DENORM_MAX(0), FP64_0(0), FP64_0(0), FP64_0(0) } },
     4059              /*mxcsr:in */ X86_MXCSR_DM,                 /* DM on,  UM off */
     4060              /*128:out  */ X86_MXCSR_DM | BS3_MXCSR_DM_FIXED | BS3_MXCSR_UM_FIXED | X86_MXCSR_DE | X86_MXCSR_UE,
     4061              /*256:out  */ X86_MXCSR_DM | BS3_MXCSR_DM_FIXED | BS3_MXCSR_UM_FIXED | X86_MXCSR_DE | X86_MXCSR_UE,
     4062              /*xcpt?    */ true, true },
     4063#endif /* TODO_X86_MXCSR_UE_HW */
     4064#ifdef TODO_X86_MXCSR_UE_IEM /** @todo THIS FAILS ON HW: X86_MXCSR_UE not set in 128:out or 256:out */
     4065          /* for comparison, this is what works on IEM (same as above, minus out:_UE) */
     4066 /*--|25*/{ { /*src2     */ { FP64_DENORM_MAX(0), FP64_0(0), FP64_0(0), FP64_0(0) } },
     4067            { /*src1     */ { FP64_0(0),          FP64_0(0), FP64_0(0), FP64_0(0) } },
     4068            { /* =>      */ { FP64_DENORM_MAX(0), FP64_0(0), FP64_0(0), FP64_0(0) } },
     4069              /*mxcsr:in */ X86_MXCSR_DM,                 /* DM on,  UM off */
     4070              /*128:out  */ X86_MXCSR_DM | BS3_MXCSR_DM_FIXED | BS3_MXCSR_UM_FIXED | X86_MXCSR_DE,
     4071              /*256:out  */ X86_MXCSR_DM | BS3_MXCSR_DM_FIXED | BS3_MXCSR_UM_FIXED | X86_MXCSR_DE,
     4072              /*xcpt?    */ true, true },
     4073#endif /* TODO_X86_MXCSR_UE_IEM */
     4074 /*25|26*/{ { /*src2     */ { FP64_DENORM_MAX(0), FP64_0(0), FP64_0(0), FP64_0(0) } },
     4075            { /*src1     */ { FP64_0(0),          FP64_0(0), FP64_0(0), FP64_0(0) } },
     4076            { /* =>      */ { FP64_DENORM_MAX(0), FP64_0(0), FP64_0(0), FP64_0(0) } },
     4077              /*mxcsr:in */ X86_MXCSR_DM | X86_MXCSR_UM,  /* DM on,  UM on */
     4078              /*128:out  */ X86_MXCSR_DM | X86_MXCSR_UM | BS3_MXCSR_DM_FIXED | BS3_MXCSR_UM_FIXED | X86_MXCSR_DE,
     4079              /*256:out  */ X86_MXCSR_DM | X86_MXCSR_UM | BS3_MXCSR_DM_FIXED | BS3_MXCSR_UM_FIXED | X86_MXCSR_DE,
     4080              /*xcpt?    */ true, true },
     4081 /*26|27*/{ { /*src2     */ { FP64_0(0), FP64_0(0), FP64_0(0),          FP64_0(0) } },
     4082            { /*src1     */ { FP64_0(0), FP64_0(0), FP64_DENORM_MAX(0), FP64_0(0) } },
     4083            { /* =>      */ { FP64_0(0), FP64_0(0), FP64_DENORM_MAX(0), FP64_0(0) } },
     4084              /*mxcsr:in */ 0,                            /* DM off, UM can vary */
     4085              /*128:out  */ 0,
     4086              /*256:out  */ BS3_MXCSR_DM_FIXED | X86_MXCSR_DE,
     4087              /*xcpt?    */ false, false },
     4088#ifdef TODO_X86_MXCSR_UE_HW /** @todo THIS FAILS ON IEM: X86_MXCSR_UE not set in 128:out or 256:out */
     4089          /* this is what works on HW (i7-10700) (same as below, plus 256:out:_UE) */
     4090 /*--|28*/{ { /*src2     */ { FP64_0(0), FP64_0(0), FP64_0(0),          FP64_0(0) } },
     4091            { /*src1     */ { FP64_0(0), FP64_0(0), FP64_DENORM_MAX(0), FP64_0(0) } },
     4092            { /* =>      */ { FP64_0(0), FP64_0(0), FP64_DENORM_MAX(0), FP64_0(0) } },
     4093              /*mxcsr:in */ X86_MXCSR_DM,                 /* DM on,  UM off */
     4094              /*128:out  */ X86_MXCSR_DM,
     4095              /*256:out  */ X86_MXCSR_DM | BS3_MXCSR_DM_FIXED | BS3_MXCSR_UM_FIXED | X86_MXCSR_DE | X86_MXCSR_UE,
     4096              /*xcpt?    */ true, true },
     4097#endif /* TODO_X86_MXCSR_UE_HW */
     4098#ifdef TODO_X86_MXCSR_UE_IEM
     4099          /* for comparison, this is what works on IEM (same as above, minus 256:out:_UE) */
     4100 /*--|28*/{ { /*src2     */ { FP64_0(0), FP64_0(0), FP64_0(0),          FP64_0(0) } },
     4101            { /*src1     */ { FP64_0(0), FP64_0(0), FP64_DENORM_MAX(0), FP64_0(0) } },
     4102            { /* =>      */ { FP64_0(0), FP64_0(0), FP64_DENORM_MAX(0), FP64_0(0) } },
     4103              /*mxcsr:in */ X86_MXCSR_DM,                 /* DM on,  UM off */
     4104              /*128:out  */ X86_MXCSR_DM,
     4105              /*256:out  */ X86_MXCSR_DM | BS3_MXCSR_DM_FIXED | BS3_MXCSR_UM_FIXED | X86_MXCSR_DE,
     4106              /*xcpt?    */ true, true },
     4107#endif /* TODO_X86_MXCSR_UE_IEM */
     4108 /*27|29*/{ { /*src2     */ { FP64_0(0), FP64_0(0), FP64_0(0),          FP64_0(0) } },
     4109            { /*src1     */ { FP64_0(0), FP64_0(0), FP64_DENORM_MAX(0), FP64_0(0) } },
     4110            { /* =>      */ { FP64_0(0), FP64_0(0), FP64_DENORM_MAX(0), FP64_0(0) } },
     4111              /*mxcsr:in */ X86_MXCSR_DM | X86_MXCSR_UM,  /* DM on,  UM on */
     4112              /*128:out  */ X86_MXCSR_DM | X86_MXCSR_UM,
     4113              /*256:out  */ X86_MXCSR_DM | X86_MXCSR_UM | BS3_MXCSR_DM_FIXED | BS3_MXCSR_UM_FIXED | X86_MXCSR_DE,
     4114              /*xcpt?    */ true, true },
    40034115          { { /*src2     */ { FP64_DENORM_MIN(0), FP64_DENORM_MIN(0), FP64_DENORM_MAX(0), FP64_DENORM_MAX(0) } },
    40044116            { /*src1     */ { FP64_DENORM_MAX(0), FP64_DENORM_MIN(0), FP64_DENORM_MAX(0), FP64_DENORM_MIN(0) } },
     
    40624174    static BS3CPUINSTR4_TEST1_MODE_T const s_aTests[3] = BS3CPUINSTR4_TEST1_MODES_INIT(s_aTests16, s_aTests32, s_aTests64);
    40634175    unsigned const                         iTest       = BS3CPUINSTR4_TEST_MODES_INDEX(bMode);
    4064     return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests,
     4176    return bs3CpuInstr4_WorkerTestType1A(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests,
    40654177                                        g_aXcptConfig2, RT_ELEMENTS(g_aXcptConfig2));
    40664178}
     
    96439755            { /* =>      */ { FP64_V(0, 0x618618618618, 0)/*-5.29XYZe-310*/, FP64_DENORM_MIN(0),  FP64_RAND_V1(1), FP64_RAND_V3(0) } },
    96449756             /*mxcsr:in */ X86_MXCSR_XCPT_MASK & ~X86_MXCSR_UM,
    9645              /*128:out  */ (X86_MXCSR_XCPT_MASK & ~X86_MXCSR_UM) | X86_MXCSR_PE | X86_MXCSR_DE | X86_MXCSR_UE,
     9757             /*128:out  */ (X86_MXCSR_XCPT_MASK & ~X86_MXCSR_UM) | X86_MXCSR_PE | X86_MXCSR_DE | X86_MXCSR_UE, // | BS3_MXCSR_PE_FUZZY /* IEM: when converted to Worker1A */
    96469758             /*256:out  */ (X86_MXCSR_XCPT_MASK & ~X86_MXCSR_UM) | X86_MXCSR_PE | X86_MXCSR_DE | X86_MXCSR_UE,
    96479759             /*xcpt?    */ true, true },
     
    1366513777BS3_DECL_FAR(uint8_t) bs3CpuInstr4_v_sqrtps(uint8_t bMode)
    1366613778{
    13667 #define FP32_x8_UNUSED FP32_1(0), FP32_1(0), FP32_1(0), FP32_1(0), FP32_1(0), FP32_1(0), FP32_1(0), FP32_1(0)
    1366813779    static BS3CPUINSTR4_TEST1_VALUES_PS_T const s_aValues[] =
    1366913780    {
     
    1367213783     */
    1367313784    /* 0*/{ { /*src1     */ { FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(1) } },
    13674             { /*unused   */ { FP32_x8_UNUSED } },
     13785            { /*unused   */ { FP32_ROW_UNUSED } },
    1367513786            { /* =>      */ { FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(1) } },
    1367613787              /*mxcsr:in */ X86_MXCSR_XCPT_MASK,
     
    1367913790              /*xcpt?    */ false, false },
    1368013791          { { /*src1     */ { FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(1) } },
    13681             { /*unused   */ { FP32_x8_UNUSED } },
     13792            { /*unused   */ { FP32_ROW_UNUSED } },
    1368213793            { /* =>      */ { FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(1) } },
    1368313794              /*mxcsr:in */ X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_RC_UP,
     
    1368613797              /*xcpt?    */ false, false },
    1368713798          { { /*src1     */ { FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(1) } },
    13688             { /*unused   */ { FP32_x8_UNUSED } },
     13799            { /*unused   */ { FP32_ROW_UNUSED } },
    1368913800            { /* =>      */ { FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(1) } },
    1369013801              /*mxcsr:in */ X86_MXCSR_RC_ZERO,
     
    1369313804              /*xcpt?    */ false, false },
    1369413805          { { /*src1     */ { FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(1) } },
    13695             { /*unused   */ { FP32_x8_UNUSED } },
     13806            { /*unused   */ { FP32_ROW_UNUSED } },
    1369613807            { /* =>      */ { FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(1) } },
    1369713808              /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_RC_DOWN,
     
    1370313814     */
    1370413815    /* 4*/{ { /*src1     */ { FP32_INF(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_INF(1),  FP32_0(0), FP32_0(0), FP32_0(0) } },
    13705             { /*unused   */ { FP32_x8_UNUSED } },
     13816            { /*unused   */ { FP32_ROW_UNUSED } },
    1370613817            { /* =>      */ { FP32_INF(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_QNAN(1), FP32_0(0), FP32_0(0), FP32_0(0) } },
    1370713818              /*mxcsr:in */ 0,
     
    1371313824     */
    1371413825    /* 5*/{ { /*src1     */ { FP32_0(0), FP32_1(0), FP32_1(0), FP32_0(1), FP32_1(0), FP32_0(0), FP32_1(0), FP32_2(0)                            } },
    13715             { /*unused   */ { FP32_x8_UNUSED } },
     13826            { /*unused   */ { FP32_ROW_UNUSED } },
    1371613827            { /* =>      */ { FP32_0(0), FP32_1(0), FP32_1(0), FP32_0(1), FP32_1(0), FP32_0(0), FP32_1(0), FP32_V(0, 0x3504f3, 0x7f)/*sqrt(2)*/ } },
    1371713828              /*mxcsr:in */ 0,
     
    1372013831              /*xcpt?    */ false, true },
    1372113832          { { /*src1     */ { FP32_0(0), FP32_1(0), FP32_1(0), FP32_0(1), FP32_1(0), FP32_0(0), FP32_1(0), FP32_2(0)                            } },
    13722             { /*unused   */ { FP32_x8_UNUSED } },
     13833            { /*unused   */ { FP32_ROW_UNUSED } },
    1372313834            { /* =>      */ { FP32_0(0), FP32_1(0), FP32_1(0), FP32_0(1), FP32_1(0), FP32_0(0), FP32_1(0), FP32_V(0, 0x3504f3, 0x7f)/*sqrt(2)*/ } },
    1372413835              /*mxcsr:in */ X86_MXCSR_PM | X86_MXCSR_RC_DOWN,
     
    1372713838              /*xcpt?    */ false, false },
    1372813839          { { /*src1     */ { FP32_0(0), FP32_1(0), FP32_1(0), FP32_0(1), FP32_1(0), FP32_0(0), FP32_1(0), FP32_2(0)                             } },
    13729             { /*unused   */ { FP32_x8_UNUSED } },
     13840            { /*unused   */ { FP32_ROW_UNUSED } },
    1373013841            { /* =>      */ { FP32_0(0), FP32_1(0), FP32_1(0), FP32_0(1), FP32_1(0), FP32_0(0), FP32_1(0), FP32_V(0, 0x3504f4, 0x7f)/*sqrt^(2)*/ } },
    1373113842              /*mxcsr:in */ X86_MXCSR_PM | X86_MXCSR_RC_UP,
     
    1373413845              /*xcpt?    */ false, false },
    1373513846          { { /*src1     */ { FP32_0(0), FP32_1(0), FP32_1(0), FP32_0(1), FP32_1(0), FP32_0(0), FP32_1(0), FP32_2(0)                            } },
    13736             { /*unused   */ { FP32_x8_UNUSED } },
     13847            { /*unused   */ { FP32_ROW_UNUSED } },
    1373713848            { /* =>      */ { FP32_0(0), FP32_1(0), FP32_1(0), FP32_0(1), FP32_1(0), FP32_0(0), FP32_1(0), FP32_V(0, 0x3504f3, 0x7f)/*sqrt(2)*/ } },
    1373813849              /*mxcsr:in */ X86_MXCSR_PM | X86_MXCSR_RC_ZERO,
     
    1374113852              /*xcpt?    */ false, false },
    1374213853          { { /*src1     */ { FP32_0(0), FP32_1(0), FP32_1(0), FP32_0(1), FP32_1(0), FP32_0(0), FP32_1(0), FP32_2(0)                            } },
    13743             { /*unused   */ { FP32_x8_UNUSED } },
     13854            { /*unused   */ { FP32_ROW_UNUSED } },
    1374413855            { /* =>      */ { FP32_0(0), FP32_1(0), FP32_1(0), FP32_0(1), FP32_1(0), FP32_0(0), FP32_1(0), FP32_V(0, 0x3504f3, 0x7f)/*sqrt(2)*/ } },
    1374513856              /*mxcsr:in */ X86_MXCSR_PM | X86_MXCSR_FZ | X86_MXCSR_DAZ,
     
    1375113862     */
    1375213863    /*10*/{ { /*src1     */ { FP32_NORM_V0(0), FP32_NORM_V1(0), FP32_NORM_V2(0), FP32_NORM_V3(0), FP32_NORM_V4(0), FP32_NORM_V5(0), FP32_NORM_V6(0), FP32_NORM_V7(0) } },
    13753             { /*unused   */ { FP32_x8_UNUSED } },
     13864            { /*unused   */ { FP32_ROW_UNUSED } },
    1375413865            { /* =>      */ { FP32_V(0,0x1ccf5c,0x40)/*sqrt(FP32_NORM_V0)*/,
    1375513866                              FP32_V(0,0x293fdb,0x97)/*sqrt(FP32_NORM_V1)*/,
     
    1377213883                              FP32_V(0,0x43ffff,0x7c)/*(7/16)^2-epsilon*/,
    1377313884                              FP32_V(0,0x6f4841,0x8c)/*123.75^2+epsilon*/ } },
    13774             { /*unused   */ { FP32_x8_UNUSED } },
     13885            { /*unused   */ { FP32_ROW_UNUSED } },
    1377513886            { /* =>      */ { FP32_V(0,0x380000,0x83)/*23.0*/,
    1377613887                              FP32_V(0,0x0,0x83)/*16.0*/,
     
    1379313904                              FP32_V(0,0x43ffff,0x7c)/*(7/16)^2-epsilon*/,
    1379413905                              FP32_V(0,0x6f4841,0x8c)/*123.75^2+epsilon*/ } },
    13795             { /*unused   */ { FP32_x8_UNUSED } },
     13906            { /*unused   */ { FP32_ROW_UNUSED } },
    1379613907            { /* =>      */ { FP32_V(0,0x380000,0x83)/*23.0*/,
    1379713908                              FP32_V(0,0x0,0x83)/*16.0*/,
     
    1381413925                              FP32_V(0,0x43ffff,0x7c)/*(7/16)^2-epsilon*/,
    1381513926                              FP32_V(0,0x6f4841,0x8c)/*123.75^2+epsilon*/ } },
    13816             { /*unused   */ { FP32_x8_UNUSED } },
     13927            { /*unused   */ { FP32_ROW_UNUSED } },
    1381713928            { /* =>      */ { FP32_V(0,0x380000,0x83)/*23.0*/,
    1381813929                              FP32_V(0,0x0,0x83)/*16.0*/,
     
    1383513946                              FP32_V(0,0x43ffff,0x7c)/*(7/16)^2-epsilon*/,
    1383613947                              FP32_V(0,0x6f4841,0x8c)/*123.75^2+epsilon*/ } },
    13837             { /*unused   */ { FP32_x8_UNUSED } },
     13948            { /*unused   */ { FP32_ROW_UNUSED } },
    1383813949            { /* =>      */ { FP32_V(0,0x380000,0x83)/*23.0*/,
    1383913950                              FP32_V(0,0x0,0x83)/*16.0*/,
     
    1384813959              /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_PE | X86_MXCSR_RC_ZERO,
    1384913960              /*xcpt?    */ false, false },
    13850 #ifdef TODO_X86_MXCSR_PE /** @todo THIS FAILS ON IEM: X86_MXCSR_PE unexpectedly set in unmasked 256:out */
    13851  /*--|15*/{ { /*src1     */ { FP32_NORM_MAX(0),
     13961          { { /*src1     */ { FP32_NORM_MAX(0),
    1385213962                              FP32_NORM_MIN(0),
    1385313963                              FP32_NORM_SAFE_INT_MAX(0),
     
    1385713967                              FP32_NORM_SAFE_INT_MAX(1),
    1385813968                              FP32_NORM_SAFE_INT_MIN(1) } },
    13859             { /*unused   */ { FP32_x8_UNUSED } },
     13969            { /*unused   */ { FP32_ROW_UNUSED } },
    1386013970            { /* =>      */ { FP32_V(0,0x7fffff,0xbe)/*sqrt(FP32_NORM_MAX)*/,
    1386113971                              FP32_V(0,0x0,0x40)/*sqrt(FP32_NORM_MIN)*/,
     
    1386813978              /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DAZ | X86_MXCSR_FZ,
    1386913979              /*128:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_PE,
    13870               /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_PE | X86_MXCSR_IE,
    13871               /*xcpt?    */ false, false },
    13872 #endif /* TODO_X86_MXCSR_PE */
     13980              /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_PE | X86_MXCSR_IE | BS3_MXCSR_PE_FUZZY /* IEM */,
     13981              /*xcpt?    */ false, false },
    1387313982    /** @todo More Normals. */
    1387413983   /*
    1387513984    * Denormals.
    1387613985    */
    13877 #ifdef TODO_X86_MXCSR_PE /** @todo THESE FAIL ON IEM: X86_MXCSR_PE unexpectedly set in unmasked 256:out */
    13878  /*--|16*/{ { /*src1     */ { FP32_DENORM_MAX(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MAX(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
    13879             { /*unused   */ { FP32_x8_UNUSED } },
     13986    /*16*/{ { /*src1     */ { FP32_DENORM_MAX(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MAX(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
     13987            { /*unused   */ { FP32_ROW_UNUSED } },
    1388013988            { /* =>      */ { FP32_V(0,0x7fffff,0x3f), FP32_V(0,0x7fffff,0x3f), FP32_0(0), FP32_0(1), FP32_QNAN(1),       FP32_QNAN(1),       FP32_0(1), FP32_0(0) } },
    1388113989              /*mxcsr:in */ 0,
    1388213990              /*128:out  */ X86_MXCSR_DE | X86_MXCSR_PE,
    13883               /*256:out  */ X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE,
     13991              /*256:out  */ X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE | BS3_MXCSR_PE_FUZZY /* IEM */,
    1388413992              /*xcpt?    */ true, true },
    13885  /*--|17*/{ { /*src1     */ { FP32_DENORM_MAX(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MAX(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
    13886             { /*unused   */ { FP32_x8_UNUSED } },
    13887             { /* =>      */ { FP32_V(0,0x7fffff,0x3f), FP32_V(0,0x7fffff,0x3f), FP32_0(0), FP32_0(1), FP32_QNAN(1),       FP32_QNAN(1),       FP32_0(1), FP32_0(0) } },
    13888               /*mxcsr:in */ X86_MXCSR_DM,
    13889               /*128:out  */ X86_MXCSR_DM | X86_MXCSR_DE | X86_MXCSR_PE,
    13890               /*256:out  */ X86_MXCSR_DM | X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE,
    13891               /*xcpt?    */ true, true },
    13892  /*--|18*/{ { /*src1     */ { FP32_DENORM_MAX(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MAX(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
    13893             { /*unused   */ { FP32_x8_UNUSED } },
    13894             { /* =>      */ { FP32_V(0,0x7fffff,0x3f), FP32_V(0,0x7fffff,0x3f), FP32_0(0), FP32_0(1), FP32_QNAN(1),       FP32_QNAN(1),       FP32_0(1), FP32_0(0) } },
    13895               /*mxcsr:in */ X86_MXCSR_PM,
    13896               /*128:out  */ X86_MXCSR_PM | X86_MXCSR_DE | X86_MXCSR_PE,
    13897               /*256:out  */ X86_MXCSR_PM | X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE,
    13898               /*xcpt?    */ true, true },
    13899  /*--|19*/{ { /*src1     */ { FP32_DENORM_MAX(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MAX(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
    13900             { /*unused   */ { FP32_x8_UNUSED } },
    13901             { /* =>      */ { FP32_V(0,0x7fffff,0x3f), FP32_V(0,0x7fffff,0x3f), FP32_0(0), FP32_0(1), FP32_QNAN(1),       FP32_QNAN(1),       FP32_0(1), FP32_0(0) } },
    13902               /*mxcsr:in */ X86_MXCSR_DM | X86_MXCSR_PM,
    13903               /*128:out  */ X86_MXCSR_DM | X86_MXCSR_PM | X86_MXCSR_DE | X86_MXCSR_PE,
    13904               /*256:out  */ X86_MXCSR_DM | X86_MXCSR_PM | X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE,
    13905               /*xcpt?    */ false, true },
    13906  /*--|20*/{ { /*src1     */ { FP32_DENORM_MAX(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MAX(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
    13907             { /*unused   */ { FP32_x8_UNUSED } },
    13908             { /* =>      */ { FP32_V(0,0x7fffff,0x3f), FP32_V(0,0x7fffff,0x3f), FP32_0(0), FP32_0(1), FP32_QNAN(1),       FP32_QNAN(1),       FP32_0(1), FP32_0(0) } },
    13909               /*mxcsr:in */ X86_MXCSR_XCPT_MASK,
    13910               /*128:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_PE,
    13911               /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE,
    13912               /*xcpt?    */ false, false },
    13913  /*--|21*/{ { /*src1     */ { FP32_DENORM_MIN(0),      FP32_DENORM_MIN(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MIN(1), FP32_DENORM_MIN(1), FP32_0(1), FP32_0(0) } },
    13914             { /*unused   */ { FP32_x8_UNUSED } },
     13993          { { /*src1     */ { FP32_DENORM_MIN(0),      FP32_DENORM_MIN(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MIN(1), FP32_DENORM_MIN(1), FP32_0(1), FP32_0(0) } },
     13994            { /*unused   */ { FP32_ROW_UNUSED } },
    1391513995            { /* =>      */ { FP32_V(0,0x3504f3,0x34), FP32_V(0,0x3504f3,0x34), FP32_0(0), FP32_0(1), FP32_QNAN(1),       FP32_QNAN(1),       FP32_0(1), FP32_0(0) } },
    1391613996              /*mxcsr:in */ 0,
    1391713997              /*128:out  */ X86_MXCSR_DE | X86_MXCSR_PE,
    13918               /*256:out  */ X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE,
     13998              /*256:out  */ X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE | BS3_MXCSR_PE_FUZZY /* IEM */,
    1391913999              /*xcpt?    */ true, true },
    13920  /*--|22*/{ { /*src1     */ { FP32_DENORM_MIN(0),      FP32_DENORM_MIN(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MIN(1), FP32_DENORM_MIN(1), FP32_0(1), FP32_0(0) } },
    13921             { /*unused   */ { FP32_x8_UNUSED } },
    13922             { /* =>      */ { FP32_V(0,0x3504f3,0x34), FP32_V(0,0x3504f3,0x34), FP32_0(0), FP32_0(1), FP32_QNAN(1),       FP32_QNAN(1),       FP32_0(1), FP32_0(0) } },
    13923               /*mxcsr:in */ X86_MXCSR_XCPT_MASK,
    13924               /*128:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_PE,
    13925               /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE,
    13926               /*xcpt?    */ false, false },
    13927  /*--|23*/{ { /*src1     */ { FP32_DENORM_MIN(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MIN(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
    13928             { /*unused   */ { FP32_x8_UNUSED } },
     14000          { { /*src1     */ { FP32_DENORM_MIN(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MIN(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
     14001            { /*unused   */ { FP32_ROW_UNUSED } },
    1392914002            { /* =>      */ { FP32_V(0,0x3504f3+1,0x34), FP32_V(0,0x7fffff,0x3f), FP32_0(0), FP32_0(1), FP32_QNAN(1),     FP32_QNAN(1),       FP32_0(1), FP32_0(0) } },
    1393014003              /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_RC_UP,
    1393114004              /*128:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_PE | X86_MXCSR_RC_UP,
    13932               /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE | X86_MXCSR_RC_UP,
    13933               /*xcpt?    */ false, false },
    13934  /*--|24*/{ { /*src1     */ { FP32_DENORM_MIN(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MIN(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
    13935             { /*unused   */ { FP32_x8_UNUSED } },
     14005              /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE | X86_MXCSR_RC_UP | BS3_MXCSR_PE_FUZZY /* IEM */,
     14006              /*xcpt?    */ false, false },
     14007          { { /*src1     */ { FP32_DENORM_MIN(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MIN(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
     14008            { /*unused   */ { FP32_ROW_UNUSED } },
    1393614009            { /* =>      */ { FP32_V(0,0x3504f3,0x34), FP32_V(0,0x7fffff-1,0x3f), FP32_0(0), FP32_0(1), FP32_QNAN(1),     FP32_QNAN(1),       FP32_0(1), FP32_0(0) } },
    1393714010              /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_RC_DOWN,
    1393814011              /*128:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_PE | X86_MXCSR_RC_DOWN,
    13939               /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE | X86_MXCSR_RC_DOWN,
    13940               /*xcpt?    */ false, false },
    13941  /*--|25*/{ { /*src1     */ { FP32_DENORM_MIN(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MIN(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
    13942             { /*unused   */ { FP32_x8_UNUSED } },
     14012              /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE | X86_MXCSR_RC_DOWN | BS3_MXCSR_PE_FUZZY /* IEM */,
     14013              /*xcpt?    */ false, false },
     14014          { { /*src1     */ { FP32_DENORM_MIN(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MIN(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
     14015            { /*unused   */ { FP32_ROW_UNUSED } },
    1394314016            { /* =>      */ { FP32_V(0,0x3504f3,0x34), FP32_V(0,0x7fffff-1,0x3f), FP32_0(0), FP32_0(1), FP32_QNAN(1),     FP32_QNAN(1),       FP32_0(1), FP32_0(0) } },
    1394414017              /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_RC_ZERO,
    1394514018              /*128:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_PE | X86_MXCSR_RC_ZERO,
    13946               /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE | X86_MXCSR_RC_ZERO,
    13947               /*xcpt?    */ false, false },
    13948  /*--|26*/{ { /*src1     */ { FP32_DENORM_MIN(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MIN(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
    13949             { /*unused   */ { FP32_x8_UNUSED } },
     14019              /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE | X86_MXCSR_RC_ZERO | BS3_MXCSR_PE_FUZZY /* IEM */,
     14020              /*xcpt?    */ false, false },
     14021          { { /*src1     */ { FP32_DENORM_MIN(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MIN(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
     14022            { /*unused   */ { FP32_ROW_UNUSED } },
    1395014023            { /* =>      */ { FP32_V(0,0x3504f3,0x34), FP32_V(0,0x7fffff,0x3f), FP32_0(0), FP32_0(1), FP32_QNAN(1),       FP32_QNAN(1),       FP32_0(1), FP32_0(0) } },
    1395114024              /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_FZ,
    1395214025              /*128:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_PE | X86_MXCSR_FZ,
    13953               /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE | X86_MXCSR_FZ,
    13954               /*xcpt?    */ false, false },
    13955 #endif /* TODO_X86_MXCSR_PE */
    13956  /*15|27*/{ { /*src1     */ { FP32_DENORM_MIN(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MIN(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
    13957             { /*unused   */ { FP32_x8_UNUSED } },
     14026              /*256:out  */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DE | X86_MXCSR_IE | X86_MXCSR_PE | X86_MXCSR_FZ | BS3_MXCSR_PE_FUZZY /* IEM */,
     14027              /*xcpt?    */ false, false },
     14028          { { /*src1     */ { FP32_DENORM_MIN(0),      FP32_DENORM_MAX(0),      FP32_0(0), FP32_0(1), FP32_DENORM_MIN(1), FP32_DENORM_MAX(1), FP32_0(1), FP32_0(0) } },
     14029            { /*unused   */ { FP32_ROW_UNUSED } },
    1395814030            { /* =>      */ { FP32_0(0),               FP32_0(0),               FP32_0(0), FP32_0(1), FP32_0(1),          FP32_0(1),          FP32_0(1), FP32_0(0) } },
    1395914031              /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DAZ,
     
    1396614038     */
    1396714039    /** @todo Invalids. */
    13968  /*16|28*/ /* FP32_TABLE_D10_PS_INVALIDS */
     14040    /*23*/ /* FP32_TABLE_D10_PS_INVALIDS */
    1396914041    /** @todo Underflow, Precision; Rounding; FZ etc. */
    1397014042    };
    13971 #undef FP32_x8_UNUSED
    1397214043
    1397314044#define PASS_s_aValues RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues
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