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