Формат инструкций SSE*

Тема в разделе "WASM.BEGINNERS", создана пользователем Mika0x65, 27 окт 2006.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    Читаю сейчас про кодирование инструкций SSE* и не совсем хорошо понял пару вещей.

    SSE* инструкции кодируются с помощью префиксов REPE/REPNE | 0x66, 0x0F (перфикс "новой" команды относительно 386) и самого кода операции SSE (точнее, при наличии префиксов он интерпретируется как опкод SSE). При этом, как я понимаю, не должно быть пересечений с возможными формами не-SSE инструкций.

    Значит, для получения SSE-инструкции необходимо брать только "старые" опкоды (не использующие префикс 0xF). В случае, когда для кодирования SSE-инструкции используется REP/REPE возможно послабление -- эти префиксы в обычных инструкциях используются только для стринговых команд, а значит все опкоды кроме стриновых подходят.

    Проверил по справочнику опкодов -- вроде бы все сходится, неоднозначностей нет. Но все же хочу уточнить -- я правильно понял?

    Заранее благодарен.
     
  2. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Mika0x65
    Следую ману от интела SSE нередко обозначаются так называемыми mandatory prefixes, это значения 66, F2 , F3. Но опкод строится 2х байтным , где первый байт это esc-символ 0F.
    Таким образом SSE имеет формат:

    <mandatory > <ESC-Symbol> <any digit>

    т.е. 3 байта.

    кодируя мнемонику, ты должен для нее найти опкод, 2й байт и знать есть ли у нее mandatory prefixes, а для этого заранее строишь табличку(массив переменных) где будут указаны сво-ва для опкодов
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Это я, в принципе, понял. Меня больше интересует каким путем устраняется пересечение с не-SSE инструкциями.

    Например, 0x66 0x0F 0xBF -- вполне корректный код для 'movsx'. Значит, если в качестве обязательного префикса используется 0x66, использовать, например, опкод 0x0F 0xBF для кодирования SSE нельзя. Т.е. для 0x66 можно использовать опкоды, которые гарантированно не могут иметь префикс замены размера операнда 0x66 -- напимер, опкод 'cmc'. С префиксами REPE/REPNE проще -- они используются только для стринговых команд, а стринговые команлы не имеют 0x0F. Тут вариантов появляется намного больше.

    Просто я попытался для себя как можно более обще представить кодирование SSE. Вроде бы представил, проверил -- однако для всех команд проверять непросто, поэтому решил спросить :).
     
  4. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Mika0x65
    Внимательней погляди на лат. буквы в Intel Manual Vol 2A page 2-2