0

我有一段使用 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 构造(如命名变量等)结合起来有点含糊。

4

1 回答 1

0
vld1.32 {d0,d1}, [%[I]]; 
vst1.32 {q0}, [%[O]];   

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

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

例如,请参阅示例。

于 2012-12-05T18:09:10.810 回答