[MIParser] Set RegClassOrRegBank during instruction parsing
[llvm-complete.git] / test / CodeGen / Hexagon / rotate.ll
blob101d68b81bbc8deac61edaf93ded84047447bd3a
1 ; RUN: llc -march=hexagon < %s | FileCheck %s
3 target triple = "hexagon"
5 ; CHECK-LABEL: f0
6 ; CHECK: r0 = rol(r0,#7)
7 define i32 @f0(i32 %a0) #0 {
8 b0:
9   %v0 = shl i32 %a0, 7
10   %v1 = lshr i32 %a0, 25
11   %v2 = or i32 %v0, %v1
12   ret i32 %v2
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]]
20 define i32 @f1(i32 %a0, i32 %a1) #0 {
21 b0:
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
29 ; CHECK-LABEL: f2
30 ; CHECK: r0 = rol(r0,#25)
31 define i32 @f2(i32 %a0) #0 {
32 b0:
33   %v0 = lshr i32 %a0, 7
34   %v1 = shl i32 %a0, 25
35   %v2 = or i32 %v0, %v1
36   ret i32 %v2
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)
43 define i32 @f3(i32 %a0, i32 %a1) #0 {
44 b0:
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
52 ; CHECK-LABEL: f4
53 ; CHECK: r1:0 = rol(r1:0,#7)
54 define i64 @f4(i64 %a0) #0 {
55 b0:
56   %v0 = shl i64 %a0, 7
57   %v1 = lshr i64 %a0, 57
58   %v2 = or i64 %v0, %v1
59   ret i64 %v2
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]])
67 define i64 @f5(i64 %a0, i32 %a1) #0 {
68 b0:
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
78 ; CHECK-LABEL: f6
79 ; CHECK: r1:0 = rol(r1:0,#57)
80 define i64 @f6(i64 %a0) #0 {
81 b0:
82   %v0 = lshr i64 %a0, 7
83   %v1 = shl i64 %a0, 57
84   %v2 = or i64 %v0, %v1
85   ret i64 %v2
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]])
93 define i64 @f7(i64 %a0, i32 %a1) #0 {
94 b0:
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
104 ; CHECK-LABEL: f8
105 ; CHECK: r0 += rol(r1,#7)
106 define i32 @f8(i32 %a0, i32 %a1) #0 {
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
115 ; CHECK-LABEL: f9
116 ; CHECK: r0 -= rol(r1,#7)
117 define i32 @f9(i32 %a0, i32 %a1) #0 {
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
126 ; CHECK-LABEL: f10
127 ; CHECK: r0 &= rol(r1,#7)
128 define i32 @f10(i32 %a0, i32 %a1) #0 {
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
137 ; CHECK-LABEL: f11
138 ; CHECK: r0 |= lsr(r1,#25)
139 ; CHECK: r0 |= asl(r1,#7)
140 define i32 @f11(i32 %a0, i32 %a1) #0 {
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
149 ; CHECK-LABEL: f12
150 ; CHECK: r0 ^= rol(r1,#7)
151 define i32 @f12(i32 %a0, i32 %a1) #0 {
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
160 ; CHECK-LABEL: f13
161 ; CHECK: r1:0 += rol(r3:2,#7)
162 define i64 @f13(i64 %a0, i64 %a1) #0 {
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
171 ; CHECK-LABEL: f14
172 ; CHECK: r1:0 -= rol(r3:2,#7)
173 define i64 @f14(i64 %a0, i64 %a1) #0 {
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
182 ; CHECK-LABEL: f15
183 ; CHECK: r1:0 &= rol(r3:2,#7)
184 define i64 @f15(i64 %a0, i64 %a1) #0 {
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
193 ; CHECK-LABEL: f16
194 ; CHECK: r1:0 |= lsr(r3:2,#57)
195 ; CHECK: r1:0 |= asl(r3:2,#7)
196 define i64 @f16(i64 %a0, i64 %a1) #0 {
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
205 ; CHECK-LABEL: f17
206 ; CHECK: r1:0 ^= rol(r3:2,#7)
207 define i64 @f17(i64 %a0, i64 %a1) #0 {
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
216 attributes #0 = { norecurse nounwind readnone "target-cpu"="hexagonv60" "target-features"="-packets" }