RVCT到ARM GCC移植(__ uadd8)

时间:2013-09-26 17:02:41

标签: c gcc arm gnu

我正在将armcc编译器移植到ARM GNU GCC中,我几乎想出了所有内容,但我在这一点上陷入困​​境:

代码正在使用这样的东西:

unsigned int add_bytes(unsigned int val1, unsigned int val2)
{
  unsigned int res;

    res = __uadd8(val1,val2); /* res[7:0] = val1[7:0] + val2[7:0]
                                 res[15:8] = val1[15:8] + val2[15:8]
                                 res[23:16] = val1[23:16] + val2[23:16]
                                 res[31:24] = val1[31:24] + val2[31:24]
                               */
    return res;
}

__ uadd8是RVCT特定的,GCC是否提供了相同的东西,或者我如何实现这一目标?

1 个答案:

答案 0 :(得分:4)

GCC不提供ARMv6 SIMD指令的内在函数。但是,您可以在下面定义自己的__UADD8

__attribute__( ( always_inline ) ) static __inline__ uint32_t __UADD8(uint32_t op1, uint32_t op2)
{
  uint32_t result;

  __asm__ volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
  return(result);
}

这来自CMSIS header files之一。我自己没有测试它,但包含该文件可能会修复所有其他v6内在函数。在最坏的情况下,您可能需要进行一些复制粘贴。