2010-03-10 6 views
7

A veces escribo las funciones de montaje muy cortos como¿Por qué el compilador Delphi no incorpora las funciones de ensamblaje?

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; 

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


Actualizado:

Gracias a ldsandon, existe una reducción del 5,5 años report on QC abierta. El informe contiene algunas propuestas (como la extensión de la directiva asm) para simplificar la creación de asm para el compilador. Preferiría introducir la directiva "naked" 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, qué registros (entre eax, edx y ecx) deben conservarse.

Si la tarea general de los procedimientos efectivos de enlining con código BASM es difícil (y puede no serlo) una buena idea es permitir la alineación para los casos más importantes (como la función desnuda con uso de registro explícitamente declarado).

+0

Debe agregar la convención de llamada de registro después del resultado (por ejemplo ...: Entero; registrar;) para asegurarse de que la función también funciona cuando se usa una convención de llamada diferente durante la compilación. –

+2

Si quisiera analizar la posibilidad FUTURA de que el compilador admita funciones de ensamblador en línea, quizás el control de calidad o un tablero de mensajes sea el mejor lugar para hacerlo. Intenté responder que en este momento no es posible alinear una función con un bloque asm ya que es una implementación. Podrías pensar que es una buena idea (oye, me gusta el montaje y creo que sería bueno). ¿Pero es TAN el lugar para discutir las solicitudes de características para los compiladores? Pensé que querías la respuesta sobre tu problema: ¿por qué no puedo alinear esto? –

+0

@Ritsaert Hornstra: ¿por qué crees que SO no es el lugar para discutir las solicitudes de funciones para los compiladores? Es claramente la pregunta de programación, y dónde deben estar las respuestas sobre cómo implementar la cosa de la mejor manera y [posiblemente la pregunta retórica] por qué la cosa aún no se ha implementado. – kludg

Respuesta

10

Consulte el informe de Quality Central # 9283 (y vota por ello). Básicamente, el problema es que el compilador debe ser capaz de entender qué registros conservar antes del código en línea y qué restaurar después. Siempre que el compilador maneje el registro, es fácil, cuando el uso no está bajo control, no es así. Su ejemplo es bastante sencillo, pero el compilador debe ser capaz de manejar casos más complejos. El informe está en estado abierto, espero que el nuevo compilador también pueda alinear el código BASM.

5

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

Sería muy difícil permitir la alineación de estas piezas del ensamblador; con la normalización de todo tipo de efectos en el uso del registro, variables locales, etc., hay algo que el compilador no puede hacer con el ensamblado en línea.

+0

No puedo ver ningún problema al subrayar la función de ensamblaje anterior. En realidad, parece incluso más simple que establecer una función pascal pura. – kludg

+4

Si crees que es simple, EMbarcadero debería contratarte como su nuevo gurú del compilador :-). No es broma: es difícil. Un compilador realiza diferentes fases (no conoce el compilador Delphi desde el interior) texto (lexing) tokens (sintáctico) árbol de sintaxis (optimizaciones) árbol de sintaxis -> ... -> (codegen) código máquina. Ahora, una parte de la línea en línea es muy difícil de analizar en la fase de optimizaciones donde se trabaja con un árbol de sintaxis abstracta. –

+0

No veo por qué? Es un escaneo lineal simple de adelante hacia atrás para encontrar registros asignados/modificados. Algunas heurísticas (como la configuración de una pila si se usa BP). Tenga en cuenta que si se detectan construcciones impares (como direccionar% esp), se puede deshabilitar la alineación. Sería genial tener la base funcionando. –

Cuestiones relacionadas