1; RUN: llc -mtriple=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) 6define i32 @f0(i32 %a0, i32 %a1) #1 { 7b0: 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) 15define i32 @f1(i32 %a0, i32 %a1, i32 %a2) #1 { 16b0: 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(r1:0,#17) 23; CHECK: r[[R20]]:[[R21]] |= lsr(r3:2,#47) 24define i64 @f2(i64 %a0, i64 %a1) #1 { 25b0: 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(r1:0,r4) 32; CHECK: r[[R32:[0-9]+]] = sub(#64,r4) 33; CHECK: r[[R30]]:[[R31]] |= lsr(r3:2,r[[R32]]) 34define i64 @f3(i64 %a0, i64 %a1, i64 %a2) #1 { 35b0: 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) 43define i32 @f4(i32 %a0, i32 %a1) #1 { 44b0: 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) 52define i32 @f5(i32 %a0, i32 %a1, i32 %a2) #1 { 53b0: 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) 61define i64 @f6(i64 %a0, i64 %a1) #1 { 62b0: 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) 71define i64 @f7(i64 %a0, i64 %a1, i64 %a2) #1 { 72b0: 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) 79define i32 @f8(i32 %a0) #1 { 80b0: 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) 88define i32 @f9(i32 %a0, i32 %a1) #1 { 89b0: 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) 96define i64 @f10(i64 %a0, i64 %a1) #1 { 97b0: 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]]) 106define i64 @f11(i64 %a0, i64 %a1) #1 { 107b0: 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) 114define i32 @f12(i32 %a0, i32 %a1) #1 { 115b0: 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) 123define i32 @f13(i32 %a0, i32 %a1) #1 { 124b0: 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) 131define i64 @f14(i64 %a0, i64 %a1) #1 { 132b0: 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]]) 141define i64 @f15(i64 %a0, i64 %a1) #1 { 142b0: 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) 149define i64 @f16(i64 %a0, i64 %a1) #1 { 150b0: 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) 157define i64 @f17(i64 %a0, i64 %a1) #1 { 158b0: 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) 165define i64 @f18(i64 %a0, i64 %a1) #1 { 166b0: 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) 173define i64 @f19(i64 %a0, i64 %a1) #1 { 174b0: 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) 181define i64 @f20(i64 %a0, i64 %a1) #1 { 182b0: 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) 189define i64 @f21(i64 %a0, i64 %a1) #1 { 190b0: 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) 197define i64 @f22(i64 %a0, i64 %a1) #1 { 198b0: 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) 205define i64 @f23(i64 %a0, i64 %a1) #1 { 206b0: 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) 213define i64 @f24(i64 %a0, i64 %a1) #1 { 214b0: 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) 221define i64 @f25(i64 %a0, i64 %a1) #1 { 222b0: 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) 229define i64 @f26(i64 %a0, i64 %a1) #1 { 230b0: 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) 237define i64 @f27(i64 %a0, i64 %a1) #1 { 238b0: 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) 245define i64 @f28(i64 %a0, i64 %a1) #1 { 246b0: 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) 253define i64 @f29(i64 %a0, i64 %a1) #1 { 254b0: 255 %v0 = tail call i64 @llvm.fshr.i64(i64 %a0, i64 %a1, i64 56) 256 ret i64 %v0 257} 258 259; CHECK-LABEL: f30: 260; CHECK: r[[R00:[0-9]+]] = combine(r0.l,r1.h) 261define i32 @f30(i32 %a0, i32 %a1) #1 { 262b0: 263 %v0 = tail call i32 @llvm.fshl.i32(i32 %a0, i32 %a1, i32 16) 264 ret i32 %v0 265} 266 267; CHECK-LABEL: f31: 268; CHECK: r[[R00:[0-9]+]] = combine(r0.l,r1.h) 269define i32 @f31(i32 %a0, i32 %a1) #1 { 270b0: 271 %v0 = tail call i32 @llvm.fshr.i32(i32 %a0, i32 %a1, i32 16) 272 ret i32 %v0 273} 274 275declare i32 @llvm.fshl.i32(i32, i32, i32) #0 276declare i32 @llvm.fshr.i32(i32, i32, i32) #0 277declare i64 @llvm.fshl.i64(i64, i64, i64) #0 278declare i64 @llvm.fshr.i64(i64, i64, i64) #0 279 280attributes #0 = { nounwind readnone speculatable } 281attributes #1 = { nounwind readnone "target-cpu"="hexagonv60" "target-features"="-packets" } 282