1 # RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s
2 # Hexagon Programmer's Reference Manual 11.10.5 XTYPE/MPY
4 # Multiply and use lower result
6 # CHECK: r17 = add(#21, mpyi(r21, r31))
8 # CHECK: r17 = add(#21, mpyi(r21, #31))
10 # CHECK: r17 = add(r21, mpyi(#84, r31))
12 # CHECK: r17 = add(r21, mpyi(r21, #31))
14 # CHECK: r17 = add(r21, mpyi(r17, r31))
16 # CHECK: r17 =+ mpyi(r21, #31)
18 # CHECK: r17 =- mpyi(r21, #31)
20 # CHECK: r17 += mpyi(r21, #31)
22 # CHECK: r17 -= mpyi(r21, #31)
24 # CHECK: r17 = mpyi(r21, r31)
26 # CHECK: r17 += mpyi(r21, r31)
28 # Vector multiply word by signed half (32x16)
30 # CHECK: r17:16 = vmpyweh(r21:20, r31:30):sat
32 # CHECK: r17:16 = vmpyweh(r21:20, r31:30):<<1:sat
34 # CHECK: r17:16 = vmpywoh(r21:20, r31:30):sat
36 # CHECK: r17:16 = vmpywoh(r21:20, r31:30):<<1:sat
38 # CHECK: r17:16 = vmpyweh(r21:20, r31:30):rnd:sat
40 # CHECK: r17:16 = vmpyweh(r21:20, r31:30):<<1:rnd:sat
42 # CHECK: r17:16 = vmpywoh(r21:20, r31:30):rnd:sat
44 # CHECK: r17:16 = vmpywoh(r21:20, r31:30):<<1:rnd:sat
46 # CHECK: r17:16 += vmpyweh(r21:20, r31:30):sat
48 # CHECK: r17:16 += vmpyweh(r21:20, r31:30):<<1:sat
50 # CHECK: r17:16 += vmpywoh(r21:20, r31:30):sat
52 # CHECK: r17:16 += vmpywoh(r21:20, r31:30):<<1:sat
54 # CHECK: r17:16 += vmpyweh(r21:20, r31:30):rnd:sat
56 # CHECK: r17:16 += vmpyweh(r21:20, r31:30):<<1:rnd:sat
58 # CHECK: r17:16 += vmpywoh(r21:20, r31:30):rnd:sat
60 # CHECK: r17:16 += vmpywoh(r21:20, r31:30):<<1:rnd:sat
62 # Vector multiply word by unsigned half (32x16)
64 # CHECK: r17:16 = vmpyweuh(r21:20, r31:30):sat
66 # CHECK: r17:16 = vmpyweuh(r21:20, r31:30):<<1:sat
68 # CHECK: r17:16 = vmpywouh(r21:20, r31:30):sat
70 # CHECK: r17:16 = vmpywouh(r21:20, r31:30):<<1:sat
72 # CHECK: r17:16 = vmpyweuh(r21:20, r31:30):rnd:sat
74 # CHECK: r17:16 = vmpyweuh(r21:20, r31:30):<<1:rnd:sat
76 # CHECK: r17:16 = vmpywouh(r21:20, r31:30):rnd:sat
78 # CHECK: r17:16 = vmpywouh(r21:20, r31:30):<<1:rnd:sat
80 # CHECK: r17:16 += vmpyweuh(r21:20, r31:30):sat
82 # CHECK: r17:16 += vmpyweuh(r21:20, r31:30):<<1:sat
84 # CHECK: r17:16 += vmpywouh(r21:20, r31:30):sat
86 # CHECK: r17:16 += vmpywouh(r21:20, r31:30):<<1:sat
88 # CHECK: r17:16 += vmpyweuh(r21:20, r31:30):rnd:sat
90 # CHECK: r17:16 += vmpyweuh(r21:20, r31:30):<<1:rnd:sat
92 # CHECK: r17:16 += vmpywouh(r21:20, r31:30):rnd:sat
94 # CHECK: r17:16 += vmpywouh(r21:20, r31:30):<<1:rnd:sat
96 # Multiply signed halfwords
98 # CHECK: r17:16 = mpy(r21.l, r31.l):<<1
100 # CHECK: r17:16 = mpy(r21.l, r31.h):<<1
102 # CHECK: r17:16 = mpy(r21.h, r31.l):<<1
104 # CHECK: r17:16 = mpy(r21.h, r31.h):<<1
106 # CHECK: r17:16 = mpy(r21.l, r31.l):<<1:rnd
108 # CHECK: r17:16 = mpy(r21.l, r31.h):<<1:rnd
110 # CHECK: r17:16 = mpy(r21.h, r31.l):<<1:rnd
112 # CHECK: r17:16 = mpy(r21.h, r31.h):<<1:rnd
114 # CHECK: r17:16 += mpy(r21.l, r31.l):<<1
116 # CHECK: r17:16 += mpy(r21.l, r31.h):<<1
118 # CHECK: r17:16 += mpy(r21.h, r31.l):<<1
120 # CHECK: r17:16 += mpy(r21.h, r31.h):<<1
122 # CHECK: r17:16 -= mpy(r21.l, r31.l):<<1
124 # CHECK: r17:16 -= mpy(r21.l, r31.h):<<1
126 # CHECK: r17:16 -= mpy(r21.h, r31.l):<<1
128 # CHECK: r17:16 -= mpy(r21.h, r31.h):<<1
130 # CHECK: r17 = mpy(r21.l, r31.l):<<1
132 # CHECK: r17 = mpy(r21.l, r31.h):<<1
134 # CHECK: r17 = mpy(r21.h, r31.l):<<1
136 # CHECK: r17 = mpy(r21.h, r31.h):<<1
138 # CHECK: r17 = mpy(r21.l, r31.l):<<1:sat
140 # CHECK: r17 = mpy(r21.l, r31.h):<<1:sat
142 # CHECK: r17 = mpy(r21.h, r31.l):<<1:sat
144 # CHECK: r17 = mpy(r21.h, r31.h):<<1:sat
146 # CHECK: r17 = mpy(r21.l, r31.l):<<1:rnd
148 # CHECK: r17 = mpy(r21.l, r31.h):<<1:rnd
150 # CHECK: r17 = mpy(r21.h, r31.l):<<1:rnd
152 # CHECK: r17 = mpy(r21.h, r31.h):<<1:rnd
154 # CHECK: r17 = mpy(r21.l, r31.l):<<1:rnd:sat
156 # CHECK: r17 = mpy(r21.l, r31.h):<<1:rnd:sat
158 # CHECK: r17 = mpy(r21.h, r31.l):<<1:rnd:sat
160 # CHECK: r17 = mpy(r21.h, r31.h):<<1:rnd:sat
162 # CHECK: r17 += mpy(r21.l, r31.l):<<1
164 # CHECK: r17 += mpy(r21.l, r31.h):<<1
166 # CHECK: r17 += mpy(r21.h, r31.l):<<1
168 # CHECK: r17 += mpy(r21.h, r31.h):<<1
170 # CHECK: r17 += mpy(r21.l, r31.l):<<1:sat
172 # CHECK: r17 += mpy(r21.l, r31.h):<<1:sat
174 # CHECK: r17 += mpy(r21.h, r31.l):<<1:sat
176 # CHECK: r17 += mpy(r21.h, r31.h):<<1:sat
178 # CHECK: r17 -= mpy(r21.l, r31.l):<<1
180 # CHECK: r17 -= mpy(r21.l, r31.h):<<1
182 # CHECK: r17 -= mpy(r21.h, r31.l):<<1
184 # CHECK: r17 -= mpy(r21.h, r31.h):<<1
186 # CHECK: r17 -= mpy(r21.l, r31.l):<<1:sat
188 # CHECK: r17 -= mpy(r21.l, r31.h):<<1:sat
190 # CHECK: r17 -= mpy(r21.h, r31.l):<<1:sat
192 # CHECK: r17 -= mpy(r21.h, r31.h):<<1:sat
194 # Multiply unsigned halfwords
196 # CHECK: r17:16 = mpyu(r21.l, r31.l):<<1
198 # CHECK: r17:16 = mpyu(r21.l, r31.h):<<1
200 # CHECK: r17:16 = mpyu(r21.h, r31.l):<<1
202 # CHECK: r17:16 = mpyu(r21.h, r31.h):<<1
204 # CHECK: r17:16 += mpyu(r21.l, r31.l):<<1
206 # CHECK: r17:16 += mpyu(r21.l, r31.h):<<1
208 # CHECK: r17:16 += mpyu(r21.h, r31.l):<<1
210 # CHECK: r17:16 += mpyu(r21.h, r31.h):<<1
212 # CHECK: r17:16 -= mpyu(r21.l, r31.l):<<1
214 # CHECK: r17:16 -= mpyu(r21.l, r31.h):<<1
216 # CHECK: r17:16 -= mpyu(r21.h, r31.l):<<1
218 # CHECK: r17:16 -= mpyu(r21.h, r31.h):<<1
220 # CHECK: r17 = mpyu(r21.l, r31.l):<<1
222 # CHECK: r17 = mpyu(r21.l, r31.h):<<1
224 # CHECK: r17 = mpyu(r21.h, r31.l):<<1
226 # CHECK: r17 = mpyu(r21.h, r31.h):<<1
228 # CHECK: r17 += mpyu(r21.l, r31.l):<<1
230 # CHECK: r17 += mpyu(r21.l, r31.h):<<1
232 # CHECK: r17 += mpyu(r21.h, r31.l):<<1
234 # CHECK: r17 += mpyu(r21.h, r31.h):<<1
236 # CHECK: r17 -= mpyu(r21.l, r31.l):<<1
238 # CHECK: r17 -= mpyu(r21.l, r31.h):<<1
240 # CHECK: r17 -= mpyu(r21.h, r31.l):<<1
242 # CHECK: r17 -= mpyu(r21.h, r31.h):<<1
244 # Polynomial multiply words
246 # CHECK: r17:16 = pmpyw(r21, r31)
248 # CHECK: r17:16 ^= pmpyw(r21, r31)
250 # Vector reduce multiply word by signed half (32x16)
252 # CHECK: r17:16 = vrmpywoh(r21:20, r31:30)
254 # CHECK: r17:16 = vrmpywoh(r21:20, r31:30):<<1
256 # CHECK: r17:16 = vrmpyweh(r21:20, r31:30)
258 # CHECK: r17:16 = vrmpyweh(r21:20, r31:30):<<1
260 # CHECK: r17:16 += vrmpywoh(r21:20, r31:30)
262 # CHECK: r17:16 += vrmpywoh(r21:20, r31:30):<<1
264 # CHECK: r17:16 += vrmpyweh(r21:20, r31:30)
266 # CHECK: r17:16 += vrmpyweh(r21:20, r31:30):<<1
268 # Multiply and use upper result
270 # CHECK: r17 = mpy(r21, r31)
272 # CHECK: r17 = mpy(r21, r31):rnd
274 # CHECK: r17 = mpyu(r21, r31)
276 # CHECK: r17 = mpysu(r21, r31)
278 # CHECK: r17 = mpy(r21, r31.h):<<1:sat
280 # CHECK: r17 = mpy(r21, r31.l):<<1:sat
282 # CHECK: r17 = mpy(r21, r31.h):<<1:rnd:sat
284 # CHECK: r17 = mpy(r21, r31):<<1:sat
286 # CHECK: r17 = mpy(r21, r31.l):<<1:rnd:sat
288 # CHECK: r17 = mpy(r21, r31):<<1
290 # CHECK: r17 += mpy(r21, r31):<<1:sat
292 # CHECK: r17 -= mpy(r21, r31):<<1:sat
294 # Multiply and use full result
296 # CHECK: r17:16 = mpy(r21, r31)
298 # CHECK: r17:16 = mpyu(r21, r31)
300 # CHECK: r17:16 += mpy(r21, r31)
302 # CHECK: r17:16 -= mpy(r21, r31)
304 # CHECK: r17:16 += mpyu(r21, r31)
306 # CHECK: r17:16 -= mpyu(r21, r31)
308 # Vector dual multiply
310 # CHECK: r17:16 = vdmpy(r21:20, r31:30):sat
312 # CHECK: r17:16 = vdmpy(r21:20, r31:30):<<1:sat
314 # CHECK: r17:16 += vdmpy(r21:20, r31:30):sat
316 # CHECK: r17:16 += vdmpy(r21:20, r31:30):<<1:sat
318 # Vector dual multiply with round and pack
320 # CHECK: r17 = vdmpy(r21:20, r31:30):rnd:sat
322 # CHECK: r17 = vdmpy(r21:20, r31:30):<<1:rnd:sat
324 # Vector reduce multiply bytes
326 # CHECK: r17:16 = vrmpybu(r21:20, r31:30)
328 # CHECK: r17:16 = vrmpybsu(r21:20, r31:30)
330 # CHECK: r17:16 += vrmpybu(r21:20, r31:30)
332 # CHECK: r17:16 += vrmpybsu(r21:20, r31:30)
334 # Vector dual multiply signed by unsigned bytes
336 # CHECK: r17:16 = vdmpybsu(r21:20, r31:30):sat
338 # CHECK: r17:16 += vdmpybsu(r21:20, r31:30):sat
340 # Vector multiply even haldwords
342 # CHECK: r17:16 = vmpyeh(r21:20, r31:30):sat
344 # CHECK: r17:16 = vmpyeh(r21:20, r31:30):<<1:sat
346 # CHECK: r17:16 += vmpyeh(r21:20, r31:30)
348 # CHECK: r17:16 += vmpyeh(r21:20, r31:30):sat
350 # CHECK: r17:16 += vmpyeh(r21:20, r31:30):<<1:sat
352 # Vector multiply halfwords
354 # CHECK: r17:16 = vmpyh(r21, r31):sat
356 # CHECK: r17:16 = vmpyh(r21, r31):<<1:sat
358 # CHECK: r17:16 += vmpyh(r21, r31)
360 # CHECK: r17:16 += vmpyh(r21, r31):sat
362 # CHECK: r17:16 += vmpyh(r21, r31):<<1:sat
364 # Vector multiply halfwords with round and pack
366 # CHECK: r17 = vmpyh(r21, r31):rnd:sat
368 # CHECK: r17 = vmpyh(r21, r31):<<1:rnd:sat
370 # Vector multiply halfwords signed by unsigned
372 # CHECK: r17:16 = vmpyhsu(r21, r31):sat
374 # CHECK: r17:16 = vmpyhsu(r21, r31):<<1:sat
376 # CHECK: r17:16 += vmpyhsu(r21, r31):sat
378 # CHECK: r17:16 += vmpyhsu(r21, r31):<<1:sat
380 # Vector reduce multiply halfwords
382 # CHECK: r17:16 = vrmpyh(r21:20, r31:30)
384 # CHECK: r17:16 += vrmpyh(r21:20, r31:30)
386 # Vector multiply bytes
388 # CHECK: r17:16 = vmpybsu(r21, r31)
390 # CHECK: r17:16 = vmpybu(r21, r31)
392 # CHECK: r17:16 += vmpybu(r21, r31)
394 # CHECK: r17:16 += vmpybsu(r21, r31)
396 # Vector polynomial multiply halfwords
398 # CHECK: r17:16 = vpmpyh(r21, r31)
400 # CHECK: r17:16 ^= vpmpyh(r21, r31)