1# RUN: llvm-mc -triple=hexagon -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
2# Hexagon Programmer's Reference Manual 11.10.1 XTYPE/ALU
3
4# Absolute value doubleword
5# CHECK: d0 c0 94 80
6r17:16 = abs(r21:20)
7# CHECK: 91 c0 95 8c
8r17 = abs(r21)
9# CHECK: b1 c0 95 8c
10r17 = abs(r21):sat
11
12# Add and accumulate
13# CHECK: ff d1 35 db
14r17 = add(r21, add(r31, #23))
15# CHECK: ff d1 b5 db
16r17 = add(r21, sub(#23, r31))
17# CHECK: f1 c2 15 e2
18r17 += add(r21, #23)
19# CHECK: f1 c2 95 e2
20r17 -= add(r21, #23)
21# CHECK: 31 df 15 ef
22r17 += add(r21, r31)
23# CHECK: 31 df 95 ef
24r17 -= add(r21, r31)
25
26# Add doublewords
27# CHECK: f0 de 14 d3
28r17:16 = add(r21:20, r31:30)
29# CHECK: b0 de 74 d3
30r17:16 = add(r21:20, r31:30):sat
31# CHECK: d0 de 74 d3
32r17:16 = add(r21:20, r31:30):raw:lo
33# CHECK: f0 de 74 d3
34r17:16 = add(r21:20, r31:30):raw:hi
35
36# Add halfword
37# CHECK: 11 d5 1f d5
38r17 = add(r21.l, r31.l)
39# CHECK: 51 d5 1f d5
40r17 = add(r21.l, r31.h)
41# CHECK: 91 d5 1f d5
42r17 = add(r21.l, r31.l):sat
43# CHECK: d1 d5 1f d5
44r17 = add(r21.l, r31.h):sat
45# CHECK: 11 d5 5f d5
46r17 = add(r21.l, r31.l):<<16
47# CHECK: 31 d5 5f d5
48r17 = add(r21.l, r31.h):<<16
49# CHECK: 51 d5 5f d5
50r17 = add(r21.h, r31.l):<<16
51# CHECK: 71 d5 5f d5
52r17 = add(r21.h, r31.h):<<16
53# CHECK: 91 d5 5f d5
54r17 = add(r21.l, r31.l):sat:<<16
55# CHECK: b1 d5 5f d5
56r17 = add(r21.l, r31.h):sat:<<16
57# CHECK: d1 d5 5f d5
58r17 = add(r21.h, r31.l):sat:<<16
59# CHECK: f1 d5 5f d5
60r17 = add(r21.h, r31.h):sat:<<16
61
62# Add or subtract doublewords with carry
63# CHECK: 70 de d4 c2
64r17:16 = add(r21:20, r31:30, p3):carry
65# CHECK: 70 de f4 c2
66r17:16 = sub(r21:20, r31:30, p3):carry
67
68# Logical doublewords
69# CHECK: 90 c0 94 80
70r17:16 = not(r21:20)
71# CHECK: 10 de f4 d3
72r17:16 = and(r21:20, r31:30)
73# CHECK: 30 d4 fe d3
74r17:16 = and(r21:20, ~r31:30)
75# CHECK: 50 de f4 d3
76r17:16 = or(r21:20, r31:30)
77# CHECK: 70 d4 fe d3
78r17:16 = or(r21:20, ~r31:30)
79# CHECK: 90 de f4 d3
80r17:16 = xor(r21:20, r31:30)
81
82# Logical-logical doublewords
83# CHECK: 10 de 94 ca
84r17:16 ^= xor(r21:20, r31:30)
85
86# Logical-logical words
87# CHECK: f1 c3 15 da
88r17 |= and(r21, #31)
89# CHECK: f5 c3 51 da
90r17 = or(r21, and(r17, #31))
91# CHECK: f1 c3 95 da
92r17 |= or(r21, #31)
93# CHECK: 11 df 35 ef
94r17 |= and(r21, ~r31)
95# CHECK: 31 df 35 ef
96r17 &= and(r21, ~r31)
97# CHECK: 51 df 35 ef
98r17 ^= and(r21, ~r31)
99# CHECK: 11 df 55 ef
100r17 &= and(r21, r31)
101# CHECK: 31 df 55 ef
102r17 &= or(r21, r31)
103# CHECK: 51 df 55 ef
104r17 &= xor(r21, r31)
105# CHECK: 71 df 55 ef
106r17 |= and(r21, r31)
107# CHECK: 71 df 95 ef
108r17 ^= xor(r21, r31)
109# CHECK: 11 df d5 ef
110r17 |= or(r21, r31)
111# CHECK: 31 df d5 ef
112r17 |= xor(r21, r31)
113# CHECK: 51 df d5 ef
114r17 ^= and(r21, r31)
115# CHECK: 71 df d5 ef
116r17 ^= or(r21, r31)
117
118# Maximum words
119# CHECK: 11 df d5 d5
120r17 = max(r21, r31)
121# CHECK: 91 df d5 d5
122r17 = maxu(r21, r31)
123
124# Maximum doublewords
125# CHECK: 90 de d4 d3
126r17:16 = max(r21:20, r31:30)
127# CHECK: b0 de d4 d3
128r17:16 = maxu(r21:20, r31:30)
129
130# Minimum words
131# CHECK: 11 d5 bf d5
132r17 = min(r21, r31)
133# CHECK: 91 d5 bf d5
134r17 = minu(r21, r31)
135
136# Minimum doublewords
137# CHECK: d0 d4 be d3
138r17:16 = min(r21:20, r31:30)
139# CHECK: f0 d4 be d3
140r17:16 = minu(r21:20, r31:30)
141
142# Module wrap
143# CHECK: f1 df f5 d3
144r17 = modwrap(r21, r31)
145
146# Negate
147# CHECK: b0 c0 94 80
148r17:16 = neg(r21:20)
149# CHECK: d1 c0 95 8c
150r17 = neg(r21):sat
151
152# Round
153# CHECK: 31 c0 d4 88
154r17 = round(r21:20):sat
155# CHECK: 11 df f5 8c
156r17 = cround(r21, #31)
157# CHECK: 91 df f5 8c
158r17 = round(r21, #31)
159# CHECK: d1 df f5 8c
160r17 = round(r21, #31):sat
161# CHECK: 11 df d5 c6
162r17 = cround(r21, r31)
163# CHECK: 91 df d5 c6
164r17 = round(r21, r31)
165# CHECK: d1 df d5 c6
166r17 = round(r21, r31):sat
167
168# Subtract doublewords
169# CHECK: f0 d4 3e d3
170r17:16 = sub(r21:20, r31:30)
171
172# Subtract and accumulate words
173# CHECK: 71 d5 1f ef
174r17 += sub(r21, r31)
175
176# Subtract halfword
177# CHECK: 11 d5 3f d5
178r17 = sub(r21.l, r31.l)
179# CHECK: 51 d5 3f d5
180r17 = sub(r21.l, r31.h)
181# CHECK: 91 d5 3f d5
182r17 = sub(r21.l, r31.l):sat
183# CHECK: d1 d5 3f d5
184r17 = sub(r21.l, r31.h):sat
185# CHECK: 11 d5 7f d5
186r17 = sub(r21.l, r31.l):<<16
187# CHECK: 31 d5 7f d5
188r17 = sub(r21.l, r31.h):<<16
189# CHECK: 51 d5 7f d5
190r17 = sub(r21.h, r31.l):<<16
191# CHECK: 71 d5 7f d5
192r17 = sub(r21.h, r31.h):<<16
193# CHECK: 91 d5 7f d5
194r17 = sub(r21.l, r31.l):sat:<<16
195# CHECK: b1 d5 7f d5
196r17 = sub(r21.l, r31.h):sat:<<16
197# CHECK: d1 d5 7f d5
198r17 = sub(r21.h, r31.l):sat:<<16
199# CHECK: f1 d5 7f d5
200r17 = sub(r21.h, r31.h):sat:<<16
201
202# Sign extend word to doubleword
203# CHECK: 10 c0 55 84
204r17:16 = sxtw(r21)
205
206# Vector absolute value halfwords
207# CHECK: 90 c0 54 80
208r17:16 = vabsh(r21:20)
209# CHECK: b0 c0 54 80
210r17:16 = vabsh(r21:20):sat
211
212# Vector absolute value words
213# CHECK: d0 c0 54 80
214r17:16 = vabsw(r21:20)
215# CHECK: f0 c0 54 80
216r17:16 = vabsw(r21:20):sat
217
218# Vector absolute difference halfwords
219# CHECK: 10 d4 7e e8
220r17:16 = vabsdiffh(r21:20, r31:30)
221
222# Vector absolute difference words
223# CHECK: 10 d4 3e e8
224r17:16 = vabsdiffw(r21:20, r31:30)
225
226# Vector add halfwords
227# CHECK: 50 de 14 d3
228r17:16 = vaddh(r21:20, r31:30)
229# CHECK: 70 de 14 d3
230r17:16 = vaddh(r21:20, r31:30):sat
231# CHECK: 90 de 14 d3
232r17:16 = vadduh(r21:20, r31:30):sat
233
234# Vector add halfwords with saturate and pack to unsigned bytes
235# CHECK: 31 de 54 c1
236r17 = vaddhub(r21:20, r31:30):sat
237
238# Vector reduce add unsigned bytes
239# CHECK: 30 de 54 e8
240r17:16 = vraddub(r21:20, r31:30)
241# CHECK: 30 de 54 ea
242r17:16 += vraddub(r21:20, r31:30)
243
244# Vector reduce add halfwords
245# CHECK: 31 de 14 e9
246r17 = vradduh(r21:20, r31:30)
247# CHECK: f1 de 34 e9
248r17 = vraddh(r21:20, r31:30)
249
250# Vector add bytes
251# CHECK: 10 de 14 d3
252r17:16 = vaddub(r21:20, r31:30)
253# CHECK: 30 de 14 d3
254r17:16 = vaddub(r21:20, r31:30):sat
255
256# Vector add words
257# CHECK: b0 de 14 d3
258r17:16 = vaddw(r21:20, r31:30)
259# CHECK: d0 de 14 d3
260r17:16 = vaddw(r21:20, r31:30):sat
261
262# Vector average halfwords
263# CHECK: 50 de 54 d3
264r17:16 = vavgh(r21:20, r31:30)
265# CHECK: 70 de 54 d3
266r17:16 = vavgh(r21:20, r31:30):rnd
267# CHECK: 90 de 54 d3
268r17:16 = vavgh(r21:20, r31:30):crnd
269# CHECK: b0 de 54 d3
270r17:16 = vavguh(r21:20, r31:30)
271# CHECK: d0 de 54 d3
272r17:16 = vavguh(r21:20, r31:30):rnd
273# CHECK: 10 d4 9e d3
274r17:16 = vnavgh(r21:20, r31:30)
275# CHECK: 30 d4 9e d3
276r17:16 = vnavgh(r21:20, r31:30):rnd:sat
277# CHECK: 50 d4 9e d3
278r17:16 = vnavgh(r21:20, r31:30):crnd:sat
279
280# Vector average unsigned bytes
281# CHECK: 10 de 54 d3
282r17:16 = vavgub(r21:20, r31:30)
283# CHECK: 30 de 54 d3
284r17:16 = vavgub(r21:20, r31:30):rnd
285
286# Vector average words
287# CHECK: 10 de 74 d3
288r17:16 = vavgw(r21:20, r31:30)
289# CHECK: 30 de 74 d3
290r17:16 = vavgw(r21:20, r31:30):rnd
291# CHECK: 50 de 74 d3
292r17:16 = vavgw(r21:20, r31:30):crnd
293# CHECK: 70 de 74 d3
294r17:16 = vavguw(r21:20, r31:30)
295# CHECK: 90 de 74 d3
296r17:16 = vavguw(r21:20, r31:30):rnd
297# CHECK: 70 d4 9e d3
298r17:16 = vnavgw(r21:20, r31:30)
299# CHECK: 90 d4 9e d3
300r17:16 = vnavgw(r21:20, r31:30):rnd:sat
301# CHECK: d0 d4 9e d3
302r17:16 = vnavgw(r21:20, r31:30):crnd:sat
303
304# Vector conditional negate
305# CHECK: 50 df d4 c3
306r17:16 = vcnegh(r21:20, r31)
307
308# CHECK: f0 ff 34 cb
309r17:16 += vrcnegh(r21:20, r31)
310
311# Vector maximum bytes
312# CHECK: 10 d4 de d3
313r17:16 = vmaxub(r21:20, r31:30)
314# CHECK: d0 d4 de d3
315r17:16 = vmaxb(r21:20, r31:30)
316
317# Vector maximum halfwords
318# CHECK: 30 d4 de d3
319r17:16 = vmaxh(r21:20, r31:30)
320# CHECK: 50 d4 de d3
321r17:16 = vmaxuh(r21:20, r31:30)
322
323# Vector reduce maximum halfwords
324# CHECK: 3f d0 34 cb
325r17:16 = vrmaxh(r21:20, r31)
326# CHECK: 3f f0 34 cb
327r17:16 = vrmaxuh(r21:20, r31)
328
329# Vector reduce maximum words
330# CHECK: 5f d0 34 cb
331r17:16 = vrmaxw(r21:20, r31)
332# CHECK: 5f f0 34 cb
333r17:16 = vrmaxuw(r21:20, r31)
334
335# Vector maximum words
336# CHECK: b0 d4 be d3
337r17:16 = vmaxuw(r21:20, r31:30)
338# CHECK: 70 d4 de d3
339r17:16 = vmaxw(r21:20, r31:30)
340
341# Vector minimum bytes
342# CHECK: 10 d4 be d3
343r17:16 = vminub(r21:20, r31:30)
344# CHECK: f0 d4 de d3
345r17:16 = vminb(r21:20, r31:30)
346
347# Vector minimum halfwords
348# CHECK: 30 d4 be d3
349r17:16 = vminh(r21:20, r31:30)
350# CHECK: 50 d4 be d3
351r17:16 = vminuh(r21:20, r31:30)
352
353# Vector reduce minimum halfwords
354# CHECK: bf d0 34 cb
355r17:16 = vrminh(r21:20, r31)
356# CHECK: bf f0 34 cb
357r17:16 = vrminuh(r21:20, r31)
358
359# Vector reduce minimum words
360# CHECK: df d0 34 cb
361r17:16 = vrminw(r21:20, r31)
362# CHECK: df f0 34 cb
363r17:16 = vrminuw(r21:20, r31)
364
365# Vector minimum words
366# CHECK: 70 d4 be d3
367r17:16 = vminw(r21:20, r31:30)
368# CHECK: 90 d4 be d3
369r17:16 = vminuw(r21:20, r31:30)
370
371# Vector sum of absolute differences unsigned bytes
372# CHECK: 50 de 54 e8
373r17:16 = vrsadub(r21:20, r31:30)
374# CHECK: 50 de 54 ea
375r17:16 += vrsadub(r21:20, r31:30)
376
377# Vector subtract halfwords
378# CHECK: 50 d4 3e d3
379r17:16 = vsubh(r21:20, r31:30)
380# CHECK: 70 d4 3e d3
381r17:16 = vsubh(r21:20, r31:30):sat
382# CHECK: 90 d4 3e d3
383r17:16 = vsubuh(r21:20, r31:30):sat
384
385# Vector subtract bytes
386# CHECK: 10 d4 3e d3
387r17:16 = vsubub(r21:20, r31:30)
388# CHECK: 30 d4 3e d3
389r17:16 = vsubub(r21:20, r31:30):sat
390
391# Vector subtract words
392# CHECK: b0 d4 3e d3
393r17:16 = vsubw(r21:20, r31:30)
394# CHECK: d0 d4 3e d3
395r17:16 = vsubw(r21:20, r31:30):sat
396