рука неон inline собрать разницу "mov" между clang и gcc - PullRequest
0 голосов
/ 10 мая 2019

У этой проблемы есть неоновый встроенный манипулятор:

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 равно копии.

1 Ответ

3 голосов
/ 10 мая 2019

Это простая целая копия регистра, следовательно, тип элемента не имеет значения.

Инструкция по сборке фактически поддерживает только 8b и 16b, задающие двойной или четырехместный регистр, и, таким образом, GCC верен в этом, в то время как Clang более терпим, хотя и в некоторой степени вводит в заблуждение, как в этом случае.

Честно говоря, мне не нравится синтаксис aarch64.

В aarch32 тип данных определяется суффиксом инструкции, в то время как это делается суффиксом регистра в aarch64, который необходимо присоединить ко ВСЕМ регистрам операндов.

Этот новый синтаксис не только раздражает, но и вызывает проблемы.

Простого vmov q5, q8 было бы достаточно в этом случае на aarch32 без каких-либо хлопот.

...