10. Instruções de vírgula flutuante¶
Estas instruções suportam o uso do coprocessador de vírgula flutuante ARM (em plataformas como as OpenMV Cams que estão equipadas com um). O FPU tem 32 registos conhecidos como s0-s31, cada um dos quais pode conter um float de precisão simples. Os dados podem ser transferidos entre os registos do FPU e os registos do núcleo ARM com a instrução vmov.
Note que o MicroPython não suporta a passagem de floats para funções assembler, nem pode colocar um float em r0 e esperar um resultado razoável. Há duas formas de contornar isto. A primeira é usar arrays, e a segunda é passar e/ou devolver inteiros e converter de e para floats no código.
10.1. Convenções do documento¶
Notação: Sd, Sm, Sn denotam registos FPU, Rd, Rm, Rn denotam registos do núcleo ARM. Estes últimos podem ser qualquer registo do núcleo ARM, embora os registos R13-R15 sejam provavelmente inadequados neste contexto.
10.2. Aritmética¶
vadd(Sd, Sn, Sm)
Sd = Sn + Smvsub(Sd, Sn, Sm)
Sd = Sn - Smvneg(Sd, Sm)
Sd = -Smvmul(Sd, Sn, Sm)
Sd = Sn * Smvdiv(Sd, Sn, Sm)
Sd = Sn / Smvsqrt(Sd, Sm)
Sd = sqrt(Sm)
Os registos podem ser idênticos: vmul(S0, S0, S0) executará S0 = S0*S0
10.3. Mover entre registos do núcleo ARM e do FPU¶
vmov(Sd, Rm)
Sd = Rmvmov(Rd, Sm)
Rd = Sm
O FPU tem um registo conhecido como FPSCR, semelhante ao APSR do núcleo ARM, que armazena códigos de condição e outros dados. As seguintes instruções fornecem acesso a este.
vmrs(APSR_nzcv, FPSCR)
Move os sinalizadores N, Z, C e V de vírgula flutuante para os sinalizadores N, Z, C e V do APSR.
Isto é feito após uma instrução como uma comparação de FPU para permitir que os códigos de condição sejam testados pelo código assembler. O seguinte é uma forma mais geral da instrução.
vmrs(Rd, FPSCR)
Rd = FPSCR
10.4. Mover entre registo FPU e memória¶
vldr(Sd, [Rn, offset])
Sd = [Rn + offset]vstr(Sd, [Rn, offset])
[Rn + offset] = Sd
Onde [Rn + offset] denota o endereço de memória obtido adicionando Rn ao offset. Isto é especificado em bytes. Como cada valor float ocupa uma palavra de 32 bits, ao aceder a arrays de floats o offset deve ser sempre um múltiplo de quatro bytes.
10.5. Comparação de dados¶
vcmp(Sd, Sm)
Compara os valores em Sd e Sm e define os sinalizadores N, Z, C e V do FPU. Normalmente seria seguido de vmrs(APSR_nzcv, FPSCR) para permitir que os resultados sejam testados.
10.6. Converter entre inteiro e float¶
vcvt_f32_s32(Sd, Sm)
Sd = float(Sm)vcvt_s32_f32(Sd, Sm)
Sd = int(Sm)