Умножение
Вообще-то, умножение – достаточно быстрая операция и особой необходимости в ее оптимизации нет. Но, как говорится, копейка рубль бережет. Вот компиляторы и борются за каждый такт времени процессора!
Если один из сомножителей представляет собой степень двойки – в ход идут битовые сдвиги. Это очевидно, но не все знают: как быстро выполнить умножение на числа 3, 5, 6, 7, 9, 10 и т.д. Оказывается, в этих случаях на помощь приходит сложение – в самом деле, (a*3) можно записать как: ((a>><<1)+a), что с легкостью укладывается в один такт (LEA может не только складывать, но и умножать один из регистров на числа 2, 4 и 8).
Компиляторы Microsoft Visual C++ и Borland C++ умело заменяют умножение битовыми сдвигами, при необходимости комбинируя их с операцией сложения, а вот WATCOM предпочитает обходиться без LEA, проигрывая своим конкурентам один такт (точнее, с учетом спаривая, даже полтора такта).