В Руководстве разработчика программного обеспечения для архитектуры Intel 64 и IA-32 таблица Row F A-4 Приложение A.3 Том 2C (номер заказа 326018-045US, январь 2013 года) уникален тем, что имеет префиксную подстроку для комбинации из двух префиксов: 0x66 и 0xF2.Почему код карты операций ia32/x64 0x66 и 0xF2 является двойным обязательным префиксом для кода операции 0x0F38F1 (CRC32)?
Единственный код операции, для которого это применимо, - 0x0F38F1 (CRC32). Только для префикса 0xF2 исходный операнд - это Ey (регистр памяти или общего назначения, 32 бит или 64 бит), а для префиксов 0x66 и 0xF2 вместе исходный операнд - Ew (регистр памяти или общего назначения, всегда 16 бит)
Но эти исходные операнды идентичны тем, какими они были бы, если бы 0x66 были просто необязательным префиксом переопределения размера операнда вместо первой комбинации из двух обязательных префиксов. На самом деле, 0x66 в качестве дополнительного префикса - это то, как документация CRC32 документирована (неявно: идентичные последовательности байтов для 16-разрядных и 32-разрядных операндов источника) в главе 3.2 тома 2A. Кажется, что таблица могла опустить строки 0x66 и 0xF2 и задокументировать исходный операнд как Ev (память или регистр общего назначения, 16 бит или 32 бит или 64 бит) в строке 0xF2.
Есть ли причина, по которой карта опкода документирует исходный операнд для кода операции 0x0F38F1 этим уникальным способом?
EDIT: Добавлена версия ручного
Да, версия таблицы, в которой я также перечисляю MOVBE как инструкцию для кода операции 0F 38 F1 без префикса F2. Мне просто интересно, почему записи таблицы для 66 F2 0F 38 F1 crc32 Gd, Ew и F2 0F 38 F1 crc32 Fd, Ey не объединены в одну запись: F2 0F 38 F1 crc32 Gd, Ev – TheBeardyMan
@ TheBeardyMan: см. мое редактирование –