blob: bcc978fdce60cfe074639327dffa5de26f8ff953 [file] [log] [blame]
Krzysztof Parzyszek3d671242018-06-12 12:49:36 +00001; RUN: llc -march=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; 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]])
23define i32 @f1(i32 %a0, i32 %a1) #0 {
24b0:
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
30}
31
32; CHECK-LABEL: f2
33; CHECK: r0 = rol(r0,#25)
34define i32 @f2(i32 %a0) #0 {
35b0:
36 %v0 = lshr i32 %a0, 7
37 %v1 = shl i32 %a0, 25
38 %v2 = or i32 %v0, %v1
39 ret i32 %v2
40}
41
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]])
50define i32 @f3(i32 %a0, i32 %a1) #0 {
51b0:
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
57}
58
59; CHECK-LABEL: f4
60; CHECK: r1:0 = rol(r1:0,#7)
61define i64 @f4(i64 %a0) #0 {
62b0:
63 %v0 = shl i64 %a0, 7
64 %v1 = lshr i64 %a0, 57
65 %v2 = or i64 %v0, %v1
66 ret i64 %v2
67}
68
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]])
77define i64 @f5(i64 %a0, i32 %a1) #0 {
78b0:
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
86}
87
88; CHECK-LABEL: f6
89; CHECK: r1:0 = rol(r1:0,#57)
90define i64 @f6(i64 %a0) #0 {
91b0:
92 %v0 = lshr i64 %a0, 7
93 %v1 = shl i64 %a0, 57
94 %v2 = or i64 %v0, %v1
95 ret i64 %v2
96}
97
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]])
106define i64 @f7(i64 %a0, i32 %a1) #0 {
107b0:
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
115}
116
117; CHECK-LABEL: f8
118; CHECK: r0 += rol(r1,#7)
119define i32 @f8(i32 %a0, i32 %a1) #0 {
120b0:
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
126}
127
128; CHECK-LABEL: f9
129; CHECK: r0 -= rol(r1,#7)
130define i32 @f9(i32 %a0, i32 %a1) #0 {
131b0:
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
137}
138
139; CHECK-LABEL: f10
140; CHECK: r0 &= rol(r1,#7)
141define i32 @f10(i32 %a0, i32 %a1) #0 {
142b0:
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
148}
149
150; CHECK-LABEL: f12
151; CHECK: r0 ^= rol(r1,#7)
152define i32 @f12(i32 %a0, i32 %a1) #0 {
153b0:
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
159}
160
161; CHECK-LABEL: f13
162; CHECK: r1:0 += rol(r3:2,#7)
163define i64 @f13(i64 %a0, i64 %a1) #0 {
164b0:
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
170}
171
172; CHECK-LABEL: f14
173; CHECK: r1:0 -= rol(r3:2,#7)
174define i64 @f14(i64 %a0, i64 %a1) #0 {
175b0:
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
181}
182
183; CHECK-LABEL: f15
184; CHECK: r1:0 &= rol(r3:2,#7)
185define i64 @f15(i64 %a0, i64 %a1) #0 {
186b0:
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
192}
193
194; CHECK-LABEL: f17
195; CHECK: r1:0 ^= rol(r3:2,#7)
196define i64 @f17(i64 %a0, i64 %a1) #0 {
197b0:
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
203}
204
205attributes #0 = { norecurse nounwind readnone "target-cpu"="hexagonv60" "target-features"="-packets" }