Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
学习GCC ASM:SSE到NEON:加载和存储_Gcc_Assembly_Sse_Neon - Fatal编程技术网

学习GCC ASM:SSE到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]

我有一段使用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版本,它将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]];