LINUX.ORG.RU

ash

 


0

1

Вот тут погуглил и ничего не нашел (точнее нашел аналогичный вопрос, а не ответ).

Почему 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 ...

Явно видно, что никакой магии тут нет, обычный сдвиг


Тэг типа занимает два нижних бита машинного слова. Для целых чисел тэг равен 00, поэтому операции +, -, *, shl не требует модификации тэга.

dmitry_vk ★★★
()

Кстати, в SBCL есть функция sb-kernel:get-lisp-obj-address, которая возвращает представление объекта/указателя в виде целого числа

dmitry_vk ★★★
()
Ответ на: комментарий от Zorn

Right... fixnum же 60 бит. Бес^Wdmitry_vk попутал :)

mv ★★★★★
()
Ответ на: комментарий от Zorn

Ну да. 2 или 3 бита - это упрощенно. Там еще есть разделение на lowtag и widetag.

dmitry_vk ★★★
()

В регистре он можеть хранить число и «как есть», без всяких тегов, если тип подходящий. И в массиве тоже. Вы же явно объявили переменную (unsigned-byte 32).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.