Сдвиги вместо MUL на 8088: по таблице выигрыш у всех констант, с учётом выборки байтов — по расчёту у 9–21%
An old 8088 optimization tip advised replacing multiplication by a constant with shifts because MUL is slow. Intel's timing table puts MUL with a 16-bit register at 118–133 cycles, a shift at 2 cycles and an add at 3; by that table, shift chains beat MUL for all 65,534 constants. A recalculation used published measurements from a real 1982 8088 in Daniel Balsom's SingleStepTests. Those measurements make the MUL table accurate to the cycle, with a formula of 117 plus the number of ones in AX and plus 1 in the zero case. Taking byte fetches into account, the calculated advantage is 9–21%.
Совет «на 8088 умножай на константу сдвигами, MUL медленный» опирался на таблицу тактов Intel: MUL с 16-битным регистром стоит 118–133 такта, сдвиг — 2, сложение — 3. По ней цепочка сдвигов обгоняет MUL для всех 65 534 констант. Я посчитал время обеих сторон по опубликованным замерам настоящего 8088 1982 года (SingleStepTests Дэниела Балсома). Для MUL таблица точна до такта: 117 плюс число единиц в AX плюс 1 при нулевом DX во всех регистровых тестах с полной очередью, из пустой — на 3 такта больше. А короткая инструкция, которую процессор должен сперва прочитать по 8-битной шине, стоит 8 тактов вместо 2–3. По сумме замеров отдельных инструкций с учётом этой выборки цепочка быстрее MUL для всех констант ниже порога, который зависит от второго множителя и лежит между 1367 и 4779, выше порога — лишь для части, а среди всех 16-битных констант — для 9–21%. Читать далее