Modelo de costo x86 moderno

Estoy escribiendo un compilador JIT con un backend x86 y aprendiendo el ensamblador x86 y el código de la máquina a medida que avanzo. Utilicé el ensamblador ARM hace unos 20 años y me sorprende la diferencia en los modelos de costo entre estas arquitecturas.

Específicamente, los accesos a la memoria y las ramas son caros en ARM, pero las operaciones de pila y los saltos equivalentes son baratos en x86. Creo que las CPU modernas x86 hacen optimizaciones mucho más dinámicas que los núcleos ARM y me resulta difícil anticipar sus efectos.

¿Cuál es un buen modelo de costos a tener en cuenta al escribir el ensamblador x86? ¿Qué combinaciones de instrucciones son baratas y cuáles son caras?

Por ejemplo, mi compilador sería más simple si siempre generara la forma larga para cargar enteros o saltar a compensaciones, incluso si los enteros fueran pequeños o las compensaciones cercanas, pero ¿esto afectaría el rendimiento?

Todavía no he hecho ningún punto flotante, pero me gustaría continuar pronto. ¿Hay algo que no sea obvio sobre la interacción entre el código normal y el flotante?

Sé que hay muchas referencias (por ejemplo, Michael Abrash) sobre la optimización x86, pero tengo el presentimiento de que nada más que unos pocos años no se aplicará a las CPU modernas x86 porque han cambiado mucho últimamente. ¿Estoy en lo correcto

Respuestas a la pregunta(12)

Su respuesta a la pregunta