1# RUN: llvm-mc -triple=hexagon -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
2# Hexagon Programmer's Reference Manual 11.10.5 XTYPE/MPY
3
4# Multiply and use lower result
5# CHECK: b1 df 35 d7
6r17 = add(#21, mpyi(r21, r31))
7# CHECK: bf d1 35 d8
8r17 = add(#21, mpyi(r21, #31))
9# CHECK: b5 d1 3f df
10r17 = add(r21, mpyi(#84, r31))
11# CHECK: f5 f1 b5 df
12r17 = add(r21, mpyi(r21, #31))
13# CHECK: 15 d1 1f e3
14r17 = add(r21, mpyi(r17, r31))
15# CHECK: f1 c3 15 e0
16r17 =+ mpyi(r21, #31)
17# CHECK: f1 c3 95 e0
18r17 =- mpyi(r21, #31)
19# CHECK: f1 c3 15 e1
20r17 += mpyi(r21, #31)
21# CHECK: f1 c3 95 e1
22r17 -= mpyi(r21, #31)
23# CHECK: 11 df 15 ed
24r17 = mpyi(r21, r31)
25# CHECK: 11 df 15 ef
26r17 += mpyi(r21, r31)
27
28# Vector multiply word by signed half (32x16)
29# CHECK: b0 de 14 e8
30r17:16 = vmpyweh(r21:20, r31:30):sat
31# CHECK: b0 de 94 e8
32r17:16 = vmpyweh(r21:20, r31:30):<<1:sat
33# CHECK: f0 de 14 e8
34r17:16 = vmpywoh(r21:20, r31:30):sat
35# CHECK: f0 de 94 e8
36r17:16 = vmpywoh(r21:20, r31:30):<<1:sat
37# CHECK: b0 de 34 e8
38r17:16 = vmpyweh(r21:20, r31:30):rnd:sat
39# CHECK: b0 de b4 e8
40r17:16 = vmpyweh(r21:20, r31:30):<<1:rnd:sat
41# CHECK: f0 de 34 e8
42r17:16 = vmpywoh(r21:20, r31:30):rnd:sat
43# CHECK: f0 de b4 e8
44r17:16 = vmpywoh(r21:20, r31:30):<<1:rnd:sat
45# CHECK: b0 de 14 ea
46r17:16 += vmpyweh(r21:20, r31:30):sat
47# CHECK: b0 de 94 ea
48r17:16 += vmpyweh(r21:20, r31:30):<<1:sat
49# CHECK: f0 de 14 ea
50r17:16 += vmpywoh(r21:20, r31:30):sat
51# CHECK: f0 de 94 ea
52r17:16 += vmpywoh(r21:20, r31:30):<<1:sat
53# CHECK: b0 de 34 ea
54r17:16 += vmpyweh(r21:20, r31:30):rnd:sat
55# CHECK: b0 de b4 ea
56r17:16 += vmpyweh(r21:20, r31:30):<<1:rnd:sat
57# CHECK: f0 de 34 ea
58r17:16 += vmpywoh(r21:20, r31:30):rnd:sat
59# CHECK: f0 de b4 ea
60r17:16 += vmpywoh(r21:20, r31:30):<<1:rnd:sat
61
62# Vector multiply word by unsigned half (32x16)
63# CHECK: b0 de 54 e8
64r17:16 = vmpyweuh(r21:20, r31:30):sat
65# CHECK: b0 de d4 e8
66r17:16 = vmpyweuh(r21:20, r31:30):<<1:sat
67# CHECK: f0 de 54 e8
68r17:16 = vmpywouh(r21:20, r31:30):sat
69# CHECK: f0 de d4 e8
70r17:16 = vmpywouh(r21:20, r31:30):<<1:sat
71# CHECK: b0 de 74 e8
72r17:16 = vmpyweuh(r21:20, r31:30):rnd:sat
73# CHECK: b0 de f4 e8
74r17:16 = vmpyweuh(r21:20, r31:30):<<1:rnd:sat
75# CHECK: f0 de 74 e8
76r17:16 = vmpywouh(r21:20, r31:30):rnd:sat
77# CHECK: f0 de f4 e8
78r17:16 = vmpywouh(r21:20, r31:30):<<1:rnd:sat
79# CHECK: b0 de 54 ea
80r17:16 += vmpyweuh(r21:20, r31:30):sat
81# CHECK: b0 de d4 ea
82r17:16 += vmpyweuh(r21:20, r31:30):<<1:sat
83# CHECK: f0 de 54 ea
84r17:16 += vmpywouh(r21:20, r31:30):sat
85# CHECK: f0 de d4 ea
86r17:16 += vmpywouh(r21:20, r31:30):<<1:sat
87# CHECK: b0 de 74 ea
88r17:16 += vmpyweuh(r21:20, r31:30):rnd:sat
89# CHECK: b0 de f4 ea
90r17:16 += vmpyweuh(r21:20, r31:30):<<1:rnd:sat
91# CHECK: f0 de 74 ea
92r17:16 += vmpywouh(r21:20, r31:30):rnd:sat
93# CHECK: f0 de f4 ea
94r17:16 += vmpywouh(r21:20, r31:30):<<1:rnd:sat
95
96# Multiply signed halfwords
97# CHECK: 10 df 95 e4
98r17:16 = mpy(r21.l, r31.l):<<1
99# CHECK: 30 df 95 e4
100r17:16 = mpy(r21.l, r31.h):<<1
101# CHECK: 50 df 95 e4
102r17:16 = mpy(r21.h, r31.l):<<1
103# CHECK: 70 df 95 e4
104r17:16 = mpy(r21.h, r31.h):<<1
105# CHECK: 10 df b5 e4
106r17:16 = mpy(r21.l, r31.l):<<1:rnd
107# CHECK: 30 df b5 e4
108r17:16 = mpy(r21.l, r31.h):<<1:rnd
109# CHECK: 50 df b5 e4
110r17:16 = mpy(r21.h, r31.l):<<1:rnd
111# CHECK: 70 df b5 e4
112r17:16 = mpy(r21.h, r31.h):<<1:rnd
113# CHECK: 10 df 95 e6
114r17:16 += mpy(r21.l, r31.l):<<1
115# CHECK: 30 df 95 e6
116r17:16 += mpy(r21.l, r31.h):<<1
117# CHECK: 50 df 95 e6
118r17:16 += mpy(r21.h, r31.l):<<1
119# CHECK: 70 df 95 e6
120r17:16 += mpy(r21.h, r31.h):<<1
121# CHECK: 10 df b5 e6
122r17:16 -= mpy(r21.l, r31.l):<<1
123# CHECK: 30 df b5 e6
124r17:16 -= mpy(r21.l, r31.h):<<1
125# CHECK: 50 df b5 e6
126r17:16 -= mpy(r21.h, r31.l):<<1
127# CHECK: 70 df b5 e6
128r17:16 -= mpy(r21.h, r31.h):<<1
129# CHECK: 11 df 95 ec
130r17 = mpy(r21.l, r31.l):<<1
131# CHECK: 31 df 95 ec
132r17 = mpy(r21.l, r31.h):<<1
133# CHECK: 51 df 95 ec
134r17 = mpy(r21.h, r31.l):<<1
135# CHECK: 71 df 95 ec
136r17 = mpy(r21.h, r31.h):<<1
137# CHECK: 91 df 95 ec
138r17 = mpy(r21.l, r31.l):<<1:sat
139# CHECK: b1 df 95 ec
140r17 = mpy(r21.l, r31.h):<<1:sat
141# CHECK: d1 df 95 ec
142r17 = mpy(r21.h, r31.l):<<1:sat
143# CHECK: f1 df 95 ec
144r17 = mpy(r21.h, r31.h):<<1:sat
145# CHECK: 11 df b5 ec
146r17 = mpy(r21.l, r31.l):<<1:rnd
147# CHECK: 31 df b5 ec
148r17 = mpy(r21.l, r31.h):<<1:rnd
149# CHECK: 51 df b5 ec
150r17 = mpy(r21.h, r31.l):<<1:rnd
151# CHECK: 71 df b5 ec
152r17 = mpy(r21.h, r31.h):<<1:rnd
153# CHECK: 91 df b5 ec
154r17 = mpy(r21.l, r31.l):<<1:rnd:sat
155# CHECK: b1 df b5 ec
156r17 = mpy(r21.l, r31.h):<<1:rnd:sat
157# CHECK: d1 df b5 ec
158r17 = mpy(r21.h, r31.l):<<1:rnd:sat
159# CHECK: f1 df b5 ec
160r17 = mpy(r21.h, r31.h):<<1:rnd:sat
161# CHECK: 11 df 95 ee
162r17 += mpy(r21.l, r31.l):<<1
163# CHECK: 31 df 95 ee
164r17 += mpy(r21.l, r31.h):<<1
165# CHECK: 51 df 95 ee
166r17 += mpy(r21.h, r31.l):<<1
167# CHECK: 71 df 95 ee
168r17 += mpy(r21.h, r31.h):<<1
169# CHECK: 91 df 95 ee
170r17 += mpy(r21.l, r31.l):<<1:sat
171# CHECK: b1 df 95 ee
172r17 += mpy(r21.l, r31.h):<<1:sat
173# CHECK: d1 df 95 ee
174r17 += mpy(r21.h, r31.l):<<1:sat
175# CHECK: f1 df 95 ee
176r17 += mpy(r21.h, r31.h):<<1:sat
177# CHECK: 11 df b5 ee
178r17 -= mpy(r21.l, r31.l):<<1
179# CHECK: 31 df b5 ee
180r17 -= mpy(r21.l, r31.h):<<1
181# CHECK: 51 df b5 ee
182r17 -= mpy(r21.h, r31.l):<<1
183# CHECK: 71 df b5 ee
184r17 -= mpy(r21.h, r31.h):<<1
185# CHECK: 91 df b5 ee
186r17 -= mpy(r21.l, r31.l):<<1:sat
187# CHECK: b1 df b5 ee
188r17 -= mpy(r21.l, r31.h):<<1:sat
189# CHECK: d1 df b5 ee
190r17 -= mpy(r21.h, r31.l):<<1:sat
191# CHECK: f1 df b5 ee
192r17 -= mpy(r21.h, r31.h):<<1:sat
193
194# Multiply unsigned halfwords
195# CHECK: 10 df d5 e4
196r17:16 = mpyu(r21.l, r31.l):<<1
197# CHECK: 30 df d5 e4
198r17:16 = mpyu(r21.l, r31.h):<<1
199# CHECK: 50 df d5 e4
200r17:16 = mpyu(r21.h, r31.l):<<1
201# CHECK: 70 df d5 e4
202r17:16 = mpyu(r21.h, r31.h):<<1
203# CHECK: 10 df d5 e6
204r17:16 += mpyu(r21.l, r31.l):<<1
205# CHECK: 30 df d5 e6
206r17:16 += mpyu(r21.l, r31.h):<<1
207# CHECK: 50 df d5 e6
208r17:16 += mpyu(r21.h, r31.l):<<1
209# CHECK: 70 df d5 e6
210r17:16 += mpyu(r21.h, r31.h):<<1
211# CHECK: 10 df f5 e6
212r17:16 -= mpyu(r21.l, r31.l):<<1
213# CHECK: 30 df f5 e6
214r17:16 -= mpyu(r21.l, r31.h):<<1
215# CHECK: 50 df f5 e6
216r17:16 -= mpyu(r21.h, r31.l):<<1
217# CHECK: 70 df f5 e6
218r17:16 -= mpyu(r21.h, r31.h):<<1
219# CHECK: 11 df d5 ec
220r17 = mpyu(r21.l, r31.l):<<1
221# CHECK: 31 df d5 ec
222r17 = mpyu(r21.l, r31.h):<<1
223# CHECK: 51 df d5 ec
224r17 = mpyu(r21.h, r31.l):<<1
225# CHECK: 71 df d5 ec
226r17 = mpyu(r21.h, r31.h):<<1
227# CHECK: 11 df d5 ee
228r17 += mpyu(r21.l, r31.l):<<1
229# CHECK: 31 df d5 ee
230r17 += mpyu(r21.l, r31.h):<<1
231# CHECK: 51 df d5 ee
232r17 += mpyu(r21.h, r31.l):<<1
233# CHECK: 71 df d5 ee
234r17 += mpyu(r21.h, r31.h):<<1
235# CHECK: 11 df f5 ee
236r17 -= mpyu(r21.l, r31.l):<<1
237# CHECK: 31 df f5 ee
238r17 -= mpyu(r21.l, r31.h):<<1
239# CHECK: 51 df f5 ee
240r17 -= mpyu(r21.h, r31.l):<<1
241# CHECK: 71 df f5 ee
242r17 -= mpyu(r21.h, r31.h):<<1
243
244# Polynomial multiply words
245# CHECK: f0 df 55 e5
246r17:16 = pmpyw(r21, r31)
247# CHECK: f0 df 35 e7
248r17:16 ^= pmpyw(r21, r31)
249
250# Vector reduce multiply word by signed half (32x16)
251# CHECK: 50 de 34 e8
252r17:16 = vrmpywoh(r21:20, r31:30)
253# CHECK: 50 de b4 e8
254r17:16 = vrmpywoh(r21:20, r31:30):<<1
255# CHECK: 90 de 54 e8
256r17:16 = vrmpyweh(r21:20, r31:30)
257# CHECK: 90 de d4 e8
258r17:16 = vrmpyweh(r21:20, r31:30):<<1
259# CHECK: d0 de 74 ea
260r17:16 += vrmpywoh(r21:20, r31:30)
261# CHECK: d0 de f4 ea
262r17:16 += vrmpywoh(r21:20, r31:30):<<1
263# CHECK: d0 de 34 ea
264r17:16 += vrmpyweh(r21:20, r31:30)
265# CHECK: d0 de b4 ea
266r17:16 += vrmpyweh(r21:20, r31:30):<<1
267
268# Multiply and use upper result
269# CHECK: 31 df 15 ed
270r17 = mpy(r21, r31)
271# CHECK: 31 df 35 ed
272r17 = mpy(r21, r31):rnd
273# CHECK: 31 df 55 ed
274r17 = mpyu(r21, r31)
275# CHECK: 31 df 75 ed
276r17 = mpysu(r21, r31)
277# CHECK: 11 df b5 ed
278r17 = mpy(r21, r31.h):<<1:sat
279# CHECK: 31 df b5 ed
280r17 = mpy(r21, r31.l):<<1:sat
281# CHECK: 91 df b5 ed
282r17 = mpy(r21, r31.h):<<1:rnd:sat
283# CHECK: 11 df f5 ed
284r17 = mpy(r21, r31):<<1:sat
285# CHECK: 91 df f5 ed
286r17 = mpy(r21, r31.l):<<1:rnd:sat
287# CHECK: 51 df b5 ed
288r17 = mpy(r21, r31):<<1
289# CHECK: 11 df 75 ef
290r17 += mpy(r21, r31):<<1:sat
291# CHECK: 31 df 75 ef
292r17 -= mpy(r21, r31):<<1:sat
293
294# Multiply and use full result
295# CHECK: 10 df 15 e5
296r17:16 = mpy(r21, r31)
297# CHECK: 10 df 55 e5
298r17:16 = mpyu(r21, r31)
299# CHECK: 10 df 15 e7
300r17:16 += mpy(r21, r31)
301# CHECK: 10 df 35 e7
302r17:16 -= mpy(r21, r31)
303# CHECK: 10 df 55 e7
304r17:16 += mpyu(r21, r31)
305# CHECK: 10 df 75 e7
306r17:16 -= mpyu(r21, r31)
307
308# Vector dual multiply
309# CHECK: 90 de 14 e8
310r17:16 = vdmpy(r21:20, r31:30):sat
311# CHECK: 90 de 94 e8
312r17:16 = vdmpy(r21:20, r31:30):<<1:sat
313# CHECK: 90 de 14 ea
314r17:16 += vdmpy(r21:20, r31:30):sat
315# CHECK: 90 de 94 ea
316r17:16 += vdmpy(r21:20, r31:30):<<1:sat
317
318# Vector dual multiply with round and pack
319# CHECK: 11 de 14 e9
320r17 = vdmpy(r21:20, r31:30):rnd:sat
321# CHECK: 11 de 94 e9
322r17 = vdmpy(r21:20, r31:30):<<1:rnd:sat
323
324# Vector reduce multiply bytes
325# CHECK: 30 de 94 e8
326r17:16 = vrmpybu(r21:20, r31:30)
327# CHECK: 30 de d4 e8
328r17:16 = vrmpybsu(r21:20, r31:30)
329# CHECK: 30 de 94 ea
330r17:16 += vrmpybu(r21:20, r31:30)
331# CHECK: 30 de d4 ea
332r17:16 += vrmpybsu(r21:20, r31:30)
333
334# Vector dual multiply signed by unsigned bytes
335# CHECK: 30 de b4 e8
336r17:16 = vdmpybsu(r21:20, r31:30):sat
337# CHECK: 30 de 34 ea
338r17:16 += vdmpybsu(r21:20, r31:30):sat
339
340# Vector multiply even haldwords
341# CHECK: d0 de 14 e8
342r17:16 = vmpyeh(r21:20, r31:30):sat
343# CHECK: d0 de 94 e8
344r17:16 = vmpyeh(r21:20, r31:30):<<1:sat
345# CHECK: 50 de 34 ea
346r17:16 += vmpyeh(r21:20, r31:30)
347# CHECK: d0 de 14 ea
348r17:16 += vmpyeh(r21:20, r31:30):sat
349# CHECK: d0 de 94 ea
350r17:16 += vmpyeh(r21:20, r31:30):<<1:sat
351
352# Vector multiply halfwords
353# CHECK: b0 df 15 e5
354r17:16 = vmpyh(r21, r31):sat
355# CHECK: b0 df 95 e5
356r17:16 = vmpyh(r21, r31):<<1:sat
357# CHECK: 30 df 35 e7
358r17:16 += vmpyh(r21, r31)
359# CHECK: b0 df 15 e7
360r17:16 += vmpyh(r21, r31):sat
361# CHECK: b0 df 95 e7
362r17:16 += vmpyh(r21, r31):<<1:sat
363
364# Vector multiply halfwords with round and pack
365# CHECK: f1 df 35 ed
366r17 = vmpyh(r21, r31):rnd:sat
367# CHECK: f1 df b5 ed
368r17 = vmpyh(r21, r31):<<1:rnd:sat
369
370# Vector multiply halfwords signed by unsigned
371# CHECK: f0 df 15 e5
372r17:16 = vmpyhsu(r21, r31):sat
373# CHECK: f0 df 95 e5
374r17:16 = vmpyhsu(r21, r31):<<1:sat
375# CHECK: b0 df 75 e7
376r17:16 += vmpyhsu(r21, r31):sat
377# CHECK: b0 df f5 e7
378r17:16 += vmpyhsu(r21, r31):<<1:sat
379
380# Vector reduce multiply halfwords
381# CHECK: 50 de 14 e8
382r17:16 = vrmpyh(r21:20, r31:30)
383# CHECK: 50 de 14 ea
384r17:16 += vrmpyh(r21:20, r31:30)
385
386# Vector multiply bytes
387# CHECK: 30 df 55 e5
388r17:16 = vmpybsu(r21, r31)
389# CHECK: 30 df 95 e5
390r17:16 = vmpybu(r21, r31)
391# CHECK: 30 df 95 e7
392r17:16 += vmpybu(r21, r31)
393# CHECK: 30 df d5 e7
394r17:16 += vmpybsu(r21, r31)
395
396# Vector polynomial multiply halfwords
397# CHECK: f0 df d5 e5
398r17:16 = vpmpyh(r21, r31)
399# CHECK: f0 df b5 e7
400r17:16 ^= vpmpyh(r21, r31)
401