ARMv8 Advanced SIMD: «неверный режим адресации у операнда 2 -` st1 {V1.D} [0], [x20,640] '» - PullRequest
2 голосов
/ 19 марта 2020

Я пытаюсь сохранить 64 бита в памяти из регистра V на адрес, содержащийся в регистре X, но я получаю сообщение об ошибке «неверный режим адресации в операнде 2 -` st1 {V1.D} [0], [x20,640] ".

Из обзора набора команд ARMv8 операция должна выглядеть следующим образом:

ST1 {Vt. <\ T> } [index], vaddr Сохранение одной одноэлементной структуры из одной дорожки (одного регистра)

Все инструкции структуры хранилища загрузки SIMD используют синтаксический термин vaddr в качестве сокращения для следующие режимы адресации: [базовый] Память адресуется базовым регистром Xn или SP. [base], Xm Память, адресуемая базовым регистром Xn или SP, с последующим увеличением на 64-битный индексный регистр Xm. [base], # immMemory с адресом Xn или SP, постинкрементным к непосредственному значению, которое должно равняться общему количеству байтов, переданных в / из памяти.

Ниже приведен конкретный код показывая, что я пытаюсь сделать sh. Мне кажется, все должно быть в порядке.

__asm__ volatile (
   "MOV V0.D[0], %[A_MASK]      \n\t"
   "ST1 {V0.D}[0], %[D]         \n\t"
   :
   : [D] "m" (<pointer>), [A_MASK] "r" (0xFF000000)
   : "memory", "V0"
);

1 Ответ

4 голосов
/ 19 марта 2020

st1 не принимает смещение, поэтому [x20,640] недопустимо. Только [x20] и подобное было бы законно. Чтобы заставить g cc создать правильный адрес, используйте ограничение Q, которое руководство определяет как

Адрес памяти, который использует один базовый регистр без смещения

Обратите внимание, что g cc имеет векторную поддержку, поэтому вам не нужно использовать сборку для этого.

...