Las instrucciones de lógica ternaria bit a bit pueden implementar lógicamente todas las operaciones bit a bit posibles entre tres entradas (256 permutaciones). Toman tres registros como entrada y un campo inmediato de 8 bits. Cada bit en la salida se genera utilizando una tabla de búsqueda de 8 bits de los tres bits correspondientes en las entradas para seleccionar una de las 8 posiciones en el inmediato de 8 bits. Dado que solo son posibles 8 combinaciones utilizando tres bits, esto permite realizar todas las operaciones bit a bit posibles de 3 entradas. En terminología matemática: cada bit correspondiente de las tres entradas es una función booleana ternaria con un diagrama de Hasse de orden n=8. [ 1 ] También conocidos como minterms .
Una tabla completa que muestra las 256 posibles instrucciones lógicas bit a bit de 3 operandos se puede encontrar en la descripción de Power ISA de xxeval. [ 2 ] Una observación adicional es que si el inmediato de 8 bits fuera un operando (registro), entonces en la terminología de FPGA , las instrucciones lógicas ternarias bit a bit implementarían una matriz de LUT3 de hardware .
Una de las aplicaciones típicas es la manipulación de bits de implementación para los cifrados simétricos . [ 3 ] [ 4 ] [ 5 ] [ 6 ]
Descripción
En pseudocódigo, la salida de tres entradas de un solo bit se ilustra utilizando r2, r1 y r0 como tres dígitos binarios de un índice de 3 bits, para tratar el valor inmediato de 8 bits como una tabla de búsqueda y simplemente devolver el bit indexado:
resultado := imm8 (r2<<2 + r1<<1 + r0)
A continuación se muestra una implementación legible en Python de tres entradas de un solo bit (r0, r1 y r2):
def ternlut8 ( r0 , r1 , r2 , imm8 ): """Implementación de una LUT3 (búsqueda ternaria)""" # el índice estará en el rango de 0 a 7 lut_index = 0 # r0 establece el bit 0, r1 el bit 1 y r2 el bit 2 if r0 : lut_index |= 1 << 0 if r1 : lut_index |= 1 << 1 if r2 : lut_index |= 1 << 2 # devuelve el bit indexado solicitado de imm8 return imm8 & ( 1 << lut_index ) != 0Si los registros de entrada son de 64 bits, la salida también será de 64 bits y se construirá seleccionando cada bit indexado de las tres entradas para crear el bit indexado correspondiente de la salida:
def ternlut8_64bit ( R0 , R1 , R2 , imm8 ): """Implementación de una instrucción de búsqueda ternaria de 64 bits""" result = 0 for i in range ( 64 ): m = 1 << i # bit de máscara único de las entradas r0 , r1 , r2 = ( R0 & m ), ( R1 & m ), ( R2 & m ) result |= ternlut8 ( r0 , r1 , r2 , imm8 ) << i return resultA continuación se muestra una tabla de ejemplo con solo tres permutaciones posibles de las 256 totales para el valor inmediato de 8 bits: doble AND, doble OR y combinación de bits. El valor inmediato (la tabla de búsqueda de 8 bits ) se denomina imm8 , como se muestra a continuación. Tenga en cuenta que la columna contiene el valor binario de su encabezado correspondiente: imm8:0xCA es el valor binario 11001010 en la columna "Combinación de bits".
Usos
El número de usos es significativo: en cualquier lugar donde se utilicen tres operaciones lógicas a nivel de bits en algoritmos. Ahorro de acarreo, SHA-1, SHA-2, MD5 y conteo de bits de exactamente uno y exactamente dos utilizados en Harley-Seal Popcount. [ 7 ]vpternlog acelera MD5 en un 20 % [ 8 ]
Implementaciones
Aunque es inusual debido al alto coste en hardware, esta instrucción se encuentra en varias arquitecturas de conjuntos de instrucciones.
- La capacidad de blitter de Amiga de 1985 en Agnus: el inmediato de 8 bits se denominó "minterm" y la operación fue de memoria a memoria. [ 9 ]
- La extensión AVX-512 lo llama
vpternlog[ 10 ] - Power ISA v3.1 llama a la instrucción
xxeval. [ 11 ] - Intel Larrabee también implementó esta instrucción como
vpternlog: Tom Forsyth explica, de forma divertida, que los ingenieros de pruebas de Intel estaban contentos de tener una instrucción para probar en lugar de 256. [ 12 ] [ 13 ] [ 14 ]
Véase también
- Conjunto de instrucciones de manipulación de bits : tipo de instrucciones informáticas. Páginas que muestran descripciones breves de destinos de redirección.
- Operaciones bit a bit : un tema de informática.
- Función booleana : función que devuelve uno de solo dos valores.
Referencias
- ↑ «Diagrama de Hasse» . Wolframio .
- ↑ power3.1 , pp. Power ISA Libro I Capítulo 7. Instalación de extensión vectorial-escalar p968, Tabla 145.
- ↑ Mercadier y Dagand 2019 .
- ↑ Sovyn, Khoma y Podporá 2023 .
- ↑ Xu 2017 .
- ↑ Biham 1997 .
- ↑ Muła, Wojciech (2020-01-11). "AVX512: Evaluación de funciones ternarias" .
- ↑ "Animetosho/Md5-optimisation" . GitHub .
- ↑ "¡Se ha detectado una vulnerabilidad en la instrucción lógica ternaria bit a bit de AVX!" 6 de octubre de 2024.
- ↑ "Intel Architecture Instruction Set Extensions Programming Reference" (PDF) . Intel . Consultado el 29 de enero de 2014 .
- ↑ power3.1 , pp. Power ISA Libro I Capítulo 7. Instalación de extensión vectorial-escalar p967.
- ↑ "Charlas y artículos de TomF" .
- ↑ Forsyth, Tom (noviembre de 2019). "SMACNI a AVX512: el ciclo de vida de un conjunto de instrucciones" (PDF) .
- ↑ "Tom Forsyth: el ciclo de vida de un conjunto de instrucciones" . 22 de agosto de 2020.
Fuentes
- Biham, Eli (1997). "Una nueva implementación rápida de DES en software" (PDF) . Cifrado rápido de software . Notas de clase en ciencias de la computación. Vol. 1267. Berlín, Heidelberg: Springer. págs. 260–272 . doi : 10.1007/BFb0052352 .
- Mercadier, Darius; Dagand, Pierre-Évariste (junio de 2019). «Usuba: cifrados de alto rendimiento y tiempo constante, por construcción». Actas de la 40.ª Conferencia ACM SIGPLAN sobre Diseño e Implementación de Lenguajes de Programación (PLDI 2019) . Phoenix, AZ, EE. UU.: Association for Computing Machinery. págs. 157-173 . doi : 10.1145/3314221.3314636 . ISBN 978-1-4503-6712-7.
- Power ISA™ Versión 3.1 (PDF) ( ed.v3.1 ). IBM . 1 de mayo de 2020. SA22-7832-14 . Recuperado el 7 de agosto de 2025 .
- Sovyn, Yaroslav; Khoma, Volodymyr; Podpora, Michal (2023). "Implementación en bits de cajas S criptográficas no algebraicas de 8 × 8 utilizando instrucciones SIMD del procesador x86-64" . IEEE Transactions on Information Forensics and Security . 18 : 491–500 . doi : 10.1109/TIFS.2022.3223782 .
- Xu, Shixiong (septiembre de 2017). Técnicas de compilación orientadas al diseño de datos en la vectorización para procesadores multinúcleo (tesis doctoral). Trinity College Dublin.
Enlaces externos
- Funciones ternarias AVX-512
- Instrucciones de Libre-SOC : incluye variantes booleanas y ternarias.
- Función ternaria implementada en Python
- Aritmética binaria
- Operadores (programación)
- Álgebra booleana
- Hardware informático