5ed761a613f95ea9fa81589c07a2696848714e9e
[oota-llvm.git] / test / CodeGen / Hexagon / intrinsics / xtype_mpy.ll
1 ; RUN: llc -march=hexagon -O0 < %s | FileCheck %s
2 ; Hexagon Programmer's Reference Manual 11.10.5 XTYPE/MPY
3
4 ; Multiply and use lower result
5 declare i32 @llvm.hexagon.M4.mpyrr.addi(i32, i32, i32)
6 define i32 @M4_mpyrr_addi(i32 %a, i32 %b) {
7   %z = call i32 @llvm.hexagon.M4.mpyrr.addi(i32 0, i32 %a, i32 %b)
8   ret i32 %z
9 }
10 ; CHECK: r0 = add(#0, mpyi(r0, r1))
11
12 declare i32 @llvm.hexagon.M4.mpyri.addi(i32, i32, i32)
13 define i32 @M4_mpyri_addi(i32 %a) {
14   %z = call i32 @llvm.hexagon.M4.mpyri.addi(i32 0, i32 %a, i32 0)
15   ret i32 %z
16 }
17 ; CHECK: r0 = add(#0, mpyi(r0, #0))
18
19 declare i32 @llvm.hexagon.M4.mpyri.addr.u2(i32, i32, i32)
20 define i32 @M4_mpyri_addr_u2(i32 %a, i32 %b) {
21   %z = call i32 @llvm.hexagon.M4.mpyri.addr.u2(i32 %a, i32 0, i32 %b)
22   ret i32 %z
23 }
24 ; CHECK: r0 = add(r0, mpyi(#0, r1))
25
26 declare i32 @llvm.hexagon.M4.mpyri.addr(i32, i32, i32)
27 define i32 @M4_mpyri_addr(i32 %a, i32 %b) {
28   %z = call i32 @llvm.hexagon.M4.mpyri.addr(i32 %a, i32 %b, i32 0)
29   ret i32 %z
30 }
31 ; CHECK: r0 = add(r0, mpyi(r1, #0))
32
33 declare i32 @llvm.hexagon.M4.mpyrr.addr(i32, i32, i32)
34 define i32 @M4_mpyrr_addr(i32 %a, i32 %b, i32 %c) {
35   %z = call i32 @llvm.hexagon.M4.mpyrr.addr(i32 %a, i32 %b, i32 %c)
36   ret i32 %z
37 }
38 ; CHECK: r1 = add(r0, mpyi(r1, r2))
39
40 ; Vector multiply word by signed half (32x16)
41 declare i64 @llvm.hexagon.M2.mmpyl.s0(i64, i64)
42 define i64 @M2_mmpyl_s0(i64 %a, i64 %b) {
43   %z = call i64 @llvm.hexagon.M2.mmpyl.s0(i64 %a, i64 %b)
44   ret i64 %z
45 }
46 ; CHECK: r1:0 = vmpyweh(r1:0, r3:2):sat
47
48 declare i64 @llvm.hexagon.M2.mmpyl.s1(i64, i64)
49 define i64 @M2_mmpyl_s1(i64 %a, i64 %b) {
50   %z = call i64 @llvm.hexagon.M2.mmpyl.s1(i64 %a, i64 %b)
51   ret i64 %z
52 }
53 ; CHECK: r1:0 = vmpyweh(r1:0, r3:2):<<1:sat
54
55 declare i64 @llvm.hexagon.M2.mmpyh.s0(i64, i64)
56 define i64 @M2_mmpyh_s0(i64 %a, i64 %b) {
57   %z = call i64 @llvm.hexagon.M2.mmpyh.s0(i64 %a, i64 %b)
58   ret i64 %z
59 }
60 ; CHECK: r1:0 = vmpywoh(r1:0, r3:2):sat
61
62 declare i64 @llvm.hexagon.M2.mmpyh.s1(i64, i64)
63 define i64 @M2_mmpyh_s1(i64 %a, i64 %b) {
64   %z = call i64 @llvm.hexagon.M2.mmpyh.s1(i64 %a, i64 %b)
65   ret i64 %z
66 }
67 ; CHECK: r1:0 = vmpywoh(r1:0, r3:2):<<1:sat
68
69 declare i64 @llvm.hexagon.M2.mmpyl.rs0(i64, i64)
70 define i64 @M2_mmpyl_rs0(i64 %a, i64 %b) {
71   %z = call i64 @llvm.hexagon.M2.mmpyl.rs0(i64 %a, i64 %b)
72   ret i64 %z
73 }
74 ; CHECK: r1:0 = vmpyweh(r1:0, r3:2):rnd:sat
75
76 declare i64 @llvm.hexagon.M2.mmpyl.rs1(i64, i64)
77 define i64 @M2_mmpyl_rs1(i64 %a, i64 %b) {
78   %z = call i64 @llvm.hexagon.M2.mmpyl.rs1(i64 %a, i64 %b)
79   ret i64 %z
80 }
81 ; CHECK: r1:0 = vmpyweh(r1:0, r3:2):<<1:rnd:sat
82
83 declare i64 @llvm.hexagon.M2.mmpyh.rs0(i64, i64)
84 define i64 @M2_mmpyh_rs0(i64 %a, i64 %b) {
85   %z = call i64 @llvm.hexagon.M2.mmpyh.rs0(i64 %a, i64 %b)
86   ret i64 %z
87 }
88 ; CHECK: r1:0 = vmpywoh(r1:0, r3:2):rnd:sat
89
90 declare i64 @llvm.hexagon.M2.mmpyh.rs1(i64, i64)
91 define i64 @M2_mmpyh_rs1(i64 %a, i64 %b) {
92   %z = call i64 @llvm.hexagon.M2.mmpyh.rs1(i64 %a, i64 %b)
93   ret i64 %z
94 }
95 ; CHECK: r1:0 = vmpywoh(r1:0, r3:2):<<1:rnd:sat
96
97 ; Vector multiply word by unsigned half (32x16)
98 declare i64 @llvm.hexagon.M2.mmpyul.s0(i64, i64)
99 define i64 @M2_mmpyul_s0(i64 %a, i64 %b) {
100   %z = call i64 @llvm.hexagon.M2.mmpyul.s0(i64 %a, i64 %b)
101   ret i64 %z
102 }
103 ; CHECK: r1:0 = vmpyweuh(r1:0, r3:2):sat
104
105 declare i64 @llvm.hexagon.M2.mmpyul.s1(i64, i64)
106 define i64 @M2_mmpyul_s1(i64 %a, i64 %b) {
107   %z = call i64 @llvm.hexagon.M2.mmpyul.s1(i64 %a, i64 %b)
108   ret i64 %z
109 }
110 ; CHECK: r1:0 = vmpyweuh(r1:0, r3:2):<<1:sat
111
112 declare i64 @llvm.hexagon.M2.mmpyuh.s0(i64, i64)
113 define i64 @M2_mmpyuh_s0(i64 %a, i64 %b) {
114   %z = call i64 @llvm.hexagon.M2.mmpyuh.s0(i64 %a, i64 %b)
115   ret i64 %z
116 }
117 ; CHECK: r1:0 = vmpywouh(r1:0, r3:2):sat
118
119 declare i64 @llvm.hexagon.M2.mmpyuh.s1(i64, i64)
120 define i64 @M2_mmpyuh_s1(i64 %a, i64 %b) {
121   %z = call i64 @llvm.hexagon.M2.mmpyuh.s1(i64 %a, i64 %b)
122   ret i64 %z
123 }
124 ; CHECK: r1:0 = vmpywouh(r1:0, r3:2):<<1:sat
125
126 declare i64 @llvm.hexagon.M2.mmpyul.rs0(i64, i64)
127 define i64 @M2_mmpyul_rs0(i64 %a, i64 %b) {
128   %z = call i64 @llvm.hexagon.M2.mmpyul.rs0(i64 %a, i64 %b)
129   ret i64 %z
130 }
131 ; CHECK: r1:0 = vmpyweuh(r1:0, r3:2):rnd:sat
132
133 declare i64 @llvm.hexagon.M2.mmpyul.rs1(i64, i64)
134 define i64 @M2_mmpyul_rs1(i64 %a, i64 %b) {
135   %z = call i64 @llvm.hexagon.M2.mmpyul.rs1(i64 %a, i64 %b)
136   ret i64 %z
137 }
138 ; CHECK: r1:0 = vmpyweuh(r1:0, r3:2):<<1:rnd:sat
139
140 declare i64 @llvm.hexagon.M2.mmpyuh.rs0(i64, i64)
141 define i64 @M2_mmpyuh_rs0(i64 %a, i64 %b) {
142   %z = call i64 @llvm.hexagon.M2.mmpyuh.rs0(i64 %a, i64 %b)
143   ret i64 %z
144 }
145 ; CHECK: r1:0 = vmpywouh(r1:0, r3:2):rnd:sat
146
147 declare i64 @llvm.hexagon.M2.mmpyuh.rs1(i64, i64)
148 define i64 @M2_mmpyuh_rs1(i64 %a, i64 %b) {
149   %z = call i64 @llvm.hexagon.M2.mmpyuh.rs1(i64 %a, i64 %b)
150   ret i64 %z
151 }
152 ; CHECK: r1:0 = vmpywouh(r1:0, r3:2):<<1:rnd:sat
153
154 ; Multiply signed halfwords
155 declare i64 @llvm.hexagon.M2.mpyd.ll.s0(i32, i32)
156 define i64 @M2_mpyd_ll_s0(i32 %a, i32 %b) {
157   %z = call i64 @llvm.hexagon.M2.mpyd.ll.s0(i32 %a, i32 %b)
158   ret i64 %z
159 }
160 ; CHECK: r1:0 = mpy(r0.l, r1.l)
161
162 declare i64 @llvm.hexagon.M2.mpyd.ll.s1(i32, i32)
163 define i64 @M2_mpyd_ll_s1(i32 %a, i32 %b) {
164   %z = call i64 @llvm.hexagon.M2.mpyd.ll.s1(i32 %a, i32 %b)
165   ret i64 %z
166 }
167 ; CHECK: r1:0 = mpy(r0.l, r1.l):<<1
168
169 declare i64 @llvm.hexagon.M2.mpyd.lh.s0(i32, i32)
170 define i64 @M2_mpyd_lh_s0(i32 %a, i32 %b) {
171   %z = call i64 @llvm.hexagon.M2.mpyd.lh.s0(i32 %a, i32 %b)
172   ret i64 %z
173 }
174 ; CHECK: r1:0 = mpy(r0.l, r1.h)
175
176 declare i64 @llvm.hexagon.M2.mpyd.lh.s1(i32, i32)
177 define i64 @M2_mpyd_lh_s1(i32 %a, i32 %b) {
178   %z = call i64 @llvm.hexagon.M2.mpyd.lh.s1(i32 %a, i32 %b)
179   ret i64 %z
180 }
181 ; CHECK: r1:0 = mpy(r0.l, r1.h):<<1
182
183 declare i64 @llvm.hexagon.M2.mpyd.hl.s0(i32, i32)
184 define i64 @M2_mpyd_hl_s0(i32 %a, i32 %b) {
185   %z = call i64 @llvm.hexagon.M2.mpyd.hl.s0(i32 %a, i32 %b)
186   ret i64 %z
187 }
188 ; CHECK: r1:0 = mpy(r0.h, r1.l)
189
190 declare i64 @llvm.hexagon.M2.mpyd.hl.s1(i32, i32)
191 define i64 @M2_mpyd_hl_s1(i32 %a, i32 %b) {
192   %z = call i64 @llvm.hexagon.M2.mpyd.hl.s1(i32 %a, i32 %b)
193   ret i64 %z
194 }
195 ; CHECK: r1:0 = mpy(r0.h, r1.l):<<1
196
197 declare i64 @llvm.hexagon.M2.mpyd.hh.s0(i32, i32)
198 define i64 @M2_mpyd_hh_s0(i32 %a, i32 %b) {
199   %z = call i64 @llvm.hexagon.M2.mpyd.hh.s0(i32 %a, i32 %b)
200   ret i64 %z
201 }
202 ; CHECK: r1:0 = mpy(r0.h, r1.h)
203
204 declare i64 @llvm.hexagon.M2.mpyd.hh.s1(i32, i32)
205 define i64 @M2_mpyd_hh_s1(i32 %a, i32 %b) {
206   %z = call i64 @llvm.hexagon.M2.mpyd.hh.s1(i32 %a, i32 %b)
207   ret i64 %z
208 }
209 ; CHECK: r1:0 = mpy(r0.h, r1.h):<<1
210
211 declare i64 @llvm.hexagon.M2.mpyd.rnd.ll.s0(i32, i32)
212 define i64 @M2_mpyd_rnd_ll_s0(i32 %a, i32 %b) {
213   %z = call i64 @llvm.hexagon.M2.mpyd.rnd.ll.s0(i32 %a, i32 %b)
214   ret i64 %z
215 }
216 ; CHECK: r1:0 = mpy(r0.l, r1.l):rnd
217
218 declare i64 @llvm.hexagon.M2.mpyd.rnd.ll.s1(i32, i32)
219 define i64 @M2_mpyd_rnd_ll_s1(i32 %a, i32 %b) {
220   %z = call i64 @llvm.hexagon.M2.mpyd.rnd.ll.s1(i32 %a, i32 %b)
221   ret i64 %z
222 }
223 ; CHECK: r1:0 = mpy(r0.l, r1.l):<<1:rnd
224
225 declare i64 @llvm.hexagon.M2.mpyd.rnd.lh.s0(i32, i32)
226 define i64 @M2_mpyd_rnd_lh_s0(i32 %a, i32 %b) {
227   %z = call i64 @llvm.hexagon.M2.mpyd.rnd.lh.s0(i32 %a, i32 %b)
228   ret i64 %z
229 }
230 ; CHECK: r1:0 = mpy(r0.l, r1.h):rnd
231
232 declare i64 @llvm.hexagon.M2.mpyd.rnd.lh.s1(i32, i32)
233 define i64 @M2_mpyd_rnd_lh_s1(i32 %a, i32 %b) {
234   %z = call i64 @llvm.hexagon.M2.mpyd.rnd.lh.s1(i32 %a, i32 %b)
235   ret i64 %z
236 }
237 ; CHECK: r1:0 = mpy(r0.l, r1.h):<<1:rnd
238
239 declare i64 @llvm.hexagon.M2.mpyd.rnd.hl.s0(i32, i32)
240 define i64 @M2_mpyd_rnd_hl_s0(i32 %a, i32 %b) {
241   %z = call i64 @llvm.hexagon.M2.mpyd.rnd.hl.s0(i32 %a, i32 %b)
242   ret i64 %z
243 }
244 ; CHECK: r1:0 = mpy(r0.h, r1.l):rnd
245
246 declare i64 @llvm.hexagon.M2.mpyd.rnd.hl.s1(i32, i32)
247 define i64 @M2_mpyd_rnd_hl_s1(i32 %a, i32 %b) {
248   %z = call i64 @llvm.hexagon.M2.mpyd.rnd.hl.s1(i32 %a, i32 %b)
249   ret i64 %z
250 }
251 ; CHECK: r1:0 = mpy(r0.h, r1.l):<<1:rnd
252
253 declare i64 @llvm.hexagon.M2.mpyd.rnd.hh.s0(i32, i32)
254 define i64 @M2_mpyd_rnd_hh_s0(i32 %a, i32 %b) {
255   %z = call i64 @llvm.hexagon.M2.mpyd.rnd.hh.s0(i32 %a, i32 %b)
256   ret i64 %z
257 }
258 ; CHECK: r1:0 = mpy(r0.h, r1.h):rnd
259
260 declare i64 @llvm.hexagon.M2.mpyd.rnd.hh.s1(i32, i32)
261 define i64 @M2_mpyd_rnd_hh_s1(i32 %a, i32 %b) {
262   %z = call i64 @llvm.hexagon.M2.mpyd.rnd.hh.s1(i32 %a, i32 %b)
263   ret i64 %z
264 }
265 ; CHECK: r1:0 = mpy(r0.h, r1.h):<<1:rnd
266
267 declare i64 @llvm.hexagon.M2.mpyd.acc.ll.s0(i64, i32, i32)
268 define i64 @M2_mpyd_acc_ll_s0(i64 %a, i32 %b, i32 %c) {
269   %z = call i64 @llvm.hexagon.M2.mpyd.acc.ll.s0(i64 %a, i32 %b, i32 %c)
270   ret i64 %z
271 }
272 ; CHECK: r1:0 += mpy(r2.l, r3.l)
273
274 declare i64 @llvm.hexagon.M2.mpyd.acc.ll.s1(i64, i32, i32)
275 define i64 @M2_mpyd_acc_ll_s1(i64 %a, i32 %b, i32 %c) {
276   %z = call i64 @llvm.hexagon.M2.mpyd.acc.ll.s1(i64 %a, i32 %b, i32 %c)
277   ret i64 %z
278 }
279 ; CHECK: r1:0 += mpy(r2.l, r3.l):<<1
280
281 declare i64 @llvm.hexagon.M2.mpyd.acc.lh.s0(i64, i32, i32)
282 define i64 @M2_mpyd_acc_lh_s0(i64 %a, i32 %b, i32 %c) {
283   %z = call i64 @llvm.hexagon.M2.mpyd.acc.lh.s0(i64 %a, i32 %b, i32 %c)
284   ret i64 %z
285 }
286 ; CHECK: r1:0 += mpy(r2.l, r3.h)
287
288 declare i64 @llvm.hexagon.M2.mpyd.acc.lh.s1(i64, i32, i32)
289 define i64 @M2_mpyd_acc_lh_s1(i64 %a, i32 %b, i32 %c) {
290   %z = call i64 @llvm.hexagon.M2.mpyd.acc.lh.s1(i64 %a, i32 %b, i32 %c)
291   ret i64 %z
292 }
293 ; CHECK: r1:0 += mpy(r2.l, r3.h):<<1
294
295 declare i64 @llvm.hexagon.M2.mpyd.acc.hl.s0(i64, i32, i32)
296 define i64 @M2_mpyd_acc_hl_s0(i64 %a, i32 %b, i32 %c) {
297   %z = call i64 @llvm.hexagon.M2.mpyd.acc.hl.s0(i64 %a, i32 %b, i32 %c)
298   ret i64 %z
299 }
300 ; CHECK: r1:0 += mpy(r2.h, r3.l)
301
302 declare i64 @llvm.hexagon.M2.mpyd.acc.hl.s1(i64, i32, i32)
303 define i64 @M2_mpyd_acc_hl_s1(i64 %a, i32 %b, i32 %c) {
304   %z = call i64 @llvm.hexagon.M2.mpyd.acc.hl.s1(i64 %a, i32 %b, i32 %c)
305   ret i64 %z
306 }
307 ; CHECK: r1:0 += mpy(r2.h, r3.l):<<1
308
309 declare i64 @llvm.hexagon.M2.mpyd.acc.hh.s0(i64, i32, i32)
310 define i64 @M2_mpyd_acc_hh_s0(i64 %a, i32 %b, i32 %c) {
311   %z = call i64 @llvm.hexagon.M2.mpyd.acc.hh.s0(i64 %a, i32 %b, i32 %c)
312   ret i64 %z
313 }
314 ; CHECK: r1:0 += mpy(r2.h, r3.h)
315
316 declare i64 @llvm.hexagon.M2.mpyd.acc.hh.s1(i64, i32, i32)
317 define i64 @M2_mpyd_acc_hh_s1(i64 %a, i32 %b, i32 %c) {
318   %z = call i64 @llvm.hexagon.M2.mpyd.acc.hh.s1(i64 %a, i32 %b, i32 %c)
319   ret i64 %z
320 }
321 ; CHECK: r1:0 += mpy(r2.h, r3.h):<<1
322
323 declare i64 @llvm.hexagon.M2.mpyd.nac.ll.s0(i64, i32, i32)
324 define i64 @M2_mpyd_nac_ll_s0(i64 %a, i32 %b, i32 %c) {
325   %z = call i64 @llvm.hexagon.M2.mpyd.nac.ll.s0(i64 %a, i32 %b, i32 %c)
326   ret i64 %z
327 }
328 ; CHECK: r1:0 -= mpy(r2.l, r3.l)
329
330 declare i64 @llvm.hexagon.M2.mpyd.nac.ll.s1(i64, i32, i32)
331 define i64 @M2_mpyd_nac_ll_s1(i64 %a, i32 %b, i32 %c) {
332   %z = call i64 @llvm.hexagon.M2.mpyd.nac.ll.s1(i64 %a, i32 %b, i32 %c)
333   ret i64 %z
334 }
335 ; CHECK: r1:0 -= mpy(r2.l, r3.l):<<1
336
337 declare i64 @llvm.hexagon.M2.mpyd.nac.lh.s0(i64, i32, i32)
338 define i64 @M2_mpyd_nac_lh_s0(i64 %a, i32 %b, i32 %c) {
339   %z = call i64 @llvm.hexagon.M2.mpyd.nac.lh.s0(i64 %a, i32 %b, i32 %c)
340   ret i64 %z
341 }
342 ; CHECK: r1:0 -= mpy(r2.l, r3.h)
343
344 declare i64 @llvm.hexagon.M2.mpyd.nac.lh.s1(i64, i32, i32)
345 define i64 @M2_mpyd_nac_lh_s1(i64 %a, i32 %b, i32 %c) {
346   %z = call i64 @llvm.hexagon.M2.mpyd.nac.lh.s1(i64 %a, i32 %b, i32 %c)
347   ret i64 %z
348 }
349 ; CHECK: r1:0 -= mpy(r2.l, r3.h):<<1
350
351 declare i64 @llvm.hexagon.M2.mpyd.nac.hl.s0(i64, i32, i32)
352 define i64 @M2_mpyd_nac_hl_s0(i64 %a, i32 %b, i32 %c) {
353   %z = call i64 @llvm.hexagon.M2.mpyd.nac.hl.s0(i64 %a, i32 %b, i32 %c)
354   ret i64 %z
355 }
356 ; CHECK: r1:0 -= mpy(r2.h, r3.l)
357
358 declare i64 @llvm.hexagon.M2.mpyd.nac.hl.s1(i64, i32, i32)
359 define i64 @M2_mpyd_nac_hl_s1(i64 %a, i32 %b, i32 %c) {
360   %z = call i64 @llvm.hexagon.M2.mpyd.nac.hl.s1(i64 %a, i32 %b, i32 %c)
361   ret i64 %z
362 }
363 ; CHECK: r1:0 -= mpy(r2.h, r3.l):<<1
364
365 declare i64 @llvm.hexagon.M2.mpyd.nac.hh.s0(i64, i32, i32)
366 define i64 @M2_mpyd_nac_hh_s0(i64 %a, i32 %b, i32 %c) {
367   %z = call i64 @llvm.hexagon.M2.mpyd.nac.hh.s0(i64 %a, i32 %b, i32 %c)
368   ret i64 %z
369 }
370 ; CHECK: r1:0 -= mpy(r2.h, r3.h)
371
372 declare i64 @llvm.hexagon.M2.mpyd.nac.hh.s1(i64, i32, i32)
373 define i64 @M2_mpyd_nac_hh_s1(i64 %a, i32 %b, i32 %c) {
374   %z = call i64 @llvm.hexagon.M2.mpyd.nac.hh.s1(i64 %a, i32 %b, i32 %c)
375   ret i64 %z
376 }
377 ; CHECK: r1:0 -= mpy(r2.h, r3.h):<<1
378
379 declare i32 @llvm.hexagon.M2.mpy.ll.s0(i32, i32)
380 define i32 @M2_mpy_ll_s0(i32 %a, i32 %b) {
381   %z = call i32 @llvm.hexagon.M2.mpy.ll.s0(i32 %a, i32 %b)
382   ret i32 %z
383 }
384 ; CHECK: r0 = mpy(r0.l, r1.l)
385
386 declare i32 @llvm.hexagon.M2.mpy.ll.s1(i32, i32)
387 define i32 @M2_mpy_ll_s1(i32 %a, i32 %b) {
388   %z = call i32 @llvm.hexagon.M2.mpy.ll.s1(i32 %a, i32 %b)
389   ret i32 %z
390 }
391 ; CHECK: r0 = mpy(r0.l, r1.l):<<1
392
393 declare i32 @llvm.hexagon.M2.mpy.lh.s0(i32, i32)
394 define i32 @M2_mpy_lh_s0(i32 %a, i32 %b) {
395   %z = call i32 @llvm.hexagon.M2.mpy.lh.s0(i32 %a, i32 %b)
396   ret i32 %z
397 }
398 ; CHECK: r0 = mpy(r0.l, r1.h)
399
400 declare i32 @llvm.hexagon.M2.mpy.lh.s1(i32, i32)
401 define i32 @M2_mpy_lh_s1(i32 %a, i32 %b) {
402   %z = call i32 @llvm.hexagon.M2.mpy.lh.s1(i32 %a, i32 %b)
403   ret i32 %z
404 }
405 ; CHECK: r0 = mpy(r0.l, r1.h):<<1
406
407 declare i32 @llvm.hexagon.M2.mpy.hl.s0(i32, i32)
408 define i32 @M2_mpy_hl_s0(i32 %a, i32 %b) {
409   %z = call i32 @llvm.hexagon.M2.mpy.hl.s0(i32 %a, i32 %b)
410   ret i32 %z
411 }
412 ; CHECK: r0 = mpy(r0.h, r1.l)
413
414 declare i32 @llvm.hexagon.M2.mpy.hl.s1(i32, i32)
415 define i32 @M2_mpy_hl_s1(i32 %a, i32 %b) {
416   %z = call i32 @llvm.hexagon.M2.mpy.hl.s1(i32 %a, i32 %b)
417   ret i32 %z
418 }
419 ; CHECK: r0 = mpy(r0.h, r1.l):<<1
420
421 declare i32 @llvm.hexagon.M2.mpy.hh.s0(i32, i32)
422 define i32 @M2_mpy_hh_s0(i32 %a, i32 %b) {
423   %z = call i32 @llvm.hexagon.M2.mpy.hh.s0(i32 %a, i32 %b)
424   ret i32 %z
425 }
426 ; CHECK: r0 = mpy(r0.h, r1.h)
427
428 declare i32 @llvm.hexagon.M2.mpy.hh.s1(i32, i32)
429 define i32 @M2_mpy_hh_s1(i32 %a, i32 %b) {
430   %z = call i32 @llvm.hexagon.M2.mpy.hh.s1(i32 %a, i32 %b)
431   ret i32 %z
432 }
433 ; CHECK: r0 = mpy(r0.h, r1.h):<<1
434
435 declare i32 @llvm.hexagon.M2.mpy.sat.ll.s0(i32, i32)
436 define i32 @M2_mpy_sat_ll_s0(i32 %a, i32 %b) {
437   %z = call i32 @llvm.hexagon.M2.mpy.sat.ll.s0(i32 %a, i32 %b)
438   ret i32 %z
439 }
440 ; CHECK: r0 = mpy(r0.l, r1.l):sat
441
442 declare i32 @llvm.hexagon.M2.mpy.sat.ll.s1(i32, i32)
443 define i32 @M2_mpy_sat_ll_s1(i32 %a, i32 %b) {
444   %z = call i32 @llvm.hexagon.M2.mpy.sat.ll.s1(i32 %a, i32 %b)
445   ret i32 %z
446 }
447 ; CHECK: r0 = mpy(r0.l, r1.l):<<1:sat
448
449 declare i32 @llvm.hexagon.M2.mpy.sat.lh.s0(i32, i32)
450 define i32 @M2_mpy_sat_lh_s0(i32 %a, i32 %b) {
451   %z = call i32 @llvm.hexagon.M2.mpy.sat.lh.s0(i32 %a, i32 %b)
452   ret i32 %z
453 }
454 ; CHECK: r0 = mpy(r0.l, r1.h):sat
455
456 declare i32 @llvm.hexagon.M2.mpy.sat.lh.s1(i32, i32)
457 define i32 @M2_mpy_sat_lh_s1(i32 %a, i32 %b) {
458   %z = call i32 @llvm.hexagon.M2.mpy.sat.lh.s1(i32 %a, i32 %b)
459   ret i32 %z
460 }
461 ; CHECK: r0 = mpy(r0.l, r1.h):<<1:sat
462
463 declare i32 @llvm.hexagon.M2.mpy.sat.hl.s0(i32, i32)
464 define i32 @M2_mpy_sat_hl_s0(i32 %a, i32 %b) {
465   %z = call i32 @llvm.hexagon.M2.mpy.sat.hl.s0(i32 %a, i32 %b)
466   ret i32 %z
467 }
468 ; CHECK: r0 = mpy(r0.h, r1.l):sat
469
470 declare i32 @llvm.hexagon.M2.mpy.sat.hl.s1(i32, i32)
471 define i32 @M2_mpy_sat_hl_s1(i32 %a, i32 %b) {
472   %z = call i32 @llvm.hexagon.M2.mpy.sat.hl.s1(i32 %a, i32 %b)
473   ret i32 %z
474 }
475 ; CHECK: r0 = mpy(r0.h, r1.l):<<1:sat
476
477 declare i32 @llvm.hexagon.M2.mpy.sat.hh.s0(i32, i32)
478 define i32 @M2_mpy_sat_hh_s0(i32 %a, i32 %b) {
479   %z = call i32 @llvm.hexagon.M2.mpy.sat.hh.s0(i32 %a, i32 %b)
480   ret i32 %z
481 }
482 ; CHECK: r0 = mpy(r0.h, r1.h):sat
483
484 declare i32 @llvm.hexagon.M2.mpy.sat.hh.s1(i32, i32)
485 define i32 @M2_mpy_sat_hh_s1(i32 %a, i32 %b) {
486   %z = call i32 @llvm.hexagon.M2.mpy.sat.hh.s1(i32 %a, i32 %b)
487   ret i32 %z
488 }
489 ; CHECK: r0 = mpy(r0.h, r1.h):<<1:sat
490
491 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.ll.s0(i32, i32)
492 define i32 @M2_mpy_sat_rnd_ll_s0(i32 %a, i32 %b) {
493   %z = call i32 @llvm.hexagon.M2.mpy.sat.rnd.ll.s0(i32 %a, i32 %b)
494   ret i32 %z
495 }
496 ; CHECK: r0 = mpy(r0.l, r1.l):rnd:sat
497
498 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.ll.s1(i32, i32)
499 define i32 @M2_mpy_sat_rnd_ll_s1(i32 %a, i32 %b) {
500   %z = call i32 @llvm.hexagon.M2.mpy.sat.rnd.ll.s1(i32 %a, i32 %b)
501   ret i32 %z
502 }
503 ; CHECK: r0 = mpy(r0.l, r1.l):<<1:rnd:sat
504
505 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.lh.s0(i32, i32)
506 define i32 @M2_mpy_sat_rnd_lh_s0(i32 %a, i32 %b) {
507   %z = call i32 @llvm.hexagon.M2.mpy.sat.rnd.lh.s0(i32 %a, i32 %b)
508   ret i32 %z
509 }
510 ; CHECK: r0 = mpy(r0.l, r1.h):rnd:sat
511
512 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.lh.s1(i32, i32)
513 define i32 @M2_mpy_sat_rnd_lh_s1(i32 %a, i32 %b) {
514   %z = call i32 @llvm.hexagon.M2.mpy.sat.rnd.lh.s1(i32 %a, i32 %b)
515   ret i32 %z
516 }
517 ; CHECK: r0 = mpy(r0.l, r1.h):<<1:rnd:sat
518
519 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.hl.s0(i32, i32)
520 define i32 @M2_mpy_sat_rnd_hl_s0(i32 %a, i32 %b) {
521   %z = call i32 @llvm.hexagon.M2.mpy.sat.rnd.hl.s0(i32 %a, i32 %b)
522   ret i32 %z
523 }
524 ; CHECK: r0 = mpy(r0.h, r1.l):rnd:sat
525
526 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.hl.s1(i32, i32)
527 define i32 @M2_mpy_sat_rnd_hl_s1(i32 %a, i32 %b) {
528   %z = call i32 @llvm.hexagon.M2.mpy.sat.rnd.hl.s1(i32 %a, i32 %b)
529   ret i32 %z
530 }
531 ; CHECK: r0 = mpy(r0.h, r1.l):<<1:rnd:sat
532
533 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.hh.s0(i32, i32)
534 define i32 @M2_mpy_sat_rnd_hh_s0(i32 %a, i32 %b) {
535   %z = call i32 @llvm.hexagon.M2.mpy.sat.rnd.hh.s0(i32 %a, i32 %b)
536   ret i32 %z
537 }
538 ; CHECK: r0 = mpy(r0.h, r1.h):rnd:sat
539
540 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.hh.s1(i32, i32)
541 define i32 @M2_mpy_sat_rnd_hh_s1(i32 %a, i32 %b) {
542   %z = call i32 @llvm.hexagon.M2.mpy.sat.rnd.hh.s1(i32 %a, i32 %b)
543   ret i32 %z
544 }
545 ; CHECK: r0 = mpy(r0.h, r1.h):<<1:rnd:sat
546
547 declare i32 @llvm.hexagon.M2.mpy.acc.ll.s0(i32, i32, i32)
548 define i32 @M2_mpy_acc_ll_s0(i32 %a, i32 %b, i32 %c) {
549   %z = call i32 @llvm.hexagon.M2.mpy.acc.ll.s0(i32 %a, i32 %b, i32 %c)
550   ret i32 %z
551 }
552 ; CHECK: r0 += mpy(r1.l, r2.l)
553
554 declare i32 @llvm.hexagon.M2.mpy.acc.ll.s1(i32, i32, i32)
555 define i32 @M2_mpy_acc_ll_s1(i32 %a, i32 %b, i32 %c) {
556   %z = call i32 @llvm.hexagon.M2.mpy.acc.ll.s1(i32 %a, i32 %b, i32 %c)
557   ret i32 %z
558 }
559 ; CHECK: r0 += mpy(r1.l, r2.l):<<1
560
561 declare i32 @llvm.hexagon.M2.mpy.acc.lh.s0(i32, i32, i32)
562 define i32 @M2_mpy_acc_lh_s0(i32 %a, i32 %b, i32 %c) {
563   %z = call i32 @llvm.hexagon.M2.mpy.acc.lh.s0(i32 %a, i32 %b, i32 %c)
564   ret i32 %z
565 }
566 ; CHECK: r0 += mpy(r1.l, r2.h)
567
568 declare i32 @llvm.hexagon.M2.mpy.acc.lh.s1(i32, i32, i32)
569 define i32 @M2_mpy_acc_lh_s1(i32 %a, i32 %b, i32 %c) {
570   %z = call i32 @llvm.hexagon.M2.mpy.acc.lh.s1(i32 %a, i32 %b, i32 %c)
571   ret i32 %z
572 }
573 ; CHECK: r0 += mpy(r1.l, r2.h):<<1
574
575 declare i32 @llvm.hexagon.M2.mpy.acc.hl.s0(i32, i32, i32)
576 define i32 @M2_mpy_acc_hl_s0(i32 %a, i32 %b, i32 %c) {
577   %z = call i32 @llvm.hexagon.M2.mpy.acc.hl.s0(i32 %a, i32 %b, i32 %c)
578   ret i32 %z
579 }
580 ; CHECK: r0 += mpy(r1.h, r2.l)
581
582 declare i32 @llvm.hexagon.M2.mpy.acc.hl.s1(i32, i32, i32)
583 define i32 @M2_mpy_acc_hl_s1(i32 %a, i32 %b, i32 %c) {
584   %z = call i32 @llvm.hexagon.M2.mpy.acc.hl.s1(i32 %a, i32 %b, i32 %c)
585   ret i32 %z
586 }
587 ; CHECK: r0 += mpy(r1.h, r2.l):<<1
588
589 declare i32 @llvm.hexagon.M2.mpy.acc.hh.s0(i32, i32, i32)
590 define i32 @M2_mpy_acc_hh_s0(i32 %a, i32 %b, i32 %c) {
591   %z = call i32 @llvm.hexagon.M2.mpy.acc.hh.s0(i32 %a, i32 %b, i32 %c)
592   ret i32 %z
593 }
594 ; CHECK: r0 += mpy(r1.h, r2.h)
595
596 declare i32 @llvm.hexagon.M2.mpy.acc.hh.s1(i32, i32, i32)
597 define i32 @M2_mpy_acc_hh_s1(i32 %a, i32 %b, i32 %c) {
598   %z = call i32 @llvm.hexagon.M2.mpy.acc.hh.s1(i32 %a, i32 %b, i32 %c)
599   ret i32 %z
600 }
601 ; CHECK: r0 += mpy(r1.h, r2.h):<<1
602
603 declare i32 @llvm.hexagon.M2.mpy.acc.sat.ll.s0(i32, i32, i32)
604 define i32 @M2_mpy_acc_sat_ll_s0(i32 %a, i32 %b, i32 %c) {
605   %z = call i32 @llvm.hexagon.M2.mpy.acc.sat.ll.s0(i32 %a, i32 %b, i32 %c)
606   ret i32 %z
607 }
608 ; CHECK: r0 += mpy(r1.l, r2.l):sat
609
610 declare i32 @llvm.hexagon.M2.mpy.acc.sat.ll.s1(i32, i32, i32)
611 define i32 @M2_mpy_acc_sat_ll_s1(i32 %a, i32 %b, i32 %c) {
612   %z = call i32 @llvm.hexagon.M2.mpy.acc.sat.ll.s1(i32 %a, i32 %b, i32 %c)
613   ret i32 %z
614 }
615 ; CHECK: r0 += mpy(r1.l, r2.l):<<1:sat
616
617 declare i32 @llvm.hexagon.M2.mpy.acc.sat.lh.s0(i32, i32, i32)
618 define i32 @M2_mpy_acc_sat_lh_s0(i32 %a, i32 %b, i32 %c) {
619   %z = call i32 @llvm.hexagon.M2.mpy.acc.sat.lh.s0(i32 %a, i32 %b, i32 %c)
620   ret i32 %z
621 }
622 ; CHECK: r0 += mpy(r1.l, r2.h):sat
623
624 declare i32 @llvm.hexagon.M2.mpy.acc.sat.lh.s1(i32, i32, i32)
625 define i32 @M2_mpy_acc_sat_lh_s1(i32 %a, i32 %b, i32 %c) {
626   %z = call i32 @llvm.hexagon.M2.mpy.acc.sat.lh.s1(i32 %a, i32 %b, i32 %c)
627   ret i32 %z
628 }
629 ; CHECK: r0 += mpy(r1.l, r2.h):<<1:sat
630
631 declare i32 @llvm.hexagon.M2.mpy.acc.sat.hl.s0(i32, i32, i32)
632 define i32 @M2_mpy_acc_sat_hl_s0(i32 %a, i32 %b, i32 %c) {
633   %z = call i32 @llvm.hexagon.M2.mpy.acc.sat.hl.s0(i32 %a, i32 %b, i32 %c)
634   ret i32 %z
635 }
636 ; CHECK: r0 += mpy(r1.h, r2.l):sat
637
638 declare i32 @llvm.hexagon.M2.mpy.acc.sat.hl.s1(i32, i32, i32)
639 define i32 @M2_mpy_acc_sat_hl_s1(i32 %a, i32 %b, i32 %c) {
640   %z = call i32 @llvm.hexagon.M2.mpy.acc.sat.hl.s1(i32 %a, i32 %b, i32 %c)
641   ret i32 %z
642 }
643 ; CHECK: r0 += mpy(r1.h, r2.l):<<1:sat
644
645 declare i32 @llvm.hexagon.M2.mpy.acc.sat.hh.s0(i32, i32, i32)
646 define i32 @M2_mpy_acc_sat_hh_s0(i32 %a, i32 %b, i32 %c) {
647   %z = call i32 @llvm.hexagon.M2.mpy.acc.sat.hh.s0(i32 %a, i32 %b, i32 %c)
648   ret i32 %z
649 }
650 ; CHECK: r0 += mpy(r1.h, r2.h):sat
651
652 declare i32 @llvm.hexagon.M2.mpy.acc.sat.hh.s1(i32, i32, i32)
653 define i32 @M2_mpy_acc_sat_hh_s1(i32 %a, i32 %b, i32 %c) {
654   %z = call i32 @llvm.hexagon.M2.mpy.acc.sat.hh.s1(i32 %a, i32 %b, i32 %c)
655   ret i32 %z
656 }
657 ; CHECK: r0 += mpy(r1.h, r2.h):<<1:sat
658
659 declare i32 @llvm.hexagon.M2.mpy.nac.ll.s0(i32, i32, i32)
660 define i32 @M2_mpy_nac_ll_s0(i32 %a, i32 %b, i32 %c) {
661   %z = call i32 @llvm.hexagon.M2.mpy.nac.ll.s0(i32 %a, i32 %b, i32 %c)
662   ret i32 %z
663 }
664 ; CHECK: r0 -= mpy(r1.l, r2.l)
665
666 declare i32 @llvm.hexagon.M2.mpy.nac.ll.s1(i32, i32, i32)
667 define i32 @M2_mpy_nac_ll_s1(i32 %a, i32 %b, i32 %c) {
668   %z = call i32 @llvm.hexagon.M2.mpy.nac.ll.s1(i32 %a, i32 %b, i32 %c)
669   ret i32 %z
670 }
671 ; CHECK: r0 -= mpy(r1.l, r2.l):<<1
672
673 declare i32 @llvm.hexagon.M2.mpy.nac.lh.s0(i32, i32, i32)
674 define i32 @M2_mpy_nac_lh_s0(i32 %a, i32 %b, i32 %c) {
675   %z = call i32 @llvm.hexagon.M2.mpy.nac.lh.s0(i32 %a, i32 %b, i32 %c)
676   ret i32 %z
677 }
678 ; CHECK: r0 -= mpy(r1.l, r2.h)
679
680 declare i32 @llvm.hexagon.M2.mpy.nac.lh.s1(i32, i32, i32)
681 define i32 @M2_mpy_nac_lh_s1(i32 %a, i32 %b, i32 %c) {
682   %z = call i32 @llvm.hexagon.M2.mpy.nac.lh.s1(i32 %a, i32 %b, i32 %c)
683   ret i32 %z
684 }
685 ; CHECK: r0 -= mpy(r1.l, r2.h):<<1
686
687 declare i32 @llvm.hexagon.M2.mpy.nac.hl.s0(i32, i32, i32)
688 define i32 @M2_mpy_nac_hl_s0(i32 %a, i32 %b, i32 %c) {
689   %z = call i32 @llvm.hexagon.M2.mpy.nac.hl.s0(i32 %a, i32 %b, i32 %c)
690   ret i32 %z
691 }
692 ; CHECK: r0 -= mpy(r1.h, r2.l)
693
694 declare i32 @llvm.hexagon.M2.mpy.nac.hl.s1(i32, i32, i32)
695 define i32 @M2_mpy_nac_hl_s1(i32 %a, i32 %b, i32 %c) {
696   %z = call i32 @llvm.hexagon.M2.mpy.nac.hl.s1(i32 %a, i32 %b, i32 %c)
697   ret i32 %z
698 }
699 ; CHECK: r0 -= mpy(r1.h, r2.l):<<1
700
701 declare i32 @llvm.hexagon.M2.mpy.nac.hh.s0(i32, i32, i32)
702 define i32 @M2_mpy_nac_hh_s0(i32 %a, i32 %b, i32 %c) {
703   %z = call i32 @llvm.hexagon.M2.mpy.nac.hh.s0(i32 %a, i32 %b, i32 %c)
704   ret i32 %z
705 }
706 ; CHECK: r0 -= mpy(r1.h, r2.h)
707
708 declare i32 @llvm.hexagon.M2.mpy.nac.hh.s1(i32, i32, i32)
709 define i32 @M2_mpy_nac_hh_s1(i32 %a, i32 %b, i32 %c) {
710   %z = call i32 @llvm.hexagon.M2.mpy.nac.hh.s1(i32 %a, i32 %b, i32 %c)
711   ret i32 %z
712 }
713 ; CHECK: r0 -= mpy(r1.h, r2.h):<<1
714
715 declare i32 @llvm.hexagon.M2.mpy.nac.sat.ll.s0(i32, i32, i32)
716 define i32 @M2_mpy_nac_sat_ll_s0(i32 %a, i32 %b, i32 %c) {
717   %z = call i32 @llvm.hexagon.M2.mpy.nac.sat.ll.s0(i32 %a, i32 %b, i32 %c)
718   ret i32 %z
719 }
720 ; CHECK: r0 -= mpy(r1.l, r2.l):sat
721
722 declare i32 @llvm.hexagon.M2.mpy.nac.sat.ll.s1(i32, i32, i32)
723 define i32 @M2_mpy_nac_sat_ll_s1(i32 %a, i32 %b, i32 %c) {
724   %z = call i32 @llvm.hexagon.M2.mpy.nac.sat.ll.s1(i32 %a, i32 %b, i32 %c)
725   ret i32 %z
726 }
727 ; CHECK: r0 -= mpy(r1.l, r2.l):<<1:sat
728
729 declare i32 @llvm.hexagon.M2.mpy.nac.sat.lh.s0(i32, i32, i32)
730 define i32 @M2_mpy_nac_sat_lh_s0(i32 %a, i32 %b, i32 %c) {
731   %z = call i32 @llvm.hexagon.M2.mpy.nac.sat.lh.s0(i32 %a, i32 %b, i32 %c)
732   ret i32 %z
733 }
734 ; CHECK: r0 -= mpy(r1.l, r2.h):sat
735
736 declare i32 @llvm.hexagon.M2.mpy.nac.sat.lh.s1(i32, i32, i32)
737 define i32 @M2_mpy_nac_sat_lh_s1(i32 %a, i32 %b, i32 %c) {
738   %z = call i32 @llvm.hexagon.M2.mpy.nac.sat.lh.s1(i32 %a, i32 %b, i32 %c)
739   ret i32 %z
740 }
741 ; CHECK: r0 -= mpy(r1.l, r2.h):<<1:sat
742
743 declare i32 @llvm.hexagon.M2.mpy.nac.sat.hl.s0(i32, i32, i32)
744 define i32 @M2_mpy_nac_sat_hl_s0(i32 %a, i32 %b, i32 %c) {
745   %z = call i32 @llvm.hexagon.M2.mpy.nac.sat.hl.s0(i32 %a, i32 %b, i32 %c)
746   ret i32 %z
747 }
748 ; CHECK: r0 -= mpy(r1.h, r2.l):sat
749
750 declare i32 @llvm.hexagon.M2.mpy.nac.sat.hl.s1(i32, i32, i32)
751 define i32 @M2_mpy_nac_sat_hl_s1(i32 %a, i32 %b, i32 %c) {
752   %z = call i32 @llvm.hexagon.M2.mpy.nac.sat.hl.s1(i32 %a, i32 %b, i32 %c)
753   ret i32 %z
754 }
755 ; CHECK: r0 -= mpy(r1.h, r2.l):<<1:sat
756
757 declare i32 @llvm.hexagon.M2.mpy.nac.sat.hh.s0(i32, i32, i32)
758 define i32 @M2_mpy_nac_sat_hh_s0(i32 %a, i32 %b, i32 %c) {
759   %z = call i32 @llvm.hexagon.M2.mpy.nac.sat.hh.s0(i32 %a, i32 %b, i32 %c)
760   ret i32 %z
761 }
762 ; CHECK: r0 -= mpy(r1.h, r2.h):sat
763
764 declare i32 @llvm.hexagon.M2.mpy.nac.sat.hh.s1(i32, i32, i32)
765 define i32 @M2_mpy_nac_sat_hh_s1(i32 %a, i32 %b, i32 %c) {
766   %z = call i32 @llvm.hexagon.M2.mpy.nac.sat.hh.s1(i32 %a, i32 %b, i32 %c)
767   ret i32 %z
768 }
769 ; CHECK: r0 -= mpy(r1.h, r2.h):<<1:sat
770
771 ; Multiply unsigned halfwords
772 declare i64 @llvm.hexagon.M2.mpyud.ll.s0(i32, i32)
773 define i64 @M2_mpyud_ll_s0(i32 %a, i32 %b) {
774   %z = call i64 @llvm.hexagon.M2.mpyud.ll.s0(i32 %a, i32 %b)
775   ret i64 %z
776 }
777 ; CHECK: r1:0 = mpyu(r0.l, r1.l)
778
779 declare i64 @llvm.hexagon.M2.mpyud.ll.s1(i32, i32)
780 define i64 @M2_mpyud_ll_s1(i32 %a, i32 %b) {
781   %z = call i64 @llvm.hexagon.M2.mpyud.ll.s1(i32 %a, i32 %b)
782   ret i64 %z
783 }
784 ; CHECK: r1:0 = mpyu(r0.l, r1.l):<<1
785
786 declare i64 @llvm.hexagon.M2.mpyud.lh.s0(i32, i32)
787 define i64 @M2_mpyud_lh_s0(i32 %a, i32 %b) {
788   %z = call i64 @llvm.hexagon.M2.mpyud.lh.s0(i32 %a, i32 %b)
789   ret i64 %z
790 }
791 ; CHECK: r1:0 = mpyu(r0.l, r1.h)
792
793 declare i64 @llvm.hexagon.M2.mpyud.lh.s1(i32, i32)
794 define i64 @M2_mpyud_lh_s1(i32 %a, i32 %b) {
795   %z = call i64 @llvm.hexagon.M2.mpyud.lh.s1(i32 %a, i32 %b)
796   ret i64 %z
797 }
798 ; CHECK: r1:0 = mpyu(r0.l, r1.h):<<1
799
800 declare i64 @llvm.hexagon.M2.mpyud.hl.s0(i32, i32)
801 define i64 @M2_mpyud_hl_s0(i32 %a, i32 %b) {
802   %z = call i64 @llvm.hexagon.M2.mpyud.hl.s0(i32 %a, i32 %b)
803   ret i64 %z
804 }
805 ; CHECK: r1:0 = mpyu(r0.h, r1.l)
806
807 declare i64 @llvm.hexagon.M2.mpyud.hl.s1(i32, i32)
808 define i64 @M2_mpyud_hl_s1(i32 %a, i32 %b) {
809   %z = call i64 @llvm.hexagon.M2.mpyud.hl.s1(i32 %a, i32 %b)
810   ret i64 %z
811 }
812 ; CHECK: r1:0 = mpyu(r0.h, r1.l):<<1
813
814 declare i64 @llvm.hexagon.M2.mpyud.hh.s0(i32, i32)
815 define i64 @M2_mpyud_hh_s0(i32 %a, i32 %b) {
816   %z = call i64 @llvm.hexagon.M2.mpyud.hh.s0(i32 %a, i32 %b)
817   ret i64 %z
818 }
819 ; CHECK: r1:0 = mpyu(r0.h, r1.h)
820
821 declare i64 @llvm.hexagon.M2.mpyud.hh.s1(i32, i32)
822 define i64 @M2_mpyud_hh_s1(i32 %a, i32 %b) {
823   %z = call i64 @llvm.hexagon.M2.mpyud.hh.s1(i32 %a, i32 %b)
824   ret i64 %z
825 }
826 ; CHECK: r1:0 = mpyu(r0.h, r1.h):<<1
827
828 declare i64 @llvm.hexagon.M2.mpyud.acc.ll.s0(i64, i32, i32)
829 define i64 @M2_mpyud_acc_ll_s0(i64 %a, i32 %b, i32 %c) {
830   %z = call i64 @llvm.hexagon.M2.mpyud.acc.ll.s0(i64 %a, i32 %b, i32 %c)
831   ret i64 %z
832 }
833 ; CHECK: r1:0 += mpyu(r2.l, r3.l)
834
835 declare i64 @llvm.hexagon.M2.mpyud.acc.ll.s1(i64, i32, i32)
836 define i64 @M2_mpyud_acc_ll_s1(i64 %a, i32 %b, i32 %c) {
837   %z = call i64 @llvm.hexagon.M2.mpyud.acc.ll.s1(i64 %a, i32 %b, i32 %c)
838   ret i64 %z
839 }
840 ; CHECK: r1:0 += mpyu(r2.l, r3.l):<<1
841
842 declare i64 @llvm.hexagon.M2.mpyud.acc.lh.s0(i64, i32, i32)
843 define i64 @M2_mpyud_acc_lh_s0(i64 %a, i32 %b, i32 %c) {
844   %z = call i64 @llvm.hexagon.M2.mpyud.acc.lh.s0(i64 %a, i32 %b, i32 %c)
845   ret i64 %z
846 }
847 ; CHECK: r1:0 += mpyu(r2.l, r3.h)
848
849 declare i64 @llvm.hexagon.M2.mpyud.acc.lh.s1(i64, i32, i32)
850 define i64 @M2_mpyud_acc_lh_s1(i64 %a, i32 %b, i32 %c) {
851   %z = call i64 @llvm.hexagon.M2.mpyud.acc.lh.s1(i64 %a, i32 %b, i32 %c)
852   ret i64 %z
853 }
854 ; CHECK: r1:0 += mpyu(r2.l, r3.h):<<1
855
856 declare i64 @llvm.hexagon.M2.mpyud.acc.hl.s0(i64, i32, i32)
857 define i64 @M2_mpyud_acc_hl_s0(i64 %a, i32 %b, i32 %c) {
858   %z = call i64 @llvm.hexagon.M2.mpyud.acc.hl.s0(i64 %a, i32 %b, i32 %c)
859   ret i64 %z
860 }
861 ; CHECK: r1:0 += mpyu(r2.h, r3.l)
862
863 declare i64 @llvm.hexagon.M2.mpyud.acc.hl.s1(i64, i32, i32)
864 define i64 @M2_mpyud_acc_hl_s1(i64 %a, i32 %b, i32 %c) {
865   %z = call i64 @llvm.hexagon.M2.mpyud.acc.hl.s1(i64 %a, i32 %b, i32 %c)
866   ret i64 %z
867 }
868 ; CHECK: r1:0 += mpyu(r2.h, r3.l):<<1
869
870 declare i64 @llvm.hexagon.M2.mpyud.acc.hh.s0(i64, i32, i32)
871 define i64 @M2_mpyud_acc_hh_s0(i64 %a, i32 %b, i32 %c) {
872   %z = call i64 @llvm.hexagon.M2.mpyud.acc.hh.s0(i64 %a, i32 %b, i32 %c)
873   ret i64 %z
874 }
875 ; CHECK: r1:0 += mpyu(r2.h, r3.h)
876
877 declare i64 @llvm.hexagon.M2.mpyud.acc.hh.s1(i64, i32, i32)
878 define i64 @M2_mpyud_acc_hh_s1(i64 %a, i32 %b, i32 %c) {
879   %z = call i64 @llvm.hexagon.M2.mpyud.acc.hh.s1(i64 %a, i32 %b, i32 %c)
880   ret i64 %z
881 }
882 ; CHECK: r1:0 += mpyu(r2.h, r3.h):<<1
883
884 declare i64 @llvm.hexagon.M2.mpyud.nac.ll.s0(i64, i32, i32)
885 define i64 @M2_mpyud_nac_ll_s0(i64 %a, i32 %b, i32 %c) {
886   %z = call i64 @llvm.hexagon.M2.mpyud.nac.ll.s0(i64 %a, i32 %b, i32 %c)
887   ret i64 %z
888 }
889 ; CHECK: r1:0 -= mpyu(r2.l, r3.l)
890
891 declare i64 @llvm.hexagon.M2.mpyud.nac.ll.s1(i64, i32, i32)
892 define i64 @M2_mpyud_nac_ll_s1(i64 %a, i32 %b, i32 %c) {
893   %z = call i64 @llvm.hexagon.M2.mpyud.nac.ll.s1(i64 %a, i32 %b, i32 %c)
894   ret i64 %z
895 }
896 ; CHECK: r1:0 -= mpyu(r2.l, r3.l):<<1
897
898 declare i64 @llvm.hexagon.M2.mpyud.nac.lh.s0(i64, i32, i32)
899 define i64 @M2_mpyud_nac_lh_s0(i64 %a, i32 %b, i32 %c) {
900   %z = call i64 @llvm.hexagon.M2.mpyud.nac.lh.s0(i64 %a, i32 %b, i32 %c)
901   ret i64 %z
902 }
903 ; CHECK: r1:0 -= mpyu(r2.l, r3.h)
904
905 declare i64 @llvm.hexagon.M2.mpyud.nac.lh.s1(i64, i32, i32)
906 define i64 @M2_mpyud_nac_lh_s1(i64 %a, i32 %b, i32 %c) {
907   %z = call i64 @llvm.hexagon.M2.mpyud.nac.lh.s1(i64 %a, i32 %b, i32 %c)
908   ret i64 %z
909 }
910 ; CHECK: r1:0 -= mpyu(r2.l, r3.h):<<1
911
912 declare i64 @llvm.hexagon.M2.mpyud.nac.hl.s0(i64, i32, i32)
913 define i64 @M2_mpyud_nac_hl_s0(i64 %a, i32 %b, i32 %c) {
914   %z = call i64 @llvm.hexagon.M2.mpyud.nac.hl.s0(i64 %a, i32 %b, i32 %c)
915   ret i64 %z
916 }
917 ; CHECK: r1:0 -= mpyu(r2.h, r3.l)
918
919 declare i64 @llvm.hexagon.M2.mpyud.nac.hl.s1(i64, i32, i32)
920 define i64 @M2_mpyud_nac_hl_s1(i64 %a, i32 %b, i32 %c) {
921   %z = call i64 @llvm.hexagon.M2.mpyud.nac.hl.s1(i64 %a, i32 %b, i32 %c)
922   ret i64 %z
923 }
924 ; CHECK: r1:0 -= mpyu(r2.h, r3.l):<<1
925
926 declare i64 @llvm.hexagon.M2.mpyud.nac.hh.s0(i64, i32, i32)
927 define i64 @M2_mpyud_nac_hh_s0(i64 %a, i32 %b, i32 %c) {
928   %z = call i64 @llvm.hexagon.M2.mpyud.nac.hh.s0(i64 %a, i32 %b, i32 %c)
929   ret i64 %z
930 }
931 ; CHECK: r1:0 -= mpyu(r2.h, r3.h)
932
933 declare i64 @llvm.hexagon.M2.mpyud.nac.hh.s1(i64, i32, i32)
934 define i64 @M2_mpyud_nac_hh_s1(i64 %a, i32 %b, i32 %c) {
935   %z = call i64 @llvm.hexagon.M2.mpyud.nac.hh.s1(i64 %a, i32 %b, i32 %c)
936   ret i64 %z
937 }
938 ; CHECK: r1:0 -= mpyu(r2.h, r3.h):<<1
939
940 declare i32 @llvm.hexagon.M2.mpyu.ll.s0(i32, i32)
941 define i32 @M2_mpyu_ll_s0(i32 %a, i32 %b) {
942   %z = call i32 @llvm.hexagon.M2.mpyu.ll.s0(i32 %a, i32 %b)
943   ret i32 %z
944 }
945 ; CHECK: r0 = mpyu(r0.l, r1.l)
946
947 declare i32 @llvm.hexagon.M2.mpyu.ll.s1(i32, i32)
948 define i32 @M2_mpyu_ll_s1(i32 %a, i32 %b) {
949   %z = call i32 @llvm.hexagon.M2.mpyu.ll.s1(i32 %a, i32 %b)
950   ret i32 %z
951 }
952 ; CHECK: r0 = mpyu(r0.l, r1.l):<<1
953
954 declare i32 @llvm.hexagon.M2.mpyu.lh.s0(i32, i32)
955 define i32 @M2_mpyu_lh_s0(i32 %a, i32 %b) {
956   %z = call i32 @llvm.hexagon.M2.mpyu.lh.s0(i32 %a, i32 %b)
957   ret i32 %z
958 }
959 ; CHECK: r0 = mpyu(r0.l, r1.h)
960
961 declare i32 @llvm.hexagon.M2.mpyu.lh.s1(i32, i32)
962 define i32 @M2_mpyu_lh_s1(i32 %a, i32 %b) {
963   %z = call i32 @llvm.hexagon.M2.mpyu.lh.s1(i32 %a, i32 %b)
964   ret i32 %z
965 }
966 ; CHECK: r0 = mpyu(r0.l, r1.h):<<1
967
968 declare i32 @llvm.hexagon.M2.mpyu.hl.s0(i32, i32)
969 define i32 @M2_mpyu_hl_s0(i32 %a, i32 %b) {
970   %z = call i32 @llvm.hexagon.M2.mpyu.hl.s0(i32 %a, i32 %b)
971   ret i32 %z
972 }
973 ; CHECK: r0 = mpyu(r0.h, r1.l)
974
975 declare i32 @llvm.hexagon.M2.mpyu.hl.s1(i32, i32)
976 define i32 @M2_mpyu_hl_s1(i32 %a, i32 %b) {
977   %z = call i32 @llvm.hexagon.M2.mpyu.hl.s1(i32 %a, i32 %b)
978   ret i32 %z
979 }
980 ; CHECK: r0 = mpyu(r0.h, r1.l):<<1
981
982 declare i32 @llvm.hexagon.M2.mpyu.hh.s0(i32, i32)
983 define i32 @M2_mpyu_hh_s0(i32 %a, i32 %b) {
984   %z = call i32 @llvm.hexagon.M2.mpyu.hh.s0(i32 %a, i32 %b)
985   ret i32 %z
986 }
987 ; CHECK: r0 = mpyu(r0.h, r1.h)
988
989 declare i32 @llvm.hexagon.M2.mpyu.hh.s1(i32, i32)
990 define i32 @M2_mpyu_hh_s1(i32 %a, i32 %b) {
991   %z = call i32 @llvm.hexagon.M2.mpyu.hh.s1(i32 %a, i32 %b)
992   ret i32 %z
993 }
994 ; CHECK: r0 = mpyu(r0.h, r1.h):<<1
995
996 declare i32 @llvm.hexagon.M2.mpyu.acc.ll.s0(i32, i32, i32)
997 define i32 @M2_mpyu_acc_ll_s0(i32 %a, i32 %b, i32 %c) {
998   %z = call i32 @llvm.hexagon.M2.mpyu.acc.ll.s0(i32 %a, i32 %b, i32 %c)
999   ret i32 %z
1000 }
1001 ; CHECK: r0 += mpyu(r1.l, r2.l)
1002
1003 declare i32 @llvm.hexagon.M2.mpyu.acc.ll.s1(i32, i32, i32)
1004 define i32 @M2_mpyu_acc_ll_s1(i32 %a, i32 %b, i32 %c) {
1005   %z = call i32 @llvm.hexagon.M2.mpyu.acc.ll.s1(i32 %a, i32 %b, i32 %c)
1006   ret i32 %z
1007 }
1008 ; CHECK: r0 += mpyu(r1.l, r2.l):<<1
1009
1010 declare i32 @llvm.hexagon.M2.mpyu.acc.lh.s0(i32, i32, i32)
1011 define i32 @M2_mpyu_acc_lh_s0(i32 %a, i32 %b, i32 %c) {
1012   %z = call i32 @llvm.hexagon.M2.mpyu.acc.lh.s0(i32 %a, i32 %b, i32 %c)
1013   ret i32 %z
1014 }
1015 ; CHECK: r0 += mpyu(r1.l, r2.h)
1016
1017 declare i32 @llvm.hexagon.M2.mpyu.acc.lh.s1(i32, i32, i32)
1018 define i32 @M2_mpyu_acc_lh_s1(i32 %a, i32 %b, i32 %c) {
1019   %z = call i32 @llvm.hexagon.M2.mpyu.acc.lh.s1(i32 %a, i32 %b, i32 %c)
1020   ret i32 %z
1021 }
1022 ; CHECK: r0 += mpyu(r1.l, r2.h):<<1
1023
1024 declare i32 @llvm.hexagon.M2.mpyu.acc.hl.s0(i32, i32, i32)
1025 define i32 @M2_mpyu_acc_hl_s0(i32 %a, i32 %b, i32 %c) {
1026   %z = call i32 @llvm.hexagon.M2.mpyu.acc.hl.s0(i32 %a, i32 %b, i32 %c)
1027   ret i32 %z
1028 }
1029 ; CHECK: r0 += mpyu(r1.h, r2.l)
1030
1031 declare i32 @llvm.hexagon.M2.mpyu.acc.hl.s1(i32, i32, i32)
1032 define i32 @M2_mpyu_acc_hl_s1(i32 %a, i32 %b, i32 %c) {
1033   %z = call i32 @llvm.hexagon.M2.mpyu.acc.hl.s1(i32 %a, i32 %b, i32 %c)
1034   ret i32 %z
1035 }
1036 ; CHECK: r0 += mpyu(r1.h, r2.l):<<1
1037
1038 declare i32 @llvm.hexagon.M2.mpyu.acc.hh.s0(i32, i32, i32)
1039 define i32 @M2_mpyu_acc_hh_s0(i32 %a, i32 %b, i32 %c) {
1040   %z = call i32 @llvm.hexagon.M2.mpyu.acc.hh.s0(i32 %a, i32 %b, i32 %c)
1041   ret i32 %z
1042 }
1043 ; CHECK: r0 += mpyu(r1.h, r2.h)
1044
1045 declare i32 @llvm.hexagon.M2.mpyu.acc.hh.s1(i32, i32, i32)
1046 define i32 @M2_mpyu_acc_hh_s1(i32 %a, i32 %b, i32 %c) {
1047   %z = call i32 @llvm.hexagon.M2.mpyu.acc.hh.s1(i32 %a, i32 %b, i32 %c)
1048   ret i32 %z
1049 }
1050 ; CHECK: r0 += mpyu(r1.h, r2.h):<<1
1051
1052 declare i32 @llvm.hexagon.M2.mpyu.nac.ll.s0(i32, i32, i32)
1053 define i32 @M2_mpyu_nac_ll_s0(i32 %a, i32 %b, i32 %c) {
1054   %z = call i32 @llvm.hexagon.M2.mpyu.nac.ll.s0(i32 %a, i32 %b, i32 %c)
1055   ret i32 %z
1056 }
1057 ; CHECK: r0 -= mpyu(r1.l, r2.l)
1058
1059 declare i32 @llvm.hexagon.M2.mpyu.nac.ll.s1(i32, i32, i32)
1060 define i32 @M2_mpyu_nac_ll_s1(i32 %a, i32 %b, i32 %c) {
1061   %z = call i32 @llvm.hexagon.M2.mpyu.nac.ll.s1(i32 %a, i32 %b, i32 %c)
1062   ret i32 %z
1063 }
1064 ; CHECK: r0 -= mpyu(r1.l, r2.l):<<1
1065
1066 declare i32 @llvm.hexagon.M2.mpyu.nac.lh.s0(i32, i32, i32)
1067 define i32 @M2_mpyu_nac_lh_s0(i32 %a, i32 %b, i32 %c) {
1068   %z = call i32 @llvm.hexagon.M2.mpyu.nac.lh.s0(i32 %a, i32 %b, i32 %c)
1069   ret i32 %z
1070 }
1071 ; CHECK: r0 -= mpyu(r1.l, r2.h)
1072
1073 declare i32 @llvm.hexagon.M2.mpyu.nac.lh.s1(i32, i32, i32)
1074 define i32 @M2_mpyu_nac_lh_s1(i32 %a, i32 %b, i32 %c) {
1075   %z = call i32 @llvm.hexagon.M2.mpyu.nac.lh.s1(i32 %a, i32 %b, i32 %c)
1076   ret i32 %z
1077 }
1078 ; CHECK: r0 -= mpyu(r1.l, r2.h):<<1
1079
1080 declare i32 @llvm.hexagon.M2.mpyu.nac.hl.s0(i32, i32, i32)
1081 define i32 @M2_mpyu_nac_hl_s0(i32 %a, i32 %b, i32 %c) {
1082   %z = call i32 @llvm.hexagon.M2.mpyu.nac.hl.s0(i32 %a, i32 %b, i32 %c)
1083   ret i32 %z
1084 }
1085 ; CHECK: r0 -= mpyu(r1.h, r2.l)
1086
1087 declare i32 @llvm.hexagon.M2.mpyu.nac.hl.s1(i32, i32, i32)
1088 define i32 @M2_mpyu_nac_hl_s1(i32 %a, i32 %b, i32 %c) {
1089   %z = call i32 @llvm.hexagon.M2.mpyu.nac.hl.s1(i32 %a, i32 %b, i32 %c)
1090   ret i32 %z
1091 }
1092 ; CHECK: r0 -= mpyu(r1.h, r2.l):<<1
1093
1094 declare i32 @llvm.hexagon.M2.mpyu.nac.hh.s0(i32, i32, i32)
1095 define i32 @M2_mpyu_nac_hh_s0(i32 %a, i32 %b, i32 %c) {
1096   %z = call i32 @llvm.hexagon.M2.mpyu.nac.hh.s0(i32 %a, i32 %b, i32 %c)
1097   ret i32 %z
1098 }
1099 ; CHECK: r0 -= mpyu(r1.h, r2.h)
1100
1101 declare i32 @llvm.hexagon.M2.mpyu.nac.hh.s1(i32, i32, i32)
1102 define i32 @M2_mpyu_nac_hh_s1(i32 %a, i32 %b, i32 %c) {
1103   %z = call i32 @llvm.hexagon.M2.mpyu.nac.hh.s1(i32 %a, i32 %b, i32 %c)
1104   ret i32 %z
1105 }
1106 ; CHECK: r0 -= mpyu(r1.h, r2.h):<<1
1107
1108 ; Polynomial multiply words
1109 declare i64 @llvm.hexagon.M4.pmpyw(i32, i32)
1110 define i64 @M4_pmpyw(i32 %a, i32 %b) {
1111   %z = call i64 @llvm.hexagon.M4.pmpyw(i32 %a, i32 %b)
1112   ret i64 %z
1113 }
1114 ; CHECK: r1:0 = pmpyw(r0, r1)
1115
1116 declare i64 @llvm.hexagon.M4.pmpyw.acc(i64, i32, i32)
1117 define i64 @M4_pmpyw_acc(i64 %a, i32 %b, i32 %c) {
1118   %z = call i64 @llvm.hexagon.M4.pmpyw.acc(i64 %a, i32 %b, i32 %c)
1119   ret i64 %z
1120 }
1121 ; CHECK: r1:0 ^= pmpyw(r2, r3)
1122
1123 ; Vector reduce multiply word by signed half
1124 declare i64 @llvm.hexagon.M4.vrmpyoh.s0(i64, i64)
1125 define i64 @M4_vrmpyoh_s0(i64 %a, i64 %b) {
1126   %z = call i64 @llvm.hexagon.M4.vrmpyoh.s0(i64 %a, i64 %b)
1127   ret i64 %z
1128 }
1129 ; CHECK: r1:0 = vrmpywoh(r1:0, r3:2)
1130
1131 declare i64 @llvm.hexagon.M4.vrmpyoh.s1(i64, i64)
1132 define i64 @M4_vrmpyoh_s1(i64 %a, i64 %b) {
1133   %z = call i64 @llvm.hexagon.M4.vrmpyoh.s1(i64 %a, i64 %b)
1134   ret i64 %z
1135 }
1136 ; CHECK: r1:0 = vrmpywoh(r1:0, r3:2):<<1
1137
1138 declare i64 @llvm.hexagon.M4.vrmpyeh.s0(i64, i64)
1139 define i64 @M4_vrmpyeh_s0(i64 %a, i64 %b) {
1140   %z = call i64 @llvm.hexagon.M4.vrmpyeh.s0(i64 %a, i64 %b)
1141   ret i64 %z
1142 }
1143 ; CHECK: r1:0 = vrmpyweh(r1:0, r3:2)
1144
1145 declare i64 @llvm.hexagon.M4.vrmpyeh.s1(i64, i64)
1146 define i64 @M4_vrmpyeh_s1(i64 %a, i64 %b) {
1147   %z = call i64 @llvm.hexagon.M4.vrmpyeh.s1(i64 %a, i64 %b)
1148   ret i64 %z
1149 }
1150 ; CHECK: r1:0 = vrmpyweh(r1:0, r3:2):<<1
1151
1152 declare i64 @llvm.hexagon.M4.vrmpyoh.acc.s0(i64, i64, i64)
1153 define i64 @M4_vrmpyoh_acc_s0(i64 %a, i64 %b, i64 %c) {
1154   %z = call i64 @llvm.hexagon.M4.vrmpyoh.acc.s0(i64 %a, i64 %b, i64 %c)
1155   ret i64 %z
1156 }
1157 ; CHECK: r1:0 += vrmpywoh(r3:2, r5:4)
1158
1159 declare i64 @llvm.hexagon.M4.vrmpyoh.acc.s1(i64, i64, i64)
1160 define i64 @M4_vrmpyoh_acc_s1(i64 %a, i64 %b, i64 %c) {
1161   %z = call i64 @llvm.hexagon.M4.vrmpyoh.acc.s1(i64 %a, i64 %b, i64 %c)
1162   ret i64 %z
1163 }
1164 ; CHECK: r1:0 += vrmpywoh(r3:2, r5:4):<<1
1165
1166 declare i64 @llvm.hexagon.M4.vrmpyeh.acc.s0(i64, i64, i64)
1167 define i64 @M4_vrmpyeh_acc_s0(i64 %a, i64 %b, i64 %c) {
1168   %z = call i64 @llvm.hexagon.M4.vrmpyeh.acc.s0(i64 %a, i64 %b, i64 %c)
1169   ret i64 %z
1170 }
1171 ; CHECK: r1:0 += vrmpyweh(r3:2, r5:4)
1172
1173 declare i64 @llvm.hexagon.M4.vrmpyeh.acc.s1(i64, i64, i64)
1174 define i64 @M4_vrmpyeh_acc_s1(i64 %a, i64 %b, i64 %c) {
1175   %z = call i64 @llvm.hexagon.M4.vrmpyeh.acc.s1(i64 %a, i64 %b, i64 %c)
1176   ret i64 %z
1177 }
1178 ; CHECK: r1:0 += vrmpyweh(r3:2, r5:4):<<1
1179
1180 ; Multiply and use upper result
1181 declare i32 @llvm.hexagon.M2.dpmpyss.rnd.s0(i32, i32)
1182 define i32 @M2_dpmpyss_rnd_s0(i32 %a, i32 %b) {
1183   %z = call i32 @llvm.hexagon.M2.dpmpyss.rnd.s0(i32 %a, i32 %b)
1184   ret i32 %z
1185 }
1186 ; CHECK: r0 = mpy(r0, r1):rnd
1187
1188 declare i32 @llvm.hexagon.M2.mpyu.up(i32, i32)
1189 define i32 @M2_mpyu_up(i32 %a, i32 %b) {
1190   %z = call i32 @llvm.hexagon.M2.mpyu.up(i32 %a, i32 %b)
1191   ret i32 %z
1192 }
1193 ; CHECK: r0 = mpyu(r0, r1)
1194
1195 declare i32 @llvm.hexagon.M2.mpysu.up(i32, i32)
1196 define i32 @M2_mpysu_up(i32 %a, i32 %b) {
1197   %z = call i32 @llvm.hexagon.M2.mpysu.up(i32 %a, i32 %b)
1198   ret i32 %z
1199 }
1200 ; CHECK: r0 = mpysu(r0, r1)
1201
1202 declare i32 @llvm.hexagon.M2.hmmpyh.s1(i32, i32)
1203 define i32 @M2_hmmpyh_s1(i32 %a, i32 %b) {
1204   %z = call i32 @llvm.hexagon.M2.hmmpyh.s1(i32 %a, i32 %b)
1205   ret i32 %z
1206 }
1207 ; CHECK: r0 = mpy(r0, r1.h):<<1:sat
1208
1209 declare i32 @llvm.hexagon.M2.hmmpyl.s1(i32, i32)
1210 define i32 @M2_hmmpyl_s1(i32 %a, i32 %b) {
1211   %z = call i32 @llvm.hexagon.M2.hmmpyl.s1(i32 %a, i32 %b)
1212   ret i32 %z
1213 }
1214 ; CHECK: r0 = mpy(r0, r1.l):<<1:sat
1215
1216 declare i32 @llvm.hexagon.M2.hmmpyh.rs1(i32, i32)
1217 define i32 @M2_hmmpyh_rs1(i32 %a, i32 %b) {
1218   %z = call i32 @llvm.hexagon.M2.hmmpyh.rs1(i32 %a, i32 %b)
1219   ret i32 %z
1220 }
1221 ; CHECK: r0 = mpy(r0, r1.h):<<1:rnd:sat
1222
1223 declare i32 @llvm.hexagon.M2.mpy.up.s1.sat(i32, i32)
1224 define i32 @M2_mpy_up_s1_sat(i32 %a, i32 %b) {
1225   %z = call i32 @llvm.hexagon.M2.mpy.up.s1.sat(i32 %a, i32 %b)
1226   ret i32 %z
1227 }
1228 ; CHECK: r0 = mpy(r0, r1):<<1:sat
1229
1230 declare i32 @llvm.hexagon.M2.hmmpyl.rs1(i32, i32)
1231 define i32 @M2_hmmpyl_rs1(i32 %a, i32 %b) {
1232   %z = call i32 @llvm.hexagon.M2.hmmpyl.rs1(i32 %a, i32 %b)
1233   ret i32 %z
1234 }
1235 ; CHECK: r0 = mpy(r0, r1.l):<<1:rnd:sat
1236
1237 declare i32 @llvm.hexagon.M2.mpy.up(i32, i32)
1238 define i32 @M2_mpy_up(i32 %a, i32 %b) {
1239   %z = call i32 @llvm.hexagon.M2.mpy.up(i32 %a, i32 %b)
1240   ret i32 %z
1241 }
1242 ; CHECK: r0 = mpy(r0, r1)
1243
1244 declare i32 @llvm.hexagon.M2.mpy.up.s1(i32, i32)
1245 define i32 @M2_mpy_up_s1(i32 %a, i32 %b) {
1246   %z = call i32 @llvm.hexagon.M2.mpy.up.s1(i32 %a, i32 %b)
1247   ret i32 %z
1248 }
1249 ; CHECK: r0 = mpy(r0, r1):<<1
1250
1251 declare i32 @llvm.hexagon.M4.mac.up.s1.sat(i32, i32, i32)
1252 define i32 @M4_mac_up_s1_sat(i32 %a, i32 %b, i32 %c) {
1253   %z = call i32 @llvm.hexagon.M4.mac.up.s1.sat(i32 %a, i32 %b, i32 %c)
1254   ret i32 %z
1255 }
1256 ; CHECK: r0 += mpy(r1, r2):<<1:sat
1257
1258 declare i32 @llvm.hexagon.M4.nac.up.s1.sat(i32, i32, i32)
1259 define i32 @M4_nac_up_s1_sat(i32 %a, i32 %b, i32 %c) {
1260   %z = call i32 @llvm.hexagon.M4.nac.up.s1.sat(i32 %a, i32 %b, i32 %c)
1261   ret i32 %z
1262 }
1263 ; CHECK: r0 -= mpy(r1, r2):<<1:sat
1264
1265 ; Multiply and use full result
1266 declare i64 @llvm.hexagon.M2.dpmpyss.s0(i32, i32)
1267 define i64 @M2_dpmpyss_s0(i32 %a, i32 %b) {
1268   %z = call i64 @llvm.hexagon.M2.dpmpyss.s0(i32 %a, i32 %b)
1269   ret i64 %z
1270 }
1271 ; CHECK: r1:0 = mpy(r0, r1)
1272
1273 declare i64 @llvm.hexagon.M2.dpmpyuu.s0(i32, i32)
1274 define i64 @M2_dpmpyuu_s0(i32 %a, i32 %b) {
1275   %z = call i64 @llvm.hexagon.M2.dpmpyuu.s0(i32 %a, i32 %b)
1276   ret i64 %z
1277 }
1278 ; CHECK: r1:0 = mpyu(r0, r1)
1279
1280 declare i64 @llvm.hexagon.M2.dpmpyss.acc.s0(i64, i32, i32)
1281 define i64 @M2_dpmpyss_acc_s0(i64 %a, i32 %b, i32 %c) {
1282   %z = call i64 @llvm.hexagon.M2.dpmpyss.acc.s0(i64 %a, i32 %b, i32 %c)
1283   ret i64 %z
1284 }
1285 ; CHECK: r1:0 += mpy(r2, r3)
1286
1287 declare i64 @llvm.hexagon.M2.dpmpyss.nac.s0(i64, i32, i32)
1288 define i64 @M2_dpmpyss_nac_s0(i64 %a, i32 %b, i32 %c) {
1289   %z = call i64 @llvm.hexagon.M2.dpmpyss.nac.s0(i64 %a, i32 %b, i32 %c)
1290   ret i64 %z
1291 }
1292 ; CHECK: r1:0 -= mpy(r2, r3)
1293
1294 declare i64 @llvm.hexagon.M2.dpmpyuu.acc.s0(i64, i32, i32)
1295 define i64 @M2_dpmpyuu_acc_s0(i64 %a, i32 %b, i32 %c) {
1296   %z = call i64 @llvm.hexagon.M2.dpmpyuu.acc.s0(i64 %a, i32 %b, i32 %c)
1297   ret i64 %z
1298 }
1299 ; CHECK: r1:0 += mpyu(r2, r3)
1300
1301 declare i64 @llvm.hexagon.M2.dpmpyuu.nac.s0(i64, i32, i32)
1302 define i64 @M2_dpmpyuu_nac_s0(i64 %a, i32 %b, i32 %c) {
1303   %z = call i64 @llvm.hexagon.M2.dpmpyuu.nac.s0(i64 %a, i32 %b, i32 %c)
1304   ret i64 %z
1305 }
1306 ; CHECK: r1:0 -= mpyu(r2, r3)
1307
1308 ; Vector dual multiply
1309 declare i64 @llvm.hexagon.M2.vdmpys.s0(i64, i64)
1310 define i64 @M2_vdmpys_s0(i64 %a, i64 %b) {
1311   %z = call i64 @llvm.hexagon.M2.vdmpys.s0(i64 %a, i64 %b)
1312   ret i64 %z
1313 }
1314 ; CHECK: r1:0 = vdmpy(r1:0, r3:2):sat
1315
1316 declare i64 @llvm.hexagon.M2.vdmpys.s1(i64, i64)
1317 define i64 @M2_vdmpys_s1(i64 %a, i64 %b) {
1318   %z = call i64 @llvm.hexagon.M2.vdmpys.s1(i64 %a, i64 %b)
1319   ret i64 %z
1320 }
1321 ; CHECK: r1:0 = vdmpy(r1:0, r3:2):<<1:sat
1322
1323 ; Vector reduce multiply bytes
1324 declare i64 @llvm.hexagon.M5.vrmpybuu(i64, i64)
1325 define i64 @M5_vrmpybuu(i64 %a, i64 %b) {
1326   %z = call i64 @llvm.hexagon.M5.vrmpybuu(i64 %a, i64 %b)
1327   ret i64 %z
1328 }
1329 ; CHECK: r1:0 = vrmpybu(r1:0, r3:2)
1330
1331 declare i64 @llvm.hexagon.M5.vrmpybsu(i64, i64)
1332 define i64 @M5_vrmpybsu(i64 %a, i64 %b) {
1333   %z = call i64 @llvm.hexagon.M5.vrmpybsu(i64 %a, i64 %b)
1334   ret i64 %z
1335 }
1336 ; CHECK: r1:0 = vrmpybsu(r1:0, r3:2)
1337
1338 declare i64 @llvm.hexagon.M5.vrmacbuu(i64, i64, i64)
1339 define i64 @M5_vrmacbuu(i64 %a, i64 %b, i64 %c) {
1340   %z = call i64 @llvm.hexagon.M5.vrmacbuu(i64 %a, i64 %b, i64 %c)
1341   ret i64 %z
1342 }
1343 ; CHECK: r1:0 += vrmpybu(r3:2, r5:4)
1344
1345 declare i64 @llvm.hexagon.M5.vrmacbsu(i64, i64, i64)
1346 define i64 @M5_vrmacbsu(i64 %a, i64 %b, i64 %c) {
1347   %z = call i64 @llvm.hexagon.M5.vrmacbsu(i64 %a, i64 %b, i64 %c)
1348   ret i64 %z
1349 }
1350 ; CHECK: r1:0 += vrmpybsu(r3:2, r5:4)
1351
1352 ; Vector dual multiply signed by unsigned bytes
1353 declare i64 @llvm.hexagon.M5.vdmpybsu(i64, i64)
1354 define i64 @M5_vdmpybsu(i64 %a, i64 %b) {
1355   %z = call i64 @llvm.hexagon.M5.vdmpybsu(i64 %a, i64 %b)
1356   ret i64 %z
1357 }
1358 ; CHECK: r1:0 = vdmpybsu(r1:0, r3:2):sat
1359
1360 declare i64 @llvm.hexagon.M5.vdmacbsu(i64, i64, i64)
1361 define i64 @M5_vdmacbsu(i64 %a, i64 %b, i64 %c) {
1362   %z = call i64 @llvm.hexagon.M5.vdmacbsu(i64 %a, i64 %b, i64 %c)
1363   ret i64 %z
1364 }
1365 ; CHECK: r1:0 += vdmpybsu(r3:2, r5:4):sat
1366
1367 ; Vector multiply even halfwords
1368 declare i64 @llvm.hexagon.M2.vmpy2es.s0(i64, i64)
1369 define i64 @M2_vmpy2es_s0(i64 %a, i64 %b) {
1370   %z = call i64 @llvm.hexagon.M2.vmpy2es.s0(i64 %a, i64 %b)
1371   ret i64 %z
1372 }
1373 ; CHECK: r1:0 = vmpyeh(r1:0, r3:2):sat
1374
1375 declare i64 @llvm.hexagon.M2.vmpy2es.s1(i64, i64)
1376 define i64 @M2_vmpy2es_s1(i64 %a, i64 %b) {
1377   %z = call i64 @llvm.hexagon.M2.vmpy2es.s1(i64 %a, i64 %b)
1378   ret i64 %z
1379 }
1380 ; CHECK: r1:0 = vmpyeh(r1:0, r3:2):<<1:sat
1381
1382 declare i64 @llvm.hexagon.M2.vmac2es(i64, i64, i64)
1383 define i64 @M2_vmac2es(i64 %a, i64 %b, i64 %c) {
1384   %z = call i64 @llvm.hexagon.M2.vmac2es(i64 %a, i64 %b, i64 %c)
1385   ret i64 %z
1386 }
1387 ; CHECK: r1:0 += vmpyeh(r3:2, r5:4)
1388
1389 declare i64 @llvm.hexagon.M2.vmac2es.s0(i64, i64, i64)
1390 define i64 @M2_vmac2es_s0(i64 %a, i64 %b, i64 %c) {
1391   %z = call i64 @llvm.hexagon.M2.vmac2es.s0(i64 %a, i64 %b, i64 %c)
1392   ret i64 %z
1393 }
1394 ; CHECK: r1:0 += vmpyeh(r3:2, r5:4):sat
1395
1396 declare i64 @llvm.hexagon.M2.vmac2es.s1(i64, i64, i64)
1397 define i64 @M2_vmac2es_s1(i64 %a, i64 %b, i64 %c) {
1398   %z = call i64 @llvm.hexagon.M2.vmac2es.s1(i64 %a, i64 %b, i64 %c)
1399   ret i64 %z
1400 }
1401 ; CHECK: r1:0 += vmpyeh(r3:2, r5:4):<<1:sat
1402
1403 ; Vector multiply halfwords
1404 declare i64 @llvm.hexagon.M2.vmpy2s.s0(i32, i32)
1405 define i64 @M2_vmpy2s_s0(i32 %a, i32 %b) {
1406   %z = call i64 @llvm.hexagon.M2.vmpy2s.s0(i32 %a, i32 %b)
1407   ret i64 %z
1408 }
1409 ; CHECK: r1:0 = vmpyh(r0, r1):sat
1410
1411 declare i64 @llvm.hexagon.M2.vmpy2s.s1(i32, i32)
1412 define i64 @M2_vmpy2s_s1(i32 %a, i32 %b) {
1413   %z = call i64 @llvm.hexagon.M2.vmpy2s.s1(i32 %a, i32 %b)
1414   ret i64 %z
1415 }
1416 ; CHECK: r1:0 = vmpyh(r0, r1):<<1:sat
1417
1418 declare i64 @llvm.hexagon.M2.vmac2(i64, i32, i32)
1419 define i64 @M2_vmac2(i64 %a, i32 %b, i32 %c) {
1420   %z = call i64 @llvm.hexagon.M2.vmac2(i64 %a, i32 %b, i32 %c)
1421   ret i64 %z
1422 }
1423 ; CHECK: r1:0 += vmpyh(r2, r3)
1424
1425 declare i64 @llvm.hexagon.M2.vmac2s.s0(i64, i32, i32)
1426 define i64 @M2_vmac2s_s0(i64 %a, i32 %b, i32 %c) {
1427   %z = call i64 @llvm.hexagon.M2.vmac2s.s0(i64 %a, i32 %b, i32 %c)
1428   ret i64 %z
1429 }
1430 ; CHECK: r1:0 += vmpyh(r2, r3):sat
1431
1432 declare i64 @llvm.hexagon.M2.vmac2s.s1(i64, i32, i32)
1433 define i64 @M2_vmac2s_s1(i64 %a, i32 %b, i32 %c) {
1434   %z = call i64 @llvm.hexagon.M2.vmac2s.s1(i64 %a, i32 %b, i32 %c)
1435   ret i64 %z
1436 }
1437 ; CHECK: r1:0 += vmpyh(r2, r3):<<1:sat
1438
1439 ; Vector multiply halfwords signed by unsigned
1440 declare i64 @llvm.hexagon.M2.vmpy2su.s0(i32, i32)
1441 define i64 @M2_vmpy2su_s0(i32 %a, i32 %b) {
1442   %z = call i64 @llvm.hexagon.M2.vmpy2su.s0(i32 %a, i32 %b)
1443   ret i64 %z
1444 }
1445 ; CHECK: r1:0 = vmpyhsu(r0, r1):sat
1446
1447 declare i64 @llvm.hexagon.M2.vmpy2su.s1(i32, i32)
1448 define i64 @M2_vmpy2su_s1(i32 %a, i32 %b) {
1449   %z = call i64 @llvm.hexagon.M2.vmpy2su.s1(i32 %a, i32 %b)
1450   ret i64 %z
1451 }
1452 ; CHECK: r1:0 = vmpyhsu(r0, r1):<<1:sat
1453
1454 declare i64 @llvm.hexagon.M2.vmac2su.s0(i64, i32, i32)
1455 define i64 @M2_vmac2su_s0(i64 %a, i32 %b, i32 %c) {
1456   %z = call i64 @llvm.hexagon.M2.vmac2su.s0(i64 %a, i32 %b, i32 %c)
1457   ret i64 %z
1458 }
1459 ; CHECK: r1:0 += vmpyhsu(r2, r3):sat
1460
1461 declare i64 @llvm.hexagon.M2.vmac2su.s1(i64, i32, i32)
1462 define i64 @M2_vmac2su_s1(i64 %a, i32 %b, i32 %c) {
1463   %z = call i64 @llvm.hexagon.M2.vmac2su.s1(i64 %a, i32 %b, i32 %c)
1464   ret i64 %z
1465 }
1466 ; CHECK: r1:0 += vmpyhsu(r2, r3):<<1:sat
1467
1468 ; Vector reduce multiply halfwords
1469 declare i64 @llvm.hexagon.M2.vrmpy.s0(i64, i64)
1470 define i64 @M2_vrmpy_s0(i64 %a, i64 %b) {
1471   %z = call i64 @llvm.hexagon.M2.vrmpy.s0(i64 %a, i64 %b)
1472   ret i64 %z
1473 }
1474 ; CHECK: r1:0 = vrmpyh(r1:0, r3:2)
1475
1476 declare i64 @llvm.hexagon.M2.vrmac.s0(i64, i64, i64)
1477 define i64 @M2_vrmac_s0(i64 %a, i64 %b, i64 %c) {
1478   %z = call i64 @llvm.hexagon.M2.vrmac.s0(i64 %a, i64 %b, i64 %c)
1479   ret i64 %z
1480 }
1481 ; CHECK: r1:0 += vrmpyh(r3:2, r5:4)
1482
1483 ; Vector multiply bytes
1484 declare i64 @llvm.hexagon.M5.vmpybsu(i32, i32)
1485 define i64 @M2_vmpybsu(i32 %a, i32 %b) {
1486   %z = call i64 @llvm.hexagon.M5.vmpybsu(i32 %a, i32 %b)
1487   ret i64 %z
1488 }
1489 ; CHECK: r1:0 = vmpybsu(r0, r1)
1490
1491 declare i64 @llvm.hexagon.M5.vmpybuu(i32, i32)
1492 define i64 @M2_vmpybuu(i32 %a, i32 %b) {
1493   %z = call i64 @llvm.hexagon.M5.vmpybuu(i32 %a, i32 %b)
1494   ret i64 %z
1495 }
1496 ; CHECK: r1:0 = vmpybu(r0, r1)
1497
1498 declare i64 @llvm.hexagon.M5.vmacbuu(i64, i32, i32)
1499 define i64 @M2_vmacbuu(i64 %a, i32 %b, i32 %c) {
1500   %z = call i64 @llvm.hexagon.M5.vmacbuu(i64 %a, i32 %b, i32 %c)
1501   ret i64 %z
1502 }
1503 ; CHECK: r1:0 += vmpybu(r2, r3)
1504
1505 declare i64 @llvm.hexagon.M5.vmacbsu(i64, i32, i32)
1506 define i64 @M2_vmacbsu(i64 %a, i32 %b, i32 %c) {
1507   %z = call i64 @llvm.hexagon.M5.vmacbsu(i64 %a, i32 %b, i32 %c)
1508   ret i64 %z
1509 }
1510 ; CHECK: r1:0 += vmpybsu(r2, r3)
1511
1512 ; Vector polynomial multiply halfwords
1513 declare i64 @llvm.hexagon.M4.vpmpyh(i32, i32)
1514 define i64 @M4_vpmpyh(i32 %a, i32 %b) {
1515   %z = call i64 @llvm.hexagon.M4.vpmpyh(i32 %a, i32 %b)
1516   ret i64 %z
1517 }
1518 ; CHECK: r1:0 = vpmpyh(r0, r1)
1519
1520 declare i64 @llvm.hexagon.M4.vpmpyh.acc(i64, i32, i32)
1521 define i64 @M4_vpmpyh_acc(i64 %a, i32 %b, i32 %c) {
1522   %z = call i64 @llvm.hexagon.M4.vpmpyh.acc(i64 %a, i32 %b, i32 %c)
1523   ret i64 %z
1524 }
1525 ; CHECK: r1:0 ^= vpmpyh(r2, r3)