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等于复制。

这是一个简单的整个寄存器副本,因此元素类型无关紧要。

汇编指令实际上只支持8b16b指定double或quad寄存器,因此,GCC在这方面是正确的,而Clang更宽容,尽管像这种情况在某种程度上具有误导性.

老实说,我不喜欢 aarch64 汇编语法。

aarch32 上,数据类型由指令后缀指定,而在 aarch64 上,数据类型由必须附加到所有操作数寄存器的寄存器后缀完成。

这种新语法不仅令人讨厌,而且还会引起问题。

在这种情况下 aarch32 一个简单的 vmov q5, q8 就足够了,没有任何麻烦。