No seré poseedor de la sapiencia infinita de Tbon, pero haré un intento por explicar las diferencias más radicales entre uno y otro set de instrucciones:
Las diferencias en realidad son pequeñas. Los compiladores (armadores del software por decirlo lúdicamente) generalmente producen binarios que son aptos para ambos sets, haciendo a las diferencias imprescindibles de conocer para los desarrolladores tanto de los mismos compiladores como de los sistemas operativos.
- Los primeros AMD64 no tienen la instrucción CMPXCHG16B, que es una extensión de la instrucción CMPXCHG8B presente en la mayoría de los procers post 486. Similar a CMPXCHG8B, CMPXCHG16B permite operaciónes de tipos de datos en 128-bit doble quadword (quadword es la direccionalidad de la cadena que contiene el bit de menor orden (bit 0)). Esto es útil para contadores de alta resolución que pueden ser actualizados por múltiples procesadores ó núcleos. Sin CMPXCHG16B, la única manera de hacer operaciones de éste estilo es usar una sección crítica (netamente menos eficiente).
- Las primeras CPU's Intel con EM64T carecen de LAHF y SAHF, soportadas por AMD64 hasta la producción de los P4 Step G1 en Diciembre del 2005. LAHF y SAHF son instrucciones de carga/almacenaje para los flags de status. Además, carecían también del NX bit (No Execute bit), que marca los archivos de memoria como no-ejecutables, protegiendo de muchos tipos de códigos maliciosos.
- SYSCALL y SYSRET están solo soportados en el modo IA-32e (no en el modo de compatibilidad) de EM64T. SYSENTER y SYSEXIT están soportados en ambos. Éstas instrucciones llaman a segmentos de código duro para describir el segmento de código objetivo.
- Las ramas cercanas al prefijo 0x66 (tamaño de operación) se comportan distinto. Para EM64T despeja los 48 bits superiores mientras que para AMD64, los primeros 32.
- Las instrucciones de EM64T BSF y BSR actúan diferente cuando la fuente es 0 y el tamaño operativo es de 32 bits. El procesador fija el flag 0 y deja los 32 bits superiores de destino indefinidos.
- AMD64 soporta 3dNow!. Esto incluye pre-carga con el opcode (porción del lenguaje de instrucciones de la máquina que especifica las operaciones que esta realizará) 0x0F, 0x0D y PREFETCHW (like CHW!), que son utilísimos para esconder las latencias (retardos) de la memoria.
- EM64T carece de la habilidad de guardar y restaurar una versión reducida (y por ello más rápida) del estado de punto flotante (involucrando a las operaciones FXSAVE y FXRSTOR). Punto flotante es una manera de representar un set de números reales en términos de un exponente, que es un integrando, y un significando, que es una cadena de ciertos números escogidos de dígitos.
- EMT64T carece de algunos modelos de registros específicos que son considerados "arquitecturales" de AMD64. Ésto inclute SYSCFG, TOP_MEM y TOP_MEM2.
- EM64T soporta refresco de microcódigo como en el modo de 32 bits.
- La identificación de la CPU del EM64T es muy específica del vendedor, como es normal en los procesadores x86.
- Las instrucciones MONITOR y MWAIT usadas por parte de los sistemas operativos para lidiar con el Hyper-threading son sólo soportadas (y útiles, ya q AMD no lo usa) en los EM64T.
- Los sistemas AMD64 permiten el uso de la apertura de AGP como IO-MMU (I/O Memory Mapping Unit ó Unidad de Mapeo de memoria de entrada/salida). Los sistemas operativos pueden tomar ventaja de ésto, dejando a los dispositivos PCI normales acceso directo a la memoria (DMA) de alrededor de 4 GB. Los que tienen EM64T requieren el uso de almacenadores intermediarios, lo que los hace más lentos.
- El hardware EM64T actual permite acceso a sólo 236 bytes de memoria, mientras AMD64 puede manejar hasta 240 bytes. Todo esto de una extensión máxima de 256 bytes.
Espero comentarios, complementos y críticas, por que fue harta pega reuniendo toda la info y complementandola con las definiciones de las cosas que no toda la gente sabe que son. Espero que queden más claras las diferencias.
Fuentes:
-
AMD
-
Intel
-
Ars Technica
-
Wikipedia
-
x86-64.org
-
Google