臂霓虹灯内联汇编c和海湾合作委员会之间的“移动”差异

时间:2019-05-10 09:28:57

标签: arm inline-assembly neon

手臂霓虹灯内联汇编器出现此问题:

char s[20];

printf("enter input\n"); 

scanf_s("%s", s); //exception occurs here

strcat_s(s, "$"); 

n = strlen(s);

指令是使用clang编译的,但是GCC会产生以下错误:(如果我使用mov v5.4s, v8.4s ,就可以了):

mov v5.16b,v8.16b

我想知道是什么原因导致GCC中的错误。我认为/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 等于copy。

1 个答案:

答案 0 :(得分:3)

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

汇编指令实际上仅支持8b16b指定双精度或四级寄存器,因此,在这种情况下,尽管在某种程度上会引起误解,但GCC在Clang更宽容的情况下是正确的。 / p>

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

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

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

在这种情况下,在vmov q5, q8上只需一个简单的aarch32就足够了。