SSE4 es un conjunto de instrucciones de la microarquitectura Intel Core , implementado por primera vez en los procesadores de la serie Penryn (que no debe confundirse con el SSE4A de AMD ) [1] .
Se anunció el 27 de septiembre de 2006 , pero una descripción detallada solo estuvo disponible en la primavera de 2007 . Puede encontrar una descripción más detallada de las nuevas características del procesador para programadores en el sitio web de Intel.
SSE4 consta de 54 instrucciones, 47 de ellas pertenecen a SSE4.1 (están en procesadores Penryn). El conjunto completo de instrucciones (SSE4.1 y SSE4.2, es decir, 47 + las 7 instrucciones restantes) está disponible en los procesadores Intel con microarquitectura Nehalem, que se lanzaron a mediados de noviembre de 2008 y en ediciones posteriores. Ninguna de las instrucciones SSE4 funciona con registros mmx de 64 bits (solo con xmm0-15 de 128 bits).
Nuevos comandos SSE4Subgrupo | instrucciones del procesador | Descripción | Mejoras esperadas en la aplicación |
---|---|---|---|
Varias operaciones DWORD empaquetadas | PMULD, PMULDQ | Nuevo soporte para cuatro multiplicaciones de 32x32 bits con signo (y sin signo) por instrucción, así como multiplicaciones con signo como 32x32->64. | Ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran). |
Producto punto flotante | DPPS, DPPD | Rendimiento de procesamiento mejorado para el tipo de datos AOS (matriz de estructuras) a través del soporte para productos de punto de precisión simple y doble. | Creación de contenidos tridimensionales, juegos. Soporte para lenguajes de programación como CG y HLSL. |
maridaje lleno | BLENDPS, BLENDPD, BLENDVPS, BLENDVPD, PBLENDVB, PBLENDDW | Por convención, la operación de emparejamiento copia un campo del origen y lo transfiere al destino. Estas nuevas instrucciones del procesador mejorarán el rendimiento de las operaciones de conjugación para la mayoría de los tamaños de campo al empaquetar las operaciones de multiplicación en una sola instrucción. | Es ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran), así como para aplicaciones diseñadas para el procesamiento de imágenes, información de video. Recursos multimedia y de juego. |
Valores enteros empaquetados máximo y mínimo | PMINSB, PMAXSB, PMINUW, PMAXUW, PMINUD, PMAXUD, PMINDS, PMAXSD | Compara los valores enteros empaquetados de nivel de byte/palabra/dword con/sin firmar en el operando de destino y en el operando de origen y devuelve el valor mínimo o máximo por instrucción para cada operando empaquetado en el operando de destino. | Es ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran), así como para aplicaciones diseñadas para el procesamiento de imágenes, información de video. |
Redondeo de valores de punto flotante | ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD | Redondea eficientemente un operando de precisión simple o doble escalar y empaquetado a un valor entero, lo que admite los requisitos de los lenguajes de programación Fortran, Java y C99. | Procesamiento de imágenes, gráficos, información de video. Aplicaciones con recursos multimedia y de juego 2D/3D. |
Insertar/Expulsar registros | INSERTOS, PINSRB, PINSRD, PINSRQ, EXTRACTOS, PEXTRB, PEXTRD, PEXTRW, PEXTRQ | Estas nuevas instrucciones del procesador simplifican el proceso de inserción y extracción entre GPR (o memoria) y XMM. | Es ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran), así como para aplicaciones diseñadas para el procesamiento de imágenes, información de video. |
Conversión de formato empaquetado | PMOVSXBW, PMOVZXBW, PMOVSXBD, PMOVZXBD, PMOVSXBQ, PMOVZXBQ, PMOVSXWD, PMOVZXWD, PMOVSXWQ, PMOVZXWQ, PMOVSXDQ, PMOVZXDQ | Convierte un valor entero encuadrado (de un registro o memoria XMM) en un valor entero de un tipo más amplio con extensión firmada o nula. | Es ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran), así como para aplicaciones diseñadas para el procesamiento de imágenes, información de video. |
Embalado de verificación e instalación. | PRUEBA | Ramificación más rápida de la arquitectura SIMD para admitir código vectorizado. | Aplicable para la automatización de la vectorización del compilador del procesamiento de datos, el procesamiento de información de imágenes y videos y la creación de contenido tridimensional. Recursos multimedia y de juego. |
Definición de identidad empaquetada | PCMPEQQ, PCMPGTQ | La arquitectura SIMD define que los valores empaquetados de QWORDs en el operando de destino y en el operando de origen son idénticos. | Es ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran), así como para aplicaciones diseñadas para el procesamiento de imágenes, información de video. Recursos multimedia y de juego. |
Empaquetando DWORD en formato WORD sin firmar | PAQUETEUSDW | Convierte un DWORD con firma empaquetada en una PALABRA empaquetada sin firmar mediante una preparación sin firmar para controlar las condiciones de desbordamiento. Esta nueva instrucción del procesador completa el conjunto de otras instrucciones en este formato. | Es ampliamente aplicable para automatizar la vectorización del compilador del procesamiento de datos escritos en lenguajes de programación de alto nivel (como C y Fortran), así como para aplicaciones diseñadas para el procesamiento de imágenes, información de video. Recursos multimedia y de juego. |
Operaciones de cadena mejoradas | PCMPESTRI, PCMPESTRM, PCMPISTRI, PCMPISTRM | Estas nuevas instrucciones del procesador contienen una gran cantidad de capacidades de procesamiento de cadenas y texto que normalmente requieren más códigos de operación. | Rendimiento mejorado para análisis de virus, búsqueda de texto, bibliotecas de procesamiento de cadenas como ZLIB, bases de datos, compiladores y aplicaciones de máquinas de estado. |
El compilador C de Intel desde la versión 10 genera instrucciones SSE4 cuando se especifica la opción -QxS . El compilador Sun Studio de Sun Microsystems desde la versión 12 actualización 1 genera instrucciones SSE4 usando las opciones -xarch=sse4_1 (SSE4.1) y -xarch=sse4_2 (SSE4.2) [2] . El compilador GCC admite SSE4.1 y SSE4.2 desde la versión 4.3 [ 3] , con las opciones -msse4.1 y -msse4.2 , o -msse4 para incluir ambas.
Se han agregado instrucciones para acelerar la compensación de movimiento en los códecs de video , lectura rápida de la memoria USWC , muchas instrucciones para simplificar la vectorización de programas por parte de los compiladores.
Además, se han agregado a SSE4.2 instrucciones para procesar cadenas de caracteres de 8/16 bits, cálculos CRC32, POPCNT . Por primera vez en SSE4, el registro xmm0 se usó como argumento implícito para algunas instrucciones.
Cálculo de ocho sumas de valores absolutos de diferencias (SAD) de grupos sin firmar de 4 bytes compensados. La ubicación de los operandos para SAD de 16 bits está determinada por los tres bits del argumento directo imm8.
s1 = mm8[2]*4 s2 = mm8[1:0]*4 TAE 0 = |A (s1+0) -B (s2+0) | + |A (s1+1) -B (s2+1) | + |A (s1+2) -B (s2+2) | + |A (s1+3) -B (s2+3) | TAE 1 = |A (s1+1) -B (s2+0) | + |A (s1+2) -B (s2+1) | + |A (s1+3) -B (s2+2) | + |A (s1+4) -B (s2+3) | TAE 2 = |A (s1+2) -B (s2+0) | + |A (s1+3) -B (s2+1) | + |A (s1+4) -B (s2+2) | + |A (s1+5) -B (s2+3) | ... TAE 7 = |A (s1+7) -B (s2+0) | + |A (s1+8) -B (s2+1) | + |A (s1+9) -B (s2+2) | + |A (s1+10) -B (s2+3) |Buscar entre campos sin signo de 16 bits A 0 ... A 7 tales que tengan un valor mínimo (y posición con un número menor, si hay varios de esos campos). Se devuelve un valor de 16 bits y su posición.
Un grupo de 12 instrucciones para expandir el formato de campos empaquetados. Los campos empaquetados de 8, 16 o 32 bits de la parte inferior del argumento se expanden (con o sin signo) en campos de resultados de 16, 32 o 64 bits.
Formato de entrada | Formato resultante | ||
---|---|---|---|
8 bits | 16 bits | 32 bits | |
PMOVSXBW | 16 bits | ||
PMOVZXBW | PMOVZXWW | ||
PMOVSXBD | PMOVSXWD | 32 bits | |
PMOVZXBD | PMOVZXWD | PMOVSXDD | |
PMOVSXBQ | PMOVSXWQ | PMOVSXDQ | 64 bits |
PMOVZXBQ | PMOVZXWQ | PMOVZXDQ |
Cada campo de resultado es el valor mínimo/máximo de los campos correspondientes de los dos argumentos. Los campos de bytes se tratan solo como números con signo, los campos de 16 bits se tratan solo como números sin signo. Para campos empaquetados de 32 bits, se proporcionan opciones firmadas y sin firmar.
Multiplique los campos de 32 bits con signo, produciendo los 64 bits completos del resultado (dos operaciones de multiplicación en campos de argumento 0 y 2).
Multiplique los campos de 32 bits con signo, produciendo los 32 bits menos significativos de los resultados (cuatro operaciones de multiplicación en todos los campos de argumento).
Empaquetado de campos firmados de 32 bits en campos sin firmar de 16 bits con saturación.
Comprobación de la igualdad de campos de 64 bits y emisión de máscaras de 64 bits.
Insertar un campo de 32 bits de xmm2 (es posible elegir cualquiera de los 4 campos de este registro) o de una ubicación de memoria de 32 bits en un campo de resultado arbitrario. Además, para cada uno de los campos de resultados, puede configurarlo para que se restablezca a +0.0.
Al extraer un campo de 32 bits del registro xmm, el número de campo se indica en los 2 bits inferiores de imm8. Si se especifica un registro de 64 bits como resultado, sus 32 bits superiores se restablecen (extensión sin signo).
Inserte un valor de 8, 32 o 64 bits en el campo xmm especificado del registro (los demás campos no se modifican).
Extracción de campo de 8, 16, 32, 64 bits del campo xmm especificado en imm8 del registro. Si se especifica case como resultado, se descarta su parte alta (extensión sin signo).
Multiplicación escalar vectorial (producto escalar) de campos de 32/64 bits. Mediante una máscara de bits en imm8 se indica qué productos de los campos se deben sumar y qué se debe escribir en cada campo del resultado: la suma de los productos especificados o +0.0.
Cada campo de resultado de 32/64 bits se selecciona según el signo del mismo campo en el argumento implícito xmm0: ya sea del primer o del segundo argumento.
La máscara de bits (4 o 2 bits) en imm8 especifica de qué argumento debe tomarse cada campo de resultado de 32/64 bits.
La elección de cada campo de bytes del resultado se realiza en función del signo del byte del mismo campo en el argumento implícito xmm0: ya sea del primero o del segundo argumento.
La máscara de bits (8 bits) en imm8 especifica de qué argumento debe tomarse cada campo de resultado de 16 bits.
Configure la bandera ZF solo si en xmm2/m128 todos los bits marcados con la máscara de xmm1 son cero. Si todos los bits sin marcar son cero, establezca el indicador CF. Las banderas restantes ( AF , OF , PF , SF ) siempre se restablecen. La instrucción no modifica xmm1.
Redondeo de todos los campos de 32/64 bits. El modo de redondeo (4 opciones) se selecciona desde MXCSR.RC o se configura directamente en imm8. También puede suprimir la generación de una excepción de pérdida de precisión.
Redondeando solo el campo de 32/64 bits menos significativo (los demás bits permanecen sin cambios).
Una operación de lectura que acelera (hasta 7,5 veces) el trabajo con áreas de memoria de combinación de escritura .
Estas instrucciones realizan comparaciones aritméticas entre todos los pares de campos posibles (64 o 256 comparaciones) de ambas cadenas dadas por los contenidos de xmm1 y xmm2/m128. Los resultados booleanos de las comparaciones luego se procesan para obtener los resultados deseados. El argumento directo de imm8 controla el tamaño (cadenas de bytes o unicode, hasta 16/8 elementos cada una), la caracterización de los campos (elementos de cadena), el tipo de comparación y la interpretación de los resultados.
Pueden buscar en una cadena (área de memoria) caracteres de un conjunto dado o en rangos dados. Puede comparar cadenas (áreas de memoria) o buscar subcadenas.
Todos ellos afectan los indicadores del procesador : SF se establece si xmm1 no es una cadena completa, ZF se establece si xmm2/m128 no es una cadena completa, CF es si el resultado no es cero, OF es si el bit menos significativo de la resultado no es cero. Las banderas AF y PF se borran.
Configuración explícita del tamaño de las líneas en <eax>, <edx> (el valor absoluto de los registros se toma de saturación a 8/16, dependiendo del tamaño de los elementos de las líneas. El resultado está en el registro ecx .
Configuración explícita del tamaño de las líneas en <eax>, <edx> (el valor absoluto de los registros se toma de saturación a 8/16, dependiendo del tamaño de los elementos de las líneas. El resultado está en el registro xmm0 .
Configuración implícita del tamaño de las cadenas (se buscan cero elementos para cada una de las cadenas). El resultado está en el registro ecx.
Configuración implícita del tamaño de las cadenas (se buscan cero elementos para cada una de las cadenas). El resultado está en el registro xmm0.
Acumulación del valor CRC-32C (otra notación CRC-32/ISCSI CRC-32/CASTAGNOLI ) para un argumento de 8, 16, 32 o 64 bits (usando el polinomio 0x1EDC6F41 ).
Contando el número de bits individuales. Tres opciones de instrucción: para registros de 16, 32 y 64 bits. También presente en el SSE4A de AMD .
Comprobación de campos de 64 bits para "mayor que" y emisión de máscaras de 64 bits.
AMD introdujo el conjunto de instrucciones SSE4a en los procesadores de arquitectura Barcelona . Esta extensión no está disponible en los procesadores Intel. El soporte se define mediante el indicador CPUID.80000001H:ECX.SSE4A[Bit 6]. [cuatro]
Instrucción | Descripción |
---|---|
LZCNT/POPCNT | Contando el número de bits cero/uno. |
EXTRQ/INSERTQ | Instrucciones combinadas de máscara y turno [5] |
MOVNTSD/MOVNTSS | Instrucciones de escritura de flujo escalar [6] |
conjuntos de instrucciones del procesador x86 | |
---|---|
Intel | |
AMD | |
cirix |