Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Есть. Должно оптимизировать исполнение команд процессором.
xor eax, eax устранит зависимость eax от состояния, в котором он находился в предыдущих командах. Поэтому процессор сможет выполнить эти 2 команды, и ,возможно, следующую, не дожидаясь выполнения предыдущих команд, юзавших eax.
>xor eax, eax устранит зависимость eax от состояния
Откуда зависимость появляется в mov ax, ... ? После mov ax, ... старшая часть eax вроде же все равно обнуляется?
Z в movzx вроде как zero расширение. А еще есть знакововое расширение movsx. Вот не помню, почему тогда используют трюк с xor перед mov. Видимо для совместимости с древними процами...
Походу нет. Смотри:
Если CPUTraceFlag == 0, то получаем set(get() & ~0) ^ 0 - т.е. ничего не изменится.
Если же CPUTraceFlag == 1, то получаем set(get() & ~(1 << 8)) ^ (1 << 8), что установит бит.
Вообще, когда я увидел этот код первый раз, то первая же мысль была: Автор кода считает AssemberGovno, боится его как огня и поэтому пишет достаточно низкоуровневые конструкции, удобно и кратко выражающиеся на ассемблере, на языке высокого уровня. Хорошо, что хоть не в ООП оформил это...
WHAT!?
Только я боюсь, что после этого будет где-нибудь:
2.5 Alternative tokens
P.S. Только это && а не &, & судя по ману доступен как bitand.
http://git.gnome.org/browse/gnome-system-monitor/tree/src/proctable.cpp
Толк от этой первой строки вообще есть какой?
xor eax, eax устранит зависимость eax от состояния, в котором он находился в предыдущих командах. Поэтому процессор сможет выполнить эти 2 команды, и ,возможно, следующую, не дожидаясь выполнения предыдущих команд, юзавших eax.
А так устраняется?
UPD: а зачем? Тогда уж лучше один mov eax, ... оставить.
Откуда зависимость появляется в mov ax, ... ? После mov ax, ... старшая часть eax вроде же все равно обнуляется?
Фу.
Походу нет. Смотри:
Если CPUTraceFlag == 0, то получаем set(get() & ~0) ^ 0 - т.е. ничего не изменится.
Если же CPUTraceFlag == 1, то получаем set(get() & ~(1 << 8)) ^ (1 << 8), что установит бит.
Дельфины какие-то приняли это в стандарт. 🙁
Но т.к. я не думаю, что автор кода будет менять какие-то биты кроме трейс флага, то вполне можно было сделать что-то типа
http://msdn.microsoft.com/en-us/library/aa983406(v=vs.80).aspx
http://msdn.microsoft.com/en-US/library/aa983392(v=vs.80)
И никакого ассемблера 😉