Size: a a a

Ассемблер

2020 March 03

AB

Artöm Bakri Al-Sarmini in Ассемблер
Операция > возвращает 0 или 1, в момент входа в функцию в eax может лежать что угодно
источник

L

Leon in Ассемблер
Artöm Bakri Al-Sarmini
int add_overflows(int lhs, int rhs) {
   return lhs + rhs > lhs;
}


add_overflows:
       xor     eax, eax
       test    esi, esi
       setg    al
       ret

Не понимаю кодген. При каком условии сработает setg?
Компайлер просто редуцировал  lhs + rhs > lhs в rhs > 0  что логично
источник

楽園松本 in Ассемблер
Leon
Компайлер просто редуцировал  lhs + rhs > lhs в rhs > 0  что логично
А зачем xor eax, eax?
источник

L

Leon in Ассемблер
楽園松本
А зачем xor eax, eax?
Потому что в конце он al меняет. Во первых убрать возможный мусор а во вторых операции с 8битными регистрами уже с п-про и выше давали задержку в несколько тактов изза особенностей внутренних,  ее модно было  избежать предварительно обнулив весь большой регистр.
источник

楽園松本 in Ассемблер
Leon
Потому что в конце он al меняет. Во первых убрать возможный мусор а во вторых операции с 8битными регистрами уже с п-про и выше давали задержку в несколько тактов изза особенностей внутренних,  ее модно было  избежать предварительно обнулив весь большой регистр.
Я правильно понял, что если операция с r8, то она будет выполняться быстрее, если r32 обнулить?
источник

AB

Artöm Bakri Al-Sarmini in Ассемблер
楽園松本
Я правильно понял, что если операция с r8, то она будет выполняться быстрее, если r32 обнулить?
Нулить нужно старшие биты
источник

AB

Artöm Bakri Al-Sarmini in Ассемблер
А по скорости не знаю
источник

L

Leon in Ассемблер
Да
источник

楽園松本 in Ассемблер
Leon
Да
Это ответ на какую реплику?
источник

L

Leon in Ассемблер
楽園松本
Это ответ на какую реплику?
На эту
источник

L

Leon in Ассемблер
楽園松本
Я правильно понял, что если операция с r8, то она будет выполняться быстрее, если r32 обнулить?
Вот
источник

楽園松本 in Ассемблер
Leon
Потому что в конце он al меняет. Во первых убрать возможный мусор а во вторых операции с 8битными регистрами уже с п-про и выше давали задержку в несколько тактов изза особенностей внутренних,  ее модно было  избежать предварительно обнулив весь большой регистр.
Откуда инфа? Для меня это новость.

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

L

Leon in Ассемблер
楽園松本
Откуда инфа? Для меня это новость.

Такое вполне может быть, но как-то очень радикально выглядит идея. Идея, что процессор выбирает последовательность микрокоманд на основе предыдущих данных.
Зубков если правильно помню
источник

L

Leon in Ассемблер
Это началось в пентиум про и врядли прекратилось. Надо глянуть Интелловские доки актуально ли еще
источник

楽園松本 in Ассемблер
Leon
Это началось в пентиум про и врядли прекратилось. Надо глянуть Интелловские доки актуально ли еще
Ну вот я не помню такого в доках. Хотя, такие вещи вряд ли поместят в доки. Это уже уровень внутренней инфы.
источник

L

Leon in Ассемблер
楽園松本
Ну вот я не помню такого в доках. Хотя, такие вещи вряд ли поместят в доки. Это уже уровень внутренней инфы.
Надо глянуть optimization manual
источник

L

Leon in Ассемблер
источник

L

Leon in Ассемблер
Во. Немножко наврал. Не операции с 8битными давали задержку а операции с 32битными после 8битных.
источник

L

Leon in Ассемблер
так, судя по этому, https://software.intel.com/sites/default/files/managed/9e/bc/64-ia-32-architectures-optimization-manual.pdf   раздел 3.5.2.4  Partial Register Stalls последние поколения с этим получше справляются особенно начиная с сандика. но все равно оптимальнее занулить регистр вначале.
источник

L

Leon in Ассемблер
А амдэшныхдоках просто пишут avoid 😄 и все
источник