VirtualBox

Changeset 105611 in vbox for trunk/src/VBox/ValidationKit


Ignore:
Timestamp:
Aug 7, 2024 3:33:51 AM (8 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
164291
Message:

ValidationKit/bootsectors: bugref:10658 SIMD FP testcase: [v]addsd (W.I.P).

Location:
trunk/src/VBox/ValidationKit/bootsectors
Files:
2 edited

Legend:

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

    r105334 r105611  
    200200
    201201;
     202;; [v]addsd
     203;
     204EMIT_INSTR_PLUS_ICEBP       addsd, XMM1, XMM2
     205EMIT_INSTR_PLUS_ICEBP       addsd, XMM1, FSxBX
     206EMIT_INSTR_PLUS_ICEBP_C64   addsd, XMM8, XMM9
     207EMIT_INSTR_PLUS_ICEBP_C64   addsd, XMM8, FSxBX
     208
     209EMIT_INSTR_PLUS_ICEBP       vaddsd, XMM1, XMM2, XMM3
     210EMIT_INSTR_PLUS_ICEBP       vaddsd, XMM1, XMM2, FSxBX
     211EMIT_INSTR_PLUS_ICEBP_C64   vaddsd, XMM8, XMM9, XMM10
     212EMIT_INSTR_PLUS_ICEBP_C64   vaddsd, XMM8, XMM9, FSxBX
     213
     214;
    202215;; [v]haddps
    203216;
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-4.c32

    r105604 r105611  
    150150 * Single-precision random values (incl. potentially invalid values).
    151151 * We don't care what the exact values are as these are meant to populate
    152  * unmodified operands and be compared bitwise.
     152 * unmodified parts of operands and be compared bitwise.
    153153 */
    154154#define FP32_RAND_V0(a_Sign)                RTFLOAT32U_INIT_C(a_Sign, 0x7bacda, 0x55)
     
    197197#define FP64_SNAN(a_Sign)                   RTFLOAT64U_INIT_SNAN(a_Sign)
    198198#define FP64_SNAN_V(a_Sign, a_Val)          RTFLOAT64U_INIT_SNAN_EX(a_Sign, a_Val)
     199
     200/*
     201 * Double-precision random values (incl. potentially invalid values).
     202 * We don't care what the exact values are as these are meant to populate
     203 * unmodified parts of operands and be compared bitwise.
     204 */
     205#define FP64_RAND_V0(a_Sign)                RTFLOAT64U_INIT_C(a_Sign, 0xab07eb7bcebce, 0x777)
     206#define FP64_RAND_V1(a_Sign)                RTFLOAT64U_INIT_C(a_Sign, 0x2fa17e10b3c7c, 0x6b6)
     207#define FP64_RAND_V2(a_Sign)                RTFLOAT64U_INIT_C(a_Sign, 0xceb1703cbe310, 0x100)
     208#define FP64_RAND_V3(a_Sign)                RTFLOAT64U_INIT_C(a_Sign, 0x7134abcdef10f, 0x70f)
    199209
    200210/*
     
    377387{
    378388    /** Scalar double-precision floating-point view. */
    379     RTFLOAT64U  ar64[3];
     389    RTFLOAT64U  ar64[4];
    380390    /** 256-bit integer view. */
    381391    RTUINT256U  ymm;
     
    10761086AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SS_T, f128FpXcptExpected, BS3CPUINSTR4_TEST1_VALUES_T, f128FpXcptExpected);
    10771087AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SS_T, f256FpXcptExpected, BS3CPUINSTR4_TEST1_VALUES_T, f256FpXcptExpected);
     1088
     1089/*
     1090 * Test type #1.
     1091 * Scalar double-precision.
     1092 */
     1093typedef struct BS3CPUINSTR4_TEST1_VALUES_SD_T
     1094{
     1095    X86YMMFLOATSDREG    uSrc2;                  /**< Second source operand. */
     1096    X86YMMFLOATSDREG    uSrc1;                  /**< uDstIn for SSE */
     1097    X86YMMFLOATSDREG    uDstOut;                /**< Destination output. */
     1098    uint32_t            uMxCsr;                 /**< MXCSR to set prior to executing the instruction. */
     1099    uint32_t            u128ExpectedMxCsr;      /**< Expected MXCSR for a 128-bit instruction. */
     1100    uint32_t            u256ExpectedMxCsr;      /**< Expected MXCSR for a 256-bit instructions. */
     1101    uint8_t             f128FpXcptExpected;     /**< Whether a floating-point exception is expected for a 128-bit instruction. */
     1102    uint8_t             f256FpXcptExpected;     /**< Whether a floating-point exception is expected for a 256-bit instruction. */
     1103    uint8_t             afPadding[2];           /**< Alignment padding. */
     1104} BS3CPUINSTR4_TEST1_VALUES_SD_T;
     1105AssertCompile(sizeof(BS3CPUINSTR4_TEST1_VALUES_SD_T) == sizeof(BS3CPUINSTR4_TEST1_VALUES_T));
     1106AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SD_T, uSrc2,              BS3CPUINSTR4_TEST1_VALUES_T, uSrc2);
     1107AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SD_T, uSrc1,              BS3CPUINSTR4_TEST1_VALUES_T, uSrc1);
     1108AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SD_T, uDstOut,            BS3CPUINSTR4_TEST1_VALUES_T, uDstOut);
     1109AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SD_T, uMxCsr,             BS3CPUINSTR4_TEST1_VALUES_T, uMxCsr);
     1110AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SD_T, u128ExpectedMxCsr,  BS3CPUINSTR4_TEST1_VALUES_T, u128ExpectedMxCsr);
     1111AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SD_T, u256ExpectedMxCsr,  BS3CPUINSTR4_TEST1_VALUES_T, u256ExpectedMxCsr);
     1112AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SD_T, f128FpXcptExpected, BS3CPUINSTR4_TEST1_VALUES_T, f128FpXcptExpected);
     1113AssertCompileMembersSameSizeAndOffset(BS3CPUINSTR4_TEST1_VALUES_SD_T, f256FpXcptExpected, BS3CPUINSTR4_TEST1_VALUES_T, f256FpXcptExpected);
    10781114
    10791115/*
     
    27302766        { bs3CpuInstr4_addss_XMM8_XMM9_icebp_c64,  255,         RM_REG, T_SSE, 8, 8, 9,   RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
    27312767        { bs3CpuInstr4_addss_XMM8_FSxBX_icebp_c64, X86_XCPT_AC, RM_MEM, T_SSE, 8, 8, 255, RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2768    };
     2769
     2770    static BS3CPUINSTR4_TEST1_MODE_T const s_aTests[3] = BS3CPUINSTR4_TEST1_MODES_INIT(s_aTests16, s_aTests32, s_aTests64);
     2771    unsigned const                         iTest       = BS3CPUINSTR4_TEST_MODES_INDEX(bMode);
     2772    return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests,
     2773                                        g_aXcptConfig3, RT_ELEMENTS(g_aXcptConfig3));
     2774}
     2775
     2776
     2777/*
     2778 * [V]ADDSD.
     2779 */
     2780BS3_DECL_FAR(uint8_t) bs3CpuInstr4_v_addsd(uint8_t bMode)
     2781{
     2782    static BS3CPUINSTR4_TEST1_VALUES_SD_T const s_aValues[] =
     2783    {
     2784    /*
     2785     * Zero.
     2786     */
     2787    /* 0*/{ { /*src2     */ { FP64_0(0), FP64_0(0), FP64_0(0), FP64_0(0) } },
     2788            { /*src1     */ { FP64_0(0), FP64_0(0), FP64_0(0), FP64_0(0) } },
     2789            { /* =>      */ { FP64_0(0), FP64_0(0), FP64_0(0), FP64_0(0) } },
     2790              /*mxcsr:in */ X86_MXCSR_XCPT_MASK,
     2791              /*128:out  */ X86_MXCSR_XCPT_MASK,
     2792              /*256:out  */ X86_MXCSR_XCPT_MASK,
     2793              /*xcpt?    */ false, false },
     2794          { { /*src2     */ { FP64_0(0), FP64_RAND_V3(0), FP32_RAND_V2(0), FP32_RAND_V1(1) } },
     2795            { /*src1     */ { FP64_0(0), FP64_RAND_V0(0), FP32_RAND_V1(1), FP32_RAND_V2(1) } },
     2796            { /* =>      */ { FP64_0(0), FP64_RAND_V0(0), FP32_RAND_V1(1), FP32_RAND_V2(1) } },
     2797              /*mxcsr:in */ 0,
     2798              /*128:out  */ 0,
     2799              /*256:out  */ 0,
     2800              /*xcpt?    */ false, false },
     2801          { { /*src2     */ { FP64_0(0), FP64_RAND_V1(0), FP64_RAND_V2(0), FP64_RAND_V0(1) } },
     2802            { /*src1     */ { FP64_0(0), FP64_RAND_V0(0), FP64_RAND_V1(1), FP64_RAND_V2(1) } },
     2803            { /* =>      */ { FP64_0(0), FP64_RAND_V0(0), FP64_RAND_V1(1), FP64_RAND_V2(1) } },
     2804              /*mxcsr:in */ X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_RC_UP,
     2805              /*128:out  */ X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_RC_UP,
     2806              /*256:out  */ X86_MXCSR_DAZ | X86_MXCSR_FZ | X86_MXCSR_RC_UP,
     2807              /*xcpt?    */ false, false },
     2808          { { /*src2     */ { FP64_0(1), FP64_RAND_V0(0), FP64_RAND_V1(0), FP64_RAND_V2(1) } },
     2809            { /*src1     */ { FP64_0(1), FP64_RAND_V3(1), FP64_RAND_V2(0), FP64_RAND_V0(0) } },
     2810            { /* =>      */ { FP64_0(1), FP64_RAND_V3(1), FP64_RAND_V2(0), FP64_RAND_V0(0) } },
     2811              /*mxcsr:in */ X86_MXCSR_DAZ | X86_MXCSR_RC_ZERO,
     2812              /*128:out  */ X86_MXCSR_DAZ | X86_MXCSR_RC_ZERO,
     2813              /*256:out  */ X86_MXCSR_DAZ | X86_MXCSR_RC_ZERO,
     2814              /*xcpt?    */ false, false },
     2815          { { /*src2     */ { FP64_0(0), FP64_RAND_V0(0), FP64_RAND_V1(0), FP64_RAND_V2(1) } },
     2816            { /*src1     */ { FP64_0(0), FP64_RAND_V3(1), FP64_RAND_V1(0), FP64_RAND_V0(0) } },
     2817            { /* =>      */ { FP64_0(0), FP64_RAND_V3(1), FP64_RAND_V1(0), FP64_RAND_V0(0) } },
     2818              /*mxcsr:in */ X86_MXCSR_FZ,
     2819              /*128:out  */ X86_MXCSR_FZ,
     2820              /*256:out  */ X86_MXCSR_FZ,
     2821              /*xcpt?    */ false, false },
     2822          { { /*src2     */ { FP64_0(0), FP64_RAND_V1(1), FP64_RAND_V2(0), FP64_RAND_V1(1) } },
     2823            { /*src1     */ { FP64_0(0), FP64_RAND_V3(1), FP64_RAND_V0(0), FP64_RAND_V2(1) } },
     2824            { /* =>      */ { FP64_0(0), FP64_RAND_V3(1), FP64_RAND_V0(0), FP64_RAND_V1(1) } },
     2825              /*mxcsr:in */ X86_MXCSR_DAZ | X86_MXCSR_RC_DOWN,
     2826              /*128:out  */ X86_MXCSR_DAZ | X86_MXCSR_RC_DOWN,
     2827              /*256:out  */ X86_MXCSR_DAZ | X86_MXCSR_RC_DOWN,
     2828              /*xcpt?    */ false, false },
     2829    /** @todo Infinity, Normalds, Denormals, Overflow/Precision, Invalids etc. */
     2830    };
     2831
     2832    static BS3CPUINSTR4_TEST1_T const s_aTests16[] =
     2833    {
     2834        { bs3CpuInstr4_addsd_XMM1_XMM2_icebp_c16,  255, RM_REG, T_SSE, 1, 1, 2,   RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2835        { bs3CpuInstr4_addsd_XMM1_FSxBX_icebp_c16, 255, RM_MEM, T_SSE, 1, 1, 255, RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2836
     2837        { bs3CpuInstr4_vaddsd_XMM1_XMM2_XMM3_icebp_c16,  255,         RM_REG, T_AVX_128, 1, 2, 3,   RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2838        { bs3CpuInstr4_vaddsd_XMM1_XMM2_FSxBX_icebp_c16, X86_XCPT_AC, RM_MEM, T_AVX_128, 1, 2, 255, RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2839    };
     2840    static BS3CPUINSTR4_TEST1_T const s_aTests32[] =
     2841    {
     2842        { bs3CpuInstr4_addsd_XMM1_XMM2_icebp_c32,  255, RM_REG, T_SSE, 1, 1, 2,   RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2843        { bs3CpuInstr4_addsd_XMM1_FSxBX_icebp_c32, 255, RM_MEM, T_SSE, 1, 1, 255, RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2844
     2845        { bs3CpuInstr4_vaddsd_XMM1_XMM2_XMM3_icebp_c32,  255,         RM_REG, T_AVX_128, 1, 2, 3,   RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2846        { bs3CpuInstr4_vaddsd_XMM1_XMM2_FSxBX_icebp_c32, X86_XCPT_AC, RM_MEM, T_AVX_128, 1, 2, 255, RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2847    };
     2848    static BS3CPUINSTR4_TEST1_T const s_aTests64[] =
     2849    {
     2850        { bs3CpuInstr4_addsd_XMM1_XMM2_icebp_c64,  255, RM_REG, T_SSE, 1, 1, 2,   RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2851        { bs3CpuInstr4_addsd_XMM1_FSxBX_icebp_c64, 255, RM_MEM, T_SSE, 1, 1, 255, RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2852
     2853        { bs3CpuInstr4_vaddsd_XMM1_XMM2_XMM3_icebp_c64,  255,         RM_REG, T_AVX_128, 1, 2, 3,   RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2854        { bs3CpuInstr4_vaddsd_XMM1_XMM2_FSxBX_icebp_c64, X86_XCPT_AC, RM_MEM, T_AVX_128, 1, 2, 255, RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2855
     2856        { bs3CpuInstr4_addsd_XMM8_XMM9_icebp_c64,  255,         RM_REG, T_SSE, 8, 8, 9,   RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
     2857        { bs3CpuInstr4_addsd_XMM8_FSxBX_icebp_c64, X86_XCPT_AC, RM_MEM, T_SSE, 8, 8, 255, RT_ELEMENTS(s_aValues), (BS3CPUINSTR4_TEST1_VALUES_T *)s_aValues },
    27322858    };
    27332859
     
    53685494        { "[v]addpd",       bs3CpuInstr4_v_addpd,  0 },
    53695495        { "[v]addss",       bs3CpuInstr4_v_addss,  0 },
     5496        { "[v]addsd",       bs3CpuInstr4_v_addsd,  0 },
    53705497        { "[v]haddps",      bs3CpuInstr4_v_haddps, 0 },
    53715498        { "[v]subps",       bs3CpuInstr4_v_subps,  0 },
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette