Pull to refresh

Comments 18

но, к сожалению, документация дает неоднозначное представление о данном вопросе

Может, в первую очередь нужно зарепортить баг всё-таки на документацию?
Вы правы, стоит попробовать им написать.

Но я лично не уверен, что это баг, есть подозрение, что это фича :)
На всякий случай проверил, что эти ненормальные инструкции запрещены в NaCl'e. С множественными префиксами в NaCl все строго.
А вы на AMD процессоре этот странный случай проверяли?
На AMD не проверял, так как нету таких под рукой.
Если кто-то может проверить — сообщите, было бы очень интересно.
По крайней мере приведённая программа выдаёт «4.000000 2.000000» как и на Intel'е.

Но с префиксом 66 связан другой очень весёлый случай, так что понимаю почему хотелось проверить как себя ведёт AMD:
sourceware.org/bugzilla/show_bug.cgi?id=13668
Если можно, готовый код тестирования, я запущу. Продолжим в личке.
«Наверно, логичнее было бы определять, что это за инструкция, по последнему префиксу»
Раз это упущено в мануале, то надо бы сначала уточнить у разработчика, повторяется ли это на всех процессорах?
// Напомнило, как я игрался с turbo debugger на 2 курсе: cs1202.vk.me/u55420/19095012/x_d4218182.jpg
f2 66 0f 59 ff — это MULSD согласно 2.2.1 REX Prefixes:

When a REX prefix is used in conjunction with an instruction containing a mandatory prefix, the mandatory prefix must come before the REX so the REX prefix can be immediately preceding the opcode or the escape byte. For example, CVTDQ2PD with REX prefix should have REX placed between F3 and 0F E6. Other placements are ignored.

66 f3 f2 0f 59 ff и 66 f2 f3 0f 59 ff здесь 66 игнорируется согласно 2.2.1. Использование f3 и f2 unpredictable behavior согласно:

Repeat prefixes (F2H, F3H) cause an instruction to be repeated for each element of a string. Use these prefixes only with string and I/O instructions (MOVS, CMPS, SCAS,LODS, STOS, INS, and OUTS). Use of repeat prefixes and/or undefined opcodes with other Intel 64 or IA-32 instructions is reserved; such use may cause unpredictable behavior.
Причём тут 2.2.1? Ни в одной из этих инструкций REX префикс не используется.
f2 66 0f 59 ff — это MULSD согласно 2.2.1 REX Prefixes:

When a REX prefix is used in conjunction with an instruction containing a mandatory prefix, the mandatory prefix must come before the REX so the REX prefix can be immediately preceding the opcode or the escape byte. For example, CVTDQ2PD with REX prefix should have REX placed between F3 and 0F E6. Other placements are ignored.

Не понял вашей аргументации, если честно. Тут говорится про REX префикс. В приведенном примере его просто нет.
66 — это не REX префикс. Не понимаю при чем здесь документация о их положении. Следующий пункт тоже не применим. Он говорит о строковых инструкциях, а не о SSE-инструкциях с обязательным префиксом. Как показывает случай f2 66, нельзя рассматривать f2 f3 0f… просто как SSE инструкцию с префиксом f2.
66 f3 f2 0f 59 ff и 66 f2 f3 0f 59 ff здесь 66 игнорируется согласно 2.2.1. Использование f3 и f2 unpredictable behavior согласно:

Repeat prefixes (F2H, F3H) cause an instruction to be repeated for each element of a string. Use these prefixes only with string and I/O instructions (MOVS, CMPS, SCAS,LODS, STOS, INS, and OUTS). Use of repeat prefixes and/or undefined opcodes with other Intel 64 or IA-32 instructions is reserved; such use may cause unpredictable behavior.

В данном случае это уже не repeat префиксы. Они несут совсем другую смысловую нагрузку.
libopcodes вообще плохо себя ведёт на странных комбинациях префиксов/суффиксов, а иногда может вообще запутаться и выдать чушь (вплоть до того, что несуществующую инструкцию запишет в существующую).

Несколько примеров:
   0:	9b                   	rex
   1:	40                   	rex
   2:	9b df 28             	fildll (%rax)
9b — это, как несложно догадаться, ни разу не rex

   0:   c4 e3 79 44 c0 02       vpclmullqhqdq %xmm0,%xmm0,%xmm0
Это, на самом деле, не vpclmullqhqdq, а совсем даже vpclmullqlqdq.

   0:	c5 fa 28 d1          	vmovaps %xmm1,%xmm2
Это — вообще не поддерживается в железе (похожая инструкция c5 f8 28 d1, разумеется, поддерживается).
vpclmullqhqdq

Ассемблер пострашнел.
Это не ассемблер пострашнел, это система команд подурнела
Одно без другого никуда.
Sign up to leave a comment.