Иногда я пишу очень короткие ассемблерные функции, такие как
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 трудна (и может быть излишней), хорошей идеей является включение встраивания для наиболее важных случаев (например, для голой функции с явно объявленным использованием регистра).