【问题标题】:arm neon inline assemble "mov" difference between clang and gccarm neon inline assemble“mov”clang和gcc的区别
【发布时间】:2019-09-28 04:31:22
【问题描述】:

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

【问题讨论】:

    标签: arm inline-assembly neon


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-07
      • 2011-05-05
      • 2019-09-14
      • 2015-08-13
      • 2016-08-01
      • 2012-11-27
      • 2018-04-25
      相关资源
      最近更新 更多