El ARM ha pasado por una progresión:
- Una arquitectura de instrucciones de 32 bits, que tenía un código más voluminoso que muchas otras arquitecturas, pero que podía decodificarse rápidamente y podía realizar muchas operaciones con menos instrucciones que las arquitecturas de la competencia.
- Una arquitectura de formato de instrucción dual, que podría cambiar entre el conjunto de instrucciones ARM agradable y potente (pero desafortunadamente algo hinchado), y un conjunto de instrucciones "Thumb" de 16 bits menos potente (pero mucho más compacto). Cada instrucción Thumb tenía su correspondiente instrucción ARM, lo que minimiza un poco la necesidad de que los programadores aprendan dos conjuntos de instrucciones.
- Una arquitectura Thumb2, que agregó instrucciones de dos palabras al conjunto de instrucciones Thumb, produciendo lo que es principalmente un win-win: el código ARM típico contendría una combinación de instrucciones que solo estaban disponibles en ARM, e instrucciones que hubieran estado disponibles en Thumb pero tuvo que ser representado como 32 bits de todos modos; en Thumb2, dicho código obtiene los beneficios de espacio al reemplazar algunas de las instrucciones de 32 bits por otras de 16 bits.
- Una arquitectura de solo pulgar, que es más limitante de lo que me gustaría, pero que es más pequeña y más barata que cualquiera de las otras.
La arquitectura ARM permite que algunas operaciones bastante sofisticadas se realicen muy rápidamente, mucho más rápido que en cualquier otro chip. Por ejemplo (usando ARM7-TDMI):
ldrh r0, [r10, # ADDR_BUS_OFS]; Leer el bus de dirección del sistema de destino (13 bits)
ldrb r1, [r9, r0, lsr # 8]; Use los bits superiores para buscar la dirección en una tabla de controladores
agregue pc, r9, r1 lsl # 2; Ir al manejador apropiado
Cada controlador se almacena como un byte, que proporciona 1/4 del desplazamiento de la dirección desde el inicio de la tabla. El efecto neto es que una vez que se ha obtenido el contenido del bus de direcciones, solo se necesitan seis ciclos (dos instrucciones) para saltar a un controlador basado en los cinco bits superiores del recuperado, utilizando una tabla de salto de 32 bytes.
El código THUMB correspondiente sería más parecido a:
; Asumiendo que no necesitamos r6 / r7 para nada más, se reasignan desde r9 / r10
ldrh r0, [r7, # ADDR_BUS_OFS]
mov r1, r0
lsr r1, r1, # 8; THUMB requiere que la fuente y el destino sean iguales
ldrb r1, [r6, r1]
lsl r1, r1, # 1; Podría usar shift-left-two, si las direcciones de destino estuvieran alineadas con palabras completas
agregar pc, r1
Eso está bien desde el punto de vista de la densidad del código, dado que las instrucciones son solo la mitad de grandes que las originales, pero tomarían nueve ciclos después de la búsqueda en lugar de seis. En una aplicación donde el bus que se está viendo va a funcionar a su propia velocidad, ya sea que el ARM haya logrado manejarlo o no, las instrucciones ARM más rápidas son una gran ventaja.
Por cierto, Thumb2 es compatible binariamente con Thumb, lo que facilita el uso de herramientas anteriores, pero significa que hay algunas cosas que no puede hacer tan bien como el ARM original. Por ejemplo, en ARM, uno podría "rotar" un mapa de bits de 8x8 contenido en cuatro registros usando aproximadamente 3 instrucciones por dos bits:
movs r0, r4, lsl # 25; Coloque el bit superior de LSB en C y el siguiente bit en N
orrcs r6, # 0x00000001
orrmi r6, # 0x00000100
En Thumb2, sería necesario agregar instrucciones condicionales explícitas:
movs r0, r4, lsl # 25; Coloque el bit superior de LSB en C y el siguiente bit en N
itcs
orrcs r6, # 0x00000001
itmi
orrmi r6, # 0x00000100
Reducción neta del 33% en eficiencia de tiempo y espacio en comparación con ARM; probablemente sea el peor de los casos en que el código Thumb sea menos eficiente que ARM, e incluso eso no es exactamente horrible.
Otra pequeña desventaja de Thumb2 en comparación con ARM: en el código ARM, todas las instrucciones comienzan en los límites de palabras completas, lo que facilita el análisis estático. En Thumb2, las instrucciones pueden comenzar arbitrariamente en límites de media palabra y abarcar límites de palabra completa. El análisis estático puede ser mucho más difícil.