В целях тестирования я пишу короткие фрагменты сборки для Intel Xeon Phi с встроенным ассемблером Icc. Теперь я хотел использовать замаскированные векторные инструкции, но мне не удалось передать их встроенному ассемблеру.
Для такого кода:
vmovapd -64(%%r14, %%r10), %%zmm0{%%k1}
Я получаю сообщение об ошибке
/tmp/icpc5115IWas_.s: Assembler messages:
/tmp/icpc5115IWas_.s:563: Error: junk `%k1' after register
Я перепробовал много разных комбинаций, но ничего не вышло. Версия компилятора - intel64 / 13.1up03 под Linux с использованием синтаксиса GAS.
Изменить: приведенный выше код действительно работает с нерасширенным ассемблером. Итак, это:
__asm__("vmovapd -64(%r14, %r10), %zmm0{%k1} ")
работает, а следующее - нет:
__asm__("vmovapd -64(%[src], %%r10), %%zmm0{%%k1} "
:
: [src]"r"(src)
:)
Я предполагаю, что это как-то связано с необходимостью использовать двойной% перед именами регистров в расширенном режиме. Но нет, ни одного% для k тоже не работает.