Принципы кодирования инструкций Intel x86(-64) или "ехал префикс через префикс"

Тема в разделе "WASM.ARTICLES", создана пользователем aa_dav, 6 окт 2021.

  1. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    Если "неизящность" ломает плотность кода и влияет на производительность и попытки удержать авгиевы конюшни легаси начинают обливать всё говном, то еще как думают.
    Префиксы VEX/EVEX в Intel x86/64 - конкретный пример когда сами инженеры поняли, что байтовые комбинации префиксов лажают в повторе разуплотняя инструкцию, а префикс REX (очень хорошая инициатива убравшая байтовые икременты/декременты регистров размера текущего слова из системы команд) оказался недостаточен как только попытались дальше удвоить количество бит. Само то что за VEX тут же последовало EVEX и опять всё удлинило и усложнило это плохо. Просто плохо и всё.
    То как ARM ломали свой хребет RISC-а многократно - пример еще один.
    В общем вопрос для дискуссий более чем плодотворных, но главное чтобы без срача. И я тут каюсь, что позволил себе в начале обсуждения этой темы выйти за рамки.
     
  2. q2e74

    q2e74 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2018
    Сообщения:
    999
    aa_dav, сама логика префекса уже подразумевает наличие избыточности в коде, т.е. то что вы назвали разуплотнением. Другое дело, что префексы можно использовать для упрощения алгоритма декодирования и выявления ошибок. И вот тут, теория теорией, а что быстрее и стабильнее - эксперимент решает.

    П.С. И да, я может по форме и уверенно сказал, но я не в теме. На производстве не был, и в проектировании арихтектур процов не участвовал.
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Надо было просто интелу делать стековый цпу и укладывать весь набор инструкций в один байт, вот тогда было бы збс.
     
  4. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    600
    Сложная система кодирования усложняет блок декодирования(БДК), вода мокрая.
    А значит, если кодирования более простое, то БДК можно сделать проще, и на сами вычислительные блоки можно потрать больше ресурсов, профит...
    Честно говоря современный ассемблер х86 это уже какой-то высокоуровневый ЯП, встроенным оптимизатором, и довольно мощным оптимизатором. На райзене уже бессмысленно делать оптимизацию, которую делал на атлоне 64(архитектура начала нулевых), сам как-то перекрутить, преобразует и выполнит на своём неведомым ассемблере.
    Конечно, от этой системы отказаться уже очень сложно. Не думали архитекторы 8086, что спустя десятилетия, так зайдёт так далеко. Иначе придумали архитектуру более логичную и расширяемую. Или тогда они просто этого не могли сделать, никто же не думал, что вот так получится.
    Хотя же пытались несколько раз соскочить с х86, но не получилось.
    http://www.thg.ru/cpu/istoriya_cpu_intel_part1/onepage.html
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Intro, ну нет. ) оптимизация все еще роляет.
    просто интел упростило работу программистам. Кодер или компилер напишет код - а процессор его съест и не подавится. А мог и подавиться ) Но нет. Перформанс не просел, и ты такой думаешь "Ай да я, ай да я" , "вай какой я код написал быстрый". )

    Вот интересная статейка ) на тему оптимизации, да еще и про эльбрус

    https://habr.com/ru/post/647165/
     
  6. KPG

    KPG Member

    Публикаций:
    0
    Регистрация:
    13 янв 2021
    Сообщения:
    121
    Так и сделали однобайтовые команды в TTL компьютере Gigatron, без использования и стека. :)
    сводная табличка по группам команд процессора Gigatron
    Гигатрон — самодельный микрокомпьютер без процессора

    команда — 1 байт + считывание вместе с ней ещё одного байта — из ПЗУ шины D в терминологии поцессора, oper в этой таблице. У процессора ещё две 8-ми битных шины: IN, OUT
    кроме внутренних регистров A — аккумулятор, и X и Y могущих образовывать пару,
    но в адресации её автоинкремента изменяется только регистр X.

    В проекте процессора процессора Gigatron на Verilog есть emulator под Linux

    Здесь эмулятор
    под Windows в этой теме с форума Gigatrona
     
  7. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    Ну штош. Знакомьтесь: Intel APX https://cdrdv2.intel.com/v1/dl/getContent/784266
    Новое расширение принципов кодирования инструкций в режиме i64-86 который главным образом расширяет пространство целочисленных регистров до 32 (добавлены R16-R31) и делает почти все существующие двухоперандные инструкции трёхоперандными.
    Достигается это как нетрудно догадаться добавлением нового двухбайтового префикса REX2 (0xD5 XX, т.е. код означавший в i86 десятичную коррекцию после сложения - AAD) и симметричным расширением уже существующего четырёхбайтового префикса EVEX.
    Изучу детали, чиркану краткую выжимку опять же. :)
    --- Сообщение объединено, 2 авг 2023 ---
    P.S.
    Если вкратце, то префикс REX2 позволит апгрейдить до 32 регистров общего назначения либо инструкции без префикса либо инструкции с префиксом 0x0F (но не инструкции с префиксами 0x0F38 или 0x0F3A). В таком префиксировании некоторые ряды инструкций (например 0x0A) не выигрывающие от нового кодирования зарезервированы и более того одна из них уже сделана новой инструкций - 64-битным прямым прыжком.
    Но если хочется еще воспользоваться новым трёхоперандным форматом инструкций, то надо использовать обновлённый префикс EVEX где можно закодировать новый регистр назначения (только регистр!) и покрыть всё пространство существующих инструкций, в том числе те, что были запромоучены из префиксов 0x0F38 или 0x0F3A ну и всё прочее. Однако огромное количество исключений и тонкостей в кодировании - без поллитры не разберёшься. :)
    --- Сообщение объединено, 2 авг 2023 ---
    P.S.
    "(например 0x0A)" читать как "(например 0xA*)"
     
    mantissa и TermoSINteZ нравится это.
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    неплохо. расширили набор регистров, убрали некоторые ограничения )
     
  9. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    449
    Для каких моделей ЦПУ интеля будут работать APX
    когда и в каких компилях появится поддержка оного набора инструкций
     
  10. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    По быстренькому еще почитал про новые введённые инструкции. Кратко расскажу о них.

    JMPABS - длинный прямой переход на 64-битный адрес.

    PUSH2/POP2 - пушить и попить можно по два регистра за раз (еще раз привет, ARM64!)

    Для операций PUSH/POP ввели бит хинта парности - когда на входе в функцию регистры сохраняются чтобы на выходе восстановить свои значения операции парно можно пометить этими битами и процессор может ориентируясь на этот хинт избежать даже обращения к памяти.

    Условные CMP и TEST - то есть теперь выполнение сравнения можно само по себе сделать условным.

    CMOV получил особую форму CFCMOV (conditional faulting) - это если выбирается ветка "false", то move не выбивает исключение при ошибке доступа к памяти если один из операндов лежит в невалидной странице памяти. Оказывается у обычного CMOV была такая особенность поведения из-за распараллеливания видимо.

    К инструкции SETcc которая обновляла байт добавили SETcc.zu которая обнуляет верхние 63 бита 64-битного РОН.

    Плюс еще замечу, что при расширении арифметико-логических инструкций префиксом EVEX появился флажок обновлять или не обновлять флаги - опять таки, привет ARM64!
     
    mantissa нравится это.
  11. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Это то чего прям давно нехватало)
     
  12. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    155
    по первой ссылке в гугле
     
  13. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    чой-то смахивает на конфликт интересов - ошибка доступа должна попадать к оси, а ось возвращать управление в юм иль не возвращать согласно политикам безопасности, тута же.. короче, посмотрим :)
     
  14. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Например такая конструкция:
    Код (ASM):
    1. or eax, eax
    2. cmovnz eax, dword ptr [eax]
    сейчас если в eax ноль, будет эксепшон. Нужен ли он? Приходится в явный if оборачивать.
    А иногда хотелось бы обойтись просто условным исполнением любой (или почти) инструкции. Это, имхо, самая недостающая в x86 ISA фича по сравнению с армами.
     
  15. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    449
    а когда в компиляторах появится.. лет 10 пройдет :)
     
  16. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    Нативная поддержка походу. Плюс еще заметьте, что (CF)CMOVE может быть трёхоперандным - т.е. полностью соответствовать тернарному оператору из Си.