2016-09-19 19 views
3

Я разрабатываю генератор кода для инструкций AVX2 и пытаюсь протестировать его на процессоре AMD A10 8700, который по спецификациям должен запускать AVX2.Незаконная инструкция vgatherdps на процессоре с поддержкой AVX2

Однако, он выходит из строя с нелегальной инструкцией по инструкции vgatherdps в:

vmovdqu  yMM0, [ r9+ PmainBase + -256]; LDdqyy;0 
lea   r9, [  PmainBase + -192];0 
vpcmpeqw ymm8, ymm8, ymm8;0 
vgatherdps YMM0, [ r9+ yMM0*4 ] ,ymm8;0 

CPUID информация говорит, что AVX2 включен, так VGATHERDPS должно быть законным.

Любые подсказки?

+2

Затем он выполнил некоторые инструкции AVX2, поэтому он включен. Что такое машинный код этого сбора? – harold

+0

Почему у вас есть '; 0' комментарии в конце каждой строки? И непоследовательная капитализация, как 'yMM0'? В основном ваш код является беспорядочным с точки зрения форматирования/удобочитаемости. (не относится к тому, как он собирается, хотя). –

ответ

2

Согласовывающ Intel's Instruction Reference:

Если любая пара из индекса, маски, или регистры назначения являются такими же, эта команда приводит к неисправности UD.

Реестры адресатов и индексов одинаковы (ymm0). Поэтому инструкция является незаконной. Я удивлен, что ассемблер не отверг это. Поэтому я считаю, что ошибка в ассемблере.


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

  1. Он записывает результат сбора в пункт назначения.
  2. Он записывает маску нулей обратно в регистр маски, указывающий, какие полосы были выполнены.

При нормальном выполнении регистр маски будет полностью перезаписан нулями. Но если произойдет сбой, не все нагрузки будут успешными. Таким образом, инструкция может быть выполнена только частично. Цель перезаписи регистра маски состоит в том, чтобы сообщить обработчику сигналов, какие полосы были успешными, а какие полосы провалились.

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

+0

OP записывает генератор кода, поэтому он, возможно, не запускает свой код через ассемблер. Более того, есть очень веская причина, по которой реестр 'idx' не может соответствовать реестру' dst' или 'msk'. Посмотрите на псевдокод 'vgatherdps' VEX.256: _ ** Сначала **, MSB каждой полосы в регистре' msk' будет разбит на все биты lane_, а затем для тех, которые включены, аппаратные средства попытки загрузить данные и очистить маску на этой полосе в случае успеха. Поскольку 'msk' безоговорочно и полностью перезаписывается, он не должен быть псевдонимом' dst' или 'idx', потому что иначе вы столкнулись бы с конфликтом записи. –

+0

И вы не можете разрешить этот конфликт записи в любом случае: Lose 'msk', и вы не можете сказать, какая полоса не удалась, потерять' idx', и вы не можете повторить попытку, потерять 'dst' и каков был смысл инструкции тогда? И даже если 'msk' были частично обновлены значениями' dst', у вас есть двусмысленность из-за проблемы внутриполосной связи; Возможно, вы успешно прочитали '0xFFFFFFFF', но если это значение находится в регистре маски, как вы можете определить, было ли чтение успешным с помощью' 0xFFFFFFFF', или не удалось? Более того, 'idx' не может быть псевдонимом' msk', потому что отрицательные индексы являются законными. –

+0

И, наконец, 'idx' не может быть псевдонимом' msk', потому что в семействе команд 'vgather *' 'idx' может быть qword или dword, тогда как размер строки' msk' и 'dst' всегда совпадает, и если' dst' является dword, тогда как 'idx' является qword, тогда только нижняя половина регистра заполняется, а верхняя половина обнуляется. –

0

Fixed описания машины использовать непересекающиеся наборы регистров для индексов и направлений в собирающей инструкции и получить

vmovdqu yMM4, [ PmainBase +   -256]; LDdqyy;0 
lea r8,[ PmainBase +   -192];0 
vpcmpeqw ymm8, ymm8, ymm8;0 
vgatherdps YMM0,[r8+ yMM4*4 ] ,ymm8;0 

который теперь работает отлично.

+2

Вы забыли войти в свой аккаунт? – Mysticial

 Смежные вопросы

  • Нет связанных вопросов^_^