Size: a a a

Compiler Development

2020 May 27

M

MaxGraey in Compiler Development
cmp     edi, -1
setne   al
movzx eax, al (если нужно)

против

mov eax, edi
xor eax, 0xffffffff
источник

AD

Artyom Drozdov in Compiler Development
MaxGraey
cmp     edi, -1
setne   al
movzx eax, al (если нужно)

против

mov eax, edi
xor eax, 0xffffffff
а может побенчмаркать и убедиться?)
источник

MM

Mikhail Maltsev in Compiler Development
Если говорить про IR, то про
cmp x, -1
для остальных оптимизаций понятнее, чем xor и truncate до 1 бита
источник

AT

Alexey Tkachenko in Compiler Development
а xor eax, -1 не лучше ли к not eax свести?
источник

M

MaxGraey in Compiler Development
not это все равно псевдоинствукция на сколько мне известно
источник

MM

Mikhail Maltsev in Compiler Development
Если говорить про сгенерированный ассемблер, то я думаю дело в ABI. Т.е. caller может ожидать, что false это 0, а true это 1 (но это неточно)
источник

M

MaxGraey in Compiler Development
Mikhail Maltsev
Если говорить про сгенерированный ассемблер, то я думаю дело в ABI. Т.е. caller может ожидать, что false это 0, а true это 1 (но это неточно)
Ну это же легко проверить переписав это так. Дело точно не в этом
https://godbolt.org/z/ffCgyw
источник

MM

Mikhail Maltsev in Compiler Development
Да, в ABI написано с точностью до наоборот: "Booleans, [...] when stored in integer registers (except for passing as arguments), all 8 bytes of the register are significant; any nonzero value is considered true."
источник

MM

Mikhail Maltsev in Compiler Development
Но в этом примере xor eax, -1 уже не даёт преимуществ
источник

M

MaxGraey in Compiler Development
Mikhail Maltsev
Но в этом примере xor eax, -1 уже не даёт преимуществ
Ну ты можешь разные варианты попробовать. Всегда будет одно и тоже
источник

MM

Mikhail Maltsev in Compiler Development
Хм, похоже что ABI всё-таки накладывает ограничения на bool: https://godbolt.org/z/r96wYX (этот код бы не работал, если бы значение true могло быть отличным от 1)
Т.е. в первом примере xor eax, -1 не прокатит из-за ABI, а во втором он не даёт преимуществ перед cmp eax, -1
источник

M

MaxGraey in Compiler Development
Mikhail Maltsev
Хм, похоже что ABI всё-таки накладывает ограничения на bool: https://godbolt.org/z/r96wYX (этот код бы не работал, если бы значение true могло быть отличным от 1)
Т.е. в первом примере xor eax, -1 не прокатит из-за ABI, а во втором он не даёт преимуществ перед cmp eax, -1
Вот с сайд эффектом в виде вызова еще
https://godbolt.org/z/EQB1Xw
источник

MM

Mikhail Maltsev in Compiler Development
Я не понимаю, какой по-твоему код должен бы был сгенерировать компилятор в этом случае?
источник

M

MaxGraey in Compiler Development
Хм, трудно подобрать пример, такой что бы явно не трогать ABI и при этом преобразование имело смысл
источник

M

MaxGraey in Compiler Development
На самом деле это довольно странно выглядит на фоне этого преобразования:
x < 0  ->  (unsigned)x >> 31

Которое применяется практически всегда
источник

MM

Mikhail Maltsev in Compiler Development
На уровне IR (x < 0) никак не преобразуется (ни в GCC, ни в Clang). (unsigned)x >> 31 генерируется уже в бэкенде
источник

M

MaxGraey in Compiler Development
Mikhail Maltsev
На уровне IR (x < 0) никак не преобразуется (ни в GCC, ни в Clang). (unsigned)x >> 31 генерируется уже в бэкенде
Это я знаю
источник
2020 May 28

C

Constantine in Compiler Development
источник

PS

Peter Sovietov in Compiler Development
@anlun Добро пожаловать! Приятно видеть, что к нам продолжают приходить специалисты в области PLT :)
источник

AP

Anton Podkopaev in Compiler Development
Peter Sovietov
@anlun Добро пожаловать! Приятно видеть, что к нам продолжают приходить специалисты в области PLT :)
Добрый день :)
источник