| 1 | #include "macros.inc" |
| 2 | #include "fpu.h" |
| 3 | |
| 4 | test_suite fp1 |
| 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_ord_ex op, br, fr0, fr1, v0, v1, r, sr |
| 14 | movi a2, 0 |
| 15 | wur a2, fsr |
| 16 | movfp \fr0, \v0 |
| 17 | movfp \fr1, \v1 |
| 18 | \op \br, \fr0, \fr1 |
| 19 | movi a2, 0 |
| 20 | movi a3, 1 |
| 21 | movt a2, a3, \br |
| 22 | assert eqi, a2, \r |
| 23 | rur a2, fsr |
| 24 | #if DFPU |
| 25 | movi a3, \sr |
| 26 | assert eq, a2, a3 |
| 27 | #else |
| 28 | assert eqi, a2, 0 |
| 29 | #endif |
| 30 | .endm |
| 31 | |
| 32 | .macro test_ord op, br, fr0, fr1, v0, v1, r, sr |
| 33 | movi a2, 0 |
| 34 | wur a2, fcr |
| 35 | test_ord_ex \op, \br, \fr0, \fr1, \v0, \v1, \r, \sr |
| 36 | movi a2, 0x7c |
| 37 | wur a2, fcr |
| 38 | test_ord_ex \op, \br, \fr0, \fr1, \v0, \v1, \r, \sr |
| 39 | .endm |
| 40 | |
| 41 | .macro test_ord_all op, aa, ab, ba, aPI, PIa, aN, Na, II, IN, NI, qnan_sr |
| 42 | test_ord \op b0, f0, f1, 0x3f800000, 0x3f800000, \aa, FSR__ /* ord == ord */ |
| 43 | test_ord \op b1, f2, f3, 0x3f800000, 0x3fc00000, \ab, FSR__ /* ord < ord */ |
| 44 | test_ord \op b2, f4, f5, 0x3fc00000, 0x3f800000, \ba, FSR__ /* ord > ord */ |
| 45 | test_ord \op b3, f6, f7, 0x3f800000, 0x7f800000, \aPI, FSR__ /* ord +INF */ |
| 46 | test_ord \op b4, f8, f9, 0x7f800000, 0x3f800000, \PIa, FSR__ /* +INF ord */ |
| 47 | test_ord \op b5, f10, f11, 0x3f800000, 0xffc00001, \aN, \qnan_sr /* ord -QNaN */ |
| 48 | test_ord \op b6, f12, f13, 0x3f800000, 0xff800001, \aN, FSR_V /* ord -SNaN */ |
| 49 | test_ord \op b7, f14, f15, 0x3f800000, 0x7f800001, \aN, FSR_V /* ord +SNaN */ |
| 50 | test_ord \op b8, f0, f1, 0x3f800000, 0x7fc00000, \aN, \qnan_sr /* ord +QNaN */ |
| 51 | test_ord \op b9, f2, f3, 0xffc00001, 0x3f800000, \Na, \qnan_sr /* -QNaN ord */ |
| 52 | test_ord \op b10, f4, f5, 0xff800001, 0x3f800000, \Na, FSR_V /* -SNaN ord */ |
| 53 | test_ord \op b11, f6, f7, 0x7f800001, 0x3f800000, \Na, FSR_V /* +SNaN ord */ |
| 54 | test_ord \op b12, f8, f9, 0x7fc00000, 0x3f800000, \Na, \qnan_sr /* +QNaN ord */ |
| 55 | test_ord \op b13, f10, f11, 0x7f800000, 0x7f800000, \II, FSR__ /* +INF +INF */ |
| 56 | test_ord \op b14, f12, f13, 0x7f800000, 0x7fc00000, \IN, \qnan_sr /* +INF +QNaN */ |
| 57 | test_ord \op b15, f14, f15, 0x7fc00000, 0x7f800000, \NI, \qnan_sr /* +QNaN +INF */ |
| 58 | .endm |
| 59 | |
| 60 | test un_s |
| 61 | movi a2, 1 |
| 62 | wsr a2, cpenable |
| 63 | test_ord_all un.s, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, FSR__ |
| 64 | test_end |
| 65 | |
| 66 | test oeq_s |
| 67 | test_ord_all oeq.s, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, FSR__ |
| 68 | test_end |
| 69 | |
| 70 | test ueq_s |
| 71 | test_ord_all ueq.s, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, FSR__ |
| 72 | test_end |
| 73 | |
| 74 | test olt_s |
| 75 | test_ord_all olt.s, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, FSR_V |
| 76 | test_end |
| 77 | |
| 78 | test ult_s |
| 79 | test_ord_all ult.s, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, FSR__ |
| 80 | test_end |
| 81 | |
| 82 | test ole_s |
| 83 | test_ord_all ole.s, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, FSR_V |
| 84 | test_end |
| 85 | |
| 86 | test ule_s |
| 87 | test_ord_all ule.s, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, FSR__ |
| 88 | test_end |
| 89 | |
| 90 | .macro test_cond op, fr0, fr1, cr, v0, v1, r |
| 91 | movfp \fr0, \v0 |
| 92 | movfp \fr1, \v1 |
| 93 | \op \fr0, \fr1, \cr |
| 94 | rfr a2, \fr0 |
| 95 | movi a3, \r |
| 96 | assert eq, a2, a3 |
| 97 | .endm |
| 98 | |
| 99 | test moveqz_s |
| 100 | movi a3, 0 |
| 101 | test_cond moveqz.s, f0, f1, a3, 0, 0x3f800000, 0x3f800000 |
| 102 | movi a3, 1 |
| 103 | test_cond moveqz.s, f0, f1, a3, 0, 0x3f800000, 0 |
| 104 | test_end |
| 105 | |
| 106 | test movnez_s |
| 107 | movi a3, 0 |
| 108 | test_cond movnez.s, f0, f1, a3, 0, 0x3f800000, 0 |
| 109 | movi a3, 1 |
| 110 | test_cond movnez.s, f0, f1, a3, 0, 0x3f800000, 0x3f800000 |
| 111 | test_end |
| 112 | |
| 113 | test movltz_s |
| 114 | movi a3, -1 |
| 115 | test_cond movltz.s, f0, f1, a3, 0, 0x3f800000, 0x3f800000 |
| 116 | movi a3, 0 |
| 117 | test_cond movltz.s, f0, f1, a3, 0, 0x3f800000, 0 |
| 118 | movi a3, 1 |
| 119 | test_cond movltz.s, f0, f1, a3, 0, 0x3f800000, 0 |
| 120 | test_end |
| 121 | |
| 122 | test movgez_s |
| 123 | movi a3, -1 |
| 124 | test_cond movgez.s, f0, f1, a3, 0, 0x3f800000, 0 |
| 125 | movi a3, 0 |
| 126 | test_cond movgez.s, f0, f1, a3, 0, 0x3f800000, 0x3f800000 |
| 127 | movi a3, 1 |
| 128 | test_cond movgez.s, f0, f1, a3, 0, 0x3f800000, 0x3f800000 |
| 129 | test_end |
| 130 | |
| 131 | test movf_s |
| 132 | olt.s b0, f0, f0 |
| 133 | test_cond movf.s, f0, f1, b0, 0, 0x3f800000, 0x3f800000 |
| 134 | ueq.s b0, f0, f0 |
| 135 | test_cond movf.s, f0, f1, b0, 0, 0x3f800000, 0 |
| 136 | test_end |
| 137 | |
| 138 | test movt_s |
| 139 | ueq.s b0, f0, f0 |
| 140 | test_cond movt.s, f0, f1, b0, 0, 0x3f800000, 0x3f800000 |
| 141 | olt.s b0, f0, f0 |
| 142 | test_cond movt.s, f0, f1, b0, 0, 0x3f800000, 0 |
| 143 | test_end |
| 144 | |
| 145 | #endif |
| 146 | |
| 147 | test_suite_end |