【问题标题】:Aligned load/store with NEON intrinsics in GCC将加载/存储与 GCC 中的 NEON 内在函数对齐
【发布时间】:2015-08-20 10:35:03
【问题描述】:

如何让 GCC 为对齐访问生成加载/存储指令?

如果我们有类似的东西:

uint8_t* p;
uint8x8x4_t r = vld4_u8(p);

如何让 GCC 生成需要 32 字节对齐的加载指令?

【问题讨论】:

  • 这是(*p),在通过指针传递其地址之前,您需要在堆栈、堆等上对齐。
  • 在 Microsoft Visual C++ 中,有一个 ex 版本的内部函数 (vld4_u8_ex) 来指示对齐的负载。
  • 我检查了内在宏,没有发现对齐说明符。或许你可以自己定义一些符合你需要的说明符,或者用 asm 写代码。

标签: gcc arm simd neon


【解决方案1】:

我认为你可以使用 __builtin_assume_aligned(ptr, size);

例如

#include <arm_neon.h>

void blend4(uint8_t *src, uint8_t *dst)
{
    uint8_t *aligned_src = __builtin_assume_aligned(src, 16);
    uint8_t *aligned_dst = __builtin_assume_aligned(dst, 16);
    uint8x8x4_t temp = vld4_u8(aligned_src);
    vst4_u8(aligned_dst, temp);
}

生成:

vld4.8  {d16-d19}, [r0:128]
vst4.8  {d16-d19}, [r1:128]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2021-12-30
    • 2015-07-31
    相关资源
    最近更新 更多