xref: /openbmc/qemu/tests/tcg/xtensa/test_fp0_arith.S (revision 448058aa)
1#include "macros.inc"
2#include "fpu.h"
3
4test_suite fp0_arith
5
6#if XCHAL_HAVE_FP
7
8.macro movfp fr, v
9    movi    a2, \v
10    wfr     \fr, a2
11.endm
12
13.macro check_res fr, r, sr
14    rfr     a2, \fr
15    dump    a2
16    movi    a3, \r
17    assert  eq, a2, a3
18    rur     a2, fsr
19#if DFPU
20    movi    a3, \sr
21    assert  eq, a2, a3
22#else
23    assert  eqi, a2, 0
24#endif
25.endm
26
27test add_s
28    movi    a2, 1
29    wsr     a2, cpenable
30
31    test_op2 add.s, f0, f1, f2, 0x3fc00000, 0x34400000, \
32        0x3fc00002, 0x3fc00001, 0x3fc00002, 0x3fc00001, \
33             FSR_I,      FSR_I,      FSR_I,      FSR_I
34    test_op2 add.s, f3, f4, f5, 0x3fc00000, 0x34a00000, \
35        0x3fc00002, 0x3fc00002, 0x3fc00003, 0x3fc00002, \
36             FSR_I,      FSR_I,      FSR_I,      FSR_I
37
38    /* MAX_FLOAT + MAX_FLOAT = +inf/MAX_FLOAT  */
39    test_op2 add.s, f6, f7, f8, 0x7f7fffff, 0x7f7fffff, \
40        0x7f800000, 0x7f7fffff, 0x7f800000, 0x7f7fffff, \
41            FSR_OI,     FSR_OI,     FSR_OI,     FSR_OI
42test_end
43
44test add_s_inf
45    /* 1 + +inf = +inf  */
46    test_op2 add.s, f6, f7, f8, 0x3fc00000, 0x7f800000, \
47        0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000, \
48             FSR__,      FSR__,      FSR__,      FSR__
49
50    /* +inf + -inf = default NaN */
51    test_op2 add.s, f0, f1, f2, 0x7f800000, 0xff800000, \
52        0x7fc00000, 0x7fc00000, 0x7fc00000, 0x7fc00000, \
53             FSR_V,      FSR_V,      FSR_V,      FSR_V
54test_end
55
56#if DFPU
57test add_s_nan_dfpu
58    /* 1 + QNaN = QNaN  */
59    test_op2 add.s, f9, f10, f11, 0x3fc00000, 0x7fc00001, \
60        0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, \
61             FSR__,      FSR__,      FSR__,      FSR__
62    /* 1 + SNaN = QNaN  */
63    test_op2 add.s, f12, f13, f14, 0x3fc00000, 0x7f800001, \
64        0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, \
65             FSR_V,      FSR_V,      FSR_V,      FSR_V
66
67    /* SNaN1 + SNaN2 = QNaN2 */
68    test_op2 add.s, f15, f0, f1, 0x7f800001, 0x7fbfffff, \
69        0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, \
70             FSR_V,      FSR_V,      FSR_V,      FSR_V
71    test_op2 add.s, f2, f3, f4, 0x7fbfffff, 0x7f800001, \
72        0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, \
73             FSR_V,      FSR_V,      FSR_V,      FSR_V
74    /* QNaN1 + SNaN2 = QNaN2 */
75    test_op2 add.s, f5, f6, f7, 0x7fc00001, 0x7fbfffff, \
76        0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, \
77             FSR_V,      FSR_V,      FSR_V,      FSR_V
78    /* SNaN1 + QNaN2 = QNaN2 */
79    test_op2 add.s, f8, f9, f10, 0x7fbfffff, 0x7fc00001, \
80        0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, \
81             FSR_V,      FSR_V,      FSR_V,      FSR_V
82test_end
83#else
84test add_s_nan_fpu2k
85    /* 1 + QNaN = QNaN  */
86    test_op2 add.s, f9, f10, f11, 0x3fc00000, 0x7fc00001, \
87        0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, \
88             FSR__,      FSR__,      FSR__,      FSR__
89    /* 1 + SNaN = SNaN  */
90    test_op2 add.s, f12, f13, f14, 0x3fc00000, 0x7f800001, \
91        0x7f800001, 0x7f800001, 0x7f800001, 0x7f800001, \
92             FSR__,      FSR__,      FSR__,      FSR__
93    /* SNaN1 + SNaN2 = SNaN1 */
94    test_op2 add.s, f15, f0, f1, 0x7f800001, 0x7fbfffff, \
95        0x7f800001, 0x7f800001, 0x7f800001, 0x7f800001, \
96             FSR__,      FSR__,      FSR__,      FSR__
97    test_op2 add.s, f2, f3, f4, 0x7fbfffff, 0x7f800001, \
98        0x7fbfffff, 0x7fbfffff, 0x7fbfffff, 0x7fbfffff, \
99             FSR__,      FSR__,      FSR__,      FSR__
100    /* QNaN1 + SNaN2 = QNaN1 */
101    test_op2 add.s, f5, f6, f7, 0x7fc00001, 0x7fbfffff, \
102        0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, \
103             FSR__,      FSR__,      FSR__,      FSR__
104    /* SNaN1 + QNaN2 = SNaN1 */
105    test_op2 add.s, f8, f9, f10, 0x7fbfffff, 0x7fc00001, \
106        0x7fbfffff, 0x7fbfffff, 0x7fbfffff, 0x7fbfffff, \
107             FSR__,      FSR__,      FSR__,      FSR__
108test_end
109#endif
110
111test sub_s
112    test_op2 sub.s, f0, f1, f0, 0x3f800001, 0x33800000, \
113        0x3f800000, 0x3f800000, 0x3f800001, 0x3f800000, \
114             FSR_I,      FSR_I,      FSR_I,      FSR_I
115    test_op2 sub.s, f0, f1, f1, 0x3f800002, 0x33800000, \
116        0x3f800002, 0x3f800001, 0x3f800002, 0x3f800001, \
117             FSR_I,      FSR_I,      FSR_I,      FSR_I
118
119    /* norm - norm = denorm */
120    test_op2 sub.s, f6, f7, f8, 0x00800001, 0x00800000, \
121        0x00000001, 0x00000001, 0x00000001, 0x00000001, \
122             FSR__,      FSR__,      FSR__,      FSR__
123test_end
124
125test mul_s
126    test_op2 mul.s, f0, f1, f2, 0x3f800001, 0x3f800001, \
127        0x3f800002, 0x3f800002, 0x3f800003, 0x3f800002, \
128             FSR_I,      FSR_I,      FSR_I,      FSR_I
129    /* MAX_FLOAT/2 * MAX_FLOAT/2 = +inf/MAX_FLOAT  */
130    test_op2 mul.s, f6, f7, f8, 0x7f000000, 0x7f000000, \
131        0x7f800000, 0x7f7fffff, 0x7f800000, 0x7f7fffff, \
132            FSR_OI,     FSR_OI,     FSR_OI,     FSR_OI
133    /* min norm * min norm = 0/denorm */
134    test_op2 mul.s, f6, f7, f8, 0x00800001, 0x00800000, \
135        0x00000000, 0x00000000, 0x00000001, 0x00000000, \
136            FSR_UI,     FSR_UI,     FSR_UI,     FSR_UI
137    /* inf * 0 = default NaN */
138    test_op2 mul.s, f6, f7, f8, 0x7f800000, 0x00000000, \
139        0x7fc00000, 0x7fc00000, 0x7fc00000, 0x7fc00000, \
140             FSR_V,      FSR_V,      FSR_V,      FSR_V
141test_end
142
143test madd_s
144    test_op3 madd.s, f0, f1, f2, f0, 0, 0x3f800001, 0x3f800001, \
145        0x3f800002, 0x3f800002, 0x3f800003, 0x3f800002, \
146             FSR_I,      FSR_I,      FSR_I,      FSR_I
147test_end
148
149test madd_s_precision
150    test_op3 madd.s, f0, f1, f2, f0, 0xbf800002, 0x3f800001, 0x3f800001, \
151        0x28800000, 0x28800000, 0x28800000, 0x28800000, \
152             FSR__,      FSR__,      FSR__,      FSR__
153test_end
154
155#if DFPU
156test madd_s_nan_dfpu
157    /* DFPU madd/msub NaN1, NaN2, NaN3 priority: NaN1, NaN3, NaN2 */
158    test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_1, F32_1, \
159        F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \
160              FSR__,       FSR__,       FSR__,       FSR__
161    test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_QNAN(2), F32_1, \
162        F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), \
163              FSR__,       FSR__,       FSR__,       FSR__
164    test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_1, F32_QNAN(3), \
165        F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), \
166              FSR__,       FSR__,       FSR__,       FSR__
167
168    test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_QNAN(2), F32_1, \
169        F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \
170              FSR__,       FSR__,       FSR__,       FSR__
171    test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_1, F32_QNAN(3), \
172        F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \
173              FSR__,       FSR__,       FSR__,       FSR__
174    test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_QNAN(2), F32_QNAN(3), \
175        F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), \
176              FSR__,       FSR__,       FSR__,       FSR__
177
178    test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_QNAN(2), F32_QNAN(3), \
179        F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \
180              FSR__,       FSR__,       FSR__,       FSR__
181
182    /* inf * 0 = default NaN */
183    test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_PINF, F32_0, \
184        F32_DNAN, F32_DNAN, F32_DNAN, F32_DNAN, \
185           FSR_V,    FSR_V,    FSR_V,    FSR_V
186    /* inf * 0 + SNaN1 = QNaN1 */
187    test_op3 madd.s, f0, f1, f2, f0, F32_SNAN(1), F32_PINF, F32_0, \
188        F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \
189              FSR_V,       FSR_V,       FSR_V,       FSR_V
190    /* inf * 0 + QNaN1 = QNaN1 */
191    test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_PINF, F32_0, \
192        F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \
193              FSR_V,       FSR_V,       FSR_V,       FSR_V
194
195    /* madd/msub SNaN turns to QNaN and sets Invalid flag */
196    test_op3 madd.s, f0, f1, f2, f0, F32_SNAN(1), F32_1, F32_1, \
197        F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \
198              FSR_V,       FSR_V,       FSR_V,       FSR_V
199    test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_SNAN(2), F32_1, \
200        F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \
201              FSR_V,       FSR_V,       FSR_V,       FSR_V
202test_end
203#else
204test madd_s_nan_fpu2k
205    /* FPU2000 madd/msub NaN1, NaN2, NaN3 priority: NaN2, NaN3, NaN1 */
206    test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_1, F32_1, \
207        F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \
208              FSR__,       FSR__,       FSR__,       FSR__
209    test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_QNAN(2), F32_1, \
210        F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), \
211              FSR__,       FSR__,       FSR__,       FSR__
212    test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_1, F32_QNAN(3), \
213        F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), \
214              FSR__,       FSR__,       FSR__,       FSR__
215
216    test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_QNAN(2), F32_1, \
217        F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), \
218              FSR__,       FSR__,       FSR__,       FSR__
219    test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_1, F32_QNAN(3), \
220        F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), \
221              FSR__,       FSR__,       FSR__,       FSR__
222    test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_QNAN(2), F32_QNAN(3), \
223        F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), \
224              FSR__,       FSR__,       FSR__,       FSR__
225
226    test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_QNAN(2), F32_QNAN(3), \
227        F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), \
228              FSR__,       FSR__,       FSR__,       FSR__
229
230    /* inf * 0 = default NaN */
231    test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_PINF, F32_0, \
232        F32_DNAN, F32_DNAN, F32_DNAN, F32_DNAN, \
233           FSR__,    FSR__,    FSR__,    FSR__
234    /* inf * 0 + SNaN1 = SNaN1 */
235    test_op3 madd.s, f0, f1, f2, f0, F32_SNAN(1), F32_PINF, F32_0, \
236        F32_SNAN(1), F32_SNAN(1), F32_SNAN(1), F32_SNAN(1), \
237              FSR__,       FSR__,       FSR__,       FSR__
238    /* inf * 0 + QNaN1 = QNaN1 */
239    test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_PINF, F32_0, \
240        F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \
241              FSR__,       FSR__,       FSR__,       FSR__
242
243    /* madd/msub SNaN is preserved */
244    test_op3 madd.s, f0, f1, f2, f0, F32_SNAN(1), F32_1, F32_1, \
245        F32_SNAN(1), F32_SNAN(1), F32_SNAN(1), F32_SNAN(1), \
246              FSR__,       FSR__,       FSR__,       FSR__
247    test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_SNAN(2), F32_1, \
248        F32_SNAN(2), F32_SNAN(2), F32_SNAN(2), F32_SNAN(2), \
249              FSR__,       FSR__,       FSR__,       FSR__
250test_end
251#endif
252
253test msub_s
254    test_op3 msub.s, f0, f1, f2, f0, 0x3f800000, 0x3f800001, 0x3f800001, \
255        0xb4800000, 0xb4800000, 0xb4800000, 0xb4800001, \
256             FSR_I,      FSR_I,      FSR_I,      FSR_I
257test_end
258
259#endif
260
261test_suite_end
262