// REQUIRES: dsp // RUN: %cc% %ccflags% %ccout% %T/%basename_t.o %s; llvm-objdump --mcpu=%mcpu% -d %T/%basename_t.o | FileCheck --allow-unused-prefixes --check-prefixes %prefixes% %s #include "cmsis_compiler.h" volatile static int32_t s32_1 = 0x47; volatile static int32_t s32_2 = 0x11; volatile static int32_t s32_3 = 0x15; volatile static uint8_t u8 = 5u; /* ADD8 */ void sadd8() { // CHECK-LABEL: : // CHECK: sadd8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SADD8(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void qadd8() { // CHECK-LABEL: : // CHECK: qadd8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __QADD8(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void shadd8() { // CHECK-LABEL: : // CHECK: shadd8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SHADD8(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uadd8() { // CHECK-LABEL: : // CHECK: uadd8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UADD8(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uqadd8() { // CHECK-LABEL: : // CHECK: uqadd8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UQADD8(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uhadd8() { // CHECK-LABEL: : // CHECK: uhadd8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UHADD8(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } /* SUB8 */ void ssub8() { // CHECK-LABEL: : // CHECK: ssub8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SSUB8(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void qsub8() { // CHECK-LABEL: : // CHECK: qsub8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __QSUB8(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void shsub8() { // CHECK-LABEL: : // CHECK: shsub8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SHSUB8(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void usub8() { // CHECK-LABEL: : // CHECK: usub8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __USUB8(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uqsub8() { // CHECK-LABEL: : // CHECK: uqsub8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UQSUB8(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uhsub8() { // CHECK-LABEL: : // CHECK: uhsub8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UHSUB8(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } /* ADD16 */ void sadd16() { // CHECK-LABEL: : // CHECK: sadd16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SADD16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void qadd16() { // CHECK-LABEL: : // CHECK: qadd16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __QADD16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void shadd16() { // CHECK-LABEL: : // CHECK: shadd16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SHADD16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uadd16() { // CHECK-LABEL: : // CHECK: uadd16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UADD16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uqadd16() { // CHECK-LABEL: : // CHECK: uqadd16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UQADD16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uhadd16() { // CHECK-LABEL: : // CHECK: uhadd16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UHADD16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } /* SUB16 */ void ssub16() { // CHECK-LABEL: : // CHECK: ssub16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SSUB16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void qsub16() { // CHECK-LABEL: : // CHECK: qsub16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __QSUB16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void shsub16() { // CHECK-LABEL: : // CHECK: shsub16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SHSUB16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void usub16() { // CHECK-LABEL: : // CHECK: usub16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __USUB16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uqsub16() { // CHECK-LABEL: : // CHECK: uqsub16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UQSUB16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uhsub16() { // CHECK-LABEL: : // CHECK: uhsub16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UHSUB16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } /* ASX */ void sasx() { // CHECK-LABEL: : // CHECK: sasx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SASX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void qasx() { // CHECK-LABEL: : // CHECK: qasx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __QASX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void shasx() { // CHECK-LABEL: : // CHECK: shasx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SHASX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uasx() { // CHECK-LABEL: : // CHECK: uasx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UASX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uqasx() { // CHECK-LABEL: : // CHECK: uqasx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UQASX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uhasx() { // CHECK-LABEL: : // CHECK: uhasx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UHASX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } /* SAX */ void ssax() { // CHECK-LABEL: : // CHECK: ssax {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SSAX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void qsax() { // CHECK-LABEL: : // CHECK: qsax {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __QSAX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void shsax() { // CHECK-LABEL: : // CHECK: shsax {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SHSAX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void usax() { // CHECK-LABEL: : // CHECK: usax {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __USAX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uqsax() { // CHECK-LABEL: : // CHECK: uqsax {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UQSAX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uhsax() { // CHECK-LABEL: : // CHECK: uhsax {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UHSAX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } /* SAT */ void usad8() { // CHECK-LABEL: : // CHECK: usad8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __USAD8(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void usada8() { // CHECK-LABEL: : // CHECK: usada8 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __USADA8(s32_1, s32_2, s32_3); // CHECK: {{(bx lr)|(pop {.*pc})}} } void ssat16() { // CHECK-LABEL: : // CHECK: ssat16 {{r[0-9]+}}, #0x5, {{r[0-9]+}} volatile uint32_t result = __SSAT16(s32_1, 0x05); // CHECK: {{(bx lr)|(pop {.*pc})}} } void usat16() { // CHECK-LABEL: : // CHECK: usat16 {{r[0-9]+}}, #0x5, {{r[0-9]+}} volatile uint32_t result = __USAT16(s32_1, 0x05); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uxtb16() { // CHECK-LABEL: : // CHECK: uxtb16 {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UXTB16(s32_1); // CHECK: {{(bx lr)|(pop {.*pc})}} } void uxtab16() { // CHECK-LABEL: : // CHECK: uxtab16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __UXTAB16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void sxtb16() { // CHECK-LABEL: : // CHECK: sxtb16 {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SXTB16(s32_1); // CHECK: {{(bx lr)|(pop {.*pc})}} } void sxtab16() { // CHECK-LABEL: : // CHECK: sxtab16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SXTAB16(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } /* MUL */ void smuad() { // CHECK-LABEL: : // CHECK: smuad {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SMUAD(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void smuadx() { // CHECK-LABEL: : // CHECK: smuadx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SMUADX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void smlad() { // CHECK-LABEL: : // CHECK: smlad {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SMLAD(s32_1, s32_2, s32_3); // CHECK: {{(bx lr)|(pop {.*pc})}} } void smladx() { // CHECK-LABEL: : // CHECK: smladx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SMLADX(s32_1, s32_2, s32_3); // CHECK: {{(bx lr)|(pop {.*pc})}} } void smlald() { // CHECK-LABEL: : // CHECK: smlald {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SMLALD(s32_1, s32_2, s32_3); // CHECK: {{(bx lr)|(pop {.*pc})}} } void smlaldx() { // CHECK-LABEL: : // CHECK: smlaldx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SMLALDX(s32_1, s32_2, s32_3); // CHECK: {{(bx lr)|(pop {.*pc})}} } void smusd() { // CHECK-LABEL: : // CHECK: smusd {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SMUSD(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void smusdx() { // CHECK-LABEL: : // CHECK: smusdx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SMUSDX(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void smlsd() { // CHECK-LABEL: : // CHECK: smlsd {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SMLSD(s32_1, s32_2, s32_3); // CHECK: {{(bx lr)|(pop {.*pc})}} } void smlsdx() { // CHECK-LABEL: : // CHECK: smlsdx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SMLSDX(s32_1, s32_2, s32_3); // CHECK: {{(bx lr)|(pop {.*pc})}} } void smlsld() { // CHECK-LABEL: : // CHECK: smlsld {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SMLSLD(s32_1, s32_2, s32_3); // CHECK: {{(bx lr)|(pop {.*pc})}} } void smlsldx() { // CHECK-LABEL: : // CHECK: smlsldx {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SMLSLDX(s32_1, s32_2, s32_3); // CHECK: {{(bx lr)|(pop {.*pc})}} } void sel() { // CHECK-LABEL: : // CHECK: sel {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __SEL(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void qadd() { // CHECK-LABEL: : // CHECK: qadd {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __QADD(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void qsub() { // CHECK-LABEL: : // CHECK: qsub {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile uint32_t result = __QSUB(s32_1, s32_2); // CHECK: {{(bx lr)|(pop {.*pc})}} } void pkhbt0() { // CHECK-LABEL: : // CHECK: {{pkhtb|pkhbt}} {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} // CHECK-NOT: , lsl // CHECK-NOT: , asr volatile uint32_t result = __PKHBT(s32_1, s32_2, 0); // CHECK: {{(bx lr)|(pop {.*pc})}} } void pkhbt() { // CHECK-LABEL: : // CHECK: pkhbt {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, lsl #11 volatile uint32_t result = __PKHBT(s32_1, s32_2, 11); // CHECK: {{(bx lr)|(pop {.*pc})}} } void pkhtb0() { // CHECK-LABEL: : // CHECK: {{pkhtb|pkhbt}} {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} // CHECK-NOT: , lsl // CHECK-NOT: , asr volatile uint32_t result = __PKHTB(s32_1, s32_2, 0); // CHECK: {{(bx lr)|(pop {.*pc})}} } void pkhtb() { // CHECK-LABEL: : // CHECK: pkhtb {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, asr #11 volatile uint32_t result = __PKHTB(s32_1, s32_2, 11); // CHECK: {{(bx lr)|(pop {.*pc})}} } void sxtb16_ror() { // CHECK-LABEL: : // CHECK: sxtb16 {{r[0-9]+}}, {{r[0-9]+}}, ror #8 volatile uint32_t result = __SXTB16_RORn(s32_1, 8); // CHECK: sxtb16 {{r[0-9]+}}, {{r[0-9]+}}, ror #16 result = __SXTB16_RORn(s32_1, 16); // CHECK: sxtb16 {{r[0-9]+}}, {{r[0-9]+}}, ror #24 result = __SXTB16_RORn(s32_1, 24); // CHECK-THUMB: ror.w [[REG:r[0-9]+]], {{r[0-9]+}}, {{#5|#0x5}} // CHECK-ARM: ror [[REG:r[0-9]+]], {{r[0-9]+}}, {{#5|#0x5}} // CHECK: sxtb16 {{r[0-9]+}}, [[REG]] // CHECK-NOT: , ror result = __SXTB16_RORn(s32_1, 5); // CHECK-THUMB: ror{{.w|ne|s}} {{r[0-9]+}}, {{r[0-9]+}} // CHECK-ARM: ror{{(ne)?}} {{r[0-9]+}}, {{r[0-9]+}} // CHECK: sxtb16 {{r[0-9]+}}, {{r[0-9]+}} // CHECK-NOT: , ror result = __SXTB16_RORn(s32_1, u8); // CHECK: {{(bx lr)|(pop {.*pc})}} } void sxtab16_ror() { // CHECK-LABEL: : // CHECK: sxtab16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, ror #8 volatile uint32_t result = __SXTAB16_RORn(s32_1, s32_2, 8); // CHECK: sxtab16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, ror #16 result = __SXTAB16_RORn(s32_1, s32_2, 16); // CHECK: sxtab16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, ror #24 result = __SXTAB16_RORn(s32_1, s32_2, 24); // CHECK-THUMB: ror.w [[REG:r[0-9]+]], {{r[0-9]+}}, {{#5|#0x5}} // CHECK-ARM: ror [[REG:r[0-9]+]], {{r[0-9]+}}, {{#5|#0x5}} // CHECK: sxtab16 {{r[0-9]+}}, {{r[0-9]+}}, [[REG]] // CHECK-NOT: , ror result = __SXTAB16_RORn(s32_1, s32_2, 5); // CHECK-THUMB: ror{{.w|ne|s}} {{r[0-9]+}}, {{r[0-9]+}} // CHECK-ARM: ror{{(ne)?}} {{r[0-9]+}}, {{r[0-9]+}} // CHECK: sxtab16 {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} // CHECK-NOT: , ror result = __SXTAB16_RORn(s32_1, s32_2, u8); // CHECK: {{(bx lr)|(pop {.*pc})}} } void smmla() { // CHECK-LABEL: : // CHECK: smmla {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} volatile int32_t result = __SMMLA(s32_1, s32_2, s32_3); // CHECK: {{(bx lr)|(pop {.*pc})}} }