19d012e8eSMax Filippov#include "macros.inc" 2e95ef431SMax Filippov#include "fpu.h" 39d012e8eSMax Filippov 49d012e8eSMax Filippovtest_suite fp0_arith 59d012e8eSMax Filippov 69d012e8eSMax Filippov#if XCHAL_HAVE_FP 79d012e8eSMax Filippov 89d012e8eSMax Filippov.macro movfp fr, v 99d012e8eSMax Filippov movi a2, \v 109d012e8eSMax Filippov wfr \fr, a2 119d012e8eSMax Filippov.endm 129d012e8eSMax Filippov 13e95ef431SMax Filippov.macro check_res fr, r, sr 149d012e8eSMax Filippov rfr a2, \fr 159d012e8eSMax Filippov dump a2 169d012e8eSMax Filippov movi a3, \r 179d012e8eSMax Filippov assert eq, a2, a3 189d012e8eSMax Filippov rur a2, fsr 19e95ef431SMax Filippov#if DFPU 20e95ef431SMax Filippov movi a3, \sr 21e95ef431SMax Filippov assert eq, a2, a3 22e95ef431SMax Filippov#else 239d012e8eSMax Filippov assert eqi, a2, 0 24e95ef431SMax Filippov#endif 259d012e8eSMax Filippov.endm 269d012e8eSMax Filippov 279d012e8eSMax Filippovtest add_s 289d012e8eSMax Filippov movi a2, 1 299d012e8eSMax Filippov wsr a2, cpenable 309d012e8eSMax Filippov 319d012e8eSMax Filippov test_op2 add.s, f0, f1, f2, 0x3fc00000, 0x34400000, \ 32e95ef431SMax Filippov 0x3fc00002, 0x3fc00001, 0x3fc00002, 0x3fc00001, \ 33e95ef431SMax Filippov FSR_I, FSR_I, FSR_I, FSR_I 349d012e8eSMax Filippov test_op2 add.s, f3, f4, f5, 0x3fc00000, 0x34a00000, \ 35e95ef431SMax Filippov 0x3fc00002, 0x3fc00002, 0x3fc00003, 0x3fc00002, \ 36e95ef431SMax Filippov FSR_I, FSR_I, FSR_I, FSR_I 379d012e8eSMax Filippov 389d012e8eSMax Filippov /* MAX_FLOAT + MAX_FLOAT = +inf/MAX_FLOAT */ 399d012e8eSMax Filippov test_op2 add.s, f6, f7, f8, 0x7f7fffff, 0x7f7fffff, \ 40e95ef431SMax Filippov 0x7f800000, 0x7f7fffff, 0x7f800000, 0x7f7fffff, \ 41e95ef431SMax Filippov FSR_OI, FSR_OI, FSR_OI, FSR_OI 429d012e8eSMax Filippovtest_end 439d012e8eSMax Filippov 449d012e8eSMax Filippovtest add_s_inf 459d012e8eSMax Filippov /* 1 + +inf = +inf */ 469d012e8eSMax Filippov test_op2 add.s, f6, f7, f8, 0x3fc00000, 0x7f800000, \ 47e95ef431SMax Filippov 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000, \ 48e95ef431SMax Filippov FSR__, FSR__, FSR__, FSR__ 499d012e8eSMax Filippov 509d012e8eSMax Filippov /* +inf + -inf = default NaN */ 519d012e8eSMax Filippov test_op2 add.s, f0, f1, f2, 0x7f800000, 0xff800000, \ 52e95ef431SMax Filippov 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x7fc00000, \ 53e95ef431SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 549d012e8eSMax Filippovtest_end 559d012e8eSMax Filippov 56e95ef431SMax Filippov#if DFPU 57e95ef431SMax Filippovtest add_s_nan_dfpu 58e95ef431SMax Filippov /* 1 + QNaN = QNaN */ 599d012e8eSMax Filippov test_op2 add.s, f9, f10, f11, 0x3fc00000, 0x7fc00001, \ 60e95ef431SMax Filippov 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, \ 61e95ef431SMax Filippov FSR__, FSR__, FSR__, FSR__ 62e95ef431SMax Filippov /* 1 + SNaN = QNaN */ 639d012e8eSMax Filippov test_op2 add.s, f12, f13, f14, 0x3fc00000, 0x7f800001, \ 64e95ef431SMax Filippov 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, \ 65e95ef431SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 669d012e8eSMax Filippov 67e95ef431SMax Filippov /* SNaN1 + SNaN2 = QNaN2 */ 689d012e8eSMax Filippov test_op2 add.s, f15, f0, f1, 0x7f800001, 0x7fbfffff, \ 69e95ef431SMax Filippov 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, \ 70e95ef431SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 719d012e8eSMax Filippov test_op2 add.s, f2, f3, f4, 0x7fbfffff, 0x7f800001, \ 72e95ef431SMax Filippov 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, \ 73e95ef431SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 74e95ef431SMax Filippov /* QNaN1 + SNaN2 = QNaN2 */ 759d012e8eSMax Filippov test_op2 add.s, f5, f6, f7, 0x7fc00001, 0x7fbfffff, \ 76e95ef431SMax Filippov 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, \ 77e95ef431SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 78e95ef431SMax Filippov /* SNaN1 + QNaN2 = QNaN2 */ 799d012e8eSMax Filippov test_op2 add.s, f8, f9, f10, 0x7fbfffff, 0x7fc00001, \ 80e95ef431SMax Filippov 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, \ 81e95ef431SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 829d012e8eSMax Filippovtest_end 83e95ef431SMax Filippov#else 84e95ef431SMax Filippovtest add_s_nan_fpu2k 85e95ef431SMax Filippov /* 1 + QNaN = QNaN */ 86e95ef431SMax Filippov test_op2 add.s, f9, f10, f11, 0x3fc00000, 0x7fc00001, \ 87e95ef431SMax Filippov 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, \ 88e95ef431SMax Filippov FSR__, FSR__, FSR__, FSR__ 89e95ef431SMax Filippov /* 1 + SNaN = SNaN */ 90e95ef431SMax Filippov test_op2 add.s, f12, f13, f14, 0x3fc00000, 0x7f800001, \ 91e95ef431SMax Filippov 0x7f800001, 0x7f800001, 0x7f800001, 0x7f800001, \ 92e95ef431SMax Filippov FSR__, FSR__, FSR__, FSR__ 93e95ef431SMax Filippov /* SNaN1 + SNaN2 = SNaN1 */ 94e95ef431SMax Filippov test_op2 add.s, f15, f0, f1, 0x7f800001, 0x7fbfffff, \ 95e95ef431SMax Filippov 0x7f800001, 0x7f800001, 0x7f800001, 0x7f800001, \ 96e95ef431SMax Filippov FSR__, FSR__, FSR__, FSR__ 97e95ef431SMax Filippov test_op2 add.s, f2, f3, f4, 0x7fbfffff, 0x7f800001, \ 98e95ef431SMax Filippov 0x7fbfffff, 0x7fbfffff, 0x7fbfffff, 0x7fbfffff, \ 99e95ef431SMax Filippov FSR__, FSR__, FSR__, FSR__ 100e95ef431SMax Filippov /* QNaN1 + SNaN2 = QNaN1 */ 101e95ef431SMax Filippov test_op2 add.s, f5, f6, f7, 0x7fc00001, 0x7fbfffff, \ 102e95ef431SMax Filippov 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, \ 103e95ef431SMax Filippov FSR__, FSR__, FSR__, FSR__ 104e95ef431SMax Filippov /* SNaN1 + QNaN2 = SNaN1 */ 105e95ef431SMax Filippov test_op2 add.s, f8, f9, f10, 0x7fbfffff, 0x7fc00001, \ 106e95ef431SMax Filippov 0x7fbfffff, 0x7fbfffff, 0x7fbfffff, 0x7fbfffff, \ 107e95ef431SMax Filippov FSR__, FSR__, FSR__, FSR__ 108e95ef431SMax Filippovtest_end 109e95ef431SMax Filippov#endif 1109d012e8eSMax Filippov 1119d012e8eSMax Filippovtest sub_s 1129d012e8eSMax Filippov test_op2 sub.s, f0, f1, f0, 0x3f800001, 0x33800000, \ 113e95ef431SMax Filippov 0x3f800000, 0x3f800000, 0x3f800001, 0x3f800000, \ 114e95ef431SMax Filippov FSR_I, FSR_I, FSR_I, FSR_I 1159d012e8eSMax Filippov test_op2 sub.s, f0, f1, f1, 0x3f800002, 0x33800000, \ 116e95ef431SMax Filippov 0x3f800002, 0x3f800001, 0x3f800002, 0x3f800001, \ 117e95ef431SMax Filippov FSR_I, FSR_I, FSR_I, FSR_I 1189d012e8eSMax Filippov 1199d012e8eSMax Filippov /* norm - norm = denorm */ 1209d012e8eSMax Filippov test_op2 sub.s, f6, f7, f8, 0x00800001, 0x00800000, \ 121e95ef431SMax Filippov 0x00000001, 0x00000001, 0x00000001, 0x00000001, \ 122e95ef431SMax Filippov FSR__, FSR__, FSR__, FSR__ 1239d012e8eSMax Filippovtest_end 1249d012e8eSMax Filippov 1259d012e8eSMax Filippovtest mul_s 1269d012e8eSMax Filippov test_op2 mul.s, f0, f1, f2, 0x3f800001, 0x3f800001, \ 127e95ef431SMax Filippov 0x3f800002, 0x3f800002, 0x3f800003, 0x3f800002, \ 128e95ef431SMax Filippov FSR_I, FSR_I, FSR_I, FSR_I 1299d012e8eSMax Filippov /* MAX_FLOAT/2 * MAX_FLOAT/2 = +inf/MAX_FLOAT */ 1309d012e8eSMax Filippov test_op2 mul.s, f6, f7, f8, 0x7f000000, 0x7f000000, \ 131e95ef431SMax Filippov 0x7f800000, 0x7f7fffff, 0x7f800000, 0x7f7fffff, \ 132e95ef431SMax Filippov FSR_OI, FSR_OI, FSR_OI, FSR_OI 1339d012e8eSMax Filippov /* min norm * min norm = 0/denorm */ 1349d012e8eSMax Filippov test_op2 mul.s, f6, f7, f8, 0x00800001, 0x00800000, \ 135e95ef431SMax Filippov 0x00000000, 0x00000000, 0x00000001, 0x00000000, \ 136e95ef431SMax Filippov FSR_UI, FSR_UI, FSR_UI, FSR_UI 1379d012e8eSMax Filippov /* inf * 0 = default NaN */ 1389d012e8eSMax Filippov test_op2 mul.s, f6, f7, f8, 0x7f800000, 0x00000000, \ 139e95ef431SMax Filippov 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x7fc00000, \ 140e95ef431SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 1419d012e8eSMax Filippovtest_end 1429d012e8eSMax Filippov 1439d012e8eSMax Filippovtest madd_s 1449d012e8eSMax Filippov test_op3 madd.s, f0, f1, f2, f0, 0, 0x3f800001, 0x3f800001, \ 145e95ef431SMax Filippov 0x3f800002, 0x3f800002, 0x3f800003, 0x3f800002, \ 146e95ef431SMax Filippov FSR_I, FSR_I, FSR_I, FSR_I 1479d012e8eSMax Filippovtest_end 1489d012e8eSMax Filippov 149*ac81ff22SMax Filippovtest madd_s_precision 150*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, 0xbf800002, 0x3f800001, 0x3f800001, \ 151*ac81ff22SMax Filippov 0x28800000, 0x28800000, 0x28800000, 0x28800000, \ 152*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 153*ac81ff22SMax Filippovtest_end 154*ac81ff22SMax Filippov 155*ac81ff22SMax Filippov#if DFPU 156*ac81ff22SMax Filippovtest madd_s_nan_dfpu 157*ac81ff22SMax Filippov /* DFPU madd/msub NaN1, NaN2, NaN3 priority: NaN1, NaN3, NaN2 */ 158*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_1, F32_1, \ 159*ac81ff22SMax Filippov F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \ 160*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 161*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_QNAN(2), F32_1, \ 162*ac81ff22SMax Filippov F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), \ 163*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 164*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_1, F32_QNAN(3), \ 165*ac81ff22SMax Filippov F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), \ 166*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 167*ac81ff22SMax Filippov 168*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_QNAN(2), F32_1, \ 169*ac81ff22SMax Filippov F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \ 170*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 171*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_1, F32_QNAN(3), \ 172*ac81ff22SMax Filippov F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \ 173*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 174*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_QNAN(2), F32_QNAN(3), \ 175*ac81ff22SMax Filippov F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), \ 176*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 177*ac81ff22SMax Filippov 178*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_QNAN(2), F32_QNAN(3), \ 179*ac81ff22SMax Filippov F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \ 180*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 181*ac81ff22SMax Filippov 182*ac81ff22SMax Filippov /* inf * 0 = default NaN */ 183*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_PINF, F32_0, \ 184*ac81ff22SMax Filippov F32_DNAN, F32_DNAN, F32_DNAN, F32_DNAN, \ 185*ac81ff22SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 186*ac81ff22SMax Filippov /* inf * 0 + SNaN1 = QNaN1 */ 187*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_SNAN(1), F32_PINF, F32_0, \ 188*ac81ff22SMax Filippov F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \ 189*ac81ff22SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 190*ac81ff22SMax Filippov /* inf * 0 + QNaN1 = QNaN1 */ 191*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_PINF, F32_0, \ 192*ac81ff22SMax Filippov F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \ 193*ac81ff22SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 194*ac81ff22SMax Filippov 195*ac81ff22SMax Filippov /* madd/msub SNaN turns to QNaN and sets Invalid flag */ 196*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_SNAN(1), F32_1, F32_1, \ 197*ac81ff22SMax Filippov F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \ 198*ac81ff22SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 199*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_SNAN(2), F32_1, \ 200*ac81ff22SMax Filippov F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \ 201*ac81ff22SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 202*ac81ff22SMax Filippovtest_end 203*ac81ff22SMax Filippov#else 204*ac81ff22SMax Filippovtest madd_s_nan_fpu2k 205*ac81ff22SMax Filippov /* FPU2000 madd/msub NaN1, NaN2, NaN3 priority: NaN2, NaN3, NaN1 */ 206*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_1, F32_1, \ 207*ac81ff22SMax Filippov F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \ 208*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 209*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_QNAN(2), F32_1, \ 210*ac81ff22SMax Filippov F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), \ 211*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 212*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_1, F32_QNAN(3), \ 213*ac81ff22SMax Filippov F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), \ 214*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 215*ac81ff22SMax Filippov 216*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_QNAN(2), F32_1, \ 217*ac81ff22SMax Filippov F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), \ 218*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 219*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_1, F32_QNAN(3), \ 220*ac81ff22SMax Filippov F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), F32_QNAN(3), \ 221*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 222*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_QNAN(2), F32_QNAN(3), \ 223*ac81ff22SMax Filippov F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), \ 224*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 225*ac81ff22SMax Filippov 226*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_QNAN(2), F32_QNAN(3), \ 227*ac81ff22SMax Filippov F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), F32_QNAN(2), \ 228*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 229*ac81ff22SMax Filippov 230*ac81ff22SMax Filippov /* inf * 0 = default NaN */ 231*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_1, F32_PINF, F32_0, \ 232*ac81ff22SMax Filippov F32_DNAN, F32_DNAN, F32_DNAN, F32_DNAN, \ 233*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 234*ac81ff22SMax Filippov /* inf * 0 + SNaN1 = SNaN1 */ 235*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_SNAN(1), F32_PINF, F32_0, \ 236*ac81ff22SMax Filippov F32_SNAN(1), F32_SNAN(1), F32_SNAN(1), F32_SNAN(1), \ 237*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 238*ac81ff22SMax Filippov /* inf * 0 + QNaN1 = QNaN1 */ 239*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_PINF, F32_0, \ 240*ac81ff22SMax Filippov F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), F32_QNAN(1), \ 241*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 242*ac81ff22SMax Filippov 243*ac81ff22SMax Filippov /* madd/msub SNaN is preserved */ 244*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_SNAN(1), F32_1, F32_1, \ 245*ac81ff22SMax Filippov F32_SNAN(1), F32_SNAN(1), F32_SNAN(1), F32_SNAN(1), \ 246*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 247*ac81ff22SMax Filippov test_op3 madd.s, f0, f1, f2, f0, F32_QNAN(1), F32_SNAN(2), F32_1, \ 248*ac81ff22SMax Filippov F32_SNAN(2), F32_SNAN(2), F32_SNAN(2), F32_SNAN(2), \ 249*ac81ff22SMax Filippov FSR__, FSR__, FSR__, FSR__ 250*ac81ff22SMax Filippovtest_end 251*ac81ff22SMax Filippov#endif 252*ac81ff22SMax Filippov 2539d012e8eSMax Filippovtest msub_s 2549d012e8eSMax Filippov test_op3 msub.s, f0, f1, f2, f0, 0x3f800000, 0x3f800001, 0x3f800001, \ 255e95ef431SMax Filippov 0xb4800000, 0xb4800000, 0xb4800000, 0xb4800001, \ 256e95ef431SMax Filippov FSR_I, FSR_I, FSR_I, FSR_I 2579d012e8eSMax Filippovtest_end 2589d012e8eSMax Filippov 2599d012e8eSMax Filippov#endif 2609d012e8eSMax Filippov 2619d012e8eSMax Filippovtest_suite_end 262