Diferença entre o conjunto de instruções do braço e do polegar

Normalmente, o código do polegar é 65% do tamanho do código ARM e fornece 160% do desempenho do código ARM ao executar a partir de um sistema de memória de 16 bits. A Thumb, portanto, torna o núcleo do ARM7TDMI ideal para aplicativos incorporados com largura de banda de memória restrita, onde a densidade e a pegada do código são importantes.

Centro de Informações ARM

A grande vantagem é que todas as instruções do Thumb têm 16 bits de largura vs 32 para o ARM completo. O código é reduzido para cerca de 60 a 65% do tamanho do ARM e, se você estiver usando memória de 16 bits, será executado 60% mais rápido devido à taxa de transferência de memória.

O Thumb é ótimo para embutir onde o espaço de endereço é limitado e você deseja um programa de controle simples e barato que não estrague o banco com um monte de hardware sofisticado que você não precisa.

Se você google

polegar vs braço

você pode encontrar uma tonelada de informações.

Vantagens:

Tamanho do programa 25% a 35% menor. Ou, olhando do outro lado, 33% a 50% mais recursos na mesma quantidade de código. Isso é importante para computadores embarcados de gama muito baixa, com espaço de programa limitado na ROM e, talvez contra-intuitivamente, em servidores enormes com um grande número de núcleos de CPU e caches de tamanho limitado.

Desvantagens:

Thumb1: não é um conjunto completo de instruções. Não apenas faltando as coisas necessárias para os sistemas operacionais, mas também ocasionalmente as necessárias para os programas normais, exigindo que o conjunto completo de instruções do ARM também esteja presente, e uma mudança para ela e para trás. Isso não é muito lento, mas precisa de várias instruções para fazê-lo. Algumas coisas nos programas Thumb1 podem acabar maiores e mais lentas que no ARM. O Thumb1 foi projetado tanto para ser executado em um barramento de memória de 16 bits (sem caches) quanto para programas menores. Isso raramente se aplica hoje.

Thumb2: sem desvantagens. É um conjunto completo de instruções e algumas CPUs são feitas apenas com o Thumb2, sem modo ARM. Basicamente, todas as instruções do ARM estão disponíveis como instruções Thumb2 de 32 bits e você pode misturá-las livremente com instruções de 16 bits. A única desvantagem muito leve é ​​que a codificação binária é um pouco feia, então é basicamente impossível ler o código da máquina em hexadecimal à mão. Mas agora é muito incomum não ter um depurador capaz de desmontar o código para você. Até mesmo sistemas embarcados geralmente podem ser "amarrados" a um depurador em um "PC" conectado, e todos podem comprar um PC (qualquer coisa do Raspberry Pi em diante).

Talvez a coisa mais estranha para mim seja que a ARM Ltd esqueceu as lições da Thumb2 quando criou o ARM64 (Aarch64). Todas as instruções têm um tamanho fixo de 32 bits e não há espaço na codificação para adicionar convenientemente instruções mais curtas posteriormente. Eles poderiam duplicar o truque Thumb1, mas não há detalhes nas instruções para executar o truque Thumb2 (essencialmente trocando os quatro bits usados ​​para execução predicada).

O RISC-V, por outro lado, fez isso corretamente. Ele foi projetado como um conjunto de instruções de 64 bits (com um subconjunto de 32 bits possível). Todas as instruções padrão têm 32 bits e você pode criar um computador usando somente essas (RV64I {MA}). Mas foi deixado espaço desde o início para instruções de 16 bits e instruções mais longas. Como resultado, o RISC-V com a extensão padrão C é de longe o conjunto de instruções mais compacto para um computador de 64 bits (e corresponde essencialmente ao Thumb2 para os 32 bits mais compactos).

Isso pode acabar prejudicando o Aarch64.

Pergunta original: “Quais são as vantagens e desvantagens da instrução Thumb configurada em relação às instruções ARM de 32 bits?”

