Ponto Flutuante no MIPS

instrução MIPS LW e SW IF Simples no MIPS

Oi pessoal! No último artigo da série MIPS eu mostrei como compilar o comando FOR e, portanto, dessa forma, todos os comandos de controle foram tratados nesta série. Em outros artigos, também expliquei as instruções aritméticas, lógicas e relacionais, assim como também os procedimentos. De maneira geral, vimos praticamente tudo a respeito de MIPS. Como existem muitas instruções, eu tratei das mais importantes aqui nesta série, mas se você consultar a documentação oficial do MIPS, você encontrará muitas outras, que normalmente são variações das principais. Falta falar sobre Ponto Flutuante, que será o tema deste artigo. Vamos nessa então?

 

Ponto Flutuante

 

O coprocessador 1 do MIPS é usado para Ponto Flutuante (P.F.). Ele lida com precisão simples, o que é equivalente a 32 bits, e precisão dupla, 64 bits. Se observarmos no MARS, veremos uma parte dedicada somente a este coprocessador, conforme mostra a Figura abaixo.

Mars Ponto Flutuante
Mars Ponto Flutuante

Os registradores são numerados de $f0 até $f31. Note também que somente os registradores pares possuem suporte à precisão dupla. Além disto, existem oito flags de código de condição (cc) que são testados, ou alterados, por instruções de movimentação condicionais, desvio e comparação. As instruções lwc1, swc1, mtc1 e mtc1 fazem a movimentação dos valores de precisão simples nesses registradores, enquanto as instruções l.s, l.d, s.s e s.d, fazem a movimentação de precisão dupla. A tabela a seguir resume as instruções de movimentação rapidamente:

 

Instrução

opcode

rs

rt

rd

shamt

funct

 

6 bits

5 bits

5 bits

5 bits

5 bits

6 bits

mfhi rd

0

0

rd

0

0x10

mflo rd

0

0

rd

0

0x12

mthi rs

0

rs

0

0x11

mtlo rs

0

rs

0

0x13

mfc0 rt, rd

0x10

0

rt

rd

0

mfcl rt, fs

0x11

0

rt

fs

0

mtc0 rd, rt

0x10

4

rt

rd

0

mtc1, rd, fs

0x11

4

rt

fs

0

movn rd, rs, rt

0

rs

rt

rd

0xb

movz rd, rs, rt

0

rs

rt

rd

0xa

movf rd, rs, cc

0

rs

cc

0

rd

0

1

movt rd, rs, cc

0

rs

cc

1

rd

0

1

 

6 bits

5 bits

3 bits

2 bits

5 bits

5 bits

6 bits

 

Os bits de 21 a 26 das instruções de ponto flutuante usam o código 0 quando for precisão simples, e 1 para precisão dupla. Vamos agora ver vários exemplos de instruções de ponto flutuante.

 

Instruções de P.F.

 

Vamos conhecer a instrução absoluto. Veja o código Assembly MIPS abaixo:

 

Diferente do que vínhamos fazendo, que era usar a instrução li para carregar números imediatos, ou la para endereços de memória, aqui devemos usar lwc1 e lwc2. Além disso, como é um número real, de precisão simples ou dupla, devemos definir o tipo do dado numérico, da mesma forma que faríamos em linguagens de programação de médio e alto nível. Não é tão difícil assim não é mesmo? Basta seguir o mesmo raciocínio lógico na programação que você conhece.

 

Então, primeiro, declaramos o tipo de número, usando um label. Neste exemplo, numero1 é o label que leva ao valor, do tipo float, -10.5. Somente depois disso, conseguir carregar o número para um registrador. No exemplo que estamos trabalhando, eu carreguei o numero1 para o registrador $f0, que é um registrador que lida com precisão dupla. Feito isto, aí sim podemos usar o valor em alguma instrução. Ao executar esse código Assembly MIPS no MARS você verá que ele funcionará corretamente.

 

A instrução abs.d encontra o valor absoluto de ponto flutuante double, enquanto a instrução abs.s, encontra o valor absoluto de ponto flutuante simples. Basicamente toda as instruções de ponto flutuante tem uma versão idêntica para precisão simples, denotada por s, e precisão dupla, denotada por d. O exemplo a seguir mostra a soma entre dois valores de ponto flutuante, usando tanto precisão simples, quanto dupla.

 

 

Note que para carregar e calcular os números em precisão dupla, eu usei os registradores pares, e para a precisão simples, usei os registradores ímpares. Também usei a palavra chave double para indicar números de precisão dupla. O exemplo a seguir mostra como usar a instrução de comparação igual.

 

 

A seguir, apresento vários com todas as instruções de ponto flutuante, tanto para precisão simples, quanto para precisão dupla. Se você quiser ver o resultado no console, você deve usar as chamadas do sistema para isto, conforme mostrei no artigo sobre o FOR. Isto pode dar um pouco mais de trabalho, mas é interessante fazer para treinar seu conhecimento.

 

 

Código de conversão entre precisão simples e dupla:

 

Código de conversão de números inteiros para precisão simples e dupla:

 

Convertendo para número inteiro

 

Divisão:

 

Multiplicação:

 

Subtração:

 

Raíz Quadrada:

 

Truncamento:

 

Conclusão

 

Para o artigo não ficar muito longo e cansativo, termino o assunto aqui. No próximo artigo veremos como trabalhar com as instruções de load/store e também arrays.

Outros artigos da série

<< Compilando o comando FOR no MIPS
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Elaine Cecília Gatto
Bacharel em Engenharia de Computação. Mestre em Ciência da Computação. Doutoranda em Ciência da Computação. Co-fundarora e Líder das #GarotasCPBr. Pesquisadora Convidada no Grupo de Pesquisa: "Artes em Tecnologias Emergentes" do Programa de Pós Graduação em Design na UNESP Campus Bauru. Cantora, Docente no Magistério Superior, Geek, Nerd, Otaku e Gamer. Apaixonada por Michael Jackson, Macross, Rocky Balboa, Séries, Filmes, Cervejas e Vinhos. Mais informações sobre mim você encontra em: http://lattes.cnpq.br/8559022477811603.

Deixe um comentário

avatar
 
  Notificações  
Notificar