Implementações recentes da arquitetura ARM viram a introdução de
técnicas superescalares para o pipeline de instruções. Nesta seção,
focamos no ARM Cortex -A8, o qual oferece um bom exemplo de um
projeto RISC superescalares. O Cortex -A8 é um processador da
família ARM, referido como processador de aplicação.
Um processador de aplicações ARM é um processador embarcado que executa
sistemas operacionais complexos para aplicações sem fio, de eletrônica de
consumo e de imagens. Cortex -A8 têm por alvo uma grande variedade de
aplicações móveis e consumidoras incluindo telefones móveis, caixas set -top,
consoles de jogos e navegação de automóveis/sistemas de entretenimento.
Unidade de busca das instruções:
Funções
A unidade de leitura de instruções prevê o fluxo de instruções,
obtém instruções da cache L1 de instruções e coloca as
instruções obtidas em um buffer para serem consumidas pelo
pipeline de decodificação. A unidade de leitura de instruções
inclui também a cache L1 de instruções.
Como pode haver vários desvios não resolvidos no pipeline, as leituras das
instruções são especulativas, o que significa que não há garantia que elas
serão executadas. Um desvio ou uma instrução excepcional no fluxo de código
pode causar o esvaziamento do pipeline, descartando instruções lidas. A
unidade de busca das instruções pode ler até quatro instruções por ciclo.
Unidade de decodificação de instruções:
A unidade de decodificação de instruções decodifica e sequencia todas as instruções
ARM e Thumb. Ela possui uma estrutura de pipeline dupla, chamada de canal0 e
canal1, para que duas instruções possam passar pela unidade ao mesmo tempo.
Quando duas instruções são emitidas a partir do pipeline de decodificação de
instruções, o canal0 sempre conterá a instrução mais antiga na ordem do programa.
Isto significa que se a instrução no canal0 não puder ser emitida,
então a instrução no canal1 não será emitida. Todas as instruções
emitidas são processadas na ordem pelo pipeline de execução com
resultados sendo atualizados no banco de registradores ao final do
pipeline de execução.
Esta emissão e retirada em ordem das instruções previne
perigos do tipo WAR e mantém diretos o acompanhamento de
hazards do tipo WAW e a recuperação das condições de
esvaziamento. Assim, a preocupação principal do pipeline de
decodificação de instruções é a prevenção de hazards RAW.
Unidade de execução de inteiros:
A unidade de execução de instruções consiste de dois pipelines
de unidades lógicas aritméticas (ALU) simétricos, um gerador
de endereços para ler e armazenar instruções e um pipeline de
multiplicação. Os pipelines de execução efetuam também a
atualização nos registradores.
A unidade de execução de instruções: Executa todas as operações de
inteiros de ALU e multiplicação, incluindo geração de flags. Gera os
endereços virtuais para leituras e escritas e o valor base de retorno,
quando requerido. Fornece dados formatados para escritas e encaminha
para frente dados e flags. Processa desvios e outras alterações do fluxo
de instruções e avalia os códigos condicionais das instruções.
Pipeline SIMD e de ponto flutuante:
Todas as instruções SIMD e de ponto flutuante
passam pelo pipeline de inteiros e são
processadas em um pipeline separado de 10
estágios.
A unidade conhecida como unidade NEON, trata as instruções SIMD
empacotadas e fornece dois tipos de suporte para ponto flutuante. Se
implementado, um coprocessador vetorial de ponto flutuante (VFP) efetua
uma operação de ponto flutuante de acordo com o padrão IEEE 754.
Se o coprocessador não estiver
presente, então pipelines separados
de multiplicação e adição
implementam as operações de
ponto flutuante.