1# RUN: llvm-mc -triple=hexagon -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
2# Hexagon Programmer's Reference Manual 11.10.8 XTYPE/SHIFT
3
4# Shift by immediate
5# CHECK: 10 df 14 80
6r17:16 = asr(r21:20, #31)
7# CHECK: 30 df 14 80
8r17:16 = lsr(r21:20, #31)
9# CHECK: 50 df 14 80
10r17:16 = asl(r21:20, #31)
11# CHECK: 11 df 15 8c
12r17 = asr(r21, #31)
13# CHECK: 31 df 15 8c
14r17 = lsr(r21, #31)
15# CHECK: 51 df 15 8c
16r17 = asl(r21, #31)
17
18# Shift by immediate and accumulate
19# CHECK: 10 df 14 82
20r17:16 -= asr(r21:20, #31)
21# CHECK: 30 df 14 82
22r17:16 -= lsr(r21:20, #31)
23# CHECK: 50 df 14 82
24r17:16 -= asl(r21:20, #31)
25# CHECK: 90 df 14 82
26r17:16 += asr(r21:20, #31)
27# CHECK: b0 df 14 82
28r17:16 += lsr(r21:20, #31)
29# CHECK: d0 df 14 82
30r17:16 += asl(r21:20, #31)
31# CHECK: 11 df 15 8e
32r17 -= asr(r21, #31)
33# CHECK: 31 df 15 8e
34r17 -= lsr(r21, #31)
35# CHECK: 51 df 15 8e
36r17 -= asl(r21, #31)
37# CHECK: 91 df 15 8e
38r17 += asr(r21, #31)
39# CHECK: b1 df 15 8e
40r17 += lsr(r21, #31)
41# CHECK: d1 df 15 8e
42r17 += asl(r21, #31)
43# CHECK: 4c f7 11 de
44r17 = add(#21, asl(r17, #23))
45# CHECK: 4e f7 11 de
46r17 = sub(#21, asl(r17, #23))
47# CHECK: 5c f7 11 de
48r17 = add(#21, lsr(r17, #23))
49# CHECK: 5e f7 11 de
50r17 = sub(#21, lsr(r17, #23))
51
52# Shift by immediate and add
53# CHECK: f1 d5 1f c4
54r17 = addasl(r21, r31, #7)
55
56# Shift by immediate and logical
57# CHECK: 10 df 54 82
58r17:16 &= asr(r21:20, #31)
59# CHECK: 30 df 54 82
60r17:16 &= lsr(r21:20, #31)
61# CHECK: 50 df 54 82
62r17:16 &= asl(r21:20, #31)
63# CHECK: 90 df 54 82
64r17:16 |= asr(r21:20, #31)
65# CHECK: b0 df 54 82
66r17:16 |= lsr(r21:20, #31)
67# CHECK: d0 df 54 82
68r17:16 |= asl(r21:20, #31)
69# CHECK: 30 df 94 82
70r17:16 ^= lsr(r21:20, #31)
71# CHECK: 50 df 94 82
72r17:16 ^= asl(r21:20, #31)
73# CHECK: 11 df 55 8e
74r17 &= asr(r21, #31)
75# CHECK: 31 df 55 8e
76r17 &= lsr(r21, #31)
77# CHECK: 51 df 55 8e
78r17 &= asl(r21, #31)
79# CHECK: 91 df 55 8e
80r17 |= asr(r21, #31)
81# CHECK: b1 df 55 8e
82r17 |= lsr(r21, #31)
83# CHECK: d1 df 55 8e
84r17 |= asl(r21, #31)
85# CHECK: 31 df 95 8e
86r17 ^= lsr(r21, #31)
87# CHECK: 51 df 95 8e
88r17 ^= asl(r21, #31)
89# CHECK: 48 ff 11 de
90r17 = and(#21, asl(r17, #31))
91# CHECK: 4a ff 11 de
92r17 = or(#21, asl(r17, #31))
93# CHECK: 58 ff 11 de
94r17 = and(#21, lsr(r17, #31))
95# CHECK: 5a ff 11 de
96r17 = or(#21, lsr(r17, #31))
97
98# Shift right by immediate with rounding
99# CHECK: f0 df d4 80
100r17:16 = asr(r21:20, #31):rnd
101# CHECK: 11 df 55 8c
102r17 = asr(r21, #31):rnd
103
104# Shift left by immediate with saturation
105# CHECK: 51 df 55 8c
106r17 = asl(r21, #31):sat
107
108# Shift by register
109# CHECK: 10 df 94 c3
110r17:16 = asr(r21:20, r31)
111# CHECK: 50 df 94 c3
112r17:16 = lsr(r21:20, r31)
113# CHECK: 90 df 94 c3
114r17:16 = asl(r21:20, r31)
115# CHECK: d0 df 94 c3
116r17:16 = lsl(r21:20, r31)
117# CHECK: 11 df 55 c6
118r17 = asr(r21, r31)
119# CHECK: 51 df 55 c6
120r17 = lsr(r21, r31)
121# CHECK: 91 df 55 c6
122r17 = asl(r21, r31)
123# CHECK: d1 df 55 c6
124r17 = lsl(r21, r31)
125# CHECK: f1 df 8a c6
126r17 = lsl(#21, r31)
127
128# Shift by register and accumulate
129# CHECK: 10 df 94 cb
130r17:16 -= asr(r21:20, r31)
131# CHECK: 50 df 94 cb
132r17:16 -= lsr(r21:20, r31)
133# CHECK: 90 df 94 cb
134r17:16 -= asl(r21:20, r31)
135# CHECK: d0 df 94 cb
136r17:16 -= lsl(r21:20, r31)
137# CHECK: 10 df d4 cb
138r17:16 += asr(r21:20, r31)
139# CHECK: 50 df d4 cb
140r17:16 += lsr(r21:20, r31)
141# CHECK: 90 df d4 cb
142r17:16 += asl(r21:20, r31)
143# CHECK: d0 df d4 cb
144r17:16 += lsl(r21:20, r31)
145# CHECK: 11 df 95 cc
146r17 -= asr(r21, r31)
147# CHECK: 51 df 95 cc
148r17 -= lsr(r21, r31)
149# CHECK: 91 df 95 cc
150r17 -= asl(r21, r31)
151# CHECK: d1 df 95 cc
152r17 -= lsl(r21, r31)
153# CHECK: 11 df d5 cc
154r17 += asr(r21, r31)
155# CHECK: 51 df d5 cc
156r17 += lsr(r21, r31)
157# CHECK: 91 df d5 cc
158r17 += asl(r21, r31)
159# CHECK: d1 df d5 cc
160r17 += lsl(r21, r31)
161
162# Shift by register and logical
163# CHECK: 10 df 14 cb
164r17:16 |= asr(r21:20, r31)
165# CHECK: 50 df 14 cb
166r17:16 |= lsr(r21:20, r31)
167# CHECK: 90 df 14 cb
168r17:16 |= asl(r21:20, r31)
169# CHECK: d0 df 14 cb
170r17:16 |= lsl(r21:20, r31)
171# CHECK: 10 df 54 cb
172r17:16 &= asr(r21:20, r31)
173# CHECK: 50 df 54 cb
174r17:16 &= lsr(r21:20, r31)
175# CHECK: 90 df 54 cb
176r17:16 &= asl(r21:20, r31)
177# CHECK: d0 df 54 cb
178r17:16 &= lsl(r21:20, r31)
179# CHECK: 10 df 74 cb
180r17:16 ^= asr(r21:20, r31)
181# CHECK: 50 df 74 cb
182r17:16 ^= lsr(r21:20, r31)
183# CHECK: 90 df 74 cb
184r17:16 ^= asl(r21:20, r31)
185# CHECK: d0 df 74 cb
186r17:16 ^= lsl(r21:20, r31)
187# CHECK: 11 df 15 cc
188r17 |= asr(r21, r31)
189# CHECK: 51 df 15 cc
190r17 |= lsr(r21, r31)
191# CHECK: 91 df 15 cc
192r17 |= asl(r21, r31)
193# CHECK: d1 df 15 cc
194r17 |= lsl(r21, r31)
195# CHECK: 11 df 55 cc
196r17 &= asr(r21, r31)
197# CHECK: 51 df 55 cc
198r17 &= lsr(r21, r31)
199# CHECK: 91 df 55 cc
200r17 &= asl(r21, r31)
201# CHECK: d1 df 55 cc
202r17 &= lsl(r21, r31)
203
204# Shift by register with saturation
205# CHECK: 11 df 15 c6
206r17 = asr(r21, r31):sat
207# CHECK: 91 df 15 c6
208r17 = asl(r21, r31):sat
209
210# Vector shift halfwords by immediate
211# CHECK: 10 c5 94 80
212r17:16 = vasrh(r21:20, #5)
213# CHECK: 30 c5 94 80
214r17:16 = vlsrh(r21:20, #5)
215# CHECK: 50 c5 94 80
216r17:16 = vaslh(r21:20, #5)
217
218# Vector arithmetic shift halfwords with round
219# CHECK: 10 c5 34 80
220r17:16 = vasrh(r21:20, #5):raw
221
222# Vector arithmetic shift halfwords with saturate and pack
223# CHECK: 91 c5 74 88
224r17 = vasrhub(r21:20, #5):raw
225# CHECK: b1 c5 74 88
226r17 = vasrhub(r21:20, #5):sat
227
228# Vector shift halfwords by register
229# CHECK: 10 df 54 c3
230r17:16 = vasrh(r21:20, r31)
231# CHECK: 50 df 54 c3
232r17:16 = vlsrh(r21:20, r31)
233# CHECK: 90 df 54 c3
234r17:16 = vaslh(r21:20, r31)
235# CHECK: d0 df 54 c3
236r17:16 = vlslh(r21:20, r31)
237
238# Vector shift words by immediate
239# CHECK: 10 df 54 80
240r17:16 = vasrw(r21:20, #31)
241# CHECK: 30 df 54 80
242r17:16 = vlsrw(r21:20, #31)
243# CHECK: 50 df 54 80
244r17:16 = vaslw(r21:20, #31)
245
246# Vector shift words by register
247# CHECK: 10 df 14 c3
248r17:16 = vasrw(r21:20, r31)
249# CHECK: 50 df 14 c3
250r17:16 = vlsrw(r21:20, r31)
251# CHECK: 90 df 14 c3
252r17:16 = vaslw(r21:20, r31)
253# CHECK: d0 df 14 c3
254r17:16 = vlslw(r21:20, r31)
255
256# Vector shift words with truncate and pack
257# CHECK: 51 df d4 88
258r17 = vasrw(r21:20, #31)
259# CHECK: 51 df 14 c5
260r17 = vasrw(r21:20, r31)
261