1 ; RUN: llc -march=hexagon -O0 < %s | FileCheck %s
2 ; Hexagon Programmer's Reference Manual 11.10.5 XTYPE/MPY
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)
10 ; CHECK: r0 = add(#0, mpyi(r0, r1))
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)
17 ; CHECK: r0 = add(#0, mpyi(r0, #0))
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)
24 ; CHECK: r0 = add(r0, mpyi(#0, r1))
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)
31 ; CHECK: r0 = add(r0, mpyi(r1, #0))
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)
38 ; CHECK: r1 = add(r0, mpyi(r1, r2))
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)
46 ; CHECK: r1:0 = vmpyweh(r1:0, r3:2):sat
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)
53 ; CHECK: r1:0 = vmpyweh(r1:0, r3:2):<<1:sat
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)
60 ; CHECK: r1:0 = vmpywoh(r1:0, r3:2):sat
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)
67 ; CHECK: r1:0 = vmpywoh(r1:0, r3:2):<<1:sat
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)
74 ; CHECK: r1:0 = vmpyweh(r1:0, r3:2):rnd:sat
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)
81 ; CHECK: r1:0 = vmpyweh(r1:0, r3:2):<<1:rnd:sat
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)
88 ; CHECK: r1:0 = vmpywoh(r1:0, r3:2):rnd:sat
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)
95 ; CHECK: r1:0 = vmpywoh(r1:0, r3:2):<<1:rnd:sat
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)
103 ; CHECK: r1:0 = vmpyweuh(r1:0, r3:2):sat
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)
110 ; CHECK: r1:0 = vmpyweuh(r1:0, r3:2):<<1:sat
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)
117 ; CHECK: r1:0 = vmpywouh(r1:0, r3:2):sat
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)
124 ; CHECK: r1:0 = vmpywouh(r1:0, r3:2):<<1:sat
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)
131 ; CHECK: r1:0 = vmpyweuh(r1:0, r3:2):rnd:sat
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)
138 ; CHECK: r1:0 = vmpyweuh(r1:0, r3:2):<<1:rnd:sat
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)
145 ; CHECK: r1:0 = vmpywouh(r1:0, r3:2):rnd:sat
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)
152 ; CHECK: r1:0 = vmpywouh(r1:0, r3:2):<<1:rnd:sat
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)
160 ; CHECK: r1:0 = mpy(r0.l, r1.l)
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)
167 ; CHECK: r1:0 = mpy(r0.l, r1.l):<<1
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)
174 ; CHECK: r1:0 = mpy(r0.l, r1.h)
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)
181 ; CHECK: r1:0 = mpy(r0.l, r1.h):<<1
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)
188 ; CHECK: r1:0 = mpy(r0.h, r1.l)
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)
195 ; CHECK: r1:0 = mpy(r0.h, r1.l):<<1
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)
202 ; CHECK: r1:0 = mpy(r0.h, r1.h)
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)
209 ; CHECK: r1:0 = mpy(r0.h, r1.h):<<1
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)
216 ; CHECK: r1:0 = mpy(r0.l, r1.l):rnd
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)
223 ; CHECK: r1:0 = mpy(r0.l, r1.l):<<1:rnd
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)
230 ; CHECK: r1:0 = mpy(r0.l, r1.h):rnd
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)
237 ; CHECK: r1:0 = mpy(r0.l, r1.h):<<1:rnd
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)
244 ; CHECK: r1:0 = mpy(r0.h, r1.l):rnd
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)
251 ; CHECK: r1:0 = mpy(r0.h, r1.l):<<1:rnd
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)
258 ; CHECK: r1:0 = mpy(r0.h, r1.h):rnd
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)
265 ; CHECK: r1:0 = mpy(r0.h, r1.h):<<1:rnd
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)
272 ; CHECK: r1:0 += mpy(r2.l, r3.l)
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)
279 ; CHECK: r1:0 += mpy(r2.l, r3.l):<<1
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)
286 ; CHECK: r1:0 += mpy(r2.l, r3.h)
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)
293 ; CHECK: r1:0 += mpy(r2.l, r3.h):<<1
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)
300 ; CHECK: r1:0 += mpy(r2.h, r3.l)
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)
307 ; CHECK: r1:0 += mpy(r2.h, r3.l):<<1
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)
314 ; CHECK: r1:0 += mpy(r2.h, r3.h)
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)
321 ; CHECK: r1:0 += mpy(r2.h, r3.h):<<1
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)
328 ; CHECK: r1:0 -= mpy(r2.l, r3.l)
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)
335 ; CHECK: r1:0 -= mpy(r2.l, r3.l):<<1
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)
342 ; CHECK: r1:0 -= mpy(r2.l, r3.h)
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)
349 ; CHECK: r1:0 -= mpy(r2.l, r3.h):<<1
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)
356 ; CHECK: r1:0 -= mpy(r2.h, r3.l)
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)
363 ; CHECK: r1:0 -= mpy(r2.h, r3.l):<<1
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)
370 ; CHECK: r1:0 -= mpy(r2.h, r3.h)
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)
377 ; CHECK: r1:0 -= mpy(r2.h, r3.h):<<1
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)
384 ; CHECK: r0 = mpy(r0.l, r1.l)
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)
391 ; CHECK: r0 = mpy(r0.l, r1.l):<<1
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)
398 ; CHECK: r0 = mpy(r0.l, r1.h)
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)
405 ; CHECK: r0 = mpy(r0.l, r1.h):<<1
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)
412 ; CHECK: r0 = mpy(r0.h, r1.l)
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)
419 ; CHECK: r0 = mpy(r0.h, r1.l):<<1
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)
426 ; CHECK: r0 = mpy(r0.h, r1.h)
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)
433 ; CHECK: r0 = mpy(r0.h, r1.h):<<1
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)
440 ; CHECK: r0 = mpy(r0.l, r1.l):sat
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)
447 ; CHECK: r0 = mpy(r0.l, r1.l):<<1:sat
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)
454 ; CHECK: r0 = mpy(r0.l, r1.h):sat
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)
461 ; CHECK: r0 = mpy(r0.l, r1.h):<<1:sat
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)
468 ; CHECK: r0 = mpy(r0.h, r1.l):sat
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)
475 ; CHECK: r0 = mpy(r0.h, r1.l):<<1:sat
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)
482 ; CHECK: r0 = mpy(r0.h, r1.h):sat
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)
489 ; CHECK: r0 = mpy(r0.h, r1.h):<<1:sat
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)
496 ; CHECK: r0 = mpy(r0.l, r1.l):rnd:sat
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)
503 ; CHECK: r0 = mpy(r0.l, r1.l):<<1:rnd:sat
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)
510 ; CHECK: r0 = mpy(r0.l, r1.h):rnd:sat
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)
517 ; CHECK: r0 = mpy(r0.l, r1.h):<<1:rnd:sat
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)
524 ; CHECK: r0 = mpy(r0.h, r1.l):rnd:sat
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)
531 ; CHECK: r0 = mpy(r0.h, r1.l):<<1:rnd:sat
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)
538 ; CHECK: r0 = mpy(r0.h, r1.h):rnd:sat
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)
545 ; CHECK: r0 = mpy(r0.h, r1.h):<<1:rnd:sat
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)
552 ; CHECK: r0 += mpy(r1.l, r2.l)
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)
559 ; CHECK: r0 += mpy(r1.l, r2.l):<<1
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)
566 ; CHECK: r0 += mpy(r1.l, r2.h)
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)
573 ; CHECK: r0 += mpy(r1.l, r2.h):<<1
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)
580 ; CHECK: r0 += mpy(r1.h, r2.l)
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)
587 ; CHECK: r0 += mpy(r1.h, r2.l):<<1
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)
594 ; CHECK: r0 += mpy(r1.h, r2.h)
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)
601 ; CHECK: r0 += mpy(r1.h, r2.h):<<1
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)
608 ; CHECK: r0 += mpy(r1.l, r2.l):sat
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)
615 ; CHECK: r0 += mpy(r1.l, r2.l):<<1:sat
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)
622 ; CHECK: r0 += mpy(r1.l, r2.h):sat
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)
629 ; CHECK: r0 += mpy(r1.l, r2.h):<<1:sat
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)
636 ; CHECK: r0 += mpy(r1.h, r2.l):sat
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)
643 ; CHECK: r0 += mpy(r1.h, r2.l):<<1:sat
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)
650 ; CHECK: r0 += mpy(r1.h, r2.h):sat
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)
657 ; CHECK: r0 += mpy(r1.h, r2.h):<<1:sat
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)
664 ; CHECK: r0 -= mpy(r1.l, r2.l)
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)
671 ; CHECK: r0 -= mpy(r1.l, r2.l):<<1
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)
678 ; CHECK: r0 -= mpy(r1.l, r2.h)
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)
685 ; CHECK: r0 -= mpy(r1.l, r2.h):<<1
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)
692 ; CHECK: r0 -= mpy(r1.h, r2.l)
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)
699 ; CHECK: r0 -= mpy(r1.h, r2.l):<<1
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)
706 ; CHECK: r0 -= mpy(r1.h, r2.h)
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)
713 ; CHECK: r0 -= mpy(r1.h, r2.h):<<1
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)
720 ; CHECK: r0 -= mpy(r1.l, r2.l):sat
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)
727 ; CHECK: r0 -= mpy(r1.l, r2.l):<<1:sat
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)
734 ; CHECK: r0 -= mpy(r1.l, r2.h):sat
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)
741 ; CHECK: r0 -= mpy(r1.l, r2.h):<<1:sat
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)
748 ; CHECK: r0 -= mpy(r1.h, r2.l):sat
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)
755 ; CHECK: r0 -= mpy(r1.h, r2.l):<<1:sat
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)
762 ; CHECK: r0 -= mpy(r1.h, r2.h):sat
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)
769 ; CHECK: r0 -= mpy(r1.h, r2.h):<<1:sat
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)
777 ; CHECK: r1:0 = mpyu(r0.l, r1.l)
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)
784 ; CHECK: r1:0 = mpyu(r0.l, r1.l):<<1
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)
791 ; CHECK: r1:0 = mpyu(r0.l, r1.h)
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)
798 ; CHECK: r1:0 = mpyu(r0.l, r1.h):<<1
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)
805 ; CHECK: r1:0 = mpyu(r0.h, r1.l)
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)
812 ; CHECK: r1:0 = mpyu(r0.h, r1.l):<<1
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)
819 ; CHECK: r1:0 = mpyu(r0.h, r1.h)
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)
826 ; CHECK: r1:0 = mpyu(r0.h, r1.h):<<1
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)
833 ; CHECK: r1:0 += mpyu(r2.l, r3.l)
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)
840 ; CHECK: r1:0 += mpyu(r2.l, r3.l):<<1
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)
847 ; CHECK: r1:0 += mpyu(r2.l, r3.h)
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)
854 ; CHECK: r1:0 += mpyu(r2.l, r3.h):<<1
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)
861 ; CHECK: r1:0 += mpyu(r2.h, r3.l)
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)
868 ; CHECK: r1:0 += mpyu(r2.h, r3.l):<<1
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)
875 ; CHECK: r1:0 += mpyu(r2.h, r3.h)
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)
882 ; CHECK: r1:0 += mpyu(r2.h, r3.h):<<1
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)
889 ; CHECK: r1:0 -= mpyu(r2.l, r3.l)
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)
896 ; CHECK: r1:0 -= mpyu(r2.l, r3.l):<<1
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)
903 ; CHECK: r1:0 -= mpyu(r2.l, r3.h)
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)
910 ; CHECK: r1:0 -= mpyu(r2.l, r3.h):<<1
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)
917 ; CHECK: r1:0 -= mpyu(r2.h, r3.l)
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)
924 ; CHECK: r1:0 -= mpyu(r2.h, r3.l):<<1
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)
931 ; CHECK: r1:0 -= mpyu(r2.h, r3.h)
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)
938 ; CHECK: r1:0 -= mpyu(r2.h, r3.h):<<1
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)
945 ; CHECK: r0 = mpyu(r0.l, r1.l)
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)
952 ; CHECK: r0 = mpyu(r0.l, r1.l):<<1
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)
959 ; CHECK: r0 = mpyu(r0.l, r1.h)
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)
966 ; CHECK: r0 = mpyu(r0.l, r1.h):<<1
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)
973 ; CHECK: r0 = mpyu(r0.h, r1.l)
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)
980 ; CHECK: r0 = mpyu(r0.h, r1.l):<<1
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)
987 ; CHECK: r0 = mpyu(r0.h, r1.h)
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)
994 ; CHECK: r0 = mpyu(r0.h, r1.h):<<1
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)
1001 ; CHECK: r0 += mpyu(r1.l, r2.l)
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)
1008 ; CHECK: r0 += mpyu(r1.l, r2.l):<<1
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)
1015 ; CHECK: r0 += mpyu(r1.l, r2.h)
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)
1022 ; CHECK: r0 += mpyu(r1.l, r2.h):<<1
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)
1029 ; CHECK: r0 += mpyu(r1.h, r2.l)
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)
1036 ; CHECK: r0 += mpyu(r1.h, r2.l):<<1
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)
1043 ; CHECK: r0 += mpyu(r1.h, r2.h)
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)
1050 ; CHECK: r0 += mpyu(r1.h, r2.h):<<1
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)
1057 ; CHECK: r0 -= mpyu(r1.l, r2.l)
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)
1064 ; CHECK: r0 -= mpyu(r1.l, r2.l):<<1
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)
1071 ; CHECK: r0 -= mpyu(r1.l, r2.h)
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)
1078 ; CHECK: r0 -= mpyu(r1.l, r2.h):<<1
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)
1085 ; CHECK: r0 -= mpyu(r1.h, r2.l)
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)
1092 ; CHECK: r0 -= mpyu(r1.h, r2.l):<<1
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)
1099 ; CHECK: r0 -= mpyu(r1.h, r2.h)
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)
1106 ; CHECK: r0 -= mpyu(r1.h, r2.h):<<1
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)
1114 ; CHECK: r1:0 = pmpyw(r0, r1)
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)
1121 ; CHECK: r1:0 ^= pmpyw(r2, r3)
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)
1129 ; CHECK: r1:0 = vrmpywoh(r1:0, r3:2)
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)
1136 ; CHECK: r1:0 = vrmpywoh(r1:0, r3:2):<<1
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)
1143 ; CHECK: r1:0 = vrmpyweh(r1:0, r3:2)
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)
1150 ; CHECK: r1:0 = vrmpyweh(r1:0, r3:2):<<1
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)
1157 ; CHECK: r1:0 += vrmpywoh(r3:2, r5:4)
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)
1164 ; CHECK: r1:0 += vrmpywoh(r3:2, r5:4):<<1
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)
1171 ; CHECK: r1:0 += vrmpyweh(r3:2, r5:4)
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)
1178 ; CHECK: r1:0 += vrmpyweh(r3:2, r5:4):<<1
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)
1186 ; CHECK: r0 = mpy(r0, r1):rnd
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)
1193 ; CHECK: r0 = mpyu(r0, r1)
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)
1200 ; CHECK: r0 = mpysu(r0, r1)
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)
1207 ; CHECK: r0 = mpy(r0, r1.h):<<1:sat
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)
1214 ; CHECK: r0 = mpy(r0, r1.l):<<1:sat
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)
1221 ; CHECK: r0 = mpy(r0, r1.h):<<1:rnd:sat
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)
1228 ; CHECK: r0 = mpy(r0, r1):<<1:sat
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)
1235 ; CHECK: r0 = mpy(r0, r1.l):<<1:rnd:sat
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)
1242 ; CHECK: r0 = mpy(r0, r1)
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)
1249 ; CHECK: r0 = mpy(r0, r1):<<1
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)
1256 ; CHECK: r0 += mpy(r1, r2):<<1:sat
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)
1263 ; CHECK: r0 -= mpy(r1, r2):<<1:sat
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)
1271 ; CHECK: r1:0 = mpy(r0, r1)
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)
1278 ; CHECK: r1:0 = mpyu(r0, r1)
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)
1285 ; CHECK: r1:0 += mpy(r2, r3)
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)
1292 ; CHECK: r1:0 -= mpy(r2, r3)
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)
1299 ; CHECK: r1:0 += mpyu(r2, r3)
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)
1306 ; CHECK: r1:0 -= mpyu(r2, r3)
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)
1314 ; CHECK: r1:0 = vdmpy(r1:0, r3:2):sat
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)
1321 ; CHECK: r1:0 = vdmpy(r1:0, r3:2):<<1:sat
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)
1329 ; CHECK: r1:0 = vrmpybu(r1:0, r3:2)
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)
1336 ; CHECK: r1:0 = vrmpybsu(r1:0, r3:2)
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)
1343 ; CHECK: r1:0 += vrmpybu(r3:2, r5:4)
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)
1350 ; CHECK: r1:0 += vrmpybsu(r3:2, r5:4)
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)
1358 ; CHECK: r1:0 = vdmpybsu(r1:0, r3:2):sat
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)
1365 ; CHECK: r1:0 += vdmpybsu(r3:2, r5:4):sat
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)
1373 ; CHECK: r1:0 = vmpyeh(r1:0, r3:2):sat
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)
1380 ; CHECK: r1:0 = vmpyeh(r1:0, r3:2):<<1:sat
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)
1387 ; CHECK: r1:0 += vmpyeh(r3:2, r5:4)
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)
1394 ; CHECK: r1:0 += vmpyeh(r3:2, r5:4):sat
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)
1401 ; CHECK: r1:0 += vmpyeh(r3:2, r5:4):<<1:sat
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)
1409 ; CHECK: r1:0 = vmpyh(r0, r1):sat
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)
1416 ; CHECK: r1:0 = vmpyh(r0, r1):<<1:sat
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)
1423 ; CHECK: r1:0 += vmpyh(r2, r3)
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)
1430 ; CHECK: r1:0 += vmpyh(r2, r3):sat
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)
1437 ; CHECK: r1:0 += vmpyh(r2, r3):<<1:sat
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)
1445 ; CHECK: r1:0 = vmpyhsu(r0, r1):sat
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)
1452 ; CHECK: r1:0 = vmpyhsu(r0, r1):<<1:sat
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)
1459 ; CHECK: r1:0 += vmpyhsu(r2, r3):sat
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)
1466 ; CHECK: r1:0 += vmpyhsu(r2, r3):<<1:sat
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)
1474 ; CHECK: r1:0 = vrmpyh(r1:0, r3:2)
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)
1481 ; CHECK: r1:0 += vrmpyh(r3:2, r5:4)
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)
1489 ; CHECK: r1:0 = vmpybsu(r0, r1)
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)
1496 ; CHECK: r1:0 = vmpybu(r0, r1)
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)
1503 ; CHECK: r1:0 += vmpybu(r2, r3)
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)
1510 ; CHECK: r1:0 += vmpybsu(r2, r3)
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)
1518 ; CHECK: r1:0 = vpmpyh(r0, r1)
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)
1525 ; CHECK: r1:0 ^= vpmpyh(r2, r3)