2 // RUN: %cc% %ccflags% %ccout% %s.o %s; llvm-objdump --mcpu=%mcpu% -d %s.o | FileCheck --allow-unused-prefixes --check-prefixes %prefixes% %s
4 #include "cmsis_compiler.h"
6 volatile static int32_t s32_1 = 0x47;
7 volatile static int32_t s32_2 = 0x11;
8 volatile static int32_t s32_3 = 0x15;
9 volatile static uint8_t u8 = 5u;
14 // CHECK-LABEL: <sadd8>:
15 // CHECK: sadd8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
16 volatile uint32_t result = __SADD8(s32_1, s32_2);
17 // CHECK: {{(bx lr)|(pop {.*pc})}}
21 // CHECK-LABEL: <qadd8>:
22 // CHECK: qadd8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
23 volatile uint32_t result = __QADD8(s32_1, s32_2);
24 // CHECK: {{(bx lr)|(pop {.*pc})}}
28 // CHECK-LABEL: <shadd8>:
29 // CHECK: shadd8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
30 volatile uint32_t result = __SHADD8(s32_1, s32_2);
31 // CHECK: {{(bx lr)|(pop {.*pc})}}
35 // CHECK-LABEL: <uadd8>:
36 // CHECK: uadd8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
37 volatile uint32_t result = __UADD8(s32_1, s32_2);
38 // CHECK: {{(bx lr)|(pop {.*pc})}}
42 // CHECK-LABEL: <uqadd8>:
43 // CHECK: uqadd8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
44 volatile uint32_t result = __UQADD8(s32_1, s32_2);
45 // CHECK: {{(bx lr)|(pop {.*pc})}}
49 // CHECK-LABEL: <uhadd8>:
50 // CHECK: uhadd8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
51 volatile uint32_t result = __UHADD8(s32_1, s32_2);
52 // CHECK: {{(bx lr)|(pop {.*pc})}}
58 // CHECK-LABEL: <ssub8>:
59 // CHECK: ssub8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
60 volatile uint32_t result = __SSUB8(s32_1, s32_2);
61 // CHECK: {{(bx lr)|(pop {.*pc})}}
65 // CHECK-LABEL: <qsub8>:
66 // CHECK: qsub8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
67 volatile uint32_t result = __QSUB8(s32_1, s32_2);
68 // CHECK: {{(bx lr)|(pop {.*pc})}}
72 // CHECK-LABEL: <shsub8>:
73 // CHECK: shsub8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
74 volatile uint32_t result = __SHSUB8(s32_1, s32_2);
75 // CHECK: {{(bx lr)|(pop {.*pc})}}
79 // CHECK-LABEL: <usub8>:
80 // CHECK: usub8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
81 volatile uint32_t result = __USUB8(s32_1, s32_2);
82 // CHECK: {{(bx lr)|(pop {.*pc})}}
86 // CHECK-LABEL: <uqsub8>:
87 // CHECK: uqsub8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
88 volatile uint32_t result = __UQSUB8(s32_1, s32_2);
89 // CHECK: {{(bx lr)|(pop {.*pc})}}
93 // CHECK-LABEL: <uhsub8>:
94 // CHECK: uhsub8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
95 volatile uint32_t result = __UHSUB8(s32_1, s32_2);
96 // CHECK: {{(bx lr)|(pop {.*pc})}}
102 // CHECK-LABEL: <sadd16>:
103 // CHECK: sadd16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
104 volatile uint32_t result = __SADD16(s32_1, s32_2);
105 // CHECK: {{(bx lr)|(pop {.*pc})}}
109 // CHECK-LABEL: <qadd16>:
110 // CHECK: qadd16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
111 volatile uint32_t result = __QADD16(s32_1, s32_2);
112 // CHECK: {{(bx lr)|(pop {.*pc})}}
116 // CHECK-LABEL: <shadd16>:
117 // CHECK: shadd16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
118 volatile uint32_t result = __SHADD16(s32_1, s32_2);
119 // CHECK: {{(bx lr)|(pop {.*pc})}}
123 // CHECK-LABEL: <uadd16>:
124 // CHECK: uadd16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
125 volatile uint32_t result = __UADD16(s32_1, s32_2);
126 // CHECK: {{(bx lr)|(pop {.*pc})}}
130 // CHECK-LABEL: <uqadd16>:
131 // CHECK: uqadd16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
132 volatile uint32_t result = __UQADD16(s32_1, s32_2);
133 // CHECK: {{(bx lr)|(pop {.*pc})}}
137 // CHECK-LABEL: <uhadd16>:
138 // CHECK: uhadd16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
139 volatile uint32_t result = __UHADD16(s32_1, s32_2);
140 // CHECK: {{(bx lr)|(pop {.*pc})}}
146 // CHECK-LABEL: <ssub16>:
147 // CHECK: ssub16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
148 volatile uint32_t result = __SSUB16(s32_1, s32_2);
149 // CHECK: {{(bx lr)|(pop {.*pc})}}
153 // CHECK-LABEL: <qsub16>:
154 // CHECK: qsub16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
155 volatile uint32_t result = __QSUB16(s32_1, s32_2);
156 // CHECK: {{(bx lr)|(pop {.*pc})}}
160 // CHECK-LABEL: <shsub16>:
161 // CHECK: shsub16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
162 volatile uint32_t result = __SHSUB16(s32_1, s32_2);
163 // CHECK: {{(bx lr)|(pop {.*pc})}}
167 // CHECK-LABEL: <usub16>:
168 // CHECK: usub16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
169 volatile uint32_t result = __USUB16(s32_1, s32_2);
170 // CHECK: {{(bx lr)|(pop {.*pc})}}
174 // CHECK-LABEL: <uqsub16>:
175 // CHECK: uqsub16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
176 volatile uint32_t result = __UQSUB16(s32_1, s32_2);
177 // CHECK: {{(bx lr)|(pop {.*pc})}}
181 // CHECK-LABEL: <uhsub16>:
182 // CHECK: uhsub16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
183 volatile uint32_t result = __UHSUB16(s32_1, s32_2);
184 // CHECK: {{(bx lr)|(pop {.*pc})}}
190 // CHECK-LABEL: <sasx>:
191 // CHECK: sasx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
192 volatile uint32_t result = __SASX(s32_1, s32_2);
193 // CHECK: {{(bx lr)|(pop {.*pc})}}
197 // CHECK-LABEL: <qasx>:
198 // CHECK: qasx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
199 volatile uint32_t result = __QASX(s32_1, s32_2);
200 // CHECK: {{(bx lr)|(pop {.*pc})}}
204 // CHECK-LABEL: <shasx>:
205 // CHECK: shasx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
206 volatile uint32_t result = __SHASX(s32_1, s32_2);
207 // CHECK: {{(bx lr)|(pop {.*pc})}}
211 // CHECK-LABEL: <uasx>:
212 // CHECK: uasx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
213 volatile uint32_t result = __UASX(s32_1, s32_2);
214 // CHECK: {{(bx lr)|(pop {.*pc})}}
218 // CHECK-LABEL: <uqasx>:
219 // CHECK: uqasx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
220 volatile uint32_t result = __UQASX(s32_1, s32_2);
221 // CHECK: {{(bx lr)|(pop {.*pc})}}
225 // CHECK-LABEL: <uhasx>:
226 // CHECK: uhasx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
227 volatile uint32_t result = __UHASX(s32_1, s32_2);
228 // CHECK: {{(bx lr)|(pop {.*pc})}}
234 // CHECK-LABEL: <ssax>:
235 // CHECK: ssax {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
236 volatile uint32_t result = __SSAX(s32_1, s32_2);
237 // CHECK: {{(bx lr)|(pop {.*pc})}}
241 // CHECK-LABEL: <qsax>:
242 // CHECK: qsax {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
243 volatile uint32_t result = __QSAX(s32_1, s32_2);
244 // CHECK: {{(bx lr)|(pop {.*pc})}}
248 // CHECK-LABEL: <shsax>:
249 // CHECK: shsax {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
250 volatile uint32_t result = __SHSAX(s32_1, s32_2);
251 // CHECK: {{(bx lr)|(pop {.*pc})}}
255 // CHECK-LABEL: <usax>:
256 // CHECK: usax {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
257 volatile uint32_t result = __USAX(s32_1, s32_2);
258 // CHECK: {{(bx lr)|(pop {.*pc})}}
262 // CHECK-LABEL: <uqsax>:
263 // CHECK: uqsax {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
264 volatile uint32_t result = __UQSAX(s32_1, s32_2);
265 // CHECK: {{(bx lr)|(pop {.*pc})}}
269 // CHECK-LABEL: <uhsax>:
270 // CHECK: uhsax {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
271 volatile uint32_t result = __UHSAX(s32_1, s32_2);
272 // CHECK: {{(bx lr)|(pop {.*pc})}}
278 // CHECK-LABEL: <usad8>:
279 // CHECK: usad8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
280 volatile uint32_t result = __USAD8(s32_1, s32_2);
281 // CHECK: {{(bx lr)|(pop {.*pc})}}
285 // CHECK-LABEL: <usada8>:
286 // CHECK: usada8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
287 volatile uint32_t result = __USADA8(s32_1, s32_2, s32_3);
288 // CHECK: {{(bx lr)|(pop {.*pc})}}
292 // CHECK-LABEL: <ssat16>:
293 // CHECK: ssat16 {{r[0-9]+}}, #0x5, {{r[0-9]+}}
294 volatile uint32_t result = __SSAT16(s32_1, 0x05);
295 // CHECK: {{(bx lr)|(pop {.*pc})}}
299 // CHECK-LABEL: <usat16>:
300 // CHECK: usat16 {{r[0-9]+}}, #0x5, {{r[0-9]+}}
301 volatile uint32_t result = __USAT16(s32_1, 0x05);
302 // CHECK: {{(bx lr)|(pop {.*pc})}}
306 // CHECK-LABEL: <uxtb16>:
307 // CHECK: uxtb16 {{r[0-9]+}}, {{r[0-9]+}}
308 volatile uint32_t result = __UXTB16(s32_1);
309 // CHECK: {{(bx lr)|(pop {.*pc})}}
313 // CHECK-LABEL: <uxtab16>:
314 // CHECK: uxtab16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
315 volatile uint32_t result = __UXTAB16(s32_1, s32_2);
316 // CHECK: {{(bx lr)|(pop {.*pc})}}
320 // CHECK-LABEL: <sxtb16>:
321 // CHECK: sxtb16 {{r[0-9]+}}, {{r[0-9]+}}
322 volatile uint32_t result = __SXTB16(s32_1);
323 // CHECK: {{(bx lr)|(pop {.*pc})}}
327 // CHECK-LABEL: <sxtab16>:
328 // CHECK: sxtab16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
329 volatile uint32_t result = __SXTAB16(s32_1, s32_2);
330 // CHECK: {{(bx lr)|(pop {.*pc})}}
336 // CHECK-LABEL: <smuad>:
337 // CHECK: smuad {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
338 volatile uint32_t result = __SMUAD(s32_1, s32_2);
339 // CHECK: {{(bx lr)|(pop {.*pc})}}
343 // CHECK-LABEL: <smuadx>:
344 // CHECK: smuadx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
345 volatile uint32_t result = __SMUADX(s32_1, s32_2);
346 // CHECK: {{(bx lr)|(pop {.*pc})}}
350 // CHECK-LABEL: <smlad>:
351 // CHECK: smlad {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
352 volatile uint32_t result = __SMLAD(s32_1, s32_2, s32_3);
353 // CHECK: {{(bx lr)|(pop {.*pc})}}
357 // CHECK-LABEL: <smladx>:
358 // CHECK: smladx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
359 volatile uint32_t result = __SMLADX(s32_1, s32_2, s32_3);
360 // CHECK: {{(bx lr)|(pop {.*pc})}}
364 // CHECK-LABEL: <smlald>:
365 // CHECK: smlald {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
366 volatile uint32_t result = __SMLALD(s32_1, s32_2, s32_3);
367 // CHECK: {{(bx lr)|(pop {.*pc})}}
371 // CHECK-LABEL: <smlaldx>:
372 // CHECK: smlaldx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
373 volatile uint32_t result = __SMLALDX(s32_1, s32_2, s32_3);
374 // CHECK: {{(bx lr)|(pop {.*pc})}}
378 // CHECK-LABEL: <smusd>:
379 // CHECK: smusd {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
380 volatile uint32_t result = __SMUSD(s32_1, s32_2);
381 // CHECK: {{(bx lr)|(pop {.*pc})}}
385 // CHECK-LABEL: <smusdx>:
386 // CHECK: smusdx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
387 volatile uint32_t result = __SMUSDX(s32_1, s32_2);
388 // CHECK: {{(bx lr)|(pop {.*pc})}}
392 // CHECK-LABEL: <smlsd>:
393 // CHECK: smlsd {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
394 volatile uint32_t result = __SMLSD(s32_1, s32_2, s32_3);
395 // CHECK: {{(bx lr)|(pop {.*pc})}}
399 // CHECK-LABEL: <smlsdx>:
400 // CHECK: smlsdx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
401 volatile uint32_t result = __SMLSDX(s32_1, s32_2, s32_3);
402 // CHECK: {{(bx lr)|(pop {.*pc})}}
406 // CHECK-LABEL: <smlsld>:
407 // CHECK: smlsld {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
408 volatile uint32_t result = __SMLSLD(s32_1, s32_2, s32_3);
409 // CHECK: {{(bx lr)|(pop {.*pc})}}
413 // CHECK-LABEL: <smlsldx>:
414 // CHECK: smlsldx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
415 volatile uint32_t result = __SMLSLDX(s32_1, s32_2, s32_3);
416 // CHECK: {{(bx lr)|(pop {.*pc})}}
420 // CHECK-LABEL: <sel>:
421 // CHECK: sel {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
422 volatile uint32_t result = __SEL(s32_1, s32_2);
423 // CHECK: {{(bx lr)|(pop {.*pc})}}
427 // CHECK-LABEL: <qadd>:
428 // CHECK: qadd {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
429 volatile uint32_t result = __QADD(s32_1, s32_2);
430 // CHECK: {{(bx lr)|(pop {.*pc})}}
434 // CHECK-LABEL: <qsub>:
435 // CHECK: qsub {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
436 volatile uint32_t result = __QSUB(s32_1, s32_2);
437 // CHECK: {{(bx lr)|(pop {.*pc})}}
441 // CHECK-LABEL: <pkhbt0>:
442 // CHECK: {{pkhtb|pkhbt}} {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
445 volatile uint32_t result = __PKHBT(s32_1, s32_2, 0);
446 // CHECK: {{(bx lr)|(pop {.*pc})}}
450 // CHECK-LABEL: <pkhbt>:
451 // CHECK: pkhbt {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, lsl #11
452 volatile uint32_t result = __PKHBT(s32_1, s32_2, 11);
453 // CHECK: {{(bx lr)|(pop {.*pc})}}
457 // CHECK-LABEL: <pkhtb0>:
458 // CHECK: {{pkhtb|pkhbt}} {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
461 volatile uint32_t result = __PKHTB(s32_1, s32_2, 0);
462 // CHECK: {{(bx lr)|(pop {.*pc})}}
466 // CHECK-LABEL: <pkhtb>:
467 // CHECK: pkhtb {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, asr #11
468 volatile uint32_t result = __PKHTB(s32_1, s32_2, 11);
469 // CHECK: {{(bx lr)|(pop {.*pc})}}
473 // CHECK-LABEL: <sxtb16_ror>:
474 // CHECK: sxtb16 {{r[0-9]+}}, {{r[0-9]+}}, ror #8
475 volatile uint32_t result = __SXTB16_RORn(s32_1, 8);
477 // CHECK: sxtb16 {{r[0-9]+}}, {{r[0-9]+}}, ror #16
478 result = __SXTB16_RORn(s32_1, 16);
480 // CHECK: sxtb16 {{r[0-9]+}}, {{r[0-9]+}}, ror #24
481 result = __SXTB16_RORn(s32_1, 24);
483 // CHECK-THUMB: ror.w [[REG:r[0-9]+]], {{r[0-9]+}}, {{#5|#0x5}}
484 // CHECK-ARM: ror [[REG:r[0-9]+]], {{r[0-9]+}}, {{#5|#0x5}}
485 // CHECK: sxtb16 {{r[0-9]+}}, [[REG]]
487 result = __SXTB16_RORn(s32_1, 5);
489 // CHECK-THUMB: ror{{.w|ne|s}} {{r[0-9]+}}, {{r[0-9]+}}
490 // CHECK-ARM: ror{{(ne)?}} {{r[0-9]+}}, {{r[0-9]+}}
491 // CHECK: sxtb16 {{r[0-9]+}}, {{r[0-9]+}}
493 result = __SXTB16_RORn(s32_1, u8);
495 // CHECK: {{(bx lr)|(pop {.*pc})}}
499 // CHECK-LABEL: <sxtab16_ror>:
501 // CHECK: sxtab16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, ror #8
502 volatile uint32_t result = __SXTAB16_RORn(s32_1, s32_2, 8);
504 // CHECK: sxtab16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, ror #16
505 result = __SXTAB16_RORn(s32_1, s32_2, 16);
507 // CHECK: sxtab16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, ror #24
508 result = __SXTAB16_RORn(s32_1, s32_2, 24);
510 // CHECK-THUMB: ror.w [[REG:r[0-9]+]], {{r[0-9]+}}, {{#5|#0x5}}
511 // CHECK-ARM: ror [[REG:r[0-9]+]], {{r[0-9]+}}, {{#5|#0x5}}
512 // CHECK: sxtab16 {{r[0-9]+}}, {{r[0-9]+}}, [[REG]]
514 result = __SXTAB16_RORn(s32_1, s32_2, 5);
516 // CHECK-THUMB: ror{{.w|ne|s}} {{r[0-9]+}}, {{r[0-9]+}}
517 // CHECK-ARM: ror{{(ne)?}} {{r[0-9]+}}, {{r[0-9]+}}
518 // CHECK: sxtab16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
520 result = __SXTAB16_RORn(s32_1, s32_2, u8);
522 // CHECK: {{(bx lr)|(pop {.*pc})}}
526 // CHECK-LABEL: <smmla>:
527 // CHECK: smmla {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
528 volatile int32_t result = __SMMLA(s32_1, s32_2, s32_3);
529 // CHECK: {{(bx lr)|(pop {.*pc})}}