https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82034

--- Comment #2 from Oscar Molin <oscar.molin at sigicom dot com> ---
(In reply to Richard Biener from comment #1)
> Can you please quote the typedefs for q31_t and q63_t, specify the GCC
> version you tested and provide a full testcase that can be compiled?

I made a program recreating this in GCC 7.1 (Arch repo, arm-none-eabi-gcc).
See that three variants included, I wasnt sure which useage of __SMMLAR was
right. I used the second one in my application, but I don't know if it's
required to have a return value to get the same result.

Compilation options:
arm-none-eabi-gcc -O3 smmlar.c -o test.elf -mcpu=cortex-m4 -mthumb
-mfpu=fpv4-sp-d16 --std=c11 --specs=nosys.specs

Dump assembly:
arm-none-eabi-objdump -D test.elf > test.dump

Code (smmlar.c):

#include <stdint.h>

typedef int32_t q31_t;
typedef int64_t q63_t;
#define __STATIC_INLINE static inline
#define __ASM __asm

#define multAcc_32x32_keep32_R(a, x, y) \
    a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32)

__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMMLAR (int32_t
op1, int32_t op2, int32_t op3)
{
 int32_t result;

 __ASM volatile ("smmlar %0, %1, %2, %3" : "=r" (result): "r"  (op1), "r"
(op2), "r" (op3) );
 return(result);
}


int main()
{
  volatile int a = 1, b = 2, c = 3;

  q31_t acc0 = a;
  q31_t x0   = b;
  q31_t c0   = c;


  //Original call used in CMSIS-DSP
  //multAcc_32x32_keep32_R(acc0, x0, c0);

  // 
  __SMMLAR(x0, c0, acc0);

  // Alternative form?
  //acc0 = __SMMLAR(x0, c0, acc0);

  return acc0; 
}

Reply via email to