【问题标题】:RVCT to ARM GCC porting(__uadd8)RVCT 到 ARM GCC 移植(__uadd8)
【发布时间】:2013-10-02 18:40:10
【问题描述】:

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

【问题讨论】:

    标签: c gcc arm gnu


    【解决方案1】:

    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 内在函数。在最坏的情况下,您可能需要进行一些复制粘贴。

    【讨论】: