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