1*6aa29c07SMax Filippov#include "macros.inc" 2*6aa29c07SMax Filippov#include "fpu.h" 3*6aa29c07SMax Filippov 4*6aa29c07SMax Filippovtest_suite fp0_arith 5*6aa29c07SMax Filippov 6*6aa29c07SMax Filippov#if XCHAL_HAVE_DFP 7*6aa29c07SMax Filippov 8*6aa29c07SMax Filippov.macro movfp fr, v 9*6aa29c07SMax Filippov movi a2, ((\v) >> 32) & 0xffffffff 10*6aa29c07SMax Filippov movi a3, ((\v) & 0xffffffff) 11*6aa29c07SMax Filippov wfrd \fr, a2, a3 12*6aa29c07SMax Filippov.endm 13*6aa29c07SMax Filippov 14*6aa29c07SMax Filippov.macro check_res fr, r, sr 15*6aa29c07SMax Filippov rfrd a2, \fr 16*6aa29c07SMax Filippov dump a2 17*6aa29c07SMax Filippov movi a3, ((\r) >> 32) & 0xffffffff 18*6aa29c07SMax Filippov assert eq, a2, a3 19*6aa29c07SMax Filippov rfr a2, \fr 20*6aa29c07SMax Filippov dump a2 21*6aa29c07SMax Filippov movi a3, ((\r) & 0xffffffff) 22*6aa29c07SMax Filippov assert eq, a2, a3 23*6aa29c07SMax Filippov rur a2, fsr 24*6aa29c07SMax Filippov movi a3, \sr 25*6aa29c07SMax Filippov assert eq, a2, a3 26*6aa29c07SMax Filippov.endm 27*6aa29c07SMax Filippov 28*6aa29c07SMax Filippovtest add_d 29*6aa29c07SMax Filippov movi a2, 1 30*6aa29c07SMax Filippov wsr a2, cpenable 31*6aa29c07SMax Filippov 32*6aa29c07SMax Filippov /* MAX_FLOAT + MAX_FLOAT = +inf/MAX_FLOAT */ 33*6aa29c07SMax Filippov test_op2 add.d, f6, f7, f8, F64_MAX, F64_MAX, \ 34*6aa29c07SMax Filippov F64_PINF, F64_MAX, F64_PINF, F64_MAX, \ 35*6aa29c07SMax Filippov FSR_OI, FSR_OI, FSR_OI, FSR_OI 36*6aa29c07SMax Filippovtest_end 37*6aa29c07SMax Filippov 38*6aa29c07SMax Filippovtest add_d_inf 39*6aa29c07SMax Filippov /* 1 + +inf = +inf */ 40*6aa29c07SMax Filippov test_op2 add.d, f6, f7, f8, F64_1, F64_PINF, \ 41*6aa29c07SMax Filippov F64_PINF, F64_PINF, F64_PINF, F64_PINF, \ 42*6aa29c07SMax Filippov FSR__, FSR__, FSR__, FSR__ 43*6aa29c07SMax Filippov 44*6aa29c07SMax Filippov /* +inf + -inf = default NaN */ 45*6aa29c07SMax Filippov test_op2 add.d, f0, f1, f2, F64_PINF, F64_NINF, \ 46*6aa29c07SMax Filippov F64_DNAN, F64_DNAN, F64_DNAN, F64_DNAN, \ 47*6aa29c07SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 48*6aa29c07SMax Filippovtest_end 49*6aa29c07SMax Filippov 50*6aa29c07SMax Filippovtest add_d_nan_dfpu 51*6aa29c07SMax Filippov /* 1 + QNaN = QNaN */ 52*6aa29c07SMax Filippov test_op2 add.d, f9, f10, f11, F64_1, F64_QNAN(1), \ 53*6aa29c07SMax Filippov F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \ 54*6aa29c07SMax Filippov FSR__, FSR__, FSR__, FSR__ 55*6aa29c07SMax Filippov /* 1 + SNaN = QNaN */ 56*6aa29c07SMax Filippov test_op2 add.d, f12, f13, f14, F64_1, F64_SNAN(1), \ 57*6aa29c07SMax Filippov F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \ 58*6aa29c07SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 59*6aa29c07SMax Filippov 60*6aa29c07SMax Filippov /* SNaN1 + SNaN2 = QNaN2 */ 61*6aa29c07SMax Filippov test_op2 add.d, f15, f0, f1, F64_SNAN(1), F64_SNAN(2), \ 62*6aa29c07SMax Filippov F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \ 63*6aa29c07SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 64*6aa29c07SMax Filippov /* QNaN1 + SNaN2 = QNaN2 */ 65*6aa29c07SMax Filippov test_op2 add.d, f5, f6, f7, F64_QNAN(1), F64_SNAN(2), \ 66*6aa29c07SMax Filippov F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \ 67*6aa29c07SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 68*6aa29c07SMax Filippov /* SNaN1 + QNaN2 = QNaN2 */ 69*6aa29c07SMax Filippov test_op2 add.d, f8, f9, f10, F64_SNAN(1), F64_QNAN(2), \ 70*6aa29c07SMax Filippov F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \ 71*6aa29c07SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 72*6aa29c07SMax Filippovtest_end 73*6aa29c07SMax Filippov 74*6aa29c07SMax Filippovtest sub_d 75*6aa29c07SMax Filippov /* norm - norm = denorm */ 76*6aa29c07SMax Filippov test_op2 sub.d, f6, f7, f8, F64_MIN_NORM | 1, F64_MIN_NORM, \ 77*6aa29c07SMax Filippov 0x00000001, 0x00000001, 0x00000001, 0x00000001, \ 78*6aa29c07SMax Filippov FSR__, FSR__, FSR__, FSR__ 79*6aa29c07SMax Filippovtest_end 80*6aa29c07SMax Filippov 81*6aa29c07SMax Filippovtest mul_d 82*6aa29c07SMax Filippov test_op2 mul.d, f0, f1, f2, F64_1 | 1, F64_1 | 1, \ 83*6aa29c07SMax Filippov F64_1 | 2, F64_1 | 2, F64_1 | 3, F64_1 | 2, \ 84*6aa29c07SMax Filippov FSR_I, FSR_I, FSR_I, FSR_I 85*6aa29c07SMax Filippov /* MAX_FLOAT/2 * MAX_FLOAT/2 = +inf/MAX_FLOAT */ 86*6aa29c07SMax Filippov test_op2 mul.d, f6, f7, f8, F64_MAX_2, F64_MAX_2, \ 87*6aa29c07SMax Filippov F64_PINF, F64_MAX, F64_PINF, F64_MAX, \ 88*6aa29c07SMax Filippov FSR_OI, FSR_OI, FSR_OI, FSR_OI 89*6aa29c07SMax Filippov /* min norm * min norm = 0/denorm */ 90*6aa29c07SMax Filippov test_op2 mul.d, f6, f7, f8, F64_MIN_NORM, F64_MIN_NORM, \ 91*6aa29c07SMax Filippov F64_0, F64_0, 0x00000001, F64_0, \ 92*6aa29c07SMax Filippov FSR_UI, FSR_UI, FSR_UI, FSR_UI 93*6aa29c07SMax Filippov /* inf * 0 = default NaN */ 94*6aa29c07SMax Filippov test_op2 mul.d, f6, f7, f8, F64_PINF, F64_0, \ 95*6aa29c07SMax Filippov F64_DNAN, F64_DNAN, F64_DNAN, F64_DNAN, \ 96*6aa29c07SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 97*6aa29c07SMax Filippovtest_end 98*6aa29c07SMax Filippov 99*6aa29c07SMax Filippovtest madd_d 100*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, F64_0, F64_1 | 1, F64_1 | 1, \ 101*6aa29c07SMax Filippov F64_1 | 2, F64_1 | 2, F64_1 | 3, F64_1 | 2, \ 102*6aa29c07SMax Filippov FSR_I, FSR_I, FSR_I, FSR_I 103*6aa29c07SMax Filippovtest_end 104*6aa29c07SMax Filippov 105*6aa29c07SMax Filippovtest madd_d_precision 106*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, \ 107*6aa29c07SMax Filippov F64_MINUS | F64_1 | 2, F64_1 | 1, F64_1 | 1, \ 108*6aa29c07SMax Filippov 0x3970000000000000, 0x3970000000000000, 0x3970000000000000, 0x3970000000000000, \ 109*6aa29c07SMax Filippov FSR__, FSR__, FSR__, FSR__ 110*6aa29c07SMax Filippovtest_end 111*6aa29c07SMax Filippov 112*6aa29c07SMax Filippovtest madd_d_nan_dfpu 113*6aa29c07SMax Filippov /* DFPU madd/msub NaN1, NaN2, NaN3 priority: NaN1, NaN3, NaN2 */ 114*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, F64_QNAN(1), F64_1, F64_1, \ 115*6aa29c07SMax Filippov F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \ 116*6aa29c07SMax Filippov FSR__, FSR__, FSR__, FSR__ 117*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, F64_1, F64_QNAN(2), F64_1, \ 118*6aa29c07SMax Filippov F64_QNAN(2), F64_QNAN(2), F64_QNAN(2), F64_QNAN(2), \ 119*6aa29c07SMax Filippov FSR__, FSR__, FSR__, FSR__ 120*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, F64_1, F64_1, F64_QNAN(3), \ 121*6aa29c07SMax Filippov F64_QNAN(3), F64_QNAN(3), F64_QNAN(3), F64_QNAN(3), \ 122*6aa29c07SMax Filippov FSR__, FSR__, FSR__, FSR__ 123*6aa29c07SMax Filippov 124*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, F64_QNAN(1), F64_QNAN(2), F64_1, \ 125*6aa29c07SMax Filippov F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \ 126*6aa29c07SMax Filippov FSR__, FSR__, FSR__, FSR__ 127*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, F64_QNAN(1), F64_1, F64_QNAN(3), \ 128*6aa29c07SMax Filippov F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \ 129*6aa29c07SMax Filippov FSR__, FSR__, FSR__, FSR__ 130*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, F64_1, F64_QNAN(2), F64_QNAN(3), \ 131*6aa29c07SMax Filippov F64_QNAN(3), F64_QNAN(3), F64_QNAN(3), F64_QNAN(3), \ 132*6aa29c07SMax Filippov FSR__, FSR__, FSR__, FSR__ 133*6aa29c07SMax Filippov 134*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, F64_QNAN(1), F64_QNAN(2), F64_QNAN(3), \ 135*6aa29c07SMax Filippov F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \ 136*6aa29c07SMax Filippov FSR__, FSR__, FSR__, FSR__ 137*6aa29c07SMax Filippov 138*6aa29c07SMax Filippov /* inf * 0 = default NaN */ 139*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, F64_1, F64_PINF, F64_0, \ 140*6aa29c07SMax Filippov F64_DNAN, F64_DNAN, F64_DNAN, F64_DNAN, \ 141*6aa29c07SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 142*6aa29c07SMax Filippov /* inf * 0 + SNaN1 = QNaN1 */ 143*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, F64_SNAN(1), F64_PINF, F64_0, \ 144*6aa29c07SMax Filippov F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \ 145*6aa29c07SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 146*6aa29c07SMax Filippov /* inf * 0 + QNaN1 = QNaN1 */ 147*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, F64_QNAN(1), F64_PINF, F64_0, \ 148*6aa29c07SMax Filippov F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \ 149*6aa29c07SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 150*6aa29c07SMax Filippov 151*6aa29c07SMax Filippov /* madd/msub SNaN turns to QNaN and sets Invalid flag */ 152*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, F64_SNAN(1), F64_1, F64_1, \ 153*6aa29c07SMax Filippov F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \ 154*6aa29c07SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 155*6aa29c07SMax Filippov test_op3 madd.d, f0, f1, f2, f0, F64_QNAN(1), F64_SNAN(2), F64_1, \ 156*6aa29c07SMax Filippov F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), F64_QNAN(1), \ 157*6aa29c07SMax Filippov FSR_V, FSR_V, FSR_V, FSR_V 158*6aa29c07SMax Filippovtest_end 159*6aa29c07SMax Filippov 160*6aa29c07SMax Filippov#endif 161*6aa29c07SMax Filippov 162*6aa29c07SMax Filippovtest_suite_end 163