xref: /openbmc/qemu/tests/tcg/xtensa/test_fp0_conv.S (revision 7d87775f)
1#include "macros.inc"
2#include "fpu.h"
3
4test_suite fp0_conv
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 test_ftoi_ex op, r0, fr0, v, c, r, sr
14    movi    a2, 0
15    wur     a2, fsr
16    movfp   \fr0, \v
17    \op     \r0, \fr0, \c
18    dump    \r0
19    movi    a3, \r
20    assert  eq, \r0, a3
21    rur     a2, fsr
22#if DFPU
23    movi    a3, \sr
24    assert  eq, a2, a3
25#else
26    assert  eqi, a2, 0
27#endif
28.endm
29
30.macro test_ftoi op, r0, fr0, v, c, r, sr
31    movi    a2, 0
32    wur     a2, fcr
33    test_ftoi_ex \op, \r0, \fr0, \v, \c, \r, \sr
34    movi    a2, 0x7c
35    wur     a2, fcr
36    test_ftoi_ex \op, \r0, \fr0, \v, \c, \r, \sr
37.endm
38
39
40.macro test_itof_ex op, fr0, ar0, v, c, r, sr
41    movi    a2, 0
42    wur     a2, fsr
43    movi    \ar0, \v
44    \op     \fr0, \ar0, \c
45
46    rfr     a2, \fr0
47    dump    a2
48    movi    a3, \r
49    assert  eq, a2, a3
50    rur     a2, fsr
51#if DFPU
52    movi    a3, \sr
53    assert  eq, a2, a3
54#else
55    assert  eqi, a2, 0
56#endif
57.endm
58
59.macro test_itof_rm op, fr0, ar0, v, c, rm, r, sr
60    movi    a2, \rm
61    wur     a2, fcr
62    test_itof_ex \op, \fr0, \ar0, \v, \c, \r, \sr
63    movi    a2, (\rm) | 0x7c
64    wur     a2, fcr
65    test_itof_ex \op, \fr0, \ar0, \v, \c, \r, \sr
66.endm
67
68.macro test_itof op, fr0, ar0, v, c, r0, r1, r2, r3, sr
69    test_itof_rm \op, \fr0, \ar0, \v, \c, 0, \r0, \sr
70    test_itof_rm \op, \fr0, \ar0, \v, \c, 1, \r1, \sr
71    test_itof_rm \op, \fr0, \ar0, \v, \c, 2, \r2, \sr
72    test_itof_rm \op, \fr0, \ar0, \v, \c, 3, \r3, \sr
73.endm
74
75test round_s
76    movi    a2, 1
77    wsr     a2, cpenable
78
79    /* NaN */
80    test_ftoi round.s, a2, f0, 0xffc00001, 0, 0x7fffffff, FSR_V
81    test_ftoi round.s, a2, f0, 0xff800001, 0, 0x7fffffff, FSR_V
82
83    /* -inf */
84    test_ftoi round.s, a2, f0, 0xff800000, 0, 0x80000000, FSR_V
85
86    /* negative overflow */
87    test_ftoi round.s, a2, f0, 0xceffffff, 1, 0x80000000, FSR_V
88    test_ftoi round.s, a2, f0, 0xcf000000, 0, 0x80000000, FSR__
89    test_ftoi round.s, a2, f0, 0xceffffff, 0, 0x80000080, FSR__
90
91    /* negative */
92    test_ftoi round.s, a2, f0, 0xbfa00000, 1, -2, FSR_I  /* -1.25 * 2 */
93    test_ftoi round.s, a2, f0, 0xbfc00000, 0, -2, FSR_I  /* -1.5 */
94    test_ftoi round.s, a2, f0, 0xbf800000, 1, -2, FSR__  /* -1 * 2 */
95    test_ftoi round.s, a2, f0, 0xbf800000, 0, -1, FSR__  /* -1 */
96    test_ftoi round.s, a2, f0, 0xbf400000, 0, -1, FSR_I  /* -0.75 */
97    test_ftoi round.s, a2, f0, 0xbf000000, 0,  0, FSR_I  /* -0.5 */
98
99    /* positive */
100    test_ftoi round.s, a2, f0, 0x3f000000, 0, 0, FSR_I /* 0.5 */
101    test_ftoi round.s, a2, f0, 0x3f400000, 0, 1, FSR_I /* 0.75 */
102    test_ftoi round.s, a2, f0, 0x3f800000, 0, 1, FSR__ /* 1 */
103    test_ftoi round.s, a2, f0, 0x3f800000, 1, 2, FSR__ /* 1 * 2 */
104    test_ftoi round.s, a2, f0, 0x3fc00000, 0, 2, FSR_I /* 1.5 */
105    test_ftoi round.s, a2, f0, 0x3fa00000, 1, 2, FSR_I /* 1.25 * 2 */
106
107    /* positive overflow */
108    test_ftoi round.s, a2, f0, 0x4effffff, 0, 0x7fffff80, FSR__
109    test_ftoi round.s, a2, f0, 0x4f000000, 0, 0x7fffffff, FSR_V
110    test_ftoi round.s, a2, f0, 0x4effffff, 1, 0x7fffffff, FSR_V
111
112    /* +inf */
113    test_ftoi round.s, a2, f0, 0x7f800000, 0, 0x7fffffff, FSR_V
114
115    /* NaN */
116    test_ftoi round.s, a2, f0, 0x7f800001, 0, 0x7fffffff, FSR_V
117    test_ftoi round.s, a2, f0, 0x7fc00000, 0, 0x7fffffff, FSR_V
118test_end
119
120test trunc_s
121    /* NaN */
122    test_ftoi trunc.s, a2, f0, 0xffc00001, 0, 0x7fffffff, FSR_V
123    test_ftoi trunc.s, a2, f0, 0xff800001, 0, 0x7fffffff, FSR_V
124
125    /* -inf */
126    test_ftoi trunc.s, a2, f0, 0xff800000, 0, 0x80000000, FSR_V
127
128    /* negative overflow */
129    test_ftoi trunc.s, a2, f0, 0xceffffff, 1, 0x80000000, FSR_V
130    test_ftoi trunc.s, a2, f0, 0xcf000000, 0, 0x80000000, FSR__
131    test_ftoi trunc.s, a2, f0, 0xceffffff, 0, 0x80000080, FSR__
132
133    /* negative */
134    test_ftoi trunc.s, a2, f0, 0xbfa00000, 1, -2, FSR_I /* -1.25 * 2 */
135    test_ftoi trunc.s, a2, f0, 0xbfc00000, 0, -1, FSR_I /* -1.5 */
136    test_ftoi trunc.s, a2, f0, 0xbf800000, 1, -2, FSR__ /* -1 * 2 */
137    test_ftoi trunc.s, a2, f0, 0xbf800000, 0, -1, FSR__ /* -1 */
138    test_ftoi trunc.s, a2, f0, 0xbf400000, 0,  0, FSR_I /* -0.75 */
139    test_ftoi trunc.s, a2, f0, 0xbf000000, 0,  0, FSR_I /* -0.5 */
140
141    /* positive */
142    test_ftoi trunc.s, a2, f0, 0x3f000000, 0, 0, FSR_I /* 0.5 */
143    test_ftoi trunc.s, a2, f0, 0x3f400000, 0, 0, FSR_I /* 0.75 */
144    test_ftoi trunc.s, a2, f0, 0x3f800000, 0, 1, FSR__ /* 1 */
145    test_ftoi trunc.s, a2, f0, 0x3f800000, 1, 2, FSR__ /* 1 * 2 */
146    test_ftoi trunc.s, a2, f0, 0x3fc00000, 0, 1, FSR_I /* 1.5 */
147    test_ftoi trunc.s, a2, f0, 0x3fa00000, 1, 2, FSR_I /* 1.25 * 2 */
148
149    /* positive overflow */
150    test_ftoi trunc.s, a2, f0, 0x4effffff, 0, 0x7fffff80, FSR__
151    test_ftoi trunc.s, a2, f0, 0x4f000000, 0, 0x7fffffff, FSR_V
152    test_ftoi trunc.s, a2, f0, 0x4effffff, 1, 0x7fffffff, FSR_V
153
154    /* +inf */
155    test_ftoi trunc.s, a2, f0, 0x7f800000, 0, 0x7fffffff, FSR_V
156
157    /* NaN */
158    test_ftoi trunc.s, a2, f0, 0x7f800001, 0, 0x7fffffff, FSR_V
159    test_ftoi trunc.s, a2, f0, 0x7fc00000, 0, 0x7fffffff, FSR_V
160test_end
161
162test floor_s
163    /* NaN */
164    test_ftoi floor.s, a2, f0, 0xffc00001, 0, 0x7fffffff, FSR_V
165    test_ftoi floor.s, a2, f0, 0xff800001, 0, 0x7fffffff, FSR_V
166
167    /* -inf */
168    test_ftoi floor.s, a2, f0, 0xff800000, 0, 0x80000000, FSR_V
169
170    /* negative overflow */
171    test_ftoi floor.s, a2, f0, 0xceffffff, 1, 0x80000000, FSR_V
172    test_ftoi floor.s, a2, f0, 0xcf000000, 0, 0x80000000, FSR__
173    test_ftoi floor.s, a2, f0, 0xceffffff, 0, 0x80000080, FSR__
174
175    /* negative */
176    test_ftoi floor.s, a2, f0, 0xbfa00000, 1, -3, FSR_I /* -1.25 * 2 */
177    test_ftoi floor.s, a2, f0, 0xbfc00000, 0, -2, FSR_I /* -1.5 */
178    test_ftoi floor.s, a2, f0, 0xbf800000, 1, -2, FSR__ /* -1 * 2 */
179    test_ftoi floor.s, a2, f0, 0xbf800000, 0, -1, FSR__ /* -1 */
180    test_ftoi floor.s, a2, f0, 0xbf400000, 0, -1, FSR_I /* -0.75 */
181    test_ftoi floor.s, a2, f0, 0xbf000000, 0, -1, FSR_I /* -0.5 */
182
183    /* positive */
184    test_ftoi floor.s, a2, f0, 0x3f000000, 0, 0, FSR_I /* 0.5 */
185    test_ftoi floor.s, a2, f0, 0x3f400000, 0, 0, FSR_I /* 0.75 */
186    test_ftoi floor.s, a2, f0, 0x3f800000, 0, 1, FSR__ /* 1 */
187    test_ftoi floor.s, a2, f0, 0x3f800000, 1, 2, FSR__ /* 1 * 2 */
188    test_ftoi floor.s, a2, f0, 0x3fc00000, 0, 1, FSR_I /* 1.5 */
189    test_ftoi floor.s, a2, f0, 0x3fa00000, 1, 2, FSR_I /* 1.25 * 2 */
190
191    /* positive overflow */
192    test_ftoi floor.s, a2, f0, 0x4effffff, 0, 0x7fffff80, FSR__
193    test_ftoi floor.s, a2, f0, 0x4f000000, 0, 0x7fffffff, FSR_V
194    test_ftoi floor.s, a2, f0, 0x4effffff, 1, 0x7fffffff, FSR_V
195
196    /* +inf */
197    test_ftoi floor.s, a2, f0, 0x7f800000, 0, 0x7fffffff, FSR_V
198
199    /* NaN */
200    test_ftoi floor.s, a2, f0, 0x7f800001, 0, 0x7fffffff, FSR_V
201    test_ftoi floor.s, a2, f0, 0x7fc00000, 0, 0x7fffffff, FSR_V
202test_end
203
204test ceil_s
205    /* NaN */
206    test_ftoi ceil.s, a2, f0, 0xffc00001, 0, 0x7fffffff, FSR_V
207    test_ftoi ceil.s, a2, f0, 0xff800001, 0, 0x7fffffff, FSR_V
208
209    /* -inf */
210    test_ftoi ceil.s, a2, f0, 0xff800000, 0, 0x80000000, FSR_V
211
212    /* negative overflow */
213    test_ftoi ceil.s, a2, f0, 0xceffffff, 1, 0x80000000, FSR_V
214    test_ftoi ceil.s, a2, f0, 0xcf000000, 0, 0x80000000, FSR__
215    test_ftoi ceil.s, a2, f0, 0xceffffff, 0, 0x80000080, FSR__
216
217    /* negative */
218    test_ftoi ceil.s, a2, f0, 0xbfa00000, 1, -2, FSR_I /* -1.25 * 2 */
219    test_ftoi ceil.s, a2, f0, 0xbfc00000, 0, -1, FSR_I /* -1.5 */
220    test_ftoi ceil.s, a2, f0, 0xbf800000, 1, -2, FSR__ /* -1 * 2 */
221    test_ftoi ceil.s, a2, f0, 0xbf800000, 0, -1, FSR__ /* -1 */
222    test_ftoi ceil.s, a2, f0, 0xbf400000, 0,  0, FSR_I /* -0.75 */
223    test_ftoi ceil.s, a2, f0, 0xbf000000, 0,  0, FSR_I /* -0.5 */
224
225    /* positive */
226    test_ftoi ceil.s, a2, f0, 0x3f000000, 0, 1, FSR_I /* 0.5 */
227    test_ftoi ceil.s, a2, f0, 0x3f400000, 0, 1, FSR_I /* 0.75 */
228    test_ftoi ceil.s, a2, f0, 0x3f800000, 0, 1, FSR__ /* 1 */
229    test_ftoi ceil.s, a2, f0, 0x3f800000, 1, 2, FSR__ /* 1 * 2 */
230    test_ftoi ceil.s, a2, f0, 0x3fc00000, 0, 2, FSR_I /* 1.5 */
231    test_ftoi ceil.s, a2, f0, 0x3fa00000, 1, 3, FSR_I /* 1.25 * 2 */
232
233    /* positive overflow */
234    test_ftoi ceil.s, a2, f0, 0x4effffff, 0, 0x7fffff80, FSR__
235    test_ftoi ceil.s, a2, f0, 0x4f000000, 0, 0x7fffffff, FSR_V
236    test_ftoi ceil.s, a2, f0, 0x4effffff, 1, 0x7fffffff, FSR_V
237
238    /* +inf */
239    test_ftoi ceil.s, a2, f0, 0x7f800000, 0, 0x7fffffff, FSR_V
240
241    /* NaN */
242    test_ftoi ceil.s, a2, f0, 0x7f800001, 0, 0x7fffffff, FSR_V
243    test_ftoi ceil.s, a2, f0, 0x7fc00000, 0, 0x7fffffff, FSR_V
244test_end
245
246test utrunc_s
247    /* NaN */
248    test_ftoi utrunc.s, a2, f0, 0xffc00001, 0, 0xffffffff, FSR_V
249    test_ftoi utrunc.s, a2, f0, 0xff800001, 0, 0xffffffff, FSR_V
250
251    /* -inf */
252    test_ftoi utrunc.s, a2, f0, 0xff800000, 0, 0x80000000, FSR_V
253
254    /* negative overflow */
255    test_ftoi utrunc.s, a2, f0, 0xceffffff, 1, 0x80000000, FSR_V
256    test_ftoi utrunc.s, a2, f0, 0xcf000000, 0, 0x80000000, FSR_V
257    test_ftoi utrunc.s, a2, f0, 0xceffffff, 0, 0x80000080, FSR_V
258
259    /* negative */
260    test_ftoi utrunc.s, a2, f0, 0xbfa00000, 1, -2, FSR_V /* -1.25 * 2 */
261    test_ftoi utrunc.s, a2, f0, 0xbfc00000, 0, -1, FSR_V /* -1.5 */
262    test_ftoi utrunc.s, a2, f0, 0xbf800000, 1, -2, FSR_V /* -1 * 2 */
263    test_ftoi utrunc.s, a2, f0, 0xbf800000, 0, -1, FSR_V /* -1 */
264    test_ftoi utrunc.s, a2, f0, 0xbf400000, 0,  0, FSR_I /* -0.75 */
265    test_ftoi utrunc.s, a2, f0, 0xbf000000, 0,  0, FSR_I /* -0.5 */
266
267    /* positive */
268    test_ftoi utrunc.s, a2, f0, 0x3f000000, 0, 0, FSR_I /* 0.5 */
269    test_ftoi utrunc.s, a2, f0, 0x3f400000, 0, 0, FSR_I /* 0.75 */
270    test_ftoi utrunc.s, a2, f0, 0x3f800000, 0, 1, FSR__ /* 1 */
271    test_ftoi utrunc.s, a2, f0, 0x3f800000, 1, 2, FSR__ /* 1 * 2 */
272    test_ftoi utrunc.s, a2, f0, 0x3fc00000, 0, 1, FSR_I /* 1.5 */
273    test_ftoi utrunc.s, a2, f0, 0x3fa00000, 1, 2, FSR_I /* 1.25 * 2 */
274
275    /* positive overflow */
276    test_ftoi utrunc.s, a2, f0, 0x4effffff, 0, 0x7fffff80, FSR__
277    test_ftoi utrunc.s, a2, f0, 0x4f000000, 0, 0x80000000, FSR__
278    test_ftoi utrunc.s, a2, f0, 0x4effffff, 1, 0xffffff00, FSR__
279    test_ftoi utrunc.s, a2, f0, 0x4f800000, 1, 0xffffffff, FSR_V
280
281    /* +inf */
282    test_ftoi utrunc.s, a2, f0, 0x7f800000, 0, 0xffffffff, FSR_V
283
284    /* NaN */
285    test_ftoi utrunc.s, a2, f0, 0x7f800001, 0, 0xffffffff, FSR_V
286    test_ftoi utrunc.s, a2, f0, 0x7fc00000, 0, 0xffffffff, FSR_V
287test_end
288
289test float_s
290    test_itof float.s, f0, a2, -1, 0, \
291        0xbf800000, 0xbf800000, 0xbf800000, 0xbf800000, FSR__
292    test_itof float.s, f0, a2, 0, 0, 0, 0, 0, 0, FSR__
293    test_itof float.s, f0, a2, 1, 1, \
294        0x3f000000, 0x3f000000, 0x3f000000, 0x3f000000, FSR__
295    test_itof float.s, f0, a2, 1, 0, \
296        0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, FSR__
297    test_itof float.s, f0, a2, 0x7fffffff, 0, \
298        0x4f000000, 0x4effffff, 0x4f000000, 0x4effffff, FSR_I
299test_end
300
301test ufloat_s
302    test_itof ufloat.s, f0, a2, 0, 0, 0, 0, 0, 0, FSR__
303    test_itof ufloat.s, f0, a2, 1, 1, \
304        0x3f000000, 0x3f000000, 0x3f000000, 0x3f000000, FSR__
305    test_itof ufloat.s, f0, a2, 1, 0, \
306        0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, FSR__
307    test_itof ufloat.s, f0, a2, 0x7fffffff, 0, \
308        0x4f000000, 0x4effffff, 0x4f000000, 0x4effffff, FSR_I
309    test_itof ufloat.s, f0, a2, 0xffffffff, 0, \
310        0x4f800000, 0x4f7fffff, 0x4f800000, 0x4f7fffff, FSR_I
311test_end
312
313#endif
314
315test_suite_end
316