2

我正在将 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 是否提供了等效的东西,或者我该如何实现?

4

1 回答 1

4

GCC不提供ARMv6SIMD 指令的内在函数。__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 头文件之一。我自己没有测试它,但包含该文件可能会修复所有其他 v6 内在函数。在最坏的情况下,您可能需要进行一些复制粘贴。

于 2013-09-26T17:57:01.610 回答