| 1 | #include "macros.inc" |
| 2 | #include "fpu.h" |
| 3 | |
| 4 | test_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 | |
| 75 | test 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 |
| 118 | test_end |
| 119 | |
| 120 | test 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 |
| 160 | test_end |
| 161 | |
| 162 | test 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 |
| 202 | test_end |
| 203 | |
| 204 | test 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 |
| 244 | test_end |
| 245 | |
| 246 | test 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 |
| 287 | test_end |
| 288 | |
| 289 | test 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 |
| 299 | test_end |
| 300 | |
| 301 | test 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 |
| 311 | test_end |
| 312 | |
| 313 | #endif |
| 314 | |
| 315 | test_suite_end |