Вот тут погуглил и ничего не нашел (точнее нашел аналогичный вопрос, а не ответ).
Почему sbcl «оптимизирует» (ну то есть заменяет вызов ash на shl) только когда второй аргумент положительный?
И ещё, как sbcl хранит тип всяких там чиселок? Я вроде как читал, что он приписывает к ним какие-то там теги, кодирующие тип. Раз так, как он так шустро делает эти оптимизации, не боясь изменить этот тег.
Ну например что-то типа
(defun foo (bar)
(declare (type (unsigned-byte 32) bar)
(optimize (speed 3)))
(ash bar 1))
Дает
shl rdx,1
mov rsp,rbp
clc
pop rbp
ret
nop nop nop ...
Явно видно, что никакой магии тут нет, обычный сдвиг