Конечно сложнее, но что весомее: экономия памяти в гигабайты или десяток другой ЛЭ в чипе?
Для Вас, как для программиста это будет выглядеть:
mov ax, ...
shl ax, 3
// на 8
mov ax, ...
mul6 ax
// на 6
(условно)
Сорри, но Вы немного не чувствуете, имхо. Попытаюсь, как я понял, что объяснить то, что хотел сказать
Finch.
Возьмём гипотетический процессор, с АЛУ, у которого есть модуль сдвига (пусть этот модуль даже позволяет сдвигать сразу на несколько бит за раз) и модуль сложения (тоже выполняющий операцию сложения за раз).
Умножение на 6 потребует задействования обоих этих модулей, причём:
1 такт засылаем на модуль сдвига исходное значение
2 такт сдвигаем на 2
3 такт засылаем результат сдвига на модуль сложения
4 такт засылаем на модуль сдвига исходное значение
5 такт сдвигаем на 1
6 такт засылаем результат сдвига на модуль сложения
7 такт выполняем сложение
8 такт выгружаем результат.
А теперь для сравнения умножаем на 8
1 такт засылаем на модуль сдвига исходное значение
2 такт сдвигаем на 3
3 такт выгружаем результат
В итоге для умножения на 6 нам понадобилось 8 тактов и оба устройства, а для умножения на 8 - всего 3 такта и одно устройство.
Можно немного ускорить умножение на 6, например, добавив ещё один сдвигатель и попытавшись выполнить операции сдвига параллельно:
1 такт засылаем на модуль сдвига 1 исходное значение и на модуль сдвига 2 исходное значение
2 такт сдвигаем на модуле сдвига 1 на 2, а на модуле сдвига 2 на 1
3 такт засылаем результат сдвига с модуля сдвига 1 на модуль сложения
4 такт засылаем результат сдвига с модуля сдвига 2 на модуль сложения
5 такт выполняем сложение
6 такт выгружаем результат.
Уже быстрее, но всё равно медленее, это раз, теперь у нас задействовано три устройства, это два, и теперь схема всего этого гораздо сложнее, т.к. придётся обеспечивать параллельное выполнение этих операций и соответственно какую-то их синхронизацию и выборку сдвигателей, это три.
А если сдвигатели выполняют по одному сдвигу за такт, то всё становится ещё хуже.
Умножение на 6
1 такт засылаем на модуль сдвига исходное значение
2 такт сдвигаем на 1
3 такт сдвигаем на 1
4 такт засылаем результат сдвига на модуль сложения
5 такт засылаем на модуль сдвига исходное значение
6 такт сдвигаем на 1
7 такт засылаем результат сдвига на модуль сложения
8 такт выполняем сложение
9 такт выгружаем результат.
Умножение на 8
1 такт засылаем на модуль сдвига исходное значение
2 такт сдвигаем на 1
3 такт сдвигаем на 1
4 такт сдвигаем на 1
5 такт выгружаем результат
Умножение на 6 два сдвигателя:
1 такт засылаем на модуль сдвига 1 исходное значение и на модуль сдвига 2 исходное значение
2 такт сдвигаем на модуле сдвига 1 на 1, а на модуле сдвига 2 на 1
3 такт сдвигаем на модуле сдвига 1 на 1, на модуле сдвига 2 ничего не делаем
4 такт засылаем результат сдвига с модуля сдвига 1 на модуль сложения
5 такт засылаем результат сдвига с модуля сдвига 2 на модуль сложения
6 такт выполняем сложение
7 такт выгружаем результат.
А если вспомнить, что в реальности операция сложения выполняется через тот-же сдвиг и операцию "или", то всё становится ещё хуже (т.е. реально операция сложения будет занимать не один такт, а вовсе даже и больше, плюс она потребует очередной сдвигатель).
Сорри, за много букв.