Pregunta

A veces escribo las funciones de montaje muy cortos como

function SeniorBit(Value: LongWord): Integer;
asm
        OR    EAX,EAX
        JZ    @@Done
        BSR   EAX,EAX
        INC   EAX
@@Done:
end;

que parece ser los mejores candidatos para procesos en línea:

function SeniorBit(Value: LongWord): Integer; inline;

Delphi compilador, pero no lo permite. ¿Por qué?


Actualizado:

Gracias a ldsandon, existe una rel="nofollow abierta informar sobre control de calidad . El informe containes algunas propuestas (como se amplía la Directiva ASM) para simplificar la expansión en línea asm para el compilador. Yo preferiría para introducir la directiva "desnudo" en el nivel de procedimiento / función que le dice al compilador que no tiene que crear un marco de pila para el procedimiento y opcionalmente lo registra (entre EAX, EDX y ECX) debe ser preservado.

Si la tarea general de procedimientos eficientes procesos en línea con el código de BASM es difícil (y puede ser unnessessary) es una buena idea para permitir la expansión en línea para los casos más importantes (como la función desnudo con el uso de registro explícitamente declarado).

¿Fue útil?

Solución

Vea Quality Central informe # 9283 (y votar por ella). Básicamente, el problema es que el compilador debe ser capaz de entender lo registra para preservar antes de que el código en línea y qué debe ser recuperado después. Mientras maneja el compilador del registro es fácil, cuando el uso no está bajo el control es que no es. Su ejemplo es bastante sencillo, pero el compilador debe ser capaz de manejar los casos más complejos. El informe está en estado abierto, espero que el nuevo compilador será capaz de código en línea BASM también.

Otros consejos

No se puede mano en línea hecho a mano el código de montaje.

Sería muy duro para permitir la expansión en línea de estas piezas de ensamblador; con inlining normal de todo tipo de efectos sobre el uso de registro, las variables locales, etc están ahí que el compilador no puede hacer con ensamblador en línea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top