Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 1 | ; Test 64-bit ANDs in which the second operand is constant. |
| 2 | ; |
| 3 | ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s |
| 4 | |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 5 | ; Use RISBG for a single bit. |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 6 | define i64 @f1(i64 %a) { |
Stephen Lin | d24ab20 | 2013-07-14 06:24:09 +0000 | [diff] [blame] | 7 | ; CHECK-LABEL: f1: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 8 | ; CHECK: risbg %r2, %r2, 63, 191, 0 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 9 | ; CHECK: br %r14 |
| 10 | %and = and i64 %a, 1 |
| 11 | ret i64 %and |
| 12 | } |
| 13 | |
| 14 | ; Likewise 0xfffe. |
| 15 | define i64 @f2(i64 %a) { |
Stephen Lin | d24ab20 | 2013-07-14 06:24:09 +0000 | [diff] [blame] | 16 | ; CHECK-LABEL: f2: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 17 | ; CHECK: risbg %r2, %r2, 48, 190, 0 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 18 | ; CHECK: br %r14 |
| 19 | %and = and i64 %a, 65534 |
| 20 | ret i64 %and |
| 21 | } |
| 22 | |
| 23 | ; ...but 0xffff is a 16-bit zero extension. |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 24 | define i64 @f3(i64 %a, i64 %b) { |
Stephen Lin | d24ab20 | 2013-07-14 06:24:09 +0000 | [diff] [blame] | 25 | ; CHECK-LABEL: f3: |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 26 | ; CHECK: llghr %r2, %r3 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 27 | ; CHECK: br %r14 |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 28 | %and = and i64 %b, 65535 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 29 | ret i64 %and |
| 30 | } |
| 31 | |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 32 | ; Check the next value up, which can again use RISBG. |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 33 | define i64 @f4(i64 %a) { |
Stephen Lin | d24ab20 | 2013-07-14 06:24:09 +0000 | [diff] [blame] | 34 | ; CHECK-LABEL: f4: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 35 | ; CHECK: risbg %r2, %r2, 47, 175, 0 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 36 | ; CHECK: br %r14 |
| 37 | %and = and i64 %a, 65536 |
| 38 | ret i64 %and |
| 39 | } |
| 40 | |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 41 | ; Check 0xfffffffe, which can also use RISBG. |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 42 | define i64 @f5(i64 %a) { |
Stephen Lin | d24ab20 | 2013-07-14 06:24:09 +0000 | [diff] [blame] | 43 | ; CHECK-LABEL: f5: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 44 | ; CHECK: risbg %r2, %r2, 32, 190, 0 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 45 | ; CHECK: br %r14 |
| 46 | %and = and i64 %a, 4294967294 |
| 47 | ret i64 %and |
| 48 | } |
| 49 | |
| 50 | ; Check the next value up, which is a 32-bit zero extension. |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 51 | define i64 @f6(i64 %a, i64 %b) { |
Stephen Lin | d24ab20 | 2013-07-14 06:24:09 +0000 | [diff] [blame] | 52 | ; CHECK-LABEL: f6: |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 53 | ; CHECK: llgfr %r2, %r3 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 54 | ; CHECK: br %r14 |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 55 | %and = and i64 %b, 4294967295 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 56 | ret i64 %and |
| 57 | } |
| 58 | |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 59 | ; Check the lowest useful NIHF value (0x00000001_ffffffff). |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 60 | define i64 @f7(i64 %a) { |
Stephen Lin | d24ab20 | 2013-07-14 06:24:09 +0000 | [diff] [blame] | 61 | ; CHECK-LABEL: f7: |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 62 | ; CHECK: nihf %r2, 1 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 63 | ; CHECK: br %r14 |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 64 | %and = and i64 %a, 8589934591 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 65 | ret i64 %and |
| 66 | } |
| 67 | |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 68 | ; ...but RISBG can be used if a three-address form is useful. |
| 69 | define i64 @f8(i64 %a, i64 %b) { |
Stephen Lin | d24ab20 | 2013-07-14 06:24:09 +0000 | [diff] [blame] | 70 | ; CHECK-LABEL: f8: |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 71 | ; CHECK: risbg %r2, %r3, 31, 191, 0 |
| 72 | ; CHECK: br %r14 |
| 73 | %and = and i64 %b, 8589934591 |
| 74 | ret i64 %and |
| 75 | } |
| 76 | |
| 77 | ; Check the lowest NIHH value outside the RISBG range (0x0002ffff_ffffffff). |
| 78 | define i64 @f9(i64 %a) { |
| 79 | ; CHECK-LABEL: f9: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 80 | ; CHECK: nihh %r2, 2 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 81 | ; CHECK: br %r14 |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 82 | %and = and i64 %a, 844424930131967 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 83 | ret i64 %and |
| 84 | } |
| 85 | |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 86 | ; Check the highest NIHH value outside the RISBG range (0xfffaffff_ffffffff). |
| 87 | define i64 @f10(i64 %a) { |
| 88 | ; CHECK-LABEL: f10: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 89 | ; CHECK: nihh %r2, 65530 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 90 | ; CHECK: br %r14 |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 91 | %and = and i64 %a, -1407374883553281 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 92 | ret i64 %and |
| 93 | } |
| 94 | |
| 95 | ; Check the highest useful NIHF value (0xfffefffe_ffffffff). |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 96 | define i64 @f11(i64 %a) { |
| 97 | ; CHECK-LABEL: f11: |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 98 | ; CHECK: nihf %r2, 4294901758 |
| 99 | ; CHECK: br %r14 |
| 100 | %and = and i64 %a, -281479271677953 |
| 101 | ret i64 %and |
| 102 | } |
| 103 | |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 104 | ; Check the lowest NIHL value outside the RISBG range (0xffff0002_ffffffff). |
| 105 | define i64 @f12(i64 %a) { |
| 106 | ; CHECK-LABEL: f12: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 107 | ; CHECK: nihl %r2, 2 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 108 | ; CHECK: br %r14 |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 109 | %and = and i64 %a, -281462091808769 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 110 | ret i64 %and |
| 111 | } |
| 112 | |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 113 | ; Check the highest NIHL value outside the RISBG range (0xfffffffa_ffffffff). |
| 114 | define i64 @f13(i64 %a) { |
| 115 | ; CHECK-LABEL: f13: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 116 | ; CHECK: nihl %r2, 65530 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 117 | ; CHECK: br %r14 |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 118 | %and = and i64 %a, -21474836481 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 119 | ret i64 %and |
| 120 | } |
| 121 | |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 122 | ; Check the lowest NILF value outside the RISBG range (0xffffffff_00000002). |
| 123 | define i64 @f14(i64 %a) { |
| 124 | ; CHECK-LABEL: f14: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 125 | ; CHECK: nilf %r2, 2 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 126 | ; CHECK: br %r14 |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 127 | %and = and i64 %a, -4294967294 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 128 | ret i64 %and |
| 129 | } |
| 130 | |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 131 | ; Check the lowest NILH value outside the RISBG range (0xffffffff_0002ffff). |
| 132 | define i64 @f15(i64 %a) { |
| 133 | ; CHECK-LABEL: f15: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 134 | ; CHECK: nilh %r2, 2 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 135 | ; CHECK: br %r14 |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 136 | %and = and i64 %a, -4294770689 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 137 | ret i64 %and |
| 138 | } |
| 139 | |
| 140 | ; Check the next value up, which must use NILF. |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 141 | define i64 @f16(i64 %a) { |
| 142 | ; CHECK-LABEL: f16: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 143 | ; CHECK: nilf %r2, 196608 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 144 | ; CHECK: br %r14 |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 145 | %and = and i64 %a, -4294770688 |
| 146 | ret i64 %and |
| 147 | } |
| 148 | |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 149 | ; Check the highest NILH value outside the RISBG range (0xffffffff_fffaffff). |
| 150 | define i64 @f17(i64 %a) { |
| 151 | ; CHECK-LABEL: f17: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 152 | ; CHECK: nilh %r2, 65530 |
| 153 | ; CHECK: br %r14 |
| 154 | %and = and i64 %a, -327681 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 155 | ret i64 %and |
| 156 | } |
| 157 | |
| 158 | ; Check the maximum useful NILF value (0xffffffff_fffefffe). |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 159 | define i64 @f18(i64 %a) { |
| 160 | ; CHECK-LABEL: f18: |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 161 | ; CHECK: nilf %r2, 4294901758 |
| 162 | ; CHECK: br %r14 |
| 163 | %and = and i64 %a, -65538 |
| 164 | ret i64 %and |
| 165 | } |
| 166 | |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 167 | ; Check the lowest NILL value outside the RISBG range (0xffffffff_ffff0002). |
| 168 | define i64 @f19(i64 %a) { |
| 169 | ; CHECK-LABEL: f19: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 170 | ; CHECK: nill %r2, 2 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 171 | ; CHECK: br %r14 |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 172 | %and = and i64 %a, -65534 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 173 | ret i64 %and |
| 174 | } |
| 175 | |
Richard Sandiford | 6a06ba3 | 2013-07-31 11:36:35 +0000 | [diff] [blame] | 176 | ; Check the highest NILL value outside the RISBG range. |
| 177 | define i64 @f20(i64 %a) { |
| 178 | ; CHECK-LABEL: f20: |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 179 | ; CHECK: nill %r2, 65530 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 180 | ; CHECK: br %r14 |
Richard Sandiford | 84f54a3 | 2013-07-11 08:59:12 +0000 | [diff] [blame] | 181 | %and = and i64 %a, -6 |
Ulrich Weigand | 9e3577f | 2013-05-06 16:17:29 +0000 | [diff] [blame] | 182 | ret i64 %and |
| 183 | } |