001-cmpset.P1pp (4774B)
1 # tests/p1/cmpset.P1pp -- libp1pp compare-and-set-bool macros. 2 # 3 # %cmpset_eq(rd, ra, rb) rd = (ra == rb) ? 1 : 0 4 # %cmpset_ne rd = (ra != rb) ? 1 : 0 5 # %cmpset_lt signed less-than 6 # %cmpset_ltu unsigned less-than 7 # %cmpset_le signed less-or-equal 8 # %cmpset_leu unsigned less-or-equal 9 # %cmpset_ge signed greater-or-equal 10 # %cmpset_geu unsigned greater-or-equal 11 # %cmpset_eqz(rd, ra) rd = (ra == 0) ? 1 : 0 12 # %cmpset_nez rd = (ra != 0) ? 1 : 0 13 # %cmpset_ltz rd = (ra < 0) ? 1 : 0 14 # 15 # Each subtest checks both the true and false case for a comparator 16 # (and for le/ge, also the equality boundary). 17 # Output: "EQ NE LT LTU LE LEU GE GEU EZ NZ LZ\n" on full pass. 18 19 %fn(p1_main, 0, { 20 # ---- eq ------------------------------------------------------------- 21 %li(s0, 5) %li(s1, 5) 22 %cmpset_eq(t0, s0, s1) 23 %li(t1, 1) %bne(t0, t1, &.fail) 24 %li(s1, 6) 25 %cmpset_eq(t0, s0, s1) 26 %li(t1, 0) %bne(t0, t1, &.fail) 27 %la(a0, &c_eq) %li(a1, 3) %call(&print) 28 29 # ---- ne ------------------------------------------------------------- 30 %li(s0, 5) %li(s1, 6) 31 %cmpset_ne(t0, s0, s1) 32 %li(t1, 1) %bne(t0, t1, &.fail) 33 %li(s1, 5) 34 %cmpset_ne(t0, s0, s1) 35 %li(t1, 0) %bne(t0, t1, &.fail) 36 %la(a0, &c_ne) %li(a1, 3) %call(&print) 37 38 # ---- lt ------------------------------------------------------------- 39 %li(s0, -3) %li(s1, 2) 40 %cmpset_lt(t0, s0, s1) 41 %li(t1, 1) %bne(t0, t1, &.fail) 42 %cmpset_lt(t0, s1, s0) 43 %li(t1, 0) %bne(t0, t1, &.fail) 44 %la(a0, &c_lt) %li(a1, 3) %call(&print) 45 46 # ---- ltu (unsigned: -1 is huge) ------------------------------------ 47 %li(s0, 5) %li(s1, -1) 48 %cmpset_ltu(t0, s0, s1) 49 %li(t1, 1) %bne(t0, t1, &.fail) 50 %cmpset_ltu(t0, s1, s0) 51 %li(t1, 0) %bne(t0, t1, &.fail) 52 %la(a0, &c_ltu) %li(a1, 4) %call(&print) 53 54 # ---- le (signed) ---------------------------------------------------- 55 # true cases: a < b, and a == b 56 %li(s0, -3) %li(s1, 2) 57 %cmpset_le(t0, s0, s1) 58 %li(t1, 1) %bne(t0, t1, &.fail) 59 %li(s0, 5) %li(s1, 5) 60 %cmpset_le(t0, s0, s1) 61 %li(t1, 1) %bne(t0, t1, &.fail) 62 # false: a > b 63 %li(s0, 6) %li(s1, 5) 64 %cmpset_le(t0, s0, s1) 65 %li(t1, 0) %bne(t0, t1, &.fail) 66 %la(a0, &c_le) %li(a1, 3) %call(&print) 67 68 # ---- leu (unsigned) ------------------------------------------------- 69 # -1 unsigned is huge; 5 <= -1 (true), -1 <= 5 (false), 5 <= 5 (true) 70 %li(s0, 5) %li(s1, -1) 71 %cmpset_leu(t0, s0, s1) 72 %li(t1, 1) %bne(t0, t1, &.fail) 73 %cmpset_leu(t0, s1, s0) 74 %li(t1, 0) %bne(t0, t1, &.fail) 75 %li(s0, 5) %li(s1, 5) 76 %cmpset_leu(t0, s0, s1) 77 %li(t1, 1) %bne(t0, t1, &.fail) 78 %la(a0, &c_leu) %li(a1, 4) %call(&print) 79 80 # ---- ge (signed) ---------------------------------------------------- 81 %li(s0, 2) %li(s1, -3) 82 %cmpset_ge(t0, s0, s1) 83 %li(t1, 1) %bne(t0, t1, &.fail) 84 %li(s0, 5) %li(s1, 5) 85 %cmpset_ge(t0, s0, s1) 86 %li(t1, 1) %bne(t0, t1, &.fail) 87 %li(s0, -3) %li(s1, 2) 88 %cmpset_ge(t0, s0, s1) 89 %li(t1, 0) %bne(t0, t1, &.fail) 90 %la(a0, &c_ge) %li(a1, 3) %call(&print) 91 92 # ---- geu (unsigned) ------------------------------------------------- 93 %li(s0, -1) %li(s1, 5) 94 %cmpset_geu(t0, s0, s1) 95 %li(t1, 1) %bne(t0, t1, &.fail) 96 %cmpset_geu(t0, s1, s0) 97 %li(t1, 0) %bne(t0, t1, &.fail) 98 %li(s0, 5) %li(s1, 5) 99 %cmpset_geu(t0, s0, s1) 100 %li(t1, 1) %bne(t0, t1, &.fail) 101 %la(a0, &c_geu) %li(a1, 4) %call(&print) 102 103 # ---- eqz ------------------------------------------------------------ 104 %li(s0, 0) 105 %cmpset_eqz(t0, s0) 106 %li(t1, 1) %bne(t0, t1, &.fail) 107 %li(s0, 7) 108 %cmpset_eqz(t0, s0) 109 %li(t1, 0) %bne(t0, t1, &.fail) 110 %la(a0, &c_ez) %li(a1, 3) %call(&print) 111 112 # ---- nez ------------------------------------------------------------ 113 %li(s0, 7) 114 %cmpset_nez(t0, s0) 115 %li(t1, 1) %bne(t0, t1, &.fail) 116 %li(s0, 0) 117 %cmpset_nez(t0, s0) 118 %li(t1, 0) %bne(t0, t1, &.fail) 119 %la(a0, &c_nz) %li(a1, 3) %call(&print) 120 121 # ---- ltz ------------------------------------------------------------ 122 %li(s0, -1) 123 %cmpset_ltz(t0, s0) 124 %li(t1, 1) %bne(t0, t1, &.fail) 125 %li(s0, 0) 126 %cmpset_ltz(t0, s0) 127 %li(t1, 0) %bne(t0, t1, &.fail) 128 %la(a0, &c_lz) %li(a1, 2) %call(&print) 129 130 %la(a0, &c_nl) %li(a1, 1) %call(&print) 131 %li(a0, 0) 132 %b(&.done) 133 134 :.fail 135 %la(a0, &c_x) %li(a1, 1) %call(&print) 136 %la(a0, &c_nl) %li(a1, 1) %call(&print) 137 %li(a0, 1) 138 :.done 139 }) 140 141 :c_eq "EQ " 142 :c_ne "NE " 143 :c_lt "LT " 144 :c_ltu "LTU " 145 :c_le "LE " 146 :c_leu "LEU " 147 :c_ge "GE " 148 :c_geu "GEU " 149 :c_ez "EZ " 150 :c_nz "NZ " 151 :c_lz "LZ" 152 :c_x "X" 153 :c_nl " 154 " 155 156 :ELF_end