Changeset 104724 in vbox
- Timestamp:
- May 20, 2024 8:06:05 AM (10 months ago)
- svn:sync-xref-src-repo-rev:
- 163285
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-4.c32
r104718 r104724 135 135 136 136 /** 137 * YMM packed double 137 * YMM packed double-precision floating-point register. 138 138 * @todo move to x86.h? 139 139 */ 140 140 typedef union X86YMMFLOATPDREG 141 141 { 142 /** Double precision packed floatingpoint view. */142 /** Packed double-precision floating-point view. */ 143 143 RTFLOAT64U ar64[4]; 144 /** Single precision packed floating point view. */145 RTFLOAT32U ar32[8];146 144 /** 256-bit integer view. */ 147 145 RTUINT256U ymm; … … 156 154 157 155 /** 158 * YMM scalarfloating-point register.156 * YMM packed single-precision floating-point register. 159 157 * @todo move to x86.h? 160 158 */ 161 typedef union X86YMMSFLOATREG 162 { 163 /** Double precision scalar floating point view. */ 159 typedef union X86YMMFLOATPSREG 160 { 161 /** Packed single-precision floating-point view. */ 162 RTFLOAT32U ar32[8]; 163 /** 256-bit integer view. */ 164 RTUINT256U ymm; 165 } X86YMMFLOATPSREG; 166 # ifndef VBOX_FOR_DTRACE_LIB 167 AssertCompileSize(X86YMMFLOATPSREG, 32); 168 # endif 169 /** Pointer to a YMM packed single-precision floating-point register. */ 170 typedef X86YMMFLOATPSREG BS3_FAR *PX86YMMFLOATPSREG; 171 /** Pointer to a const YMM single-precision packed floating-point register. */ 172 typedef X86YMMFLOATPSREG const BS3_FAR *PCX86YMMFLOATPSREG; 173 174 /** 175 * YMM scalar quadruple-precision floating-point register. 176 * @todo move to x86.h? 177 */ 178 typedef union X86YMMFLOATSQREG 179 { 180 /** Scalar quadruple-precision floating point view. */ 164 181 RTFLOAT128U ar128[2]; 165 182 /** 256-bit integer view. */ 166 183 RTUINT256U ymm; 167 } X86YMM SFLOATREG;184 } X86YMMFLOATSQREG; 168 185 # ifndef VBOX_FOR_DTRACE_LIB 169 AssertCompileSize(X86YMM SFLOATREG, 32);186 AssertCompileSize(X86YMMFLOATSQREG, 32); 170 187 # endif 171 /** Pointer to a YMM scalar floating-point register. */172 typedef X86YMM SFLOATREG *PX86YMMSFLOATREG;173 /** Pointer to a const YMM scalar floating-point register. */174 typedef X86YMM SFLOATREG const *PCX86YMMSFLOATREG;188 /** Pointer to a YMM scalar quadruple-precision floating-point register. */ 189 typedef X86YMMFLOATSQREG *PX86YMMFLOATSQREG; 190 /** Pointer to a const YMM scalar quadruple-precision floating-point register. */ 191 typedef X86YMMFLOATSQREG const *PCX86YMMFLOATSQREG; 175 192 176 193 … … 680 697 #endif /* BS3_SKIPIT_DO_SKIP */ 681 698 699 /* 700 * Test type #1. 701 * Generic YMM registers. 702 */ 703 typedef struct BS3CPUINSTR4_TEST1_VALUES_T 704 { 705 X86YMMREG uSrc2; /**< Second source operand. */ 706 X86YMMREG uSrc1; /**< uDstIn for SSE */ 707 X86YMMREG uDstOut; /**< Destination output. */ 708 uint32_t fMxCsrMask; /**< MXCSR exception mask to use. */ 709 bool fDenormalsAreZero; /**< Whether DAZ (Denormals-Are-Zero) is used. */ 710 bool fFlushToZero; /**< Whether Flush-To-Zero (FZ) is used. */ 711 uint32_t fRoundingCtlMask; /**< Rounding control mask (X86_MXCSR_RC_MASK) to use. */ 712 uint32_t fExpectedMxCsrFlags; /**< Expected MXCSR exception flags. */ 713 } BS3CPUINSTR4_TEST1_VALUES_T; 714 715 /* 716 * Test type #1. 717 * Packed single-precision. 718 */ 719 typedef struct BS3CPUINSTR4_TEST1_VALUES_PS_T 720 { 721 X86YMMFLOATPSREG uSrc2; /**< Second source operand. */ 722 X86YMMFLOATPSREG uSrc1; /**< uDstIn for SSE */ 723 X86YMMFLOATPSREG uDstOut; /**< Destination output. */ 724 uint32_t fMxCsrMask; /**< MXCSR exception mask to use. */ 725 bool fDenormalsAreZero; /**< Whether DAZ (Denormals-Are-Zero) is used. */ 726 bool fFlushToZero; /**< Whether Flush-To-Zero (FZ) is used. */ 727 uint32_t fRoundingCtlMask; /**< Rounding control mask (X86_MXCSR_RC_MASK) to use. */ 728 uint32_t fExpectedMxCsrFlags; /**< Expected MXCSR exception flags. */ 729 } BS3CPUINSTR4_TEST1_VALUES_PS_T; 730 AssertCompile(sizeof(BS3CPUINSTR4_TEST1_VALUES_PS_T) == sizeof(BS3CPUINSTR4_TEST1_VALUES_T)); 731 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PS_T, uSrc2, BS3CPUINSTR4_TEST1_VALUES_T, uSrc2); 732 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PS_T, uSrc1, BS3CPUINSTR4_TEST1_VALUES_T, uSrc1); 733 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PS_T, uDstOut, BS3CPUINSTR4_TEST1_VALUES_T, uDstOut); 734 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PS_T, fMxCsrMask, BS3CPUINSTR4_TEST1_VALUES_T, fMxCsrMask); 735 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PS_T, fDenormalsAreZero, BS3CPUINSTR4_TEST1_VALUES_T, fDenormalsAreZero); 736 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PS_T, fFlushToZero, BS3CPUINSTR4_TEST1_VALUES_T, fFlushToZero); 737 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PS_T, fRoundingCtlMask, BS3CPUINSTR4_TEST1_VALUES_T, fRoundingCtlMask); 738 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PS_T, fExpectedMxCsrFlags, BS3CPUINSTR4_TEST1_VALUES_T, fExpectedMxCsrFlags); 682 739 683 740 /* … … 696 753 uint32_t fExpectedMxCsrFlags; /**< Expected MXCSR exception flags. */ 697 754 } BS3CPUINSTR4_TEST1_VALUES_PD_T; 755 AssertCompile(sizeof(BS3CPUINSTR4_TEST1_VALUES_PD_T) == sizeof(BS3CPUINSTR4_TEST1_VALUES_T)); 756 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PD_T, uSrc2, BS3CPUINSTR4_TEST1_VALUES_T, uSrc2); 757 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PD_T, uSrc1, BS3CPUINSTR4_TEST1_VALUES_T, uSrc1); 758 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PD_T, uDstOut, BS3CPUINSTR4_TEST1_VALUES_T, uDstOut); 759 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PD_T, fMxCsrMask, BS3CPUINSTR4_TEST1_VALUES_T, fMxCsrMask); 760 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PD_T, fDenormalsAreZero, BS3CPUINSTR4_TEST1_VALUES_T, fDenormalsAreZero); 761 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PD_T, fFlushToZero, BS3CPUINSTR4_TEST1_VALUES_T, fFlushToZero); 762 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PD_T, fRoundingCtlMask, BS3CPUINSTR4_TEST1_VALUES_T, fRoundingCtlMask); 763 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_PD_T, fExpectedMxCsrFlags, BS3CPUINSTR4_TEST1_VALUES_T, fExpectedMxCsrFlags); 764 765 /* 766 * Test type #1. 767 * Scalar quadruple-precision. 768 */ 769 typedef struct BS3CPUINSTR4_TEST1_VALUES_SQ_T 770 { 771 X86YMMFLOATSQREG uSrc2; /**< Second source operand. */ 772 X86YMMFLOATSQREG uSrc1; /**< uDstIn for SSE */ 773 X86YMMFLOATSQREG uDstOut; /**< Destination output. */ 774 uint32_t fMxCsrMask; /**< MXCSR exception mask to use. */ 775 bool fDenormalsAreZero; /**< Whether DAZ (Denormals-Are-Zero) is used. */ 776 bool fFlushToZero; /**< Whether Flush-To-Zero (FZ) is used. */ 777 uint32_t fRoundingCtlMask; /**< Rounding control mask (X86_MXCSR_RC_MASK) to use. */ 778 uint32_t fExpectedMxCsrFlags; /**< Expected MXCSR exception flags. */ 779 } BS3CPUINSTR4_TEST1_VALUES_SQ_T; 780 AssertCompile(sizeof(BS3CPUINSTR4_TEST1_VALUES_SQ_T) == sizeof(BS3CPUINSTR4_TEST1_VALUES_T)); 781 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SQ_T, uSrc2, BS3CPUINSTR4_TEST1_VALUES_T, uSrc2); 782 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SQ_T, uSrc1, BS3CPUINSTR4_TEST1_VALUES_T, uSrc1); 783 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SQ_T, uDstOut, BS3CPUINSTR4_TEST1_VALUES_T, uDstOut); 784 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SQ_T, fMxCsrMask, BS3CPUINSTR4_TEST1_VALUES_T, fMxCsrMask); 785 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SQ_T, fDenormalsAreZero, BS3CPUINSTR4_TEST1_VALUES_T, fDenormalsAreZero); 786 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SQ_T, fFlushToZero, BS3CPUINSTR4_TEST1_VALUES_T, fFlushToZero); 787 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SQ_T, fRoundingCtlMask, BS3CPUINSTR4_TEST1_VALUES_T, fRoundingCtlMask); 788 AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SQ_T, fExpectedMxCsrFlags, BS3CPUINSTR4_TEST1_VALUES_T, fExpectedMxCsrFlags); 698 789 699 790 typedef struct BS3CPUINSTR4_TEST1_T … … 707 798 uint8_t iRegSrc2; /**< Index of second source register, UINT8_MAX if N/A. */ 708 799 uint8_t cValues; /**< Number of test values in @c paValues. */ 709 BS3CPUINSTR4_TEST1_VALUES_ PD_T const BS3_FAR *paValues; /**< Test values. */800 BS3CPUINSTR4_TEST1_VALUES_T const BS3_FAR *paValues; /**< Test values. */ 710 801 } BS3CPUINSTR4_TEST1_T; 711 802 … … 749 840 PCBS3CPUINSTRX_CONFIG_SAVED_T pSavedCfg) 750 841 { 751 BS3CPUINSTR4_TEST1_T const BS3_FAR 752 BS3CPUINSTR4_TEST1_VALUES_ PD_T const BS3_FAR *pValues = &pTestCtx->pTest->paValues[pTestCtx->iVal];842 BS3CPUINSTR4_TEST1_T const BS3_FAR *pTest = pTestCtx->pTest; 843 BS3CPUINSTR4_TEST1_VALUES_T const BS3_FAR *pValues = &pTestCtx->pTest->paValues[pTestCtx->iVal]; 753 844 PBS3TRAPFRAME pTrapFrame = pTestCtx->pTrapFrame; 754 845 PBS3REGCTX pCtx = pTestCtx->pCtx; … … 870 961 char szGotBuf[BS3_FP_XCPT_NAMES_MAXLEN]; 871 962 char szExpectBuf[BS3_FP_XCPT_NAMES_MAXLEN]; 872 bs3CpuInstr4GetXcptFlags(&szExpectBuf[0], sizeof(szExpectBuf), 963 bs3CpuInstr4GetXcptFlags(&szExpectBuf[0], sizeof(szExpectBuf), pValues->fExpectedMxCsrFlags); 873 964 bs3CpuInstr4GetXcptFlags(&szGotBuf[0], sizeof(szGotBuf), fMxCsrXcptFlags); 874 965 Bs3TestFailedF("Expected floating-point xcpt flags%s, got%s", szExpectBuf, szGotBuf); … … 1019 1110 for (iVal = 0; iVal < cValues; iVal++, idTestStep++, cRecompRuns++) 1020 1111 { 1021 uint16_t cErrors;1112 uint16_t cErrors; 1022 1113 BS3CPUINSTR4_TEST1_CTX_T TestCtx; 1023 1024 1114 if (BS3_SKIPIT(bRing, iCfg, iTest, iVal, 0)) 1025 1115 continue; … … 1030 1120 * it outside the inner most loop is more optimal. 1031 1121 */ 1032 TestCtx.pConfig 1033 TestCtx.pTest 1034 TestCtx.iVal 1035 TestCtx.pszMode 1036 TestCtx.pTrapFrame 1037 TestCtx.pCtx 1038 TestCtx.pExtCtx 1039 TestCtx.pExtCtxOut 1040 TestCtx.puMemOp 1041 TestCtx.puMemOpAlias 1042 TestCtx.cbMemOp 1043 TestCtx.cbOperand 1044 TestCtx.bXcptExpect 1045 TestCtx.fSseInstr 1046 TestCtx.idTestStep 1122 TestCtx.pConfig = &paConfigs[iCfg]; 1123 TestCtx.pTest = pTest; 1124 TestCtx.iVal = iVal; 1125 TestCtx.pszMode = pszMode; 1126 TestCtx.pTrapFrame = &TrapFrame; 1127 TestCtx.pCtx = &Ctx; 1128 TestCtx.pExtCtx = pExtCtx; 1129 TestCtx.pExtCtxOut = pExtCtxOut; 1130 TestCtx.puMemOp = (uint8_t *)puMemOp; 1131 TestCtx.puMemOpAlias = puMemOpAlias; 1132 TestCtx.cbMemOp = cbMemOp; 1133 TestCtx.cbOperand = cbOperand; 1134 TestCtx.bXcptExpect = bXcptExpect; 1135 TestCtx.fSseInstr = fSseInstr; 1136 TestCtx.idTestStep = idTestStep; 1047 1137 cErrors = bs3CpuInstr4_WorkerTestType1_Inner(bMode, &TestCtx, &SavedCfg); 1048 1049 1138 if (cErrors != Bs3TestSubErrorCount()) 1050 1139 { … … 1126 1215 static BS3CPUINSTR4_TEST1_T const s_aTests16[] = 1127 1216 { 1128 { bs3CpuInstrX_addpd_XMM1_XMM2_icebp_c16, 255, RM_REG, T_SSE, 1, 1, 2, RT_ELEMENTS(s_aValues), s_aValues },1217 { bs3CpuInstrX_addpd_XMM1_XMM2_icebp_c16, 255, RM_REG, T_SSE, 1, 1, 2, RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues }, 1129 1218 }; 1130 1219 static BS3CPUINSTR4_TEST1_T const s_aTests32[] = 1131 1220 { 1132 { bs3CpuInstrX_addpd_XMM1_XMM2_icebp_c32, 255, RM_REG, T_SSE, 1, 1, 2, RT_ELEMENTS(s_aValues), s_aValues },1221 { bs3CpuInstrX_addpd_XMM1_XMM2_icebp_c32, 255, RM_REG, T_SSE, 1, 1, 2, RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues }, 1133 1222 }; 1134 1223 static BS3CPUINSTR4_TEST1_T const s_aTests64[] = 1135 1224 { 1136 { bs3CpuInstrX_addpd_XMM1_XMM2_icebp_c64, 255, RM_REG, T_SSE, 1, 1, 2, RT_ELEMENTS(s_aValues), s_aValues },1225 { bs3CpuInstrX_addpd_XMM1_XMM2_icebp_c64, 255, RM_REG, T_SSE, 1, 1, 2, RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues }, 1137 1226 }; 1138 1227
Note:
See TracChangeset
for help on using the changeset viewer.