Na verdade, existem várias versões do Thumb:

  • O Thumb original, que fornece instruções compactadas de 16 bits e é implementado como um estado do processador.
  • Thumb2, que estende o Thumb. De acordo com a ARM: “Ele adiciona instruções de 32 bits que podem ser livremente misturadas com instruções de 16 bits em um programa. As instruções adicionais de 32 bits permitem que o Thumb-2 cubra a funcionalidade do conjunto de instruções ARM. As instruções de 32 bits permitem que o Thumb-2 combine a densidade de código das versões anteriores do Thumb, com o desempenho da instrução ARM. ”
  • ThumbEE, que é uma variante do Thumb2 destinada ao código gerado dinamicamente.

Modo ARM

fornece o conjunto de instruções ARM tradicional. Isso é caracterizado por uma codificação muito regular. A maioria das operações possui um campo predicado de código de condição dedicado, campos dedicados para 2 operandos de origem, um operando de destino e um controle de turno no segundo operando de origem. (Tabela de

aqui.

)

O operando 2 é divertido, incluindo um número de turno e número de registro, além de algumas funcionalidades sofisticadas de geração constante.

Modo de polegar

fornece instruções compactadas (e, portanto, densidade de código aprimorada), à custa da flexibilidade - menos instruções, combinações mais limitadas de operandos. Em vez de um predicado de código de condição em cada instrução, você precisa ramificar as instruções. Em vez de um campo de registro completo de 4 bits, você está limitado a 3 bits (e, portanto, 8 registros). O generoso

Operando 2

campo se foi. (Tabela de

aqui.

)

Por ser um modo de processador, agora você precisa gerenciar transições entre os modos Thumb e ARM. Isso leva a todo tipo de diversão, incluindo hacks como

interfuncionamento

prefixos em funções. Agora você precisa decidir, provavelmente, função por função, se deseja gerar código no modo ARM ou Thumb e incluir o código necessário para alternar os estados do processador. O Thumb não fornece acesso completo à arquitetura - por exemplo, tratamento de exceções e acesso ao coprocessador -, portanto, você precisa ter pelo menos um pouco de código ARM em um programa que, de outra forma, poderia ser principalmente o Thumb.

O código do polegar tende a ser mais lento, devido à flexibilidade reduzida do operando e ao fato de fornecer apenas acesso a um subconjunto do conjunto de instruções. É mais denso, no entanto. O ARM sugere que o código Thumb tenha cerca de 65% do tamanho do código ARM de 32 bits correspondente. Eles também apontam que o código Thumb pode ser executado mais rapidamente que o código ARM em ambientes com largura de banda limitada de busca de programa.

O modo Thumb2 tenta atenuar as desvantagens do Thumb adicionando novas instruções de 16 e 32 bits ao modo Thumb. As novas instruções de 32 bits fornecem ao modo Thumb a maioria das funcionalidades do ARM que estavam ausentes no modo Thumb. Eu digo mais, pois o Thumb2 não possui predicados de código de condição por instrução, a favor da construção If-Then (IT).

Com o modo Thumb2, agora você pode gravar seu aplicativo completo no modo Thumb2. De fato, os processadores da classe Cortex-M suportam apenas o modo Thumb2, se a memória servir. As instruções de 32 bits fornecem acesso total à máquina e a maior parte da flexibilidade do conjunto de instruções ARM original. As instruções de 16 bits continuam a fornecer uma densidade de código decente.

Este é um compromisso bastante decente, IMHO. Ao permanecer no modo Thumb2 o tempo todo, você pode selecionar entre as variantes de instruções de 16 e 32 bits, onde isso faz sentido. Você não precisa mais se preocupar tanto com o gerenciamento dos modos do processador. Pode haver lugares em que os predicados do código de condição ausentes o mordam, mas, na prática, a maioria das coisas não notará.

Quanto ao ThumbEE: eu realmente não sei o suficiente para comentar de forma inteligente.

Para resumir:

  • O modo ARM é o mais flexível e mais rápido, desde que você tenha o código para buscar a largura de banda.
  • O modo Thumb fornece maior densidade de código, à custa da velocidade. Também está incompleto, pois você ainda precisa que parte do seu aplicativo esteja no modo ARM para gerenciar alguns aspectos da máquina.
  • O modo Thumb2 fornece uma troca decente entre a densidade do código do modo Thumb e a flexibilidade do modo ARM. Está completo, pois você pode escrever sua inscrição inteira no Thumb2; de fato, alguns processadores ARM suportam apenas o modo Thumb2.