xref: /openbmc/qemu/tests/tcg/xtensa/test_dfp0_arith.S (revision 44423107e7b5731ef40c5c8632a5bad8b49d0838)
1*6aa29c07SMax Filippov#include "macros.inc"
2*6aa29c07SMax Filippov#include "fpu.h"
3*6aa29c07SMax Filippov
4*6aa29c07SMax Filippovtest_suite fp0_arith
5*6aa29c07SMax Filippov
6*6aa29c07SMax Filippov#if XCHAL_HAVE_DFP
7*6aa29c07SMax Filippov
8*6aa29c07SMax Filippov.macro movfp fr, v
9*6aa29c07SMax Filippov    movi    a2, ((\v) >> 32) & 0xffffffff
10*6aa29c07SMax Filippov    movi    a3, ((\v) & 0xffffffff)
11*6aa29c07SMax Filippov    wfrd    \fr, a2, a3
12*6aa29c07SMax Filippov.endm
13*6aa29c07SMax Filippov
14*6aa29c07SMax Filippov.macro check_res fr, r, sr
15*6aa29c07SMax Filippov    rfrd    a2, \fr
16*6aa29c07SMax Filippov    dump    a2
17*6aa29c07SMax Filippov    movi    a3, ((\r) >> 32) & 0xffffffff
18*6aa29c07SMax Filippov    assert  eq, a2, a3
19*6aa29c07SMax Filippov    rfr    a2, \fr
20*6aa29c07SMax Filippov    dump    a2
21*6aa29c07SMax Filippov    movi    a3, ((\r) & 0xffffffff)
22*6aa29c07SMax Filippov    assert  eq, a2, a3
23*6aa29c07SMax Filippov    rur     a2, fsr
24*6aa29c07SMax Filippov    movi    a3, \sr
25*6aa29c07SMax Filippov    assert  eq, a2, a3
26*6aa29c07SMax Filippov.endm
27*6aa29c07SMax Filippov
28*6aa29c07SMax Filippovtest add_d
29*6aa29c07SMax Filippov    movi    a2, 1
30*6aa29c07SMax Filippov    wsr     a2, cpenable
31*6aa29c07SMax Filippov
32*6aa29c07SMax Filippov    /* MAX_FLOAT + MAX_FLOAT = +inf/MAX_FLOAT  */
33*6aa29c07SMax Filippov    test_op2 add.d, f6, f7, f8, F64_MAX, F64_MAX, \
34*6aa29c07SMax Filippov        F64_PINF, F64_MAX, F64_PINF, F64_MAX, \
35*6aa29c07SMax Filippov          FSR_OI,  FSR_OI,   FSR_OI,  FSR_OI
36*6aa29c07SMax Filippovtest_end
37*6aa29c07SMax Filippov
38*6aa29c07SMax Filippovtest add_d_inf
39*6aa29c07SMax Filippov    /* 1 + +inf = +inf  */
40*6aa29c07SMax Filippov    test_op2 add.d, f6, f7, f8, F64_1, F64_PINF, \
41*6aa29c07SMax Filippov        F64_PINF, F64_PINF, F64_PINF, F64_PINF, \
42*6aa29c07SMax Filippov           FSR__,    FSR__,    FSR__,    FSR__
43*6aa29c07SMax Filippov
44*6aa29c07SMax Filippov    /* +inf + -inf = default NaN */
45*6aa29c07SMax Filippov    test_op2 add.d, f0, f1, f2, F64_PINF, F64_NINF, \
46*6aa29c07SMax Filippov        F64_DNAN, F64_DNAN, F64_DNAN, F64_DNAN, \
47*6aa29c07SMax Filippov           FSR_V,    FSR_V,    FSR_V,    FSR_V
48*6aa29c07SMax Filippovtest_end
49*6aa29c07SMax Filippov
50*6aa29c07SMax Filippovtest add_d_nan_dfpu
51*6aa29c07SMax Filippov    /* 1 + QNaN = QNaN  */
52*6aa29c07SMax Filippov    test_op2 add.d, f9, f10, f11, F64_1, F64_QNAN(1), \
53*6aa29c07SMax Filippov        F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \
54*6aa29c07SMax Filippov              FSR__,       FSR__,       FSR__,       FSR__
55*6aa29c07SMax Filippov    /* 1 + SNaN = QNaN  */
56*6aa29c07SMax Filippov    test_op2 add.d, f12, f13, f14, F64_1, F64_SNAN(1), \
57*6aa29c07SMax Filippov        F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \
58*6aa29c07SMax Filippov              FSR_V,       FSR_V,       FSR_V,       FSR_V
59*6aa29c07SMax Filippov
60*6aa29c07SMax Filippov    /* SNaN1 + SNaN2 = QNaN2 */
61*6aa29c07SMax Filippov    test_op2 add.d, f15, f0, f1, F64_SNAN(1), F64_SNAN(2), \
62*6aa29c07SMax Filippov        F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \
63*6aa29c07SMax Filippov              FSR_V,       FSR_V,       FSR_V,       FSR_V
64*6aa29c07SMax Filippov    /* QNaN1 + SNaN2 = QNaN2 */
65*6aa29c07SMax Filippov    test_op2 add.d, f5, f6, f7, F64_QNAN(1), F64_SNAN(2), \
66*6aa29c07SMax Filippov        F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \
67*6aa29c07SMax Filippov              FSR_V,       FSR_V,       FSR_V,       FSR_V
68*6aa29c07SMax Filippov    /* SNaN1 + QNaN2 = QNaN2 */
69*6aa29c07SMax Filippov    test_op2 add.d, f8, f9, f10, F64_SNAN(1), F64_QNAN(2), \
70*6aa29c07SMax Filippov        F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \
71*6aa29c07SMax Filippov              FSR_V,       FSR_V,       FSR_V,       FSR_V
72*6aa29c07SMax Filippovtest_end
73*6aa29c07SMax Filippov
74*6aa29c07SMax Filippovtest sub_d
75*6aa29c07SMax Filippov    /* norm - norm = denorm */
76*6aa29c07SMax Filippov    test_op2 sub.d, f6, f7, f8, F64_MIN_NORM | 1, F64_MIN_NORM, \
77*6aa29c07SMax Filippov        0x00000001, 0x00000001, 0x00000001, 0x00000001, \
78*6aa29c07SMax Filippov             FSR__,      FSR__,      FSR__,      FSR__
79*6aa29c07SMax Filippovtest_end
80*6aa29c07SMax Filippov
81*6aa29c07SMax Filippovtest mul_d
82*6aa29c07SMax Filippov    test_op2 mul.d, f0, f1, f2, F64_1 | 1, F64_1 | 1, \
83*6aa29c07SMax Filippov        F64_1 | 2, F64_1 | 2, F64_1 | 3, F64_1 | 2, \
84*6aa29c07SMax Filippov            FSR_I,     FSR_I,     FSR_I,     FSR_I
85*6aa29c07SMax Filippov    /* MAX_FLOAT/2 * MAX_FLOAT/2 = +inf/MAX_FLOAT  */
86*6aa29c07SMax Filippov    test_op2 mul.d, f6, f7, f8, F64_MAX_2, F64_MAX_2, \
87*6aa29c07SMax Filippov        F64_PINF, F64_MAX, F64_PINF, F64_MAX, \
88*6aa29c07SMax Filippov          FSR_OI,  FSR_OI,   FSR_OI,  FSR_OI
89*6aa29c07SMax Filippov    /* min norm * min norm = 0/denorm */
90*6aa29c07SMax Filippov    test_op2 mul.d, f6, f7, f8, F64_MIN_NORM, F64_MIN_NORM, \
91*6aa29c07SMax Filippov         F64_0,  F64_0, 0x00000001,  F64_0, \
92*6aa29c07SMax Filippov        FSR_UI, FSR_UI,     FSR_UI, FSR_UI
93*6aa29c07SMax Filippov    /* inf * 0 = default NaN */
94*6aa29c07SMax Filippov    test_op2 mul.d, f6, f7, f8, F64_PINF, F64_0, \
95*6aa29c07SMax Filippov        F64_DNAN, F64_DNAN, F64_DNAN, F64_DNAN, \
96*6aa29c07SMax Filippov           FSR_V,    FSR_V,    FSR_V,    FSR_V
97*6aa29c07SMax Filippovtest_end
98*6aa29c07SMax Filippov
99*6aa29c07SMax Filippovtest madd_d
100*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, F64_0, F64_1 | 1, F64_1 | 1, \
101*6aa29c07SMax Filippov        F64_1 | 2, F64_1 | 2, F64_1 | 3, F64_1 | 2, \
102*6aa29c07SMax Filippov            FSR_I,     FSR_I,     FSR_I,     FSR_I
103*6aa29c07SMax Filippovtest_end
104*6aa29c07SMax Filippov
105*6aa29c07SMax Filippovtest madd_d_precision
106*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, \
107*6aa29c07SMax Filippov        F64_MINUS | F64_1 | 2, F64_1 | 1, F64_1 | 1, \
108*6aa29c07SMax Filippov        0x3970000000000000, 0x3970000000000000, 0x3970000000000000, 0x3970000000000000, \
109*6aa29c07SMax Filippov             FSR__,      FSR__,      FSR__,      FSR__
110*6aa29c07SMax Filippovtest_end
111*6aa29c07SMax Filippov
112*6aa29c07SMax Filippovtest madd_d_nan_dfpu
113*6aa29c07SMax Filippov    /* DFPU madd/msub NaN1, NaN2, NaN3 priority: NaN1, NaN3, NaN2 */
114*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, F64_QNAN(1), F64_1, F64_1, \
115*6aa29c07SMax Filippov        F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \
116*6aa29c07SMax Filippov              FSR__,       FSR__,       FSR__,       FSR__
117*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, F64_1, F64_QNAN(2), F64_1, \
118*6aa29c07SMax Filippov        F64_QNAN(2), F64_QNAN(2), F64_QNAN(2), F64_QNAN(2), \
119*6aa29c07SMax Filippov              FSR__,       FSR__,       FSR__,       FSR__
120*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, F64_1, F64_1, F64_QNAN(3), \
121*6aa29c07SMax Filippov        F64_QNAN(3), F64_QNAN(3), F64_QNAN(3), F64_QNAN(3), \
122*6aa29c07SMax Filippov              FSR__,       FSR__,       FSR__,       FSR__
123*6aa29c07SMax Filippov
124*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, F64_QNAN(1), F64_QNAN(2), F64_1, \
125*6aa29c07SMax Filippov        F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \
126*6aa29c07SMax Filippov              FSR__,       FSR__,       FSR__,       FSR__
127*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, F64_QNAN(1), F64_1, F64_QNAN(3), \
128*6aa29c07SMax Filippov        F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \
129*6aa29c07SMax Filippov              FSR__,       FSR__,       FSR__,       FSR__
130*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, F64_1, F64_QNAN(2), F64_QNAN(3), \
131*6aa29c07SMax Filippov        F64_QNAN(3), F64_QNAN(3), F64_QNAN(3), F64_QNAN(3), \
132*6aa29c07SMax Filippov              FSR__,       FSR__,       FSR__,       FSR__
133*6aa29c07SMax Filippov
134*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, F64_QNAN(1), F64_QNAN(2), F64_QNAN(3), \
135*6aa29c07SMax Filippov        F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \
136*6aa29c07SMax Filippov              FSR__,       FSR__,       FSR__,       FSR__
137*6aa29c07SMax Filippov
138*6aa29c07SMax Filippov    /* inf * 0 = default NaN */
139*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, F64_1, F64_PINF, F64_0, \
140*6aa29c07SMax Filippov        F64_DNAN, F64_DNAN, F64_DNAN, F64_DNAN, \
141*6aa29c07SMax Filippov           FSR_V,    FSR_V,    FSR_V,    FSR_V
142*6aa29c07SMax Filippov    /* inf * 0 + SNaN1 = QNaN1 */
143*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, F64_SNAN(1), F64_PINF, F64_0, \
144*6aa29c07SMax Filippov        F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \
145*6aa29c07SMax Filippov              FSR_V,       FSR_V,       FSR_V,       FSR_V
146*6aa29c07SMax Filippov    /* inf * 0 + QNaN1 = QNaN1 */
147*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, F64_QNAN(1), F64_PINF, F64_0, \
148*6aa29c07SMax Filippov        F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \
149*6aa29c07SMax Filippov              FSR_V,       FSR_V,       FSR_V,       FSR_V
150*6aa29c07SMax Filippov
151*6aa29c07SMax Filippov    /* madd/msub SNaN turns to QNaN and sets Invalid flag */
152*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, F64_SNAN(1), F64_1, F64_1, \
153*6aa29c07SMax Filippov        F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \
154*6aa29c07SMax Filippov              FSR_V,       FSR_V,       FSR_V,       FSR_V
155*6aa29c07SMax Filippov    test_op3 madd.d, f0, f1, f2, f0, F64_QNAN(1), F64_SNAN(2), F64_1, \
156*6aa29c07SMax Filippov        F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \
157*6aa29c07SMax Filippov              FSR_V,       FSR_V,       FSR_V,       FSR_V
158*6aa29c07SMax Filippovtest_end
159*6aa29c07SMax Filippov
160*6aa29c07SMax Filippov#endif
161*6aa29c07SMax Filippov
162*6aa29c07SMax Filippovtest_suite_end
163