arm neon inline assemble "mov" clang 和 gcc 的区别
arm neon inline assemble "mov" difference between clang and gcc
arm neon 内联汇编器有这个问题:
mov v5.4s, v8.4s
该指令是使用 clang 编译的,但是 GCC 会产生以下错误:(如果我使用 mov v5.16b,v8.16b
没问题):
/var/folders/ln/2jr6sq855753h7fjrg_g6hm80000gq/T//ccUbsZid.s: Assembler
messages:
/var/folders/ln/2jr6sq855753h7fjrg_g6hm80000gq/T//ccUbsZid.s:38355:
Error: operand mismatch -- `mov v5.4s,v8.4s'
//ccUbsZid.s:38355:Info:did you mean this?
//ccUbsZid.s:38355:Info:mov v5.8b,v8.8b
//ccUbsZid.s:38355:Info:other valid variant(s):
//ccUbsZid.s:38355:Info:mov v5.16b,v8.16b
我想知道是什么导致了 GCC 中的错误。在我看来,mov
等于复制。
这是一个简单的整个寄存器副本,因此元素类型无关紧要。
汇编指令实际上只支持8b
和16b
指定double或quad寄存器,因此,GCC在这方面是正确的,而Clang更宽容,尽管像这种情况在某种程度上具有误导性.
老实说,我不喜欢 aarch64
汇编语法。
在 aarch32
上,数据类型由指令后缀指定,而在 aarch64
上,数据类型由必须附加到所有操作数寄存器的寄存器后缀完成。
这种新语法不仅令人讨厌,而且还会引起问题。
在这种情况下 aarch32
一个简单的 vmov q5, q8
就足够了,没有任何麻烦。
arm neon 内联汇编器有这个问题:
mov v5.4s, v8.4s
该指令是使用 clang 编译的,但是 GCC 会产生以下错误:(如果我使用 mov v5.16b,v8.16b
没问题):
/var/folders/ln/2jr6sq855753h7fjrg_g6hm80000gq/T//ccUbsZid.s: Assembler
messages:
/var/folders/ln/2jr6sq855753h7fjrg_g6hm80000gq/T//ccUbsZid.s:38355:
Error: operand mismatch -- `mov v5.4s,v8.4s'
//ccUbsZid.s:38355:Info:did you mean this?
//ccUbsZid.s:38355:Info:mov v5.8b,v8.8b
//ccUbsZid.s:38355:Info:other valid variant(s):
//ccUbsZid.s:38355:Info:mov v5.16b,v8.16b
我想知道是什么导致了 GCC 中的错误。在我看来,mov
等于复制。
这是一个简单的整个寄存器副本,因此元素类型无关紧要。
汇编指令实际上只支持8b
和16b
指定double或quad寄存器,因此,GCC在这方面是正确的,而Clang更宽容,尽管像这种情况在某种程度上具有误导性.
老实说,我不喜欢 aarch64
汇编语法。
在 aarch32
上,数据类型由指令后缀指定,而在 aarch64
上,数据类型由必须附加到所有操作数寄存器的寄存器后缀完成。
这种新语法不仅令人讨厌,而且还会引起问题。
在这种情况下 aarch32
一个简单的 vmov q5, q8
就足够了,没有任何麻烦。