[PowerPC] Do not emit record-form rotates when record-form andi/andis suffices
[llvm-core.git] / test / CodeGen / Hexagon / rotate.ll
blobbcc978fdce60cfe074639327dffa5de26f8ff953
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 ; No variable-shift rotates. Check for the default expansion code.
17 ; This is a rotate left by %a1(r1).
18 ; CHECK: r[[R10:[0-9]+]] = sub(#32,r1)
19 ; CHECK: r[[R11:[0-9]+]] = and(r1,#31)
20 ; CHECK: r[[R12:[0-9]+]] = and(r[[R10]],#31)
21 ; CHECK: r[[R13:[0-9]+]] = asl(r0,r[[R11]])
22 ; CHECK: r[[R13]] |= lsr(r0,r[[R12]])
23 define i32 @f1(i32 %a0, i32 %a1) #0 {
24 b0:
25   %v0 = shl i32 %a0, %a1
26   %v1 = sub i32 32, %a1
27   %v2 = lshr i32 %a0, %v1
28   %v3 = or i32 %v2, %v0
29   ret i32 %v3
32 ; CHECK-LABEL: f2
33 ; CHECK: r0 = rol(r0,#25)
34 define i32 @f2(i32 %a0) #0 {
35 b0:
36   %v0 = lshr i32 %a0, 7
37   %v1 = shl i32 %a0, 25
38   %v2 = or i32 %v0, %v1
39   ret i32 %v2
42 ; CHECK-LABEL: f3
43 ; No variable-shift rotates. Check for the default expansion code.
44 ; This is a rotate right by %a1(r1) that became a rotate left by 32-%a1.
45 ; CHECK: r[[R30:[0-9]+]] = sub(#32,r1)
46 ; CHECK: r[[R31:[0-9]+]] = and(r1,#31)
47 ; CHECK: r[[R32:[0-9]+]] = and(r[[R30]],#31)
48 ; CHECK: r[[R33:[0-9]+]] = asl(r0,r[[R32]])
49 ; CHECK: r[[R33]] |= lsr(r0,r[[R31]])
50 define i32 @f3(i32 %a0, i32 %a1) #0 {
51 b0:
52   %v0 = lshr i32 %a0, %a1
53   %v1 = sub i32 32, %a1
54   %v2 = shl i32 %a0, %v1
55   %v3 = or i32 %v2, %v0
56   ret i32 %v3
59 ; CHECK-LABEL: f4
60 ; CHECK: r1:0 = rol(r1:0,#7)
61 define i64 @f4(i64 %a0) #0 {
62 b0:
63   %v0 = shl i64 %a0, 7
64   %v1 = lshr i64 %a0, 57
65   %v2 = or i64 %v0, %v1
66   ret i64 %v2
69 ; CHECK-LABEL: f5
70 ; No variable-shift rotates. Check for the default expansion code.
71 ; This is a rotate left by %a1(r2).
72 ; CHECK: r[[R50:[0-9]+]] = sub(#64,r2)
73 ; CHECK: r[[R51:[0-9]+]] = and(r2,#63)
74 ; CHECK: r[[R52:[0-9]+]] = and(r[[R50]],#63)
75 ; CHECK: r[[R53:[0-9]+]]:[[R54:[0-9]+]] = asl(r1:0,r[[R51]])
76 ; CHECK: r[[R53]]:[[R54]] |= lsr(r1:0,r[[R52]])
77 define i64 @f5(i64 %a0, i32 %a1) #0 {
78 b0:
79   %v0 = zext i32 %a1 to i64
80   %v1 = shl i64 %a0, %v0
81   %v2 = sub i32 64, %a1
82   %v3 = zext i32 %v2 to i64
83   %v4 = lshr i64 %a0, %v3
84   %v5 = or i64 %v4, %v1
85   ret i64 %v5
88 ; CHECK-LABEL: f6
89 ; CHECK: r1:0 = rol(r1:0,#57)
90 define i64 @f6(i64 %a0) #0 {
91 b0:
92   %v0 = lshr i64 %a0, 7
93   %v1 = shl i64 %a0, 57
94   %v2 = or i64 %v0, %v1
95   ret i64 %v2
98 ; CHECK-LABEL: f7
99 ; No variable-shift rotates. Check for the default expansion code.
100 ; This is a rotate right by %a1(r2) that became a rotate left by 64-%a1.
101 ; CHECK: r[[R70:[0-9]+]] = sub(#64,r2)
102 ; CHECK: r[[R71:[0-9]+]] = and(r2,#63)
103 ; CHECK: r[[R72:[0-9]+]] = and(r[[R70]],#63)
104 ; CHECK: r[[R73:[0-9]+]]:[[R75:[0-9]+]] = asl(r1:0,r[[R72]])
105 ; CHECK: r[[R73]]:[[R75]] |= lsr(r1:0,r[[R71]])
106 define i64 @f7(i64 %a0, i32 %a1) #0 {
108   %v0 = zext i32 %a1 to i64
109   %v1 = lshr i64 %a0, %v0
110   %v2 = sub i32 64, %a1
111   %v3 = zext i32 %v2 to i64
112   %v4 = shl i64 %a0, %v3
113   %v5 = or i64 %v4, %v1
114   ret i64 %v5
117 ; CHECK-LABEL: f8
118 ; CHECK: r0 += rol(r1,#7)
119 define i32 @f8(i32 %a0, i32 %a1) #0 {
121   %v0 = shl i32 %a1, 7
122   %v1 = lshr i32 %a1, 25
123   %v2 = or i32 %v0, %v1
124   %v3 = add i32 %v2, %a0
125   ret i32 %v3
128 ; CHECK-LABEL: f9
129 ; CHECK: r0 -= rol(r1,#7)
130 define i32 @f9(i32 %a0, i32 %a1) #0 {
132   %v0 = shl i32 %a1, 7
133   %v1 = lshr i32 %a1, 25
134   %v2 = or i32 %v0, %v1
135   %v3 = sub i32 %a0, %v2
136   ret i32 %v3
139 ; CHECK-LABEL: f10
140 ; CHECK: r0 &= rol(r1,#7)
141 define i32 @f10(i32 %a0, i32 %a1) #0 {
143   %v0 = shl i32 %a1, 7
144   %v1 = lshr i32 %a1, 25
145   %v2 = or i32 %v0, %v1
146   %v3 = and i32 %v2, %a0
147   ret i32 %v3
150 ; CHECK-LABEL: f12
151 ; CHECK: r0 ^= rol(r1,#7)
152 define i32 @f12(i32 %a0, i32 %a1) #0 {
154   %v0 = shl i32 %a1, 7
155   %v1 = lshr i32 %a1, 25
156   %v2 = or i32 %v0, %v1
157   %v3 = xor i32 %v2, %a0
158   ret i32 %v3
161 ; CHECK-LABEL: f13
162 ; CHECK: r1:0 += rol(r3:2,#7)
163 define i64 @f13(i64 %a0, i64 %a1) #0 {
165   %v0 = shl i64 %a1, 7
166   %v1 = lshr i64 %a1, 57
167   %v2 = or i64 %v0, %v1
168   %v3 = add i64 %v2, %a0
169   ret i64 %v3
172 ; CHECK-LABEL: f14
173 ; CHECK: r1:0 -= rol(r3:2,#7)
174 define i64 @f14(i64 %a0, i64 %a1) #0 {
176   %v0 = shl i64 %a1, 7
177   %v1 = lshr i64 %a1, 57
178   %v2 = or i64 %v0, %v1
179   %v3 = sub i64 %a0, %v2
180   ret i64 %v3
183 ; CHECK-LABEL: f15
184 ; CHECK: r1:0 &= rol(r3:2,#7)
185 define i64 @f15(i64 %a0, i64 %a1) #0 {
187   %v0 = shl i64 %a1, 7
188   %v1 = lshr i64 %a1, 57
189   %v2 = or i64 %v0, %v1
190   %v3 = and i64 %v2, %a0
191   ret i64 %v3
194 ; CHECK-LABEL: f17
195 ; CHECK: r1:0 ^= rol(r3:2,#7)
196 define i64 @f17(i64 %a0, i64 %a1) #0 {
198   %v0 = shl i64 %a1, 7
199   %v1 = lshr i64 %a1, 57
200   %v2 = or i64 %v0, %v1
201   %v3 = xor i64 %v2, %a0
202   ret i64 %v3
205 attributes #0 = { norecurse nounwind readnone "target-cpu"="hexagonv60" "target-features"="-packets" }