blob: 101d68b81bbc8deac61edaf93ded84047447bd3a [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
Krzysztof Parzyszek30c42e22018-12-20 16:39:20 +000016; 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]]
Krzysztof Parzyszek3d671242018-06-12 12:49:36 +000020define 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
Krzysztof Parzyszek30c42e22018-12-20 16:39:20 +000040; 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)
Krzysztof Parzyszek3d671242018-06-12 12:49:36 +000043define 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
Krzysztof Parzyszek3d671242018-06-12 12:49:36 +000063; This is a rotate left by %a1(r2).
Krzysztof Parzyszek30c42e22018-12-20 16:39:20 +000064; 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]])
Krzysztof Parzyszek3d671242018-06-12 12:49:36 +000067define 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
Krzysztof Parzyszek30c42e22018-12-20 16:39:20 +000089; 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]])
Krzysztof Parzyszek3d671242018-06-12 12:49:36 +000093define 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
Krzysztof Parzyszek47195022019-03-21 17:14:22 +0000137; 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
Krzysztof Parzyszek3d671242018-06-12 12:49:36 +0000149; 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
Krzysztof Parzyszek47195022019-03-21 17:14:22 +0000193; 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
Krzysztof Parzyszek3d671242018-06-12 12:49:36 +0000205; 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" }