Почему компилятор Delphi не использует встроенные функции сборки?
Вопрос
Иногда я пишу очень короткие функции сборки, такие как
function SeniorBit(Value: LongWord): Integer;
asm
OR EAX,EAX
JZ @@Done
BSR EAX,EAX
INC EAX
@@Done:
end;
это, по-видимому, лучшие кандидаты для встраивания:
function SeniorBit(Value: LongWord): Integer; inline;
но компилятор Delphi этого не допускает.Почему?
Обновленный:
Благодаря ldsandon существует 5,5-летняя открытая отчет о контроле качества.Отчет содержит некоторые предложения (например, расширение директивы asm) по упрощению встраивания asm в компилятор.Я бы предпочел ввести директиву "naked" на уровне процедуры / функции, которая сообщает компилятору, что ему не обязательно создавать фрейм стека для процедуры и, при необходимости, какие регистры (среди eax, edx и ecx) должны быть сохранены.
Если общая задача эффективного встраивания процедур в код BASM сложна (и может оказаться ненужной), хорошей идеей будет включить встраивание для наиболее важных случаев (например, голой функции с явно заявленным использованием регистра).
Решение
Смотрите отчет Центра качества № 9283 (и голосуйте за него).По сути, проблема заключается в том, что компилятор должен быть в состоянии понять, какие регистры сохранять до встроенного кода, а какие восстанавливать после.Пока компилятор обрабатывает регистр, это легко, когда использование не находится под контролем, это не так.Ваш пример довольно прост, но компилятор должен быть способен обрабатывать более сложные случаи.Отчет находится в открытом состоянии, надеюсь, новый компилятор также сможет встроить код BASM.
Другие советы
Вы не можете встроить созданный вручную ассемблерный код.
Было бы очень трудно разрешить встраивание этих частей ассемблера;при обычном встраивании возникают всевозможные эффекты на использование регистра, локальные переменные и т.д., которые компилятор не может выполнить с помощью встроенной сборки.