Техника оптимизации под линуха

       

неоптимизированный кандидат на алгебраическое упрощение


Компилятор 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;



Содержание раздела