Ошибка ассемблера ARM NEON: "инструкция не может быть условной" - PullRequest
2 голосов
/ 10 августа 2011

Согласно информационному центру arm vadd может выполняться условно, однако, когда я пытаюсь

vaddeq.f32 d0,d0,d1

Xcode возвращает

65:instruction cannot be conditional -- vaddeq.f32 d0,d0,d1

Одна вещь, которую я заметил, это то, что, похоже, только NEON-инструкции дают эту ошибку. Инструкции VFP не приводят к этим ошибкам.

Нужно ли установить флаг компилятора, чтобы включить условные инструкции NEON?

Ответы [ 3 ]

5 голосов
/ 10 августа 2011

Справочное руководство по архитектуре ARM гласит:

 An ARM Advanced SIMD VADD instruction must be unconditional.

Т.е., если вы находитесь в режиме ARM, эти инструкции не являются условными. Вы можете использовать их условно в Thumb-2, если поместите их в блок ИТ.

  .syntax unified
  .code 16
  .globl _foo
_foo:
  cmp r0, #0
  it eq
  vaddeq.f32 d0, d0, d1
  bx lr
1 голос
/ 01 ноября 2011

Условно могут выполняться только инструкции, передаваемые NEON и VFP.

(например, vldmia.)

Для меня было несколько ситуаций, когда условное выполнение могло бы спасти меня отнекоторые незначительные головные боли, но в целом вам это не понадобится так сильно.

Внимательно посмотрите на логические и сравнительные операции NEON.Они очень хорошо показывают, как НЕОН должен быть запрограммирован.

cya.

1 голос
/ 22 августа 2011

Причина, по которой условные инструкции NEON недоступны в режиме ARM, заключается в том, что они используют кодировки с полем условия, установленным в NV (никогда). Вам нужно использовать условные переходы или (лучше) переписать код, чтобы не использовать результаты сравнения напрямую - например, установите регистр в 0 или 1 в зависимости от результата и используйте его значение в дальнейших операциях.

...