неоптимизированный кандидат на алгебраическое упрощение
Компилятор vc выбрасывает лишь часть операций, но чем он руководствуется при этом— непонятно. Оптимизатор легко раскрывает скобки ((cs.y*3) – cs.y), но дальше этого он не идет, послушно выполняя бессмысленную операцию (cs.y*2 / 2). И тут же, словно одумавшись, принудительно обнуляет регистр EAX, возвращая ноль. Судя по всему, результат выражения вычисляется компилятором еще на стадии трансляции, но он словно не решается им воспользоваться:
mov eax, [esp+arg_0]
; загрузка n
add eax, eax
; n *= 2; ( без учета знака)
cdq
; преобразовать двойное знаковое слово
sub eax, edx
; учесть знак
sar eax, 1
; n /= 2;
xor eax, eax
; n = 0;