Почему компилятор Delphi не использует встроенные функции сборки?

StackOverflow https://stackoverflow.com/questions/2414964

Вопрос

Иногда я пишу очень короткие функции сборки, такие как

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.

Другие советы

Вы не можете встроить созданный вручную ассемблерный код.

Было бы очень трудно разрешить встраивание этих частей ассемблера;при обычном встраивании возникают всевозможные эффекты на использование регистра, локальные переменные и т.д., которые компилятор не может выполнить с помощью встроенной сборки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top