- Timestamp:
- Sep 30, 2024 10:58:11 PM (5 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-4.c32
r106178 r106182 290 290 /** The maximum denormal value. */ 291 291 #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) 292 298 293 299 … … 2987 2993 2988 2994 /** 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 */ 3010 AssertCompile(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); 3011 AssertCompile((X86_MXCSR_ZERO_MASK & BS3_MXCSR_FIXED_MASK) == BS3_MXCSR_FIXED_MASK); 3012 AssertCompile((X86_MXCSR_ZERO_MASK & BS3_MXCSR_PE_FUZZY) == BS3_MXCSR_PE_FUZZY); 3013 /* Confirm bits we're 'stealing' do not overlap each other */ 3014 AssertCompile((BS3_MXCSR_FIXED_MASK & BS3_MXCSR_PE_FUZZY) == 0); 3015 3016 /** 2989 3017 * Worker for bs3CpuInstr4_WorkerTestType1 [new WIP version] 2990 3018 */ … … 3015 3043 uint32_t uSpecifiedMask, uExpectedMask, uImpliedMask, uCombinedMask, uMaskedMask, uUnmaskedMask, uThisMask; 3016 3044 uint32_t uExpectedMxCsr_orig, uExpectedExceptions, uExpectedUnmaskedExceptions, uInitialExceptions, uRandTmp; 3045 bool fFuzzyPE; 3046 uint32_t uForceOnMask, uForceOffMask; 3017 3047 const char *pszMaskType; 3018 3048 unsigned iMaskType; … … 3020 3050 3021 3051 /* 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 3028 3079 if (pTestCtx->cbOperand > 16) 3029 {3030 3080 uExpectedMxCsr = pValues->u256ExpectedMxCsr; 3031 fFpXcptExpected = pValues->f256FpXcptExpected;3032 }3033 3081 else 3034 {3035 3082 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; 3038 3089 3039 3090 /* … … 3062 3113 uExpectedMxCsr_orig = uExpectedMxCsr; 3063 3114 uInitialExceptions = pValues->uMxCsr & X86_MXCSR_XCPT_FLAGS; 3064 uSpecifiedMask = pValues->uMxCsr & X86_MXCSR_XCPT_MASK;3065 3115 uExpectedMask = uExpectedMxCsr_orig & X86_MXCSR_XCPT_MASK; 3066 3116 … … 3073 3123 uImpliedMask = (uExpectedMxCsr_orig & X86_MXCSR_XCPT_FLAGS) << X86_MXCSR_XCPT_MASK_SHIFT; 3074 3124 uCombinedMask = uSpecifiedMask | uImpliedMask; 3075 uMaskedMask = X86_MXCSR_XCPT_MASK ;3076 uUnmaskedMask = 0 ;3125 uMaskedMask = X86_MXCSR_XCPT_MASK & ~uForceOffMask; 3126 uUnmaskedMask = 0 | uForceOnMask; 3077 3127 3078 3128 for (iMaskType = 0; iMaskType <= 6; iMaskType++) … … 3117 3167 { 3118 3168 case X86_MXCSR_RC_ZERO: 3119 case X86_MXCSR_RC_NEAREST: 3169 case X86_MXCSR_RC_NEAREST: /* Random mask */ 3120 3170 uThisMask = uRandTmp & X86_MXCSR_XCPT_MASK; 3121 3171 break; 3122 case X86_MXCSR_RC_ DOWN:3123 uThisMask = u RandTmp & X86_MXCSR_XCPT_MASK;3172 case X86_MXCSR_RC_UP: /* Random initial exceptions */ 3173 uThisMask = uSpecifiedMask; 3124 3174 uInitialExceptions = uRandTmp & X86_MXCSR_XCPT_FLAGS; 3125 3175 break; 3126 case X86_MXCSR_RC_ UP:3127 uThisMask = u SpecifiedMask;3176 case X86_MXCSR_RC_DOWN: /* Random mask & initial exceptions */ 3177 uThisMask = uRandTmp & X86_MXCSR_XCPT_MASK; 3128 3178 uInitialExceptions = uRandTmp & X86_MXCSR_XCPT_FLAGS; 3129 3179 break; … … 3133 3183 pszMaskType = "Random"; 3134 3184 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. */3139 3185 default: 3140 3186 BS3_ASSERT(0); 3141 3187 } 3188 /* No matter what was chosen, honor FIXED mask bits */ 3189 uThisMask = (uThisMask | uForceOnMask) & ~uForceOffMask; 3190 3142 3191 /* This is the input MXCSR value we'll be sending */ 3143 3192 uMxCsr = (pValues->uMxCsr & ~(X86_MXCSR_XCPT_MASK | X86_MXCSR_XCPT_FLAGS)) | uThisMask | uInitialExceptions; … … 3250 3299 pExtCtxOut->Ctx.x.Hdr.bmXState = 0x7; 3251 3300 #endif 3301 3252 3302 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 } 3253 3309 Bs3ExtCtxSetMxCsr(pExtCtx, uExpectedMxCsr | (pSavedCfg->uMxCsr & X86_MXCSR_MM)); 3310 } 3311 3254 3312 Bs3TestCheckExtCtx(pExtCtxOut, pExtCtx, 0 /*fFlags*/, pTestCtx->pszMode, pTestCtx->idTestStep); 3255 3313 … … 3313 3371 Bs3TestFailedF("Expected uMemOp %.*Rhxs, got %.*Rhxs", cbMemOp, &MemOpExpect, cbMemOp, puMemOpAlias); 3314 3372 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); 3317 3375 } 3318 3376 … … 3845 3903 * Infinity. 3846 3904 */ 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) } }, 3850 3908 /*mxcsr:in */ X86_MXCSR_DM | X86_MXCSR_ZM | X86_MXCSR_OM | X86_MXCSR_UM | X86_MXCSR_PM, 3851 3909 /*128:out */ X86_MXCSR_DM | X86_MXCSR_ZM | X86_MXCSR_OM | X86_MXCSR_UM | X86_MXCSR_PM | X86_MXCSR_IE, 3852 3910 /*256:out */ X86_MXCSR_DM | X86_MXCSR_ZM | X86_MXCSR_OM | X86_MXCSR_UM | X86_MXCSR_PM | X86_MXCSR_IE, 3853 3911 /*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) } }, 3857 3915 /*mxcsr:in */ X86_MXCSR_DM | X86_MXCSR_ZM | X86_MXCSR_OM | X86_MXCSR_UM | X86_MXCSR_PM | X86_MXCSR_FZ | X86_MXCSR_RC_DOWN, 3858 3916 /*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, 3859 3917 /*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, 3860 3918 /*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) } }, 3864 3922 /*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, 3865 3923 /*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, … … 3885 3943 /*10*/{ { /*src2 */ { FP64_0(0), FP64_NORM_MAX(1), FP64_0(0), FP64_NORM_MAX(1) } }, 3886 3944 { /*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) } }, 3888 3946 /*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 */, 3891 3949 /*xcpt? */ true, true }, 3892 3950 { { /*src2 */ { FP64_NORM_MAX(0), FP64_NORM_MAX(0), FP64_0(0), FP64_0(0) } }, 3893 3951 { /*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) } }, 3895 3953 /*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 */, 3898 3956 /*xcpt? */ true, true }, 3899 3957 { { /*src2 */ { FP64_NORM_MAX(0), FP64_NORM_MIN(1), FP64_0(0), FP64_NORM_MAX(0) } }, … … 3901 3959 { /* => */ { FP64_INF(0), FP64_V(1, 0, FP32_EXP_NORM_MIN + 1), FP64_0(0), FP64_INF(0) } }, 3902 3960 /*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 */, 3905 3963 /*xcpt? */ false, false }, 3906 3964 { { /*src2 */ { FP64_NORM_MIN(1), FP64_NORM_MAX(0), FP64_NORM_MAX(0), FP64_0(0) } }, … … 3908 3966 { /* => */ { FP64_V(1, 0, FP32_EXP_NORM_MIN + 1), FP64_INF(0), FP64_0(0), FP64_0(0) } }, 3909 3967 /*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 */, 3912 3970 /*xcpt? */ false, false }, 3913 3971 { { /*src2 */ { FP64_NORM_MAX(0), FP64_NORM_MAX(1), FP64_NORM_MAX(1), FP64_NORM_MAX(0) } }, … … 3915 3973 { /* => */ { FP64_NORM_MAX(0), FP64_NORM_MAX(1), FP64_NORM_MAX(1), FP64_NORM_MAX(0) } }, 3916 3974 /*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 */, 3919 3977 /*xcpt? */ false, false }, 3920 3978 { { /*src2 */ { FP64_NORM_SAFE_INT_MIN(0), FP64_NORM_MAX(0), FP64_0(0), FP64_NORM_SAFE_INT_MAX(1) } }, … … 3989 4047 /*24*/{ { /*src2 */ { FP64_DENORM_MAX(0), FP64_0(0), FP64_0(0), FP64_0(0) } }, 3990 4048 { /*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, 3995 4053 /*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 }, 4003 4115 { { /*src2 */ { FP64_DENORM_MIN(0), FP64_DENORM_MIN(0), FP64_DENORM_MAX(0), FP64_DENORM_MAX(0) } }, 4004 4116 { /*src1 */ { FP64_DENORM_MAX(0), FP64_DENORM_MIN(0), FP64_DENORM_MAX(0), FP64_DENORM_MIN(0) } }, … … 4062 4174 static BS3CPUINSTR4_TEST1_MODE_T const s_aTests[3] = BS3CPUINSTR4_TEST1_MODES_INIT(s_aTests16, s_aTests32, s_aTests64); 4063 4175 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, 4065 4177 g_aXcptConfig2, RT_ELEMENTS(g_aXcptConfig2)); 4066 4178 } … … 9643 9755 { /* => */ { FP64_V(0, 0x618618618618, 0)/*-5.29XYZe-310*/, FP64_DENORM_MIN(0), FP64_RAND_V1(1), FP64_RAND_V3(0) } }, 9644 9756 /*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 */ 9646 9758 /*256:out */ (X86_MXCSR_XCPT_MASK & ~X86_MXCSR_UM) | X86_MXCSR_PE | X86_MXCSR_DE | X86_MXCSR_UE, 9647 9759 /*xcpt? */ true, true }, … … 13665 13777 BS3_DECL_FAR(uint8_t) bs3CpuInstr4_v_sqrtps(uint8_t bMode) 13666 13778 { 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)13668 13779 static BS3CPUINSTR4_TEST1_VALUES_PS_T const s_aValues[] = 13669 13780 { … … 13672 13783 */ 13673 13784 /* 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 } }, 13675 13786 { /* => */ { FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(1) } }, 13676 13787 /*mxcsr:in */ X86_MXCSR_XCPT_MASK, … … 13679 13790 /*xcpt? */ false, false }, 13680 13791 { { /*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 } }, 13682 13793 { /* => */ { FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(1) } }, 13683 13794 /*mxcsr:in */ X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_RC_UP, … … 13686 13797 /*xcpt? */ false, false }, 13687 13798 { { /*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 } }, 13689 13800 { /* => */ { FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(1) } }, 13690 13801 /*mxcsr:in */ X86_MXCSR_RC_ZERO, … … 13693 13804 /*xcpt? */ false, false }, 13694 13805 { { /*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 } }, 13696 13807 { /* => */ { FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(1) } }, 13697 13808 /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_RC_DOWN, … … 13703 13814 */ 13704 13815 /* 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 } }, 13706 13817 { /* => */ { FP32_INF(0), FP32_0(0), FP32_0(0), FP32_0(0), FP32_QNAN(1), FP32_0(0), FP32_0(0), FP32_0(0) } }, 13707 13818 /*mxcsr:in */ 0, … … 13713 13824 */ 13714 13825 /* 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 } }, 13716 13827 { /* => */ { 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)*/ } }, 13717 13828 /*mxcsr:in */ 0, … … 13720 13831 /*xcpt? */ false, true }, 13721 13832 { { /*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 } }, 13723 13834 { /* => */ { 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)*/ } }, 13724 13835 /*mxcsr:in */ X86_MXCSR_PM | X86_MXCSR_RC_DOWN, … … 13727 13838 /*xcpt? */ false, false }, 13728 13839 { { /*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 } }, 13730 13841 { /* => */ { 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)*/ } }, 13731 13842 /*mxcsr:in */ X86_MXCSR_PM | X86_MXCSR_RC_UP, … … 13734 13845 /*xcpt? */ false, false }, 13735 13846 { { /*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 } }, 13737 13848 { /* => */ { 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)*/ } }, 13738 13849 /*mxcsr:in */ X86_MXCSR_PM | X86_MXCSR_RC_ZERO, … … 13741 13852 /*xcpt? */ false, false }, 13742 13853 { { /*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 } }, 13744 13855 { /* => */ { 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)*/ } }, 13745 13856 /*mxcsr:in */ X86_MXCSR_PM | X86_MXCSR_FZ | X86_MXCSR_DAZ, … … 13751 13862 */ 13752 13863 /*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 } }, 13754 13865 { /* => */ { FP32_V(0,0x1ccf5c,0x40)/*sqrt(FP32_NORM_V0)*/, 13755 13866 FP32_V(0,0x293fdb,0x97)/*sqrt(FP32_NORM_V1)*/, … … 13772 13883 FP32_V(0,0x43ffff,0x7c)/*(7/16)^2-epsilon*/, 13773 13884 FP32_V(0,0x6f4841,0x8c)/*123.75^2+epsilon*/ } }, 13774 { /*unused */ { FP32_ x8_UNUSED } },13885 { /*unused */ { FP32_ROW_UNUSED } }, 13775 13886 { /* => */ { FP32_V(0,0x380000,0x83)/*23.0*/, 13776 13887 FP32_V(0,0x0,0x83)/*16.0*/, … … 13793 13904 FP32_V(0,0x43ffff,0x7c)/*(7/16)^2-epsilon*/, 13794 13905 FP32_V(0,0x6f4841,0x8c)/*123.75^2+epsilon*/ } }, 13795 { /*unused */ { FP32_ x8_UNUSED } },13906 { /*unused */ { FP32_ROW_UNUSED } }, 13796 13907 { /* => */ { FP32_V(0,0x380000,0x83)/*23.0*/, 13797 13908 FP32_V(0,0x0,0x83)/*16.0*/, … … 13814 13925 FP32_V(0,0x43ffff,0x7c)/*(7/16)^2-epsilon*/, 13815 13926 FP32_V(0,0x6f4841,0x8c)/*123.75^2+epsilon*/ } }, 13816 { /*unused */ { FP32_ x8_UNUSED } },13927 { /*unused */ { FP32_ROW_UNUSED } }, 13817 13928 { /* => */ { FP32_V(0,0x380000,0x83)/*23.0*/, 13818 13929 FP32_V(0,0x0,0x83)/*16.0*/, … … 13835 13946 FP32_V(0,0x43ffff,0x7c)/*(7/16)^2-epsilon*/, 13836 13947 FP32_V(0,0x6f4841,0x8c)/*123.75^2+epsilon*/ } }, 13837 { /*unused */ { FP32_ x8_UNUSED } },13948 { /*unused */ { FP32_ROW_UNUSED } }, 13838 13949 { /* => */ { FP32_V(0,0x380000,0x83)/*23.0*/, 13839 13950 FP32_V(0,0x0,0x83)/*16.0*/, … … 13848 13959 /*256:out */ X86_MXCSR_XCPT_MASK | X86_MXCSR_PE | X86_MXCSR_RC_ZERO, 13849 13960 /*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), 13852 13962 FP32_NORM_MIN(0), 13853 13963 FP32_NORM_SAFE_INT_MAX(0), … … 13857 13967 FP32_NORM_SAFE_INT_MAX(1), 13858 13968 FP32_NORM_SAFE_INT_MIN(1) } }, 13859 { /*unused */ { FP32_ x8_UNUSED } },13969 { /*unused */ { FP32_ROW_UNUSED } }, 13860 13970 { /* => */ { FP32_V(0,0x7fffff,0xbe)/*sqrt(FP32_NORM_MAX)*/, 13861 13971 FP32_V(0,0x0,0x40)/*sqrt(FP32_NORM_MIN)*/, … … 13868 13978 /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DAZ | X86_MXCSR_FZ, 13869 13979 /*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 }, 13873 13982 /** @todo More Normals. */ 13874 13983 /* 13875 13984 * Denormals. 13876 13985 */ 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 } }, 13880 13988 { /* => */ { 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) } }, 13881 13989 /*mxcsr:in */ 0, 13882 13990 /*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 */, 13884 13992 /*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 } }, 13915 13995 { /* => */ { 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) } }, 13916 13996 /*mxcsr:in */ 0, 13917 13997 /*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 */, 13919 13999 /*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 } }, 13929 14002 { /* => */ { 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) } }, 13930 14003 /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_RC_UP, 13931 14004 /*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 } }, 13936 14009 { /* => */ { 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) } }, 13937 14010 /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_RC_DOWN, 13938 14011 /*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 } }, 13943 14016 { /* => */ { 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) } }, 13944 14017 /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_RC_ZERO, 13945 14018 /*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 } }, 13950 14023 { /* => */ { 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) } }, 13951 14024 /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_FZ, 13952 14025 /*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 } }, 13958 14030 { /* => */ { FP32_0(0), FP32_0(0), FP32_0(0), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(1), FP32_0(0) } }, 13959 14031 /*mxcsr:in */ X86_MXCSR_XCPT_MASK | X86_MXCSR_DAZ, … … 13966 14038 */ 13967 14039 /** @todo Invalids. */ 13968 /*16|28*/ /* FP32_TABLE_D10_PS_INVALIDS */14040 /*23*/ /* FP32_TABLE_D10_PS_INVALIDS */ 13969 14041 /** @todo Underflow, Precision; Rounding; FZ etc. */ 13970 14042 }; 13971 #undef FP32_x8_UNUSED13972 14043 13973 14044 #define PASS_s_aValues RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues
Note:
See TracChangeset
for help on using the changeset viewer.