1; RUN: llc -mtriple=hexagon < %s | FileCheck %s 2 3target triple = "hexagon" 4 5; CHECK-LABEL: f0 6; CHECK: r0 = rol(r0,#7) 7define i32 @f0(i32 %a0) #0 { 8b0: 9 %v0 = shl i32 %a0, 7 10 %v1 = lshr i32 %a0, 25 11 %v2 = or i32 %v0, %v1 12 ret i32 %v2 13} 14 15; CHECK-LABEL: f1 16; This is a rotate left by %a1(r1). Use register-pair shift to implement it. 17; CHECK: r[[R10:[0-9]+]]:[[R11:[0-9]+]] = combine(r0,r0) 18; CHECK: r[[R12:[0-9]+]]:[[R13:[0-9]+]] = asl(r[[R10]]:[[R11]],r1) 19; CHECK: r0 = r[[R12]] 20define i32 @f1(i32 %a0, i32 %a1) #0 { 21b0: 22 %v0 = shl i32 %a0, %a1 23 %v1 = sub i32 32, %a1 24 %v2 = lshr i32 %a0, %v1 25 %v3 = or i32 %v2, %v0 26 ret i32 %v3 27} 28 29; CHECK-LABEL: f2 30; CHECK: r0 = rol(r0,#25) 31define i32 @f2(i32 %a0) #0 { 32b0: 33 %v0 = lshr i32 %a0, 7 34 %v1 = shl i32 %a0, 25 35 %v2 = or i32 %v0, %v1 36 ret i32 %v2 37} 38 39; CHECK-LABEL: f3 40; This is a rotate right by %a1(r1). Use register-pair shift to implement it. 41; CHECK: r[[R30:[0-9]+]]:[[R31:[0-9]+]] = combine(r0,r0) 42; CHECK: r[[R32:[0-9]+]]:[[R33:[0-9]+]] = lsr(r[[R30]]:[[R31]],r1) 43define i32 @f3(i32 %a0, i32 %a1) #0 { 44b0: 45 %v0 = lshr i32 %a0, %a1 46 %v1 = sub i32 32, %a1 47 %v2 = shl i32 %a0, %v1 48 %v3 = or i32 %v2, %v0 49 ret i32 %v3 50} 51 52; CHECK-LABEL: f4 53; CHECK: r1:0 = rol(r1:0,#7) 54define i64 @f4(i64 %a0) #0 { 55b0: 56 %v0 = shl i64 %a0, 7 57 %v1 = lshr i64 %a0, 57 58 %v2 = or i64 %v0, %v1 59 ret i64 %v2 60} 61 62; CHECK-LABEL: f5 63; This is a rotate left by %a1(r2). 64; CHECK: r[[R50:[0-9]+]]:[[R51:[0-9]+]] = asl(r1:0,r2) 65; CHECK: r[[R52:[0-9]+]] = sub(#64,r2) 66; CHECK: r[[R50]]:[[R51]] |= lsr(r1:0,r[[R52]]) 67define i64 @f5(i64 %a0, i32 %a1) #0 { 68b0: 69 %v0 = zext i32 %a1 to i64 70 %v1 = shl i64 %a0, %v0 71 %v2 = sub i32 64, %a1 72 %v3 = zext i32 %v2 to i64 73 %v4 = lshr i64 %a0, %v3 74 %v5 = or i64 %v4, %v1 75 ret i64 %v5 76} 77 78; CHECK-LABEL: f6 79; CHECK: r1:0 = rol(r1:0,#57) 80define i64 @f6(i64 %a0) #0 { 81b0: 82 %v0 = lshr i64 %a0, 7 83 %v1 = shl i64 %a0, 57 84 %v2 = or i64 %v0, %v1 85 ret i64 %v2 86} 87 88; CHECK-LABEL: f7 89; This is a rotate right by %a1(r2). 90; CHECK: r[[R70:[0-9]+]]:[[R71:[0-9]+]] = lsr(r1:0,r2) 91; CHECK: r[[R72:[0-9]+]] = sub(#64,r2) 92; CHECK: r[[R70]]:[[R71]] |= asl(r1:0,r[[R72]]) 93define i64 @f7(i64 %a0, i32 %a1) #0 { 94b0: 95 %v0 = zext i32 %a1 to i64 96 %v1 = lshr i64 %a0, %v0 97 %v2 = sub i32 64, %a1 98 %v3 = zext i32 %v2 to i64 99 %v4 = shl i64 %a0, %v3 100 %v5 = or i64 %v4, %v1 101 ret i64 %v5 102} 103 104; CHECK-LABEL: f8 105; CHECK: r0 += rol(r1,#7) 106define i32 @f8(i32 %a0, i32 %a1) #0 { 107b0: 108 %v0 = shl i32 %a1, 7 109 %v1 = lshr i32 %a1, 25 110 %v2 = or i32 %v0, %v1 111 %v3 = add i32 %v2, %a0 112 ret i32 %v3 113} 114 115; CHECK-LABEL: f9 116; CHECK: r0 -= rol(r1,#7) 117define i32 @f9(i32 %a0, i32 %a1) #0 { 118b0: 119 %v0 = shl i32 %a1, 7 120 %v1 = lshr i32 %a1, 25 121 %v2 = or i32 %v0, %v1 122 %v3 = sub i32 %a0, %v2 123 ret i32 %v3 124} 125 126; CHECK-LABEL: f10 127; CHECK: r0 &= rol(r1,#7) 128define i32 @f10(i32 %a0, i32 %a1) #0 { 129b0: 130 %v0 = shl i32 %a1, 7 131 %v1 = lshr i32 %a1, 25 132 %v2 = or i32 %v0, %v1 133 %v3 = and i32 %v2, %a0 134 ret i32 %v3 135} 136 137; CHECK-LABEL: f11 138; CHECK: r0 |= lsr(r1,#25) 139; CHECK: r0 |= asl(r1,#7) 140define i32 @f11(i32 %a0, i32 %a1) #0 { 141b0: 142 %v0 = shl i32 %a1, 7 143 %v1 = lshr i32 %a1, 25 144 %v2 = or i32 %v1, %a0 145 %v3 = or i32 %v2, %v0 146 ret i32 %v3 147} 148 149; CHECK-LABEL: f12 150; CHECK: r0 ^= rol(r1,#7) 151define i32 @f12(i32 %a0, i32 %a1) #0 { 152b0: 153 %v0 = shl i32 %a1, 7 154 %v1 = lshr i32 %a1, 25 155 %v2 = or i32 %v0, %v1 156 %v3 = xor i32 %v2, %a0 157 ret i32 %v3 158} 159 160; CHECK-LABEL: f13 161; CHECK: r1:0 += rol(r3:2,#7) 162define i64 @f13(i64 %a0, i64 %a1) #0 { 163b0: 164 %v0 = shl i64 %a1, 7 165 %v1 = lshr i64 %a1, 57 166 %v2 = or i64 %v0, %v1 167 %v3 = add i64 %v2, %a0 168 ret i64 %v3 169} 170 171; CHECK-LABEL: f14 172; CHECK: r1:0 -= rol(r3:2,#7) 173define i64 @f14(i64 %a0, i64 %a1) #0 { 174b0: 175 %v0 = shl i64 %a1, 7 176 %v1 = lshr i64 %a1, 57 177 %v2 = or i64 %v0, %v1 178 %v3 = sub i64 %a0, %v2 179 ret i64 %v3 180} 181 182; CHECK-LABEL: f15 183; CHECK: r1:0 &= rol(r3:2,#7) 184define i64 @f15(i64 %a0, i64 %a1) #0 { 185b0: 186 %v0 = shl i64 %a1, 7 187 %v1 = lshr i64 %a1, 57 188 %v2 = or i64 %v0, %v1 189 %v3 = and i64 %v2, %a0 190 ret i64 %v3 191} 192 193; CHECK-LABEL: f16 194; CHECK: r1:0 |= lsr(r3:2,#57) 195; CHECK: r1:0 |= asl(r3:2,#7) 196define i64 @f16(i64 %a0, i64 %a1) #0 { 197b0: 198 %v0 = shl i64 %a1, 7 199 %v1 = lshr i64 %a1, 57 200 %v2 = or i64 %v1, %a0 201 %v3 = or i64 %v2, %v0 202 ret i64 %v3 203} 204 205; CHECK-LABEL: f17 206; CHECK: r1:0 ^= rol(r3:2,#7) 207define i64 @f17(i64 %a0, i64 %a1) #0 { 208b0: 209 %v0 = shl i64 %a1, 7 210 %v1 = lshr i64 %a1, 57 211 %v2 = or i64 %v0, %v1 212 %v3 = xor i64 %v2, %a0 213 ret i64 %v3 214} 215 216attributes #0 = { norecurse nounwind readnone "target-cpu"="hexagonv60" "target-features"="-packets" } 217