【问题标题】:Learning GCC ASM: SSE to NEON: Loads and Stores学习 GCC ASM:SSE 到 NEON:加载和存储
【发布时间】:2012-12-05 16:54:58
【问题描述】:

我有一段使用 SSE 指令编写的内联 ASM 代码,我需要将其移植到 NEON。我想自己学习基础知识,看看我能不能一步一步地完成,而不是把整个东西批量转换。

因此,第一步是学习加载和存储。考虑...

float input[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
float output[4] = { 0 };
asm volatile
(
    "movups %[I], %%xmm0 \n\t"
    "movups %%xmm0, %[O] \n\t"
    : [O] "=m" (output[0])
    : [I] "m" (input[0])
    : "memory", "xmm0"
);

我知道(我认为)我应该使用 vld1.32 指令,但我对将它与我之前使用过的其他一些 GCC ASM 构造(如命名变量等)结合起来有点含糊。 )。

【问题讨论】:

    标签: gcc assembly sse neon


    【解决方案1】:
    vld1.32 {d0,d1}, [%[I]]; 
    vst1.32 {q0}, [%[O]];   
    

    根据 gcc 版本,它将 q0 识别为 d0,d1。 另外我认为你想要 (&output[0]) 或简单地 (output) 和 (input) 而不是将浮点数加载到通用寄存器。

    在 ARM 中,您还可以后递增指针:xxx { }, [%[I]!]

    咨询例如例如this

    【讨论】:

    • 事实证明,约束也需要一些调整。 "vld1.32 {d0,d1}, [%[I]] \n\t" "vst1.32 {d0,d1}, [%[O]] \n\t" : : [I] "r" (input), [O] "r" (output) : "memory", "d0", "d1"
    • 确实如此。还有一些 gcc 版本在 clobber 列表中需要 "d0"、"d1" 和 "q0"。
    猜你喜欢
    • 2015-08-20
    • 2019-06-07
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 2012-02-03
    • 2018-07-07
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多