1 # RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s
2 # Hexagon Programmer's Reference Manual 11.10.1 XTYPE/ALU
4 # Absolute value doubleword
6 # CHECK: r17:16 = abs(r21:20)
8 # CHECK: r17 = abs(r21)
10 # CHECK: r17 = abs(r21):sat
14 # CHECK: r17 = add(r21, add(r31, #23))
16 # CHECK: r17 = add(r21, sub(#23, r31))
18 # CHECK: r17 += add(r21, #23)
20 # CHECK: r17 -= add(r21, #23)
22 # CHECK: r17 += add(r21, r31)
24 # CHECK: r17 -= add(r21, r31)
28 # CHECK: r17:16 = add(r21:20, r31:30)
30 # CHECK: r17:16 = add(r21:20, r31:30):sat
32 # CHECK: r17:16 = add(r21:20, r31:30):raw:lo
34 # CHECK: r17:16 = add(r21:20, r31:30):raw:hi
38 # CHECK: r17 = add(r21.l, r31.l)
40 # CHECK: r17 = add(r21.l, r31.h)
42 # CHECK: r17 = add(r21.l, r31.l):sat
44 # CHECK: r17 = add(r21.l, r31.h):sat
46 # CHECK: r17 = add(r21.l, r31.l):<<16
48 # CHECK: r17 = add(r21.l, r31.h):<<16
50 # CHECK: r17 = add(r21.h, r31.l):<<16
52 # CHECK: r17 = add(r21.h, r31.h):<<16
54 # CHECK: r17 = add(r21.l, r31.l):sat:<<16
56 # CHECK: r17 = add(r21.l, r31.h):sat:<<16
58 # CHECK: r17 = add(r21.h, r31.l):sat:<<16
60 # CHECK: r17 = add(r21.h, r31.h):sat:<<16
62 # Add or subtract doublewords with carry
64 # CHECK: r17:16 = add(r21:20, r31:30, p3):carry
66 # CHECK: r17:16 = sub(r21:20, r31:30, p3):carry
70 # CHECK: r17:16 = not(r21:20)
72 # CHECK: r17:16 = and(r21:20, r31:30)
74 # CHECK: r17:16 = and(r21:20, ~r31:30)
76 # CHECK: r17:16 = or(r21:20, r31:30)
78 # CHECK: r17:16 = or(r21:20, ~r31:30)
80 # CHECK: r17:16 = xor(r21:20, r31:30)
82 # Logical-logical doublewords
84 # CHECK: r17:16 ^= xor(r21:20, r31:30)
86 # Logical-logical words
88 # CHECK: r17 |= and(r21, #31)
90 # CHECK: r17 = or(r21, and(r17, #31))
92 # CHECK: r17 |= or(r21, #31)
94 # CHECK: r17 |= and(r21, ~r31)
96 # CHECK: r17 &= and(r21, ~r31)
98 # CHECK: r17 ^= and(r21, ~r31)
100 # CHECK: r17 &= and(r21, r31)
102 # CHECK: r17 &= or(r21, r31)
104 # CHECK: r17 &= xor(r21, r31)
106 # CHECK: r17 |= and(r21, r31)
108 # CHECK: r17 ^= xor(r21, r31)
110 # CHECK: r17 |= or(r21, r31)
112 # CHECK: r17 |= xor(r21, r31)
114 # CHECK: r17 ^= and(r21, r31)
116 # CHECK: r17 ^= or(r21, r31)
120 # CHECK: r17 = max(r21, r31)
122 # CHECK: r17 = maxu(r21, r31)
124 # Maximum doublewords
126 # CHECK: r17:16 = max(r21:20, r31:30)
128 # CHECK: r17:16 = maxu(r21:20, r31:30)
132 # CHECK: r17 = min(r21, r31)
134 # CHECK: r17 = minu(r21, r31)
136 # Minimum doublewords
138 # CHECK: r17:16 = min(r21:20, r31:30)
140 # CHECK: r17:16 = minu(r21:20, r31:30)
144 # CHECK: r17 = modwrap(r21, r31)
148 # CHECK: r17:16 = neg(r21:20)
150 # CHECK: r17 = neg(r21):sat
154 # CHECK: r17 = round(r21:20):sat
156 # CHECK: r17 = cround(r21, #31)
158 # CHECK: r17 = round(r21, #31)
160 # CHECK: r17 = round(r21, #31):sat
162 # CHECK: r17 = cround(r21, r31)
164 # CHECK: r17 = round(r21, r31)
166 # CHECK: r17 = round(r21, r31):sat
168 # Subtract doublewords
170 # CHECK: r17:16 = sub(r21:20, r31:30)
172 # Subtract and accumulate words
174 # CHECK: r17 += sub(r21, r31)
178 # CHECK: r17 = sub(r21.l, r31.l)
180 # CHECK: r17 = sub(r21.l, r31.h)
182 # CHECK: r17 = sub(r21.l, r31.l):sat
184 # CHECK: r17 = sub(r21.l, r31.h):sat
186 # CHECK: r17 = sub(r21.l, r31.l):<<16
188 # CHECK: r17 = sub(r21.l, r31.h):<<16
190 # CHECK: r17 = sub(r21.h, r31.l):<<16
192 # CHECK: r17 = sub(r21.h, r31.h):<<16
194 # CHECK: r17 = sub(r21.l, r31.l):sat:<<16
196 # CHECK: r17 = sub(r21.l, r31.h):sat:<<16
198 # CHECK: r17 = sub(r21.h, r31.l):sat:<<16
200 # CHECK: r17 = sub(r21.h, r31.h):sat:<<16
202 # Sign extend word to doubleword
204 # CHECK: r17:16 = sxtw(r21)
206 # Vector absolute value halfwords
208 # CHECK: r17:16 = vabsh(r21:20)
210 # CHECK: r17:16 = vabsh(r21:20):sat
212 # Vector absolute value words
214 # CHECK: r17:16 = vabsw(r21:20)
216 # CHECK: r17:16 = vabsw(r21:20):sat
218 # Vector absolute difference halfwords
220 # CHECK: r17:16 = vabsdiffh(r21:20, r31:30)
222 # Vector add halfwords
224 # CHECK: r17:16 = vaddh(r21:20, r31:30)
226 # CHECK: r17:16 = vaddh(r21:20, r31:30):sat
228 # CHECK: r17:16 = vadduh(r21:20, r31:30):sat
230 # Vector add halfwords with saturate and pack to unsigned bytes
232 # CHECK: r17 = vaddhub(r21:20, r31:30):sat
234 # Vector reduce add unsigned bytes
236 # CHECK: r17:16 = vraddub(r21:20, r31:30)
238 # CHECK: r17:16 += vraddub(r21:20, r31:30)
240 # Vector reduce add halfwords
242 # CHECK: r17 = vradduh(r21:20, r31:30)
244 # CHECK: r17 = vraddh(r21:20, r31:30)
248 # CHECK: r17:16 = vaddub(r21:20, r31:30)
250 # CHECK: r17:16 = vaddub(r21:20, r31:30):sat
254 # CHECK: r17:16 = vaddw(r21:20, r31:30)
256 # CHECK: r17:16 = vaddw(r21:20, r31:30):sat
258 # Vector average halfwords
260 # CHECK: r17:16 = vavgh(r21:20, r31:30)
262 # CHECK: r17:16 = vavgh(r21:20, r31:30):rnd
264 # CHECK: r17:16 = vavgh(r21:20, r31:30):crnd
266 # CHECK: r17:16 = vavguh(r21:20, r31:30)
268 # CHECK: r17:16 = vavguh(r21:20, r31:30):rnd
270 # CHECK: r17:16 = vnavgh(r21:20, r31:30)
272 # CHECK: r17:16 = vnavgh(r21:20, r31:30):rnd:sat
274 # CHECK: r17:16 = vnavgh(r21:20, r31:30):crnd:sat
276 # Vector average unsigned bytes
278 # CHECK: r17:16 = vavgub(r21:20, r31:30)
280 # CHECK: r17:16 = vavgub(r21:20, r31:30):rnd
282 # Vector average words
284 # CHECK: r17:16 = vavgw(r21:20, r31:30)
286 # CHECK: r17:16 = vavgw(r21:20, r31:30):rnd
288 # CHECK: r17:16 = vavgw(r21:20, r31:30):crnd
290 # CHECK: r17:16 = vavguw(r21:20, r31:30)
292 # CHECK: r17:16 = vavguw(r21:20, r31:30):rnd
294 # CHECK: r17:16 = vnavgw(r21:20, r31:30)
296 # CHECK: r17:16 = vnavgw(r21:20, r31:30):rnd:sat
298 # CHECK: r17:16 = vnavgw(r21:20, r31:30):crnd:sat
300 # Vector conditional negate
302 # CHECK: r17:16 = vcnegh(r21:20, r31)
305 # CHECK: r17:16 += vrcnegh(r21:20, r31)
307 # Vector maximum bytes
309 # CHECK: r17:16 = vmaxub(r21:20, r31:30)
311 # CHECK: r17:16 = vmaxb(r21:20, r31:30)
313 # Vector maximum halfwords
315 # CHECK: r17:16 = vmaxh(r21:20, r31:30)
317 # CHECK: r17:16 = vmaxuh(r21:20, r31:30)
319 # Vector reduce maximum halfwords
321 # CHECK: r17:16 = vrmaxh(r21:20, r31)
323 # CHECK: r17:16 = vrmaxuh(r21:20, r31)
325 # Vector reduce maximum words
327 # CHECK: r17:16 = vrmaxw(r21:20, r31)
329 # CHECK: r17:16 = vrmaxuw(r21:20, r31)
331 # Vector maximum words
333 # CHECK: r17:16 = vmaxuw(r21:20, r31:30)
335 # CHECK: r17:16 = vmaxw(r21:20, r31:30)
337 # Vector minimum bytes
339 # CHECK: r17:16 = vminub(r21:20, r31:30)
341 # CHECK: r17:16 = vminb(r21:20, r31:30)
343 # Vector minimum halfwords
345 # CHECK: r17:16 = vminh(r21:20, r31:30)
347 # CHECK: r17:16 = vminuh(r21:20, r31:30)
349 # Vector reduce minimum halfwords
351 # CHECK: r17:16 = vrminh(r21:20, r31)
353 # CHECK: r17:16 = vrminuh(r21:20, r31)
355 # Vector reduce minimum words
357 # CHECK: r17:16 = vrminw(r21:20, r31)
359 # CHECK: r17:16 = vrminuw(r21:20, r31)
361 # Vector minimum words
363 # CHECK: r17:16 = vminw(r21:20, r31:30)
365 # CHECK: r17:16 = vminuw(r21:20, r31:30)
367 # Vector sum of absolute differences unsigned bytes
369 # CHECK: r17:16 = vrsadub(r21:20, r31:30)
371 # CHECK: r17:16 += vrsadub(r21:20, r31:30)
373 # Vector subtract halfwords
375 # CHECK: r17:16 = vsubh(r21:20, r31:30)
377 # CHECK: r17:16 = vsubh(r21:20, r31:30):sat
379 # CHECK: r17:16 = vsubuh(r21:20, r31:30):sat
381 # Vector subtract bytes
383 # CHECK: r17:16 = vsubub(r21:20, r31:30)
385 # CHECK: r17:16 = vsubub(r21:20, r31:30):sat
387 # Vector subtract words
389 # CHECK: r17:16 = vsubw(r21:20, r31:30)
391 # CHECK: r17:16 = vsubw(r21:20, r31:30):sat