Почему компилятор Delphi не поддерживает встроенные функции сборки? - PullRequest
7 голосов
/ 10 марта 2010

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

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-летний открытый отчет о QC . Отчет содержит некоторые предложения (например, расширение директивы asm), чтобы упростить встраивание asm для компилятора. Я бы предпочел ввести директиву «naked» на уровне процедуры / функции, которая говорит компилятору, что ему не нужно создавать стековый фрейм для процедуры и, опционально, какие регистры (среди eax, edx и ecx) следует сохранить.

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

Ответы [ 2 ]

10 голосов
/ 10 марта 2010

См. Quality Central report # 9283 (и проголосуйте за него). По сути, проблема в том, что компилятор должен понимать, какие регистры сохранять перед встроенным кодом, а что восстанавливать после. Пока компилятор обрабатывает регистр, это легко, когда использование не находится под контролем, это не так. Ваш пример довольно прост, но компилятор должен уметь обрабатывать более сложные случаи. Отчет находится в открытом состоянии, надеюсь, новый компилятор также сможет встроить код BASM.

5 голосов
/ 10 марта 2010

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

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

...