Changeset 106814 in vbox
- Timestamp:
- Nov 1, 2024 2:01:09 AM (5 months ago)
- svn:sync-xref-src-repo-rev:
- 165715
- Location:
- trunk/src/VBox
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstTwoByte0f.cpp.h
r106695 r106814 3621 3621 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2); 3622 3622 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 3623 IEM_MC_MAYBE_RAISE_FPU_XCPT();3624 3623 3625 3624 IEM_MC_PREPARE_FPU_USAGE(); … … 3984 3983 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Dst, 0); 3985 3984 IEM_MC_ARG(uint64_t, u64Src, 1); 3985 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 3986 3986 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 3987 3987 IEM_MC_PREPARE_FPU_USAGE(); … … 4009 4009 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 4010 4010 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2); 4011 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 4011 4012 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 4012 4013 IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); … … 4039 4040 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Dst, 0); 4040 4041 IEM_MC_ARG(PCX86XMMREG, pSrc, 1); 4042 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 4041 4043 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 4042 4044 IEM_MC_PREPARE_FPU_USAGE(); … … 4065 4067 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 4066 4068 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2); 4069 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 4067 4070 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 4068 4071 IEM_MC_FETCH_MEM_XMM_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); … … 4290 4293 IEM_MC_ARG(uint64_t, u64Src, 1); 4291 4294 4295 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 4292 4296 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 4293 4297 IEM_MC_PREPARE_FPU_USAGE(); … … 4315 4319 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 4316 4320 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2); 4321 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 4317 4322 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 4318 4323 IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); … … 4346 4351 IEM_MC_ARG(PCX86XMMREG, pSrc, 1); 4347 4352 4353 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 4348 4354 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 4349 4355 IEM_MC_PREPARE_FPU_USAGE(); … … 4372 4378 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 4373 4379 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2); 4380 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 4374 4381 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 4375 4382 IEM_MC_FETCH_MEM_XMM_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-4.c32
r106780 r106814 446 446 * intended to be used for for unused arguments in scalar instructions. 447 447 */ 448 #define FP64_0_x2(a_Sign) FP64_0(a_Sign), FP64_0(a_Sign) 448 449 #define FP64_0_x3(a_Sign) FP64_0(a_Sign), FP64_0(a_Sign), FP64_0(a_Sign) 449 #define FP64_RAND_x3_V0 FP64_SNAN(1), FP64_DENORM_MIN(0), FP64_RAND_V2(0) 450 #define FP64_RAND_x3_V1 FP64_DENORM_MAX(1), FP64_1(1), FP64_RAND_V3(1) 451 #define FP64_RAND_x3_V2 FP64_RAND_V1(1), FP64_RAND_V0(0), FP64_QNAN(0) 452 #define FP64_RAND_x3_V3 FP64_NORM_V1(0), FP64_INF(1), FP64_NORM_V0(1) 450 #define FP64_RAND_x2_V0 FP64_SNAN(1), FP64_DENORM_MIN(0) 451 #define FP64_RAND_x3_V0 FP64_RAND_x2_V0, FP64_RAND_V2(0) 452 #define FP64_RAND_x2_V1 FP64_DENORM_MAX(1), FP64_1(1) 453 #define FP64_RAND_x3_V1 FP64_RAND_x2_V1, FP64_RAND_V3(1) 454 #define FP64_RAND_x2_V2 FP64_RAND_V1(1), FP64_RAND_V0(0) 455 #define FP64_RAND_x3_V2 FP64_RAND_x2_V2, FP64_QNAN(0) 456 #define FP64_RAND_x2_V3 FP64_NORM_V1(0), FP64_INF(1) 457 #define FP64_RAND_x3_V3 FP64_RAND_x2_V3, FP64_NORM_V0(1) 453 458 #define FP64_ROW_UNUSED FP64_1(0), FP64_RAND_x3_V0 454 459 #define FP64_x3_UNUSED FP64_RAND_x3_V1 … … 777 782 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, X86_XCPT_AC, X86_XCPT_GP, "AMDmm+AC" }, /* #9 */ 778 783 /* Memory misalignment and alignment checks: */ 779 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, X86_XCPT_ DB, X86_XCPT_DB, "Misalign" }, /* #10 - misaligned data: no effect*/780 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, X86_XCPT_ AC, X86_XCPT_AC, "AlChkMis" }, /* #11 - misaligned data + CR0:AM + fl:AC: MMX/SSE/AVX => #AC*/784 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, X86_XCPT_GP, X86_XCPT_DB, "Misalign" }, /* #10 - misaligned data: SSE => #GP */ 785 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, X86_XCPT_GP, X86_XCPT_DB, "AlChkMis" }, /* #11 - misaligned data + CR0:AM + fl:AC: SSE => #GP */ 781 786 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB, "AlChkAli" }, /* #12 - aligned data + CR0:AM + fl:AC: no effect */ 782 787 }; … … 803 808 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, X86_XCPT_AC, X86_XCPT_GP, "AMDmm+AC" }, /* #9 */ 804 809 /* Memory misalignment and alignment checks: */ 805 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, X86_XCPT_ GP, X86_XCPT_DB, "Misalign" }, /* #10 - misaligned data: SSE => #GP*/806 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, X86_XCPT_ GP, X86_XCPT_DB, "AlChkMis" }, /* #11 - misaligned data + CR0:AM + fl:AC: SSE => #GP*/810 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "Misalign" }, /* #10 - misaligned data: no effect */ 811 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, X86_XCPT_AC, X86_XCPT_AC, "AlChkMis" }, /* #11 - misaligned data + CR0:AM + fl:AC: MMX/SSE/AVX => #AC */ 807 812 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB, "AlChkAli" }, /* #12 - aligned data + CR0:AM + fl:AC: no effect */ 808 813 }; … … 824 829 { 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "OSFXSR=0" }, /* #5 - CR4:OSFXSR=0: SSE => #UD */ 825 830 /* Memory misalignment and alignment checks: */ 826 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, X86_XCPT_ GP, X86_XCPT_DB, "Misalign" }, /* #6 - misaligned data: SSE => #GP*/827 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, X86_XCPT_ GP, X86_XCPT_DB, "AlChkMis" }, /* #7 - misaligned data + CR0:AM + fl:AC: SSE => #GP*/831 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "Misalign" }, /* #6 - misaligned data: no effect */ 832 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, X86_XCPT_AC, X86_XCPT_AC, "AlChkMis" }, /* #7 - misaligned data + CR0:AM + fl:AC: MMX/SSE/AVX => #AC */ 828 833 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB, "AlChkAli" }, /* #8 - aligned data + CR0:AM + fl:AC: no effect */ 829 834 /* AMD only: */ … … 2590 2595 #define BS3_XCPT_ALWAYS 0x80 2591 2596 #define BS3_XCPT_UD (X86_XCPT_UD | BS3_XCPT_ALWAYS) 2597 #define BS3_XCPT_NEVER 0x40 2598 #define BS3_XCPT_NOT_MF (X86_XCPT_MF | BS3_XCPT_NEVER) 2592 2599 2593 2600 typedef struct BS3CPUINSTR4_TEST1_MODE_T … … 3112 3119 bXcptExpect = pTest->bAltXcpt; /* they generally don't raise #AC */ 3113 3120 } 3121 3122 if ((pTest->bAltXcpt & BS3_XCPT_NEVER) && (pTest->bAltXcpt != 255) && (bXcptExpect == (pTest->bAltXcpt & ~BS3_XCPT_NEVER))) 3123 bXcptExpect = X86_XCPT_DB; 3114 3124 3115 3125 if (fPf && bXcptExpect == X86_XCPT_DB) … … 16425 16435 static BS3CPUINSTR4_TEST1_T const s_aTests16[] = 16426 16436 { 16427 { bs3CpuInstr4_cvtpi2ps_XMM1_MM1_icebp_c16, 255, RM_REG, T_SSE, XMM1, MM1, XMM1, PASS_s_aValues },16428 { bs3CpuInstr4_cvtpi2ps_XMM1_FSxBX_icebp_c16, 255, RM_MEM, T_SSE, XMM1, FSxBX, XMM1, PASS_s_aValues },16437 { bs3CpuInstr4_cvtpi2ps_XMM1_MM1_icebp_c16, 255, RM_REG, T_SSE, XMM1, MM1, XMM1, PASS_s_aValues }, 16438 { bs3CpuInstr4_cvtpi2ps_XMM1_FSxBX_icebp_c16, BS3_XCPT_NOT_MF, RM_MEM, T_SSE, XMM1, FSxBX, XMM1, PASS_s_aValues }, 16429 16439 }; 16430 16440 static BS3CPUINSTR4_TEST1_T const s_aTests32[] = 16431 16441 { 16432 { bs3CpuInstr4_cvtpi2ps_XMM1_MM1_icebp_c32, 255, RM_REG, T_SSE, XMM1, MM1, XMM1, PASS_s_aValues },16433 { bs3CpuInstr4_cvtpi2ps_XMM1_FSxBX_icebp_c32, 255, RM_MEM, T_SSE, XMM1, FSxBX, XMM1, PASS_s_aValues },16442 { bs3CpuInstr4_cvtpi2ps_XMM1_MM1_icebp_c32, 255, RM_REG, T_SSE, XMM1, MM1, XMM1, PASS_s_aValues }, 16443 { bs3CpuInstr4_cvtpi2ps_XMM1_FSxBX_icebp_c32, BS3_XCPT_NOT_MF, RM_MEM, T_SSE, XMM1, FSxBX, XMM1, PASS_s_aValues }, 16434 16444 }; 16435 16445 static BS3CPUINSTR4_TEST1_T const s_aTests64[] = 16436 16446 { 16437 { bs3CpuInstr4_cvtpi2ps_XMM1_MM1_icebp_c64, 255, RM_REG, T_SSE, XMM1, MM1, XMM1, PASS_s_aValues },16438 { bs3CpuInstr4_cvtpi2ps_XMM1_FSxBX_icebp_c64, 255, RM_MEM, T_SSE, XMM1, FSxBX, XMM1, PASS_s_aValues },16439 { bs3CpuInstr4_cvtpi2ps_XMM8_MM1_icebp_c64, 255, RM_REG, T_SSE, XMM8, MM1, XMM8, PASS_s_aValues },16440 { bs3CpuInstr4_cvtpi2ps_XMM8_FSxBX_icebp_c64, 255, RM_MEM, T_SSE, XMM8, FSxBX, XMM8, PASS_s_aValues },16447 { bs3CpuInstr4_cvtpi2ps_XMM1_MM1_icebp_c64, 255, RM_REG, T_SSE, XMM1, MM1, XMM1, PASS_s_aValues }, 16448 { bs3CpuInstr4_cvtpi2ps_XMM1_FSxBX_icebp_c64, BS3_XCPT_NOT_MF, RM_MEM, T_SSE, XMM1, FSxBX, XMM1, PASS_s_aValues }, 16449 { bs3CpuInstr4_cvtpi2ps_XMM8_MM1_icebp_c64, 255, RM_REG, T_SSE, XMM8, MM1, XMM8, PASS_s_aValues }, 16450 { bs3CpuInstr4_cvtpi2ps_XMM8_FSxBX_icebp_c64, BS3_XCPT_NOT_MF, RM_MEM, T_SSE, XMM8, FSxBX, XMM8, PASS_s_aValues }, 16441 16451 }; 16442 16452 … … 16444 16454 unsigned const iTest = BS3CPUINSTR4_TEST_MODES_INDEX(bMode); 16445 16455 return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests, 16446 g_aXcptConfig 5, RT_ELEMENTS(g_aXcptConfig5));16456 g_aXcptConfig23_5, RT_ELEMENTS(g_aXcptConfig23_5)); 16447 16457 } 16448 16458 … … 16566 16576 static BS3CPUINSTR4_TEST1_T const s_aTests16[] = 16567 16577 { 16578 { bs3CpuInstr4_cvtps2pi_MM1_XMM1_icebp_c16, 255, RM_REG, T_SSE, MM1, XMM1, NOREG, PASS_s_aValues }, 16568 16579 { bs3CpuInstr4_cvtps2pi_MM1_FSxBX_icebp_c16, 255, RM_MEM, T_SSE, MM1, FSxBX, NOREG, PASS_s_aValues }, 16569 { bs3CpuInstr4_cvtps2pi_MM1_XMM1_icebp_c16, 255, RM_REG, T_SSE, MM1, XMM1, NOREG, PASS_s_aValues },16570 16580 }; 16571 16581 16572 16582 static BS3CPUINSTR4_TEST1_T const s_aTests32[] = 16573 16583 { 16584 { bs3CpuInstr4_cvtps2pi_MM1_XMM1_icebp_c32, 255, RM_REG, T_SSE, MM1, XMM1, NOREG, PASS_s_aValues }, 16574 16585 { bs3CpuInstr4_cvtps2pi_MM1_FSxBX_icebp_c32, 255, RM_MEM, T_SSE, MM1, FSxBX, NOREG, PASS_s_aValues }, 16575 { bs3CpuInstr4_cvtps2pi_MM1_XMM1_icebp_c32, 255, RM_REG, T_SSE, MM1, XMM1, NOREG, PASS_s_aValues },16576 16586 }; 16577 16587 static BS3CPUINSTR4_TEST1_T const s_aTests64[] = 16578 16588 { 16589 { bs3CpuInstr4_cvtps2pi_MM1_XMM1_icebp_c64, 255, RM_REG, T_SSE, MM1, XMM1, NOREG, PASS_s_aValues }, 16579 16590 { bs3CpuInstr4_cvtps2pi_MM1_FSxBX_icebp_c64, 255, RM_MEM, T_SSE, MM1, FSxBX, NOREG, PASS_s_aValues }, 16580 { bs3CpuInstr4_cvtps2pi_MM1_XMM1_icebp_c64, 255, RM_REG, T_SSE, MM1, XMM1, NOREG, PASS_s_aValues },16581 16591 { bs3CpuInstr4_cvtps2pi_MM1_XMM8_icebp_c64, 255, RM_REG, T_SSE, MM1, XMM8, NOREG, PASS_s_aValues }, 16582 16592 }; … … 16585 16595 unsigned const iTest = BS3CPUINSTR4_TEST_MODES_INDEX(bMode); 16586 16596 return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests, 16587 g_aXcptConfig 5, RT_ELEMENTS(g_aXcptConfig5));16597 g_aXcptConfig23_5, RT_ELEMENTS(g_aXcptConfig23_5)); 16588 16598 } 16589 16599 … … 16726 16736 unsigned const iTest = BS3CPUINSTR4_TEST_MODES_INDEX(bMode); 16727 16737 return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests, 16728 g_aXcptConfig 5, RT_ELEMENTS(g_aXcptConfig5));16738 g_aXcptConfig23_5, RT_ELEMENTS(g_aXcptConfig23_5)); 16729 16739 } 16730 16740 … … 17022 17032 unsigned const iTest = BS3CPUINSTR4_TEST_MODES_INDEX(bMode); 17023 17033 return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests, 17024 g_aXcptConfig 5, RT_ELEMENTS(g_aXcptConfig5));17034 g_aXcptConfig3, RT_ELEMENTS(g_aXcptConfig3)); 17025 17035 } 17026 17036 … … 17463 17473 unsigned const iTest = BS3CPUINSTR4_TEST_MODES_INDEX(bMode); 17464 17474 return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests, 17465 g_aXcptConfig 5, RT_ELEMENTS(g_aXcptConfig5));17475 g_aXcptConfig3, RT_ELEMENTS(g_aXcptConfig3)); 17466 17476 } 17467 17477 … … 17904 17914 unsigned const iTest = BS3CPUINSTR4_TEST_MODES_INDEX(bMode); 17905 17915 return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests, 17906 g_aXcptConfig5, RT_ELEMENTS(g_aXcptConfig5)); 17916 g_aXcptConfig3, RT_ELEMENTS(g_aXcptConfig3)); 17917 } 17918 17919 17920 /* 17921 * CVTPI2PD. 17922 */ 17923 BS3_DECL_FAR(uint8_t) bs3CpuInstr4_cvtpi2pd(uint8_t bMode) 17924 { 17925 static BS3CPUINSTR4_TEST1_VALUES_PD_T const s_aValues[] = 17926 { 17927 /* 17928 * Zero. 17929 */ 17930 /* 0*/{ { /* unused */ { FP64_ROW_UNUSED } }, 17931 { /* src mm */ { FP64_INT32_C(0, 0) } }, 17932 { /* => xmm */ { FP64_0(0), FP64_0(0) } }, 17933 /*mxcsr:in */ 0, 17934 /*128:out */ 0, 17935 /*256:out */ -1 }, 17936 /* 17937 * Normals. 17938 */ 17939 /* 1*/{ { /* unused */ { FP64_ROW_UNUSED } }, 17940 { /* src mm */ { FP64_INT32_C(123456789, -123456789) } }, 17941 { /* => xmm */ { FP64_V(0,0xd6f3454000000,0x419), FP64_V(1,0xd6f3454000000,0x419) } }, 17942 /*123456789.0*/ /*-123456789.0*/ 17943 /*mxcsr:in */ 0, 17944 /*128:out */ 0, 17945 /*256:out */ -1 }, 17946 { { /* unused */ { FP64_ROW_UNUSED } }, 17947 { /* src mm */ { FP64_INT32_C(-47, 42) } }, 17948 { /* => xmm */ { FP64_V(1,0x7800000000000,0x404), FP64_V(0,0x5000000000000,0x404) } }, 17949 /*-47.0*/ /*42.0*/ 17950 /*mxcsr:in */ 0, 17951 /*128:out */ 0, 17952 /*256:out */ -1 }, 17953 { { /* unused */ { FP64_ROW_UNUSED } }, 17954 { /* src mm */ { FP64_INT32(INT32_MAX, -INT32_MAX) } }, 17955 { /* => xmm */ { FP64_V(0,0xfffffffc00000,0x41d), FP64_V(1,0xfffffffc00000,0x41d) } }, 17956 /*2147483648.0*/ /*-2147483648.0*/ 17957 /*mxcsr:in */ 0, 17958 /*128:out */ 0, 17959 /*256:out */ -1 }, 17960 { { /* unused */ { FP64_ROW_UNUSED } }, 17961 { /* src mm */ { FP64_INT32_C(123456789, -123456789) } }, 17962 { /* => xmm */ { FP64_V(0,0xd6f3454000000,0x419), FP64_V(1,0xd6f3454000000,0x419) } }, 17963 /*123456789.0*/ /*-123456789.0*/ 17964 /*mxcsr:in */ X86_MXCSR_FZ | X86_MXCSR_DAZ, 17965 /*128:out */ X86_MXCSR_FZ | X86_MXCSR_DAZ, 17966 /*256:out */ -1 }, 17967 { { /* unused */ { FP64_ROW_UNUSED } }, 17968 { /* src mm */ { FP64_INT32_C(123456789, -123456789) } }, 17969 { /* => xmm */ { FP64_V(0,0xd6f3454000000,0x419), FP64_V(1,0xd6f3454000000,0x419) } }, 17970 /*123456789.0*/ /*-123456789.0*/ 17971 /*mxcsr:in */ X86_MXCSR_RC_DOWN, 17972 /*128:out */ X86_MXCSR_RC_DOWN, 17973 /*256:out */ -1 }, 17974 { { /* unused */ { FP64_ROW_UNUSED } }, 17975 { /* src mm */ { FP64_INT32_C(123456789, -123456789) } }, 17976 { /* => xmm */ { FP64_V(0,0xd6f3454000000,0x419), FP64_V(1,0xd6f3454000000,0x419) } }, 17977 /*123456789.0*/ /*-123456789.0*/ 17978 /*mxcsr:in */ X86_MXCSR_RC_UP, 17979 /*128:out */ X86_MXCSR_RC_UP, 17980 /*256:out */ -1 }, 17981 { { /* unused */ { FP64_ROW_UNUSED } }, 17982 { /* src mm */ { FP64_INT32_C(123456789, -123456789) } }, 17983 { /* => xmm */ { FP64_V(0,0xd6f3454000000,0x419), FP64_V(1,0xd6f3454000000,0x419) } }, 17984 /*123456789.0*/ /*-123456789.0*/ 17985 /*mxcsr:in */ X86_MXCSR_RC_ZERO, 17986 /*128:out */ X86_MXCSR_RC_ZERO, 17987 /*256:out */ -1 }, 17988 }; 17989 /* 17990 * Precision, Infinity, Overflow, Underflow, Denormal, Invalid not possible. 17991 */ 17992 17993 static BS3CPUINSTR4_TEST1_T const s_aTests16[] = 17994 { 17995 { bs3CpuInstr4_cvtpi2pd_XMM1_MM1_icebp_c16, 255, RM_REG, T_SSE, XMM1, MM1, NOREG, PASS_s_aValues }, 17996 { bs3CpuInstr4_cvtpi2pd_XMM1_FSxBX_icebp_c16, 255, RM_MEM, T_SSE, XMM1, FSxBX, NOREG, PASS_s_aValues }, 17997 }; 17998 static BS3CPUINSTR4_TEST1_T const s_aTests32[] = 17999 { 18000 { bs3CpuInstr4_cvtpi2pd_XMM1_MM1_icebp_c32, 255, RM_REG, T_SSE, XMM1, MM1, NOREG, PASS_s_aValues }, 18001 { bs3CpuInstr4_cvtpi2pd_XMM1_FSxBX_icebp_c32, 255, RM_MEM, T_SSE, XMM1, FSxBX, NOREG, PASS_s_aValues }, 18002 }; 18003 static BS3CPUINSTR4_TEST1_T const s_aTests64[] = 18004 { 18005 { bs3CpuInstr4_cvtpi2pd_XMM1_MM1_icebp_c64, 255, RM_REG, T_SSE, XMM1, MM1, NOREG, PASS_s_aValues }, 18006 { bs3CpuInstr4_cvtpi2pd_XMM1_FSxBX_icebp_c64, 255, RM_MEM, T_SSE, XMM1, FSxBX, NOREG, PASS_s_aValues }, 18007 { bs3CpuInstr4_cvtpi2pd_XMM8_MM1_icebp_c64, 255, RM_REG, T_SSE, XMM8, MM1, NOREG, PASS_s_aValues }, 18008 { bs3CpuInstr4_cvtpi2pd_XMM8_FSxBX_icebp_c64, 255, RM_MEM, T_SSE, XMM8, FSxBX, NOREG, PASS_s_aValues }, 18009 }; 18010 18011 static BS3CPUINSTR4_TEST1_MODE_T const s_aTests[3] = BS3CPUINSTR4_TEST1_MODES_INIT(s_aTests16, s_aTests32, s_aTests64); 18012 unsigned const iTest = BS3CPUINSTR4_TEST_MODES_INDEX(bMode); 18013 return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests, 18014 g_aXcptConfig23_6, RT_ELEMENTS(g_aXcptConfig23_6)); 18015 } 18016 18017 18018 /* 18019 * CVTPD2PI. 18020 */ 18021 BS3_DECL_FAR(uint8_t) bs3CpuInstr4_cvtpd2pi(uint8_t bMode) 18022 { 18023 static BS3CPUINSTR4_TEST1_VALUES_PD_T const s_aValues[] = 18024 { 18025 /* 18026 * Zero. 18027 */ 18028 /* 0*/{ { /* unused */ { FP64_ROW_UNUSED } }, 18029 { /* src xmm */ { FP64_0(0), FP64_0(1) } }, 18030 { /* => mm */ { FP64_INT32_C(0, 0) } }, 18031 /*mxcsr:in */ 0, 18032 /*128:out */ 0, 18033 /*256:out */ -1 }, 18034 /* 18035 * Infinity. 18036 */ 18037 /* 1*/{ { /* unused */ { FP64_ROW_UNUSED } }, 18038 { /* src xmm */ { FP64_INF(1), FP64_INF(0) } }, 18039 { /* => mm */ { FP64_INT32(INT32_INDEFINITE_C, INT32_INDEFINITE_C) } }, 18040 /*mxcsr:in */ 0, 18041 /*128:out */ X86_MXCSR_IE, 18042 /*256:out */ -1 }, 18043 /* 18044 * Normals & Precision. 18045 */ 18046 /* 2*/{ { /* unused */ { FP64_ROW_UNUSED } }, 18047 { /* src xmm */ { FP64_V(0,0xe240000000000,0x40f), FP64_V(1,0xe240000000000,0x40f) } }, 18048 { /* => mm */ { FP64_INT32_C(123456, -123456) } }, 18049 /*mxcsr:in */ 0, 18050 /*128:out */ 0, 18051 /*256:out */ -1 }, 18052 { { /* unused */ { FP64_ROW_UNUSED } }, 18053 { /* src xmm */ { FP64_V(0,0xe240e66666666,0x40f), FP64_V(1,0xe240e66666666,0x40f) } }, 18054 /*123456.9*/ /*-123456.9*/ 18055 { /* => mm */ { FP64_INT32_C(123457, -123457) } }, 18056 /*mxcsr:in */ 0, 18057 /*128:out */ X86_MXCSR_PE, 18058 /*256:out */ -1 }, 18059 { { /* unused */ { FP64_ROW_UNUSED } }, 18060 { /* src xmm */ { FP64_V(0,0xe240e66666666,0x40f), FP64_V(1,0xe240e66666666,0x40f) } }, 18061 /*123456.9*/ /*-123456.9*/ 18062 { /* => mm */ { FP64_INT32_C(123456, -123457) } }, 18063 /*mxcsr:in */ X86_MXCSR_RC_DOWN, 18064 /*128:out */ X86_MXCSR_PE | X86_MXCSR_RC_DOWN, 18065 /*256:out */ -1 }, 18066 { { /* unused */ { FP64_ROW_UNUSED } }, 18067 { /* src xmm */ { FP64_V(0,0xe240e66666666,0x40f), FP64_V(1,0xe240e66666666,0x40f) } }, 18068 /*123456.9*/ /*-123456.9*/ 18069 { /* => mm */ { FP64_INT32_C(123457, -123456) } }, 18070 /*mxcsr:in */ X86_MXCSR_RC_UP, 18071 /*128:out */ X86_MXCSR_PE | X86_MXCSR_RC_UP, 18072 /*256:out */ -1 }, 18073 { { /* unused */ { FP64_ROW_UNUSED } }, 18074 { /* src xmm */ { FP64_V(0,0xe240e66666666,0x40f), FP64_V(1,0xe240e66666666,0x40f) } }, 18075 /*123456.9*/ /*-123456.9*/ 18076 { /* => mm */ { FP64_INT32_C(123456, -123456) } }, 18077 /*mxcsr:in */ X86_MXCSR_RC_ZERO, 18078 /*128:out */ X86_MXCSR_PE | X86_MXCSR_RC_ZERO, 18079 /*256:out */ -1 }, 18080 { { /* unused */ { FP64_ROW_UNUSED } }, 18081 { /* src xmm */ { FP64_V(1,0xccccccccccccd,0x3fe), FP64_V(0,0xccccccccccccd,0x3fe) } }, 18082 /*-0.9*/ /*0.9*/ 18083 { /* => mm */ { FP64_INT32_C(-1, 1) } }, 18084 /*mxcsr:in */ X86_MXCSR_FZ, 18085 /*128:out */ X86_MXCSR_PE | X86_MXCSR_FZ, 18086 /*256:out */ -1 }, 18087 /* 18088 * Denormals. 18089 */ 18090 /* 8*/{ { /* unused */ { FP64_ROW_UNUSED } }, 18091 { /* src xmm */ { FP64_DENORM_MAX(0), FP64_DENORM_MIN(1) } }, 18092 { /* => mm */ { FP64_INT32_C(0, 0) } }, 18093 /*mxcsr:in */ 0, 18094 /*128:out */ X86_MXCSR_PE, 18095 /*256:out */ -1 }, 18096 { { /* unused */ { FP64_ROW_UNUSED } }, 18097 { /* src xmm */ { FP64_DENORM_MIN(0), FP64_DENORM_MAX(1) } }, 18098 { /* => mm */ { FP64_INT32_C(0, 0) } }, 18099 /*mxcsr:in */ X86_MXCSR_DAZ, 18100 /*128:out */ X86_MXCSR_DAZ, 18101 /*256:out */ -1 }, 18102 /* 18103 * Overflow (Underflow not possible). 18104 */ 18105 /*10*/{ { /* unused */ { FP64_ROW_UNUSED } }, 18106 { /* src xmm */ { FP64_NORM_MAX(0), FP64_NORM_MAX(1) } }, 18107 { /* => mm */ { FP64_INT32(INT32_INDEFINITE_C, INT32_INDEFINITE_C) } }, 18108 /*mxcsr:in */ 0, 18109 /*128:out */ X86_MXCSR_IE, 18110 /*256:out */ -1 }, 18111 { { /* unused */ { FP64_ROW_UNUSED } }, 18112 { /* src xmm */ { FP64_NORM_SAFE_INT_MAX(1), FP64_NORM_SAFE_INT_MAX(0) } }, 18113 { /* => mm */ { FP64_INT32(INT32_INDEFINITE_C, INT32_INDEFINITE_C) } }, 18114 /*mxcsr:in */ 0, 18115 /*128:out */ X86_MXCSR_IE, 18116 /*256:out */ -1 }, 18117 /* 18118 * Invalids. 18119 */ 18120 /*12*/{ { /* unused */ { FP64_ROW_UNUSED } }, 18121 { /* src xmm */ { FP64_QNAN(0), FP64_QNAN(1) } }, 18122 { /* => mm */ { FP64_INT32(INT32_INDEFINITE_C, INT32_INDEFINITE_C) } }, 18123 /*mxcsr:in */ 0, 18124 /*128:out */ X86_MXCSR_IE, 18125 /*256:out */ -1 }, 18126 { { /* unused */ { FP64_ROW_UNUSED } }, 18127 { /* src xmm */ { FP64_SNAN(1), FP64_SNAN(0) } }, 18128 { /* => mm */ { FP64_INT32(INT32_INDEFINITE_C, INT32_INDEFINITE_C) } }, 18129 /*mxcsr:in */ 0, 18130 /*128:out */ X86_MXCSR_IE, 18131 /*256:out */ -1 }, 18132 }; 18133 18134 static BS3CPUINSTR4_TEST1_T const s_aTests16[] = 18135 { 18136 { bs3CpuInstr4_cvtpd2pi_MM1_XMM1_icebp_c16, 255, RM_REG, T_SSE, MM1, XMM1, NOREG, PASS_s_aValues }, 18137 { bs3CpuInstr4_cvtpd2pi_MM1_FSxBX_icebp_c16, 255, RM_MEM, T_SSE, MM1, FSxBX, NOREG, PASS_s_aValues }, 18138 }; 18139 18140 static BS3CPUINSTR4_TEST1_T const s_aTests32[] = 18141 { 18142 { bs3CpuInstr4_cvtpd2pi_MM1_XMM1_icebp_c32, 255, RM_REG, T_SSE, MM1, XMM1, NOREG, PASS_s_aValues }, 18143 { bs3CpuInstr4_cvtpd2pi_MM1_FSxBX_icebp_c32, 255, RM_MEM, T_SSE, MM1, FSxBX, NOREG, PASS_s_aValues }, 18144 }; 18145 static BS3CPUINSTR4_TEST1_T const s_aTests64[] = 18146 { 18147 { bs3CpuInstr4_cvtpd2pi_MM1_XMM1_icebp_c64, 255, RM_REG, T_SSE, MM1, XMM1, NOREG, PASS_s_aValues }, 18148 { bs3CpuInstr4_cvtpd2pi_MM1_FSxBX_icebp_c64, 255, RM_MEM, T_SSE, MM1, FSxBX, NOREG, PASS_s_aValues }, 18149 { bs3CpuInstr4_cvtpd2pi_MM1_XMM8_icebp_c64, 255, RM_REG, T_SSE, MM1, XMM8, NOREG, PASS_s_aValues }, 18150 }; 18151 18152 static BS3CPUINSTR4_TEST1_MODE_T const s_aTests[3] = BS3CPUINSTR4_TEST1_MODES_INIT(s_aTests16, s_aTests32, s_aTests64); 18153 unsigned const iTest = BS3CPUINSTR4_TEST_MODES_INDEX(bMode); 18154 return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests, 18155 g_aXcptConfig23_4, RT_ELEMENTS(g_aXcptConfig23_4)); 18156 } 18157 18158 18159 /* 18160 * CVTTPD2PI. 18161 */ 18162 BS3_DECL_FAR(uint8_t) bs3CpuInstr4_cvttpd2pi(uint8_t bMode) 18163 { 18164 static BS3CPUINSTR4_TEST1_VALUES_PD_T const s_aValues[] = 18165 { 18166 /* 18167 * Zero. 18168 */ 18169 /* 0*/{ { /* unused */ { FP64_ROW_UNUSED } }, 18170 { /* src xmm */ { FP64_0(0), FP64_0(1) } }, 18171 { /* => mm */ { FP64_INT32_C(0, 0) } }, 18172 /*mxcsr:in */ 0, 18173 /*128:out */ 0, 18174 /*256:out */ -1 }, 18175 /* 18176 * Infinity. 18177 */ 18178 /* 1*/{ { /* unused */ { FP64_ROW_UNUSED } }, 18179 { /* src xmm */ { FP64_INF(1), FP64_INF(0) } }, 18180 { /* => mm */ { FP64_INT32(INT32_INDEFINITE_C, INT32_INDEFINITE_C) } }, 18181 /*mxcsr:in */ 0, 18182 /*128:out */ X86_MXCSR_IE, 18183 /*256:out */ -1 }, 18184 /* 18185 * Normals & Precision. 18186 */ 18187 /* 2*/{ { /* unused */ { FP64_ROW_UNUSED } }, 18188 { /* src xmm */ { FP64_V(0,0xe240000000000,0x40f), FP64_V(1,0xe240000000000,0x40f) } }, 18189 { /* => mm */ { FP64_INT32_C(123456, -123456) } }, 18190 /*mxcsr:in */ 0, 18191 /*128:out */ 0, 18192 /*256:out */ -1 }, 18193 { { /* unused */ { FP64_ROW_UNUSED } }, 18194 { /* src xmm */ { FP64_V(0,0xe240e66666666,0x40f), FP64_V(1,0xe240e66666666,0x40f) } }, 18195 /*123456.9*/ /*-123456.9*/ 18196 { /* => mm */ { FP64_INT32_C(123456, -123456) } }, 18197 /*mxcsr:in */ 0, 18198 /*128:out */ X86_MXCSR_PE, 18199 /*256:out */ -1 }, 18200 { { /* unused */ { FP64_ROW_UNUSED } }, 18201 { /* src xmm */ { FP64_V(0,0xe240e66666666,0x40f), FP64_V(1,0xe240e66666666,0x40f) } }, 18202 /*123456.9*/ /*-123456.9*/ 18203 { /* => mm */ { FP64_INT32_C(123456, -123456) } }, 18204 /*mxcsr:in */ X86_MXCSR_RC_DOWN, 18205 /*128:out */ X86_MXCSR_PE | X86_MXCSR_RC_DOWN, 18206 /*256:out */ -1 }, 18207 { { /* unused */ { FP64_ROW_UNUSED } }, 18208 { /* src xmm */ { FP64_V(0,0xe240e66666666,0x40f), FP64_V(1,0xe240e66666666,0x40f) } }, 18209 /*123456.9*/ /*-123456.9*/ 18210 { /* => mm */ { FP64_INT32_C(123456, -123456) } }, 18211 /*mxcsr:in */ X86_MXCSR_RC_UP, 18212 /*128:out */ X86_MXCSR_PE | X86_MXCSR_RC_UP, 18213 /*256:out */ -1 }, 18214 { { /* unused */ { FP64_ROW_UNUSED } }, 18215 { /* src xmm */ { FP64_V(0,0xe240e66666666,0x40f), FP64_V(1,0xe240e66666666,0x40f) } }, 18216 /*123456.9*/ /*-123456.9*/ 18217 { /* => mm */ { FP64_INT32_C(123456, -123456) } }, 18218 /*mxcsr:in */ X86_MXCSR_RC_ZERO, 18219 /*128:out */ X86_MXCSR_PE | X86_MXCSR_RC_ZERO, 18220 /*256:out */ -1 }, 18221 { { /* unused */ { FP64_ROW_UNUSED } }, 18222 { /* src xmm */ { FP64_V(1,0xccccccccccccd,0x3fe), FP64_V(0,0xccccccccccccd,0x3fe) } }, 18223 /*-0.9*/ /*0.9*/ 18224 { /* => mm */ { FP64_INT32_C(0, 0) } }, 18225 /*mxcsr:in */ X86_MXCSR_FZ, 18226 /*128:out */ X86_MXCSR_PE | X86_MXCSR_FZ, 18227 /*256:out */ -1 }, 18228 /* 18229 * Denormals. 18230 */ 18231 /* 8*/{ { /* unused */ { FP64_ROW_UNUSED } }, 18232 { /* src xmm */ { FP64_DENORM_MAX(0), FP64_DENORM_MIN(1) } }, 18233 { /* => mm */ { FP64_INT32_C(0, 0) } }, 18234 /*mxcsr:in */ 0, 18235 /*128:out */ X86_MXCSR_PE, 18236 /*256:out */ -1 }, 18237 { { /* unused */ { FP64_ROW_UNUSED } }, 18238 { /* src xmm */ { FP64_DENORM_MIN(0), FP64_DENORM_MAX(1) } }, 18239 { /* => mm */ { FP64_INT32_C(0, 0) } }, 18240 /*mxcsr:in */ X86_MXCSR_DAZ, 18241 /*128:out */ X86_MXCSR_DAZ, 18242 /*256:out */ -1 }, 18243 /* 18244 * Overflow (Underflow not possible). 18245 */ 18246 /*10*/{ { /* unused */ { FP64_ROW_UNUSED } }, 18247 { /* src xmm */ { FP64_NORM_MAX(0), FP64_NORM_MAX(1) } }, 18248 { /* => mm */ { FP64_INT32(INT32_INDEFINITE_C, INT32_INDEFINITE_C) } }, 18249 /*mxcsr:in */ 0, 18250 /*128:out */ X86_MXCSR_IE, 18251 /*256:out */ -1 }, 18252 { { /* unused */ { FP64_ROW_UNUSED } }, 18253 { /* src xmm */ { FP64_NORM_SAFE_INT_MAX(1), FP64_NORM_SAFE_INT_MAX(0) } }, 18254 { /* => mm */ { FP64_INT32(INT32_INDEFINITE_C, INT32_INDEFINITE_C) } }, 18255 /*mxcsr:in */ 0, 18256 /*128:out */ X86_MXCSR_IE, 18257 /*256:out */ -1 }, 18258 /* 18259 * Invalids. 18260 */ 18261 /*12*/{ { /* unused */ { FP64_ROW_UNUSED } }, 18262 { /* src xmm */ { FP64_QNAN(0), FP64_QNAN(1) } }, 18263 { /* => mm */ { FP64_INT32(INT32_INDEFINITE_C, INT32_INDEFINITE_C) } }, 18264 /*mxcsr:in */ 0, 18265 /*128:out */ X86_MXCSR_IE, 18266 /*256:out */ -1 }, 18267 { { /* unused */ { FP64_ROW_UNUSED } }, 18268 { /* src xmm */ { FP64_SNAN(1), FP64_SNAN(0) } }, 18269 { /* => mm */ { FP64_INT32(INT32_INDEFINITE_C, INT32_INDEFINITE_C) } }, 18270 /*mxcsr:in */ 0, 18271 /*128:out */ X86_MXCSR_IE, 18272 /*256:out */ -1 }, 18273 }; 18274 18275 static BS3CPUINSTR4_TEST1_T const s_aTests16[] = 18276 { 18277 { bs3CpuInstr4_cvttpd2pi_MM1_XMM1_icebp_c16, 255, RM_REG, T_SSE, MM1, XMM1, NOREG, PASS_s_aValues }, 18278 { bs3CpuInstr4_cvttpd2pi_MM1_FSxBX_icebp_c16, 255, RM_MEM, T_SSE, MM1, FSxBX, NOREG, PASS_s_aValues }, 18279 }; 18280 18281 static BS3CPUINSTR4_TEST1_T const s_aTests32[] = 18282 { 18283 { bs3CpuInstr4_cvttpd2pi_MM1_XMM1_icebp_c32, 255, RM_REG, T_SSE, MM1, XMM1, NOREG, PASS_s_aValues }, 18284 { bs3CpuInstr4_cvttpd2pi_MM1_FSxBX_icebp_c32, 255, RM_MEM, T_SSE, MM1, FSxBX, NOREG, PASS_s_aValues }, 18285 }; 18286 static BS3CPUINSTR4_TEST1_T const s_aTests64[] = 18287 { 18288 { bs3CpuInstr4_cvttpd2pi_MM1_XMM1_icebp_c64, 255, RM_REG, T_SSE, MM1, XMM1, NOREG, PASS_s_aValues }, 18289 { bs3CpuInstr4_cvttpd2pi_MM1_FSxBX_icebp_c64, 255, RM_MEM, T_SSE, MM1, FSxBX, NOREG, PASS_s_aValues }, 18290 { bs3CpuInstr4_cvttpd2pi_MM1_XMM8_icebp_c64, 255, RM_REG, T_SSE, MM1, XMM8, NOREG, PASS_s_aValues }, 18291 }; 18292 18293 static BS3CPUINSTR4_TEST1_MODE_T const s_aTests[3] = BS3CPUINSTR4_TEST1_MODES_INIT(s_aTests16, s_aTests32, s_aTests64); 18294 unsigned const iTest = BS3CPUINSTR4_TEST_MODES_INDEX(bMode); 18295 return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests, 18296 g_aXcptConfig23_4, RT_ELEMENTS(g_aXcptConfig23_4)); 17907 18297 } 17908 18298 … … 17971 18361 { "cvtss2si", bs3CpuInstr4_cvtss2si, 0 }, 17972 18362 { "cvttss2si", bs3CpuInstr4_cvttss2si, 0 }, 18363 { "cvtpi2pd", bs3CpuInstr4_cvtpi2pd, 0 }, 18364 { "cvtpd2pi", bs3CpuInstr4_cvtpd2pi, 0 }, 18365 { "cvttpd2pi", bs3CpuInstr4_cvttpd2pi, 0 }, 17973 18366 #endif 17974 18367 };
Note:
See TracChangeset
for help on using the changeset viewer.