Krzysztof Parzyszek | 30c42e2 | 2018-12-20 16:39:20 +0000 | [diff] [blame] | 1 | ; RUN: llc -march=hexagon < %s | FileCheck %s |
| 2 | |
| 3 | ; CHECK-LABEL: f0: |
| 4 | ; CHECK: r[[R00:[0-9]+]]:[[R01:[0-9]+]] = combine(r0,r1) |
| 5 | ; CHECK: r[[R02:[0-9]+]]:[[R03:[0-9]+]] = asl(r[[R00]]:[[R01]],#17) |
| 6 | define i32 @f0(i32 %a0, i32 %a1) #1 { |
| 7 | b0: |
| 8 | %v0 = tail call i32 @llvm.fshl.i32(i32 %a0, i32 %a1, i32 17) |
| 9 | ret i32 %v0 |
| 10 | } |
| 11 | |
| 12 | ; CHECK-LABEL: f1: |
| 13 | ; CHECK: r[[R10:[0-9]+]]:[[R11:[0-9]+]] = combine(r0,r1) |
| 14 | ; CHECK: r[[R12:[0-9]+]]:[[R13:[0-9]+]] = asl(r[[R10]]:[[R11]],r2) |
| 15 | define i32 @f1(i32 %a0, i32 %a1, i32 %a2) #1 { |
| 16 | b0: |
| 17 | %v0 = tail call i32 @llvm.fshl.i32(i32 %a0, i32 %a1, i32 %a2) |
| 18 | ret i32 %v0 |
| 19 | } |
| 20 | |
| 21 | ; CHECK-LABEL: f2: |
| 22 | ; CHECK: r[[R20:[0-9]+]]:[[R21:[0-9]+]] = asl(r3:2,#17) |
| 23 | ; CHECK: r[[R20]]:[[R21]] |= lsr(r1:0,#47) |
| 24 | define i64 @f2(i64 %a0, i64 %a1) #1 { |
| 25 | b0: |
| 26 | %v0 = tail call i64 @llvm.fshl.i64(i64 %a0, i64 %a1, i64 17) |
| 27 | ret i64 %v0 |
| 28 | } |
| 29 | |
| 30 | ; CHECK-LABEL: f3: |
| 31 | ; CHECK: r[[R30:[0-9]+]]:[[R31:[0-9]+]] = asl(r3:2,r4) |
| 32 | ; CHECK: r[[R32:[0-9]+]] = sub(#64,r4) |
| 33 | ; CHECK: r[[R30]]:[[R31]] |= lsr(r1:0,r[[R32]]) |
| 34 | define i64 @f3(i64 %a0, i64 %a1, i64 %a2) #1 { |
| 35 | b0: |
| 36 | %v0 = tail call i64 @llvm.fshl.i64(i64 %a0, i64 %a1, i64 %a2) |
| 37 | ret i64 %v0 |
| 38 | } |
| 39 | |
| 40 | ; CHECK-LABEL: f4: |
| 41 | ; CHECK: r[[R40:[0-9]+]]:[[R41:[0-9]+]] = combine(r0,r1) |
| 42 | ; CHECK: r[[R42:[0-9]+]]:[[R43:[0-9]+]] = lsr(r[[R40]]:[[R41]],#17) |
| 43 | define i32 @f4(i32 %a0, i32 %a1) #1 { |
| 44 | b0: |
| 45 | %v0 = tail call i32 @llvm.fshr.i32(i32 %a0, i32 %a1, i32 17) |
| 46 | ret i32 %v0 |
| 47 | } |
| 48 | |
| 49 | ; CHECK-LABEL: f5: |
| 50 | ; CHECK: r[[R50:[0-9]+]]:[[R51:[0-9]+]] = combine(r0,r1) |
| 51 | ; CHECK: r[[R52:[0-9]+]]:[[R53:[0-9]+]] = lsr(r[[R50]]:[[R51]],r2) |
| 52 | define i32 @f5(i32 %a0, i32 %a1, i32 %a2) #1 { |
| 53 | b0: |
| 54 | %v0 = tail call i32 @llvm.fshr.i32(i32 %a0, i32 %a1, i32 %a2) |
| 55 | ret i32 %v0 |
| 56 | } |
| 57 | |
| 58 | ; CHECK-LABEL: f6: |
| 59 | ; CHECK: r[[R60:[0-9]+]]:[[R61:[0-9]+]] = lsr(r3:2,#17) |
| 60 | ; CHECK: r[[R60]]:[[R61]] |= asl(r1:0,#47) |
| 61 | define i64 @f6(i64 %a0, i64 %a1) #1 { |
| 62 | b0: |
| 63 | %v0 = tail call i64 @llvm.fshr.i64(i64 %a0, i64 %a1, i64 17) |
| 64 | ret i64 %v0 |
| 65 | } |
| 66 | |
| 67 | ; CHECK-LABEL: f7: |
| 68 | ; CHECK: r[[R70:[0-9]+]]:[[R71:[0-9]+]] = lsr(r3:2,r4) |
| 69 | ; CHECK: r[[R72:[0-9]+]] = sub(#64,r4) |
| 70 | ; CHECK: r[[R70]]:[[R71]] |= asl(r1:0,r6) |
| 71 | define i64 @f7(i64 %a0, i64 %a1, i64 %a2) #1 { |
| 72 | b0: |
| 73 | %v0 = tail call i64 @llvm.fshr.i64(i64 %a0, i64 %a1, i64 %a2) |
| 74 | ret i64 %v0 |
| 75 | } |
| 76 | |
| 77 | ; CHECK-LABEL: f8: |
| 78 | ; CHECK: r[[R80:[0-9]+]] = rol(r0,#17) |
| 79 | define i32 @f8(i32 %a0) #1 { |
| 80 | b0: |
| 81 | %v0 = tail call i32 @llvm.fshl.i32(i32 %a0, i32 %a0, i32 17) |
| 82 | ret i32 %v0 |
| 83 | } |
| 84 | |
| 85 | ; CHECK-LABEL: f9: |
| 86 | ; CHECK: r[[R90:[0-9]+]]:[[R91:[0-9]+]] = combine(r0,r0) |
| 87 | ; CHECK: r[[R92:[0-9]+]]:[[R93:[0-9]+]] = asl(r[[R90]]:[[R91]],r1) |
| 88 | define i32 @f9(i32 %a0, i32 %a1) #1 { |
| 89 | b0: |
| 90 | %v0 = tail call i32 @llvm.fshl.i32(i32 %a0, i32 %a0, i32 %a1) |
| 91 | ret i32 %v0 |
| 92 | } |
| 93 | |
| 94 | ; CHECK-LABEL: f10: |
| 95 | ; CHECK: r[[RA0:[0-9]+]]:[[RA1:[0-9]+]] = rol(r1:0,#17) |
| 96 | define i64 @f10(i64 %a0, i64 %a1) #1 { |
| 97 | b0: |
| 98 | %v0 = tail call i64 @llvm.fshl.i64(i64 %a0, i64 %a0, i64 17) |
| 99 | ret i64 %v0 |
| 100 | } |
| 101 | |
| 102 | ; CHECK-LABEL: f11: |
| 103 | ; CHECK: r[[RB0:[0-9]+]]:[[RB1:[0-9]+]] = asl(r1:0,r2) |
| 104 | ; CHECK: r[[RB2:[0-9]+]] = sub(#64,r2) |
| 105 | ; CHECK: r[[RB0]]:[[RB1]] |= lsr(r1:0,r[[RB2]]) |
| 106 | define i64 @f11(i64 %a0, i64 %a1) #1 { |
| 107 | b0: |
| 108 | %v0 = tail call i64 @llvm.fshl.i64(i64 %a0, i64 %a0, i64 %a1) |
| 109 | ret i64 %v0 |
| 110 | } |
| 111 | |
| 112 | ; CHECK-LABEL: f12: |
| 113 | ; CHECK: r[[RC0:[0-9]+]] = rol(r0,#15) |
| 114 | define i32 @f12(i32 %a0, i32 %a1) #1 { |
| 115 | b0: |
| 116 | %v0 = tail call i32 @llvm.fshr.i32(i32 %a0, i32 %a0, i32 17) |
| 117 | ret i32 %v0 |
| 118 | } |
| 119 | |
| 120 | ; CHECK-LABEL: f13: |
| 121 | ; CHECK: r[[RD0:[0-9]+]]:[[RD1:[0-9]+]] = combine(r0,r0) |
| 122 | ; CHECK: r[[RD2:[0-9]+]]:[[RD3:[0-9]+]] = lsr(r[[RD0]]:[[RD1]],r1) |
| 123 | define i32 @f13(i32 %a0, i32 %a1) #1 { |
| 124 | b0: |
| 125 | %v0 = tail call i32 @llvm.fshr.i32(i32 %a0, i32 %a0, i32 %a1) |
| 126 | ret i32 %v0 |
| 127 | } |
| 128 | |
| 129 | ; CHECK-LABEL: f14: |
| 130 | ; CHECK: r[[RE0:[0-9]+]]:[[RE1:[0-9]+]] = rol(r1:0,#47) |
| 131 | define i64 @f14(i64 %a0, i64 %a1) #1 { |
| 132 | b0: |
| 133 | %v0 = tail call i64 @llvm.fshr.i64(i64 %a0, i64 %a0, i64 17) |
| 134 | ret i64 %v0 |
| 135 | } |
| 136 | |
| 137 | ; CHECK-LABEL: f15: |
| 138 | ; CHECK: r[[RF0:[0-9]+]]:[[RF1:[0-9]+]] = lsr(r1:0,r2) |
| 139 | ; CHECK: r[[RF2:[0-9]+]] = sub(#64,r2) |
| 140 | ; CHECK: r[[RF0]]:[[RF1]] |= asl(r1:0,r[[RF2]]) |
| 141 | define i64 @f15(i64 %a0, i64 %a1) #1 { |
| 142 | b0: |
| 143 | %v0 = tail call i64 @llvm.fshr.i64(i64 %a0, i64 %a0, i64 %a1) |
| 144 | ret i64 %v0 |
| 145 | } |
| 146 | |
| 147 | ; CHECK-LABEL: f16: |
| 148 | ; CHECK: r[[RG0:[0-9]+]]:[[RG1:[0-9]+]] = valignb(r1:0,r3:2,#7) |
| 149 | define i64 @f16(i64 %a0, i64 %a1) #1 { |
| 150 | b0: |
| 151 | %v0 = tail call i64 @llvm.fshl.i64(i64 %a0, i64 %a1, i64 8) |
| 152 | ret i64 %v0 |
| 153 | } |
| 154 | |
| 155 | ; CHECK-LABEL: f17: |
| 156 | ; CHECK: r[[RH0:[0-9]+]]:[[RH1:[0-9]+]] = valignb(r1:0,r3:2,#6) |
| 157 | define i64 @f17(i64 %a0, i64 %a1) #1 { |
| 158 | b0: |
| 159 | %v0 = tail call i64 @llvm.fshl.i64(i64 %a0, i64 %a1, i64 16) |
| 160 | ret i64 %v0 |
| 161 | } |
| 162 | |
| 163 | ; CHECK-LABEL: f18: |
| 164 | ; CHECK: r[[RI0:[0-9]+]]:[[RI1:[0-9]+]] = valignb(r1:0,r3:2,#5) |
| 165 | define i64 @f18(i64 %a0, i64 %a1) #1 { |
| 166 | b0: |
| 167 | %v0 = tail call i64 @llvm.fshl.i64(i64 %a0, i64 %a1, i64 24) |
| 168 | ret i64 %v0 |
| 169 | } |
| 170 | |
| 171 | ; CHECK-LABEL: f19: |
| 172 | ; CHECK: r[[RJ0:[0-9]+]]:[[RJ1:[0-9]+]] = valignb(r1:0,r3:2,#4) |
| 173 | define i64 @f19(i64 %a0, i64 %a1) #1 { |
| 174 | b0: |
| 175 | %v0 = tail call i64 @llvm.fshl.i64(i64 %a0, i64 %a1, i64 32) |
| 176 | ret i64 %v0 |
| 177 | } |
| 178 | |
| 179 | ; CHECK-LABEL: f20: |
| 180 | ; CHECK: r[[RK0:[0-9]+]]:[[RK1:[0-9]+]] = valignb(r1:0,r3:2,#3) |
| 181 | define i64 @f20(i64 %a0, i64 %a1) #1 { |
| 182 | b0: |
| 183 | %v0 = tail call i64 @llvm.fshl.i64(i64 %a0, i64 %a1, i64 40) |
| 184 | ret i64 %v0 |
| 185 | } |
| 186 | |
| 187 | ; CHECK-LABEL: f21: |
| 188 | ; CHECK: r[[RL0:[0-9]+]]:[[RL1:[0-9]+]] = valignb(r1:0,r3:2,#2) |
| 189 | define i64 @f21(i64 %a0, i64 %a1) #1 { |
| 190 | b0: |
| 191 | %v0 = tail call i64 @llvm.fshl.i64(i64 %a0, i64 %a1, i64 48) |
| 192 | ret i64 %v0 |
| 193 | } |
| 194 | |
| 195 | ; CHECK-LABEL: f22: |
| 196 | ; CHECK: r[[RM0:[0-9]+]]:[[RM1:[0-9]+]] = valignb(r1:0,r3:2,#1) |
| 197 | define i64 @f22(i64 %a0, i64 %a1) #1 { |
| 198 | b0: |
| 199 | %v0 = tail call i64 @llvm.fshl.i64(i64 %a0, i64 %a1, i64 56) |
| 200 | ret i64 %v0 |
| 201 | } |
| 202 | |
| 203 | ; CHECK-LABEL: f23: |
| 204 | ; CHECK: r[[RN0:[0-9]+]]:[[RN1:[0-9]+]] = valignb(r1:0,r3:2,#1) |
| 205 | define i64 @f23(i64 %a0, i64 %a1) #1 { |
| 206 | b0: |
| 207 | %v0 = tail call i64 @llvm.fshr.i64(i64 %a0, i64 %a1, i64 8) |
| 208 | ret i64 %v0 |
| 209 | } |
| 210 | |
| 211 | ; CHECK-LABEL: f24: |
| 212 | ; CHECK: r[[RO0:[0-9]+]]:[[RO1:[0-9]+]] = valignb(r1:0,r3:2,#2) |
| 213 | define i64 @f24(i64 %a0, i64 %a1) #1 { |
| 214 | b0: |
| 215 | %v0 = tail call i64 @llvm.fshr.i64(i64 %a0, i64 %a1, i64 16) |
| 216 | ret i64 %v0 |
| 217 | } |
| 218 | |
| 219 | ; CHECK-LABEL: f25: |
| 220 | ; CHECK: r[[RP0:[0-9]+]]:[[RP1:[0-9]+]] = valignb(r1:0,r3:2,#3) |
| 221 | define i64 @f25(i64 %a0, i64 %a1) #1 { |
| 222 | b0: |
| 223 | %v0 = tail call i64 @llvm.fshr.i64(i64 %a0, i64 %a1, i64 24) |
| 224 | ret i64 %v0 |
| 225 | } |
| 226 | |
| 227 | ; CHECK-LABEL: f26: |
| 228 | ; CHECK: r[[RQ0:[0-9]+]]:[[RQ1:[0-9]+]] = valignb(r1:0,r3:2,#4) |
| 229 | define i64 @f26(i64 %a0, i64 %a1) #1 { |
| 230 | b0: |
| 231 | %v0 = tail call i64 @llvm.fshr.i64(i64 %a0, i64 %a1, i64 32) |
| 232 | ret i64 %v0 |
| 233 | } |
| 234 | |
| 235 | ; CHECK-LABEL: f27: |
| 236 | ; CHECK: r[[RR0:[0-9]+]]:[[RR1:[0-9]+]] = valignb(r1:0,r3:2,#5) |
| 237 | define i64 @f27(i64 %a0, i64 %a1) #1 { |
| 238 | b0: |
| 239 | %v0 = tail call i64 @llvm.fshr.i64(i64 %a0, i64 %a1, i64 40) |
| 240 | ret i64 %v0 |
| 241 | } |
| 242 | |
| 243 | ; CHECK-LABEL: f28: |
| 244 | ; CHECK: r[[RS0:[0-9]+]]:[[RS1:[0-9]+]] = valignb(r1:0,r3:2,#6) |
| 245 | define i64 @f28(i64 %a0, i64 %a1) #1 { |
| 246 | b0: |
| 247 | %v0 = tail call i64 @llvm.fshr.i64(i64 %a0, i64 %a1, i64 48) |
| 248 | ret i64 %v0 |
| 249 | } |
| 250 | |
| 251 | ; CHECK-LABEL: f29: |
| 252 | ; CHECK: r[[RT0:[0-9]+]]:[[RT1:[0-9]+]] = valignb(r1:0,r3:2,#7) |
| 253 | define i64 @f29(i64 %a0, i64 %a1) #1 { |
| 254 | b0: |
| 255 | %v0 = tail call i64 @llvm.fshr.i64(i64 %a0, i64 %a1, i64 56) |
| 256 | ret i64 %v0 |
| 257 | } |
| 258 | |
| 259 | declare i32 @llvm.fshl.i32(i32, i32, i32) #0 |
| 260 | declare i32 @llvm.fshr.i32(i32, i32, i32) #0 |
| 261 | declare i64 @llvm.fshl.i64(i64, i64, i64) #0 |
| 262 | declare i64 @llvm.fshr.i64(i64, i64, i64) #0 |
| 263 | |
| 264 | attributes #0 = { nounwind readnone speculatable } |
| 265 | attributes #1 = { nounwind readnone "target-cpu"="hexagonv60" "target-features"="-packets" } |