[Hexagon] Adding intrinsics for doubleword ALU operations.
[oota-llvm.git] / test / CodeGen / Hexagon / intrinsics-mpyd-acc.ll
1 ; RUN: llc -march=hexagon -mcpu=hexagonv5 < %s | FileCheck %s
2
3 ; Verify that the mpy intrinsics with accumulation are lowered into
4 ; the right instructions. These instructions have a 64-bit destination register.
5
6 @c = external global i64
7
8 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l)
9
10 define void @test1(i32 %a1, i32 %b1) #0 {
11 entry:
12   %0 = load i64* @c, align 8
13   %1 = tail call i64 @llvm.hexagon.M2.mpyd.acc.ll.s0(i64 %0, i32 %a1, i32 %b1)
14   store i64 %1, i64* @c, align 8
15   ret void
16 }
17
18 declare i64 @llvm.hexagon.M2.mpyd.acc.ll.s0(i64, i32, i32) #1
19
20 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h)
21
22 define void @test2(i32 %a2, i32 %b2) #0 {
23 entry:
24   %0 = load i64* @c, align 8
25   %1 = tail call i64 @llvm.hexagon.M2.mpyd.acc.lh.s0(i64 %0, i32 %a2, i32 %b2)
26   store i64 %1, i64* @c, align 8
27   ret void
28 }
29
30 declare i64 @llvm.hexagon.M2.mpyd.acc.lh.s0(i64, i32, i32) #1
31
32 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l)
33
34 define void @test3(i32 %a3, i32 %b3) #0 {
35 entry:
36   %0 = load i64* @c, align 8
37   %1 = tail call i64 @llvm.hexagon.M2.mpyd.acc.hl.s0(i64 %0, i32 %a3, i32 %b3)
38   store i64 %1, i64* @c, align 8
39   ret void
40 }
41
42 declare i64 @llvm.hexagon.M2.mpyd.acc.hl.s0(i64, i32, i32) #1
43
44 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h)
45
46 define void @test4(i32 %a4, i32 %b4) #0 {
47 entry:
48   %0 = load i64* @c, align 8
49   %1 = tail call i64 @llvm.hexagon.M2.mpyd.acc.hh.s0(i64 %0, i32 %a4, i32 %b4)
50   store i64 %1, i64* @c, align 8
51   ret void
52 }
53
54 declare i64 @llvm.hexagon.M2.mpyd.acc.hh.s0(i64, i32, i32) #1
55
56 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l)
57
58 define void @test5(i32 %a5, i32 %b5) #0 {
59 entry:
60   %0 = load i64* @c, align 8
61   %1 = tail call i64 @llvm.hexagon.M2.mpyd.nac.ll.s0(i64 %0, i32 %a5, i32 %b5)
62   store i64 %1, i64* @c, align 8
63   ret void
64 }
65
66 declare i64 @llvm.hexagon.M2.mpyd.nac.ll.s0(i64, i32, i32) #1
67
68 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h)
69
70 define void @test6(i32 %a6, i32 %b6) #0 {
71 entry:
72   %0 = load i64* @c, align 8
73   %1 = tail call i64 @llvm.hexagon.M2.mpyd.nac.lh.s0(i64 %0, i32 %a6, i32 %b6)
74   store i64 %1, i64* @c, align 8
75   ret void
76 }
77
78 declare i64 @llvm.hexagon.M2.mpyd.nac.lh.s0(i64, i32, i32) #1
79
80 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l)
81
82 define void @test7(i32 %a7, i32 %b7) #0 {
83 entry:
84   %0 = load i64* @c, align 8
85   %1 = tail call i64 @llvm.hexagon.M2.mpyd.nac.hl.s0(i64 %0, i32 %a7, i32 %b7)
86   store i64 %1, i64* @c, align 8
87   ret void
88 }
89
90 declare i64 @llvm.hexagon.M2.mpyd.nac.hl.s0(i64, i32, i32) #1
91
92 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h)
93
94 define void @test8(i32 %a8, i32 %b8) #0 {
95 entry:
96   %0 = load i64* @c, align 8
97   %1 = tail call i64 @llvm.hexagon.M2.mpyd.nac.hh.s0(i64 %0, i32 %a8, i32 %b8)
98   store i64 %1, i64* @c, align 8
99   ret void
100 }
101
102 declare i64 @llvm.hexagon.M2.mpyd.nac.hh.s0(i64, i32, i32) #1
103
104 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l)
105
106 define void @test9(i32 %a9, i32 %b9) #0 {
107 entry:
108   %0 = load i64* @c, align 8
109   %1 = tail call i64 @llvm.hexagon.M2.mpyud.acc.ll.s0(i64 %0, i32 %a9, i32 %b9)
110   store i64 %1, i64* @c, align 8
111   ret void
112 }
113
114 declare i64 @llvm.hexagon.M2.mpyud.acc.ll.s0(i64, i32, i32) #1
115
116 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h)
117
118 define void @test10(i32 %a10, i32 %b10) #0 {
119 entry:
120   %0 = load i64* @c, align 8
121   %1 = tail call i64 @llvm.hexagon.M2.mpyud.acc.lh.s0(i64 %0, i32 %a10, i32 %b10)
122   store i64 %1, i64* @c, align 8
123   ret void
124 }
125
126 declare i64 @llvm.hexagon.M2.mpyud.acc.lh.s0(i64, i32, i32) #1
127
128 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l)
129
130 define void @test11(i32 %a11, i32 %b11) #0 {
131 entry:
132   %0 = load i64* @c, align 8
133   %1 = tail call i64 @llvm.hexagon.M2.mpyud.acc.hl.s0(i64 %0, i32 %a11, i32 %b11)
134   store i64 %1, i64* @c, align 8
135   ret void
136 }
137
138 declare i64 @llvm.hexagon.M2.mpyud.acc.hl.s0(i64, i32, i32) #1
139
140 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h)
141
142 define void @test12(i32 %a12, i32 %b12) #0 {
143 entry:
144   %0 = load i64* @c, align 8
145   %1 = tail call i64 @llvm.hexagon.M2.mpyud.acc.hh.s0(i64 %0, i32 %a12, i32 %b12)
146   store i64 %1, i64* @c, align 8
147   ret void
148 }
149
150 declare i64 @llvm.hexagon.M2.mpyud.acc.hh.s0(i64, i32, i32) #1
151
152 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l)
153
154 define void @test13(i32 %a13, i32 %b13) #0 {
155 entry:
156   %0 = load i64* @c, align 8
157   %1 = tail call i64 @llvm.hexagon.M2.mpyud.nac.ll.s0(i64 %0, i32 %a13, i32 %b13)
158   store i64 %1, i64* @c, align 8
159   ret void
160 }
161
162 declare i64 @llvm.hexagon.M2.mpyud.nac.ll.s0(i64, i32, i32) #1
163
164 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h)
165
166 define void @test14(i32 %a14, i32 %b14) #0 {
167 entry:
168   %0 = load i64* @c, align 8
169   %1 = tail call i64 @llvm.hexagon.M2.mpyud.nac.lh.s0(i64 %0, i32 %a14, i32 %b14)
170   store i64 %1, i64* @c, align 8
171   ret void
172 }
173
174 declare i64 @llvm.hexagon.M2.mpyud.nac.lh.s0(i64, i32, i32) #1
175
176 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l)
177
178 define void @test15(i32 %a15, i32 %b15) #0 {
179 entry:
180   %0 = load i64* @c, align 8
181   %1 = tail call i64 @llvm.hexagon.M2.mpyud.nac.hl.s0(i64 %0, i32 %a15, i32 %b15)
182   store i64 %1, i64* @c, align 8
183   ret void
184 }
185
186 declare i64 @llvm.hexagon.M2.mpyud.nac.hl.s0(i64, i32, i32) #1
187
188 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h)
189
190 define void @test16(i32 %a16, i32 %b16) #0 {
191 entry:
192   %0 = load i64* @c, align 8
193   %1 = tail call i64 @llvm.hexagon.M2.mpyud.nac.hh.s0(i64 %0, i32 %a16, i32 %b16)
194   store i64 %1, i64* @c, align 8
195   ret void
196 }
197
198 declare i64 @llvm.hexagon.M2.mpyud.nac.hh.s0(i64, i32, i32) #1
199
200 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
201
202 define void @test17(i32 %a17, i32 %b17) #0 {
203 entry:
204   %0 = load i64* @c, align 8
205   %1 = tail call i64 @llvm.hexagon.M2.mpyd.acc.ll.s1(i64 %0, i32 %a17, i32 %b17)
206   store i64 %1, i64* @c, align 8
207   ret void
208 }
209
210 declare i64 @llvm.hexagon.M2.mpyd.acc.ll.s1(i64, i32, i32) #1
211
212 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
213
214 define void @test18(i32 %a18, i32 %b18) #0 {
215 entry:
216   %0 = load i64* @c, align 8
217   %1 = tail call i64 @llvm.hexagon.M2.mpyd.acc.lh.s1(i64 %0, i32 %a18, i32 %b18)
218   store i64 %1, i64* @c, align 8
219   ret void
220 }
221
222 declare i64 @llvm.hexagon.M2.mpyd.acc.lh.s1(i64, i32, i32) #1
223
224 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
225
226 define void @test19(i32 %a19, i32 %b19) #0 {
227 entry:
228   %0 = load i64* @c, align 8
229   %1 = tail call i64 @llvm.hexagon.M2.mpyd.acc.hl.s1(i64 %0, i32 %a19, i32 %b19)
230   store i64 %1, i64* @c, align 8
231   ret void
232 }
233
234 declare i64 @llvm.hexagon.M2.mpyd.acc.hl.s1(i64, i32, i32) #1
235
236 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
237
238 define void @test20(i32 %a20, i32 %b20) #0 {
239 entry:
240   %0 = load i64* @c, align 8
241   %1 = tail call i64 @llvm.hexagon.M2.mpyd.acc.hh.s1(i64 %0, i32 %a20, i32 %b20)
242   store i64 %1, i64* @c, align 8
243   ret void
244 }
245
246 declare i64 @llvm.hexagon.M2.mpyd.acc.hh.s1(i64, i32, i32) #1
247
248 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
249
250 define void @test21(i32 %a21, i32 %b21) #0 {
251 entry:
252   %0 = load i64* @c, align 8
253   %1 = tail call i64 @llvm.hexagon.M2.mpyd.nac.ll.s1(i64 %0, i32 %a21, i32 %b21)
254   store i64 %1, i64* @c, align 8
255   ret void
256 }
257
258 declare i64 @llvm.hexagon.M2.mpyd.nac.ll.s1(i64, i32, i32) #1
259
260 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
261
262 define void @test22(i32 %a22, i32 %b22) #0 {
263 entry:
264   %0 = load i64* @c, align 8
265   %1 = tail call i64 @llvm.hexagon.M2.mpyd.nac.lh.s1(i64 %0, i32 %a22, i32 %b22)
266   store i64 %1, i64* @c, align 8
267   ret void
268 }
269
270 declare i64 @llvm.hexagon.M2.mpyd.nac.lh.s1(i64, i32, i32) #1
271
272 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
273
274 define void @test23(i32 %a23, i32 %b23) #0 {
275 entry:
276   %0 = load i64* @c, align 8
277   %1 = tail call i64 @llvm.hexagon.M2.mpyd.nac.hl.s1(i64 %0, i32 %a23, i32 %b23)
278   store i64 %1, i64* @c, align 8
279   ret void
280 }
281
282 declare i64 @llvm.hexagon.M2.mpyd.nac.hl.s1(i64, i32, i32) #1
283
284 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
285
286 define void @test24(i32 %a24, i32 %b24) #0 {
287 entry:
288   %0 = load i64* @c, align 8
289   %1 = tail call i64 @llvm.hexagon.M2.mpyd.nac.hh.s1(i64 %0, i32 %a24, i32 %b24)
290   store i64 %1, i64* @c, align 8
291   ret void
292 }
293
294 declare i64 @llvm.hexagon.M2.mpyd.nac.hh.s1(i64, i32, i32) #1
295
296 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
297
298 define void @test25(i32 %a25, i32 %b25) #0 {
299 entry:
300   %0 = load i64* @c, align 8
301   %1 = tail call i64 @llvm.hexagon.M2.mpyud.acc.ll.s1(i64 %0, i32 %a25, i32 %b25)
302   store i64 %1, i64* @c, align 8
303   ret void
304 }
305
306 declare i64 @llvm.hexagon.M2.mpyud.acc.ll.s1(i64, i32, i32) #1
307
308 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
309
310 define void @test26(i32 %a26, i32 %b26) #0 {
311 entry:
312   %0 = load i64* @c, align 8
313   %1 = tail call i64 @llvm.hexagon.M2.mpyud.acc.lh.s1(i64 %0, i32 %a26, i32 %b26)
314   store i64 %1, i64* @c, align 8
315   ret void
316 }
317
318 declare i64 @llvm.hexagon.M2.mpyud.acc.lh.s1(i64, i32, i32) #1
319
320 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
321
322 define void @test27(i32 %a27, i32 %b27) #0 {
323 entry:
324   %0 = load i64* @c, align 8
325   %1 = tail call i64 @llvm.hexagon.M2.mpyud.acc.hl.s1(i64 %0, i32 %a27, i32 %b27)
326   store i64 %1, i64* @c, align 8
327   ret void
328 }
329
330 declare i64 @llvm.hexagon.M2.mpyud.acc.hl.s1(i64, i32, i32) #1
331
332 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}+={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
333
334 define void @test28(i32 %a28, i32 %b28) #0 {
335 entry:
336   %0 = load i64* @c, align 8
337   %1 = tail call i64 @llvm.hexagon.M2.mpyud.acc.hh.s1(i64 %0, i32 %a28, i32 %b28)
338   store i64 %1, i64* @c, align 8
339   ret void
340 }
341
342 declare i64 @llvm.hexagon.M2.mpyud.acc.hh.s1(i64, i32, i32) #1
343
344 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
345
346 define void @test29(i32 %a29, i32 %b29) #0 {
347 entry:
348   %0 = load i64* @c, align 8
349   %1 = tail call i64 @llvm.hexagon.M2.mpyud.nac.ll.s1(i64 %0, i32 %a29, i32 %b29)
350   store i64 %1, i64* @c, align 8
351   ret void
352 }
353
354 declare i64 @llvm.hexagon.M2.mpyud.nac.ll.s1(i64, i32, i32) #1
355
356 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
357
358 define void @test30(i32 %a30, i32 %b30) #0 {
359 entry:
360   %0 = load i64* @c, align 8
361   %1 = tail call i64 @llvm.hexagon.M2.mpyud.nac.lh.s1(i64 %0, i32 %a30, i32 %b30)
362   store i64 %1, i64* @c, align 8
363   ret void
364 }
365
366 declare i64 @llvm.hexagon.M2.mpyud.nac.lh.s1(i64, i32, i32) #1
367
368 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
369
370 define void @test31(i32 %a31, i32 %b31) #0 {
371 entry:
372   %0 = load i64* @c, align 8
373   %1 = tail call i64 @llvm.hexagon.M2.mpyud.nac.hl.s1(i64 %0, i32 %a31, i32 %b31)
374   store i64 %1, i64* @c, align 8
375   ret void
376 }
377
378 declare i64 @llvm.hexagon.M2.mpyud.nac.hl.s1(i64, i32, i32) #1
379
380 ; CHECK: r{{[0-9]+}}:{{[0-9]+}}{{ *}}-={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
381
382 define void @test32(i32 %a32, i32 %b32) #0 {
383 entry:
384   %0 = load i64* @c, align 8
385   %1 = tail call i64 @llvm.hexagon.M2.mpyud.nac.hh.s1(i64 %0, i32 %a32, i32 %b32)
386   store i64 %1, i64* @c, align 8
387   ret void
388 }
389
390 declare i64 @llvm.hexagon.M2.mpyud.nac.hh.s1(i64, i32, i32) #1