Arquitetura MIPS
MIPS, acrônimo para Microprocessor without interlocked pipeline stages, é uma arquitetura de microprocessadores RISC desenvolvida pela MIPS Computer Systems.
O MIPS é uma arquitetura baseada em registrador, ou seja, a CPU usa apenas registradores para realizar as suas operações aritméticas e lógicas. Existem outros tipos de processadores, tais como processadores baseados em pilha e processadores baseados em acumuladores. Processadores baseados no conjunto de instruções do MIPS estão em produção desde 1988. Ao longo do tempo foram feitas várias melhorias do conjunto de instruções. As diferentes revisões que foram introduzidas são MIPS I, MIPS II, MIPS III, MIPS IV e MIPS V. Cada revisão é um super conjunto de seus antecessores. Quando a MIPS Technologies saiu da Silicon Graphics em 1998, a definição da arquitetura foi alterada para definir um conjunto de instruções MIPS32 de 32 bits e um MIPS64 de 64 bits. Existem diversas extensões opcionais, incluindo MIPS-3D, que é um conjunto simples de instruções SIMD de ponto flutuante, dedicado a tarefas comuns em 3D; MDMX (MaDMaX) que é um conjunto de instruções SIMD inteiras mais extenso usando os registradores de ponto flutuante de 64 bits; MIPS16e que adicionou compressão ao fluxo de instruções de modo que os programas ocupassem menos espaço na memória; e MIPS MT, que adicionou capacidade multithreading ao MIPS.
Um grupo liderado por David Patterson e Carlo Séquin, em Berkeley, desenvolveu chips processadores; para dar um nome a este conceito eles utilizaram o termo RISC, atribuindo ao chip desenvolvido por eles nessa filosofia o nome RISC I, no ano de 1980. Esse chip foi quase imediatamente seguido pelo RISC II, projetado pelos mesmos dois pesquisadores. Pouco mais tarde, em 1981, John Hennessy, pesquisador de Stanford, universidade situada do outro lado da baía de San Francisco, projetou e fabricou um chip diferente, ao qual ele deu o nome de MIPS. O conceito básico era aumentar muito o desempenho com o uso de pipelines profundos para as instruções, uma técnica que, embora boa, viria a revelar-se difícil de levar a cabo. Geralmente, um pipeline divide a tarefa de executar uma instrução em diversas etapas, executando, de forma sobreposta, várias instruções ao mesmo tempo. Porém, os projetos tradicionais da época esperavam para terminar uma instrução inteira antes de seguir adiante, deixando assim o processador sem fazer nada por boa parte do tempo enquanto uma instrução era concluída.
O primeiro modelo comercial do processador MIPS, o R2000, foi anunciado em 1985. Adicionou instruções de multiplicação e divisão inteiras realizadas em múltiplos ciclos de relógio em uma unidade um tanto quanto independente dentro do chip. Novas instruções foram adicionadas para recuperar os resultados de volta dessa unidade para o banco de registradores. Ironicamente essas instruções de recuperação de resultados eram inter-travadas, o que fazia o nome MIPS ficar sem sentido. O R2000 podia ser iniciado usando tanto a ordenação de dados no formato big-endian como no little-endian. Ele tinha 32 registradores de 32 bits de uso geral, mas o nenhum registrador de código de condição, já que os projetistas consideravam o seu uso um gargalo em potencial, uma característica que compartilhou com processadores como o AMD 29000 e o Alpha da DEC. Ao contrário de outros registradores, o apontador de instruções (PC) não era diretamente acessível.
Entre os fabricantes que fizeram sistemas computacionais do tipo "estação de trabalho" que usam processadores MIPS estão: SGI, MIPS, Inc., Olivetti, Siemens-Nixdorf, Acer, Digital Equipment Corporation e NEC. Vários sistemas operacionais foram portados à arquitetura, tais como o IRIX da SGI, Windows NT da Microsoft, Linux, sistema V do DEB, do UNIX, SINIX, MIPS próprio RISC/os dos sistemas computatorizados, e outros. Entretanto, o uso dos MIPS como o processador principal de estações de trabalho do computador declinou, e a SGI anunciou que suas plantas industriais cessariam de desenvolver estações high-performance com a arquitetura dos MIPS em favor de usar processadores da Intel IA64-based (ver a “outra seção dos modelos e das plantas futuras” abaixo). Por outro lado, o uso dos microprocessadores dos MIPS em sistemas embarcados é provável remanescer comum, por causa das características baixas de execuções encaixadas dos MIPS, a disponibilidade larga do poder-consumo e do calor de ferramentas de desenvolvimento encaixadas para MIPS, assim como sua arquitetura inteligente.
Outros membros da família dos MIPS incluem o R6000, uma execução do ECL da arquitetura dos MIPS que foi produzida pela tecnologia integrada bipolar. O microprocessador R6000 introduziu o jogo de instrução dos MIPS II. Sua arquitetura de TLB e de esconderijo é diferente de todos membros restantes da família dos MIPS. O R6000 não entregou os benefícios prometidos do desempenho, e embora visse algum uso em máquinas dos dados de controle, desapareceu rapidamente do mercado mainstream. O RM7000 era uma versão do R5000 com um built-in 256 esconderijo do nível 2 do kB e um controlador para a cache opcional do nível três. Foi alvejado primeiramente em projetos encaixados, including processadores dos gráficos do SGI e várias soluções do trabalho em rede, primeiramente por Cisco. O nome R9000 foi usado nunca. Em uma vez o SGI tinha pretendido mover-se fora da plataforma dos MIPS para Intel Itanium, e o desenvolvimento era ter terminado com o R10000. O sempre-mais longo atrasa em introduzir o Itanium significou que a base instalada de máquinas MIPS-baseadas continuou a aumentar. Por 1999 estava desobstruído que o desenvolvimento tinha terminado demasiado logo, e os R14000 e os R16000 foram liberados em conseqüência. O SGI tinha sugerido R8000 em um estilo mais complexo FPU para umas R-séries mais atrasadas, e também em um processador duplo do núcleo, mas os problemas financeiros e o uso oficialmente suportado do SGI da emulation de QuickTransit funcionar binaries de IRIX em Altix eliminaram essencialmente o desenvolvimento da ferragem de IRIX/MIPS.
Em anos recentes da tecnologia usada nas várias gerações dos MIPS foi oferecido mais como IP-núcleos (edifício-obstrui) para projetos encaixados do processador. Os bits ambos os 32 e os núcleos básicos 64-bit são oferecidos, sabido como o 4K e o 5K respectivamente, e o projeto próprio pode ser licenciado como MIPS32 e MIPS64. Estes núcleos podem ser misturados com as unidades add-in tais como FPUs, sistemas de SIMD, a vária entrada - dispositivos de saída, etc. Os MIPS dos núcleos foram comercialmente bem sucedidos, agora sendo usado nos muitos consumidor e aplicações industriais. Os MIPS dos núcleos podem ser encontrados em uns roteadores mais novos de Cisco e de Linksys, em uns modem de cabo e em uns modem do ADSL, em uns smartcards, em uns motores da impressora de laser, em umas caixas do ajust-alto, em uns robôs, em computadores handheld, em Sony PlayStation 2 e em Sony PlayStation portátil. Em aplicações de cellphone/PDA, o núcleo dos MIPS foi incapaz de deslocar o encarregado, núcleo competindo do ARM.
Há dos “um simulador livremente disponível” SPIM chamado MIPS R2000/R3000 para diversos sistemas operacionais (UNIX, especificamente GNU/Linux; Mac OS X; MS Windows 95, 98, NT, 2000, XP; e DOS) qual é útil para o aprendizado de programação no conjunto de instruções MIPS e os conceitos gerais de programação RISC: http://www.cs.wisc.edu/~larus/spim.html Um emulador livre característica-mais rico dos MIPS está disponível do projeto de GXemul (sabido anteriormente como o projeto de mips64emul), que emula não somente os vários MIPS III e uns microprocessadores mais elevados (do R4000 com o R10000), mas emula também os sistemas computadorizados inteiros que usam os microprocessadores. Por exemplo, GXemul pode emular um DECstation com um processador central dos MIPS R4400 (e o carregador a Ultrix), e um O2 do SGI com um processador central dos MIPS R10000 (embora a habilidade de carregar Irix seja limitada), entre outros, assim como os vários framebuffers, os controladores de SCSI, e o gosto que compreendem aqueles sistemas. Mips das chamadas do sistema serviço Código da armadilha Entrada Saída Notas print_int $v0=1 inteiro de $a0= a imprimir imprime a0 à saída padrão print_string $v0=4 endereço de $a0= do primeiro caráter imprime uma corda de caráter à saída padrão sbrk $v0=9 número de $a0= dos bytes requeridos endereço de $v0= da memória alocada Aloca a memória do heap
As instruções são divididas em três tipos do formato: Formato de R, de I e de J. O formato de R consiste em três registradores e campo funcional, o formato I contém dois registradores e o valor imediato de 16 bits, e por último o formato J, no qual seu opcode tem seis bits seguido de um valor imediato de 26 bits.[nota 2][nota 3] Nome de registrador, número, uso, e convenções da chamada: registradores Nome Número Uso O Callee deve preservar? $zero $0 constante 0 N/A $at $1 ajuntador provisório não $v0-$v1 $2–$3 Valores para retornos da função e avaliação da expressão não $a0-$a3 $4–$7 argumentos da função não $t0-$t7 $8–$15 temporaries não $s0-$s7 $16–$23 temporaries conservados sim $t8-$t9 $24–$25 temporaries não $k0-$k1 $26–$27 reservado para a semente do ósmio não $gp $28 ponteiro global sim $sp $29 ponteiro de pilha sim $fp $30 ponteiro do frame sim $ra $31 endereço do retorno N/A Regista que é preservado através de uma chamada é os registradores que (pela convenção) não será mudado por uma chamada do sistema ou pela chamada do procedimento (função). Por exemplo, $s-registers deve ser conservado à pilha por um procedimento que necessite o usar, e $sp e $fp estão incrementados sempre por constantes, e decrecidos para trás depois que o procedimento é feito com elas (e a memória que apontam a). Pelo contraste, $ra é mudado automaticamente por toda a ligação de controle normal (umas que usa o jal), e $t-registers deve ser conservado pelo programa antes de qualquer chamada do procedimento (se o programa necessita os valores dentro deles após a chamada).
Estas são as instruções que têm a execução de ferragem direta. Isto é ao contrário das pseudo-instruções que são traduzidas em instruções reais múltiplas antes de ser montada. Os seguintes são os três formatos usados para o jogo de instrução do núcleo: Tipo -31 - formato (bitss) -0 R opcode (6) rs (5) rt (5) rd (5) shamt (5) funct (6) I opcode (6) rs (5) rt (5) imediato (16) NOTA: nas instruções ramificar e de salto, o offset pode ser substituído por um presente da etiqueta em algum lugar no código. As pseudo-instruções são traduzidos em instruções reais múltiplas (ver acima) antes de ser montada.
Estas instruções devem ser colocadas acima “nas seções reais das instruções” ou das “pseudo-instruções”.
Instruções lógicas comuns (bitwise)
addiu $1, $2.100 $1 = $2 + 100 (imediato não assinado) addu $1, $2, $3 $1 = $2 + $3 (não assinado) div $1, $2 HI = $ 1% $2; = $1 BAIXOS/$2 subu $1, $2, $3 $1 = $2 – $3 (não assinado)
Memória para registar instruções de transferência
lbu $1.100 ($2) carrega um byte não assinado lhu $1.100 ($2) carrega um halfword não assinado lwcz $1.100 ($2) carrega uma palavra ao coprocessor de “z” (“z” é o número do coprocessor) Anotar que não há nenhuma da “instrução imediata correspondente carga mais baixo”; isto pode ser feito usando o addi (adicionar imediato, vêem abaixo) ou o ori (ou imediato) com o registrador $0 (cujo valor é sempre zero). Por exemplo, o addi $1, $0, 100 e ori $1, $0, 100 carrega o valor decimal 100 no registrador $1.
Registar às instruções de transferência da memória
swcz $1.100 ($2) armazena uma palavra do coprocessor de “z” (“z” é o número do coprocessor).
Registro - a - instruções do registrador (movimento)
mfcz $1, $c1 move um valor no registrador $1 do coprocessor para o registrador principal $1 do processador (“z” é o número do coprocessor) mtcz $1, $c1 move um valor do registrador principal $1 do processador para o registrador $1 do coprocessor mov.d $fp1, $fp3 move um valor com precisão dobro do registrador $3 de FPU para o registrador $1 de f.p. mov.s $fp1, $fp3 move um valor com única precisão do registrador $3 de FPU para o registrador $1 de f.p. (valores com registradores adjacentes do uso dois FPU da precisão dobro) Uma operação com os immediates assinados difere de um com os não assinados que não joga uma exceção. Subtrair um imediato pode ser feito com adição da negação desse valor como o imediato.


