学习GCC ASM:SSE到NEON:加载和存储
我有一段使用SSE指令编写的内联ASM代码,我需要将其移植到NEON。我想自己学习一些基本知识,看看是否可以一步一步地完成,而不是把整个东西批量转换 因此,第一步是学习加载和存储。考虑…学习GCC ASM:SSE到NEON:加载和存储,gcc,assembly,sse,neon,Gcc,Assembly,Sse,Neon,我有一段使用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]
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版本,它将q0识别为d0、d1。
另外,我认为您希望使用(&output[0])或简单地使用(output)和(input),而不是将浮点加载到通用寄存器
在ARM中,您还可以发布递增指针:xxx{},[%[I]!]
例如,请参考。事实证明,约束也需要一些调整<代码>“vld1.32{d0,d1},[%[I]]\n\t”“vst1.32{d0,d1},[%[O]]]\n\t:[I]“r”(输入),[O]“r”(输出):“内存”,“d0”,“d1”没错。另外,一些gcc版本在clobber列表中需要“d0”、“d1”和“q0”。
vld1.32 {d0,d1}, [%[I]];
vst1.32 {q0}, [%[O]];