10. Instrucciones de punto flotante¶
Estas instrucciones permiten el uso del coprocesador de punto flotante ARM (en plataformas como las OpenMV Cam que están equipadas con uno). La FPU tiene 32 registros conocidos como s0-s31, cada uno de los cuales puede contener un número de punto flotante de precisión simple. Los datos pueden pasarse entre los registros de la FPU y los registros del núcleo ARM con la instrucción vmov.
Ten en cuenta que MicroPython no admite pasar números de punto flotante a funciones del ensamblador, ni puedes poner un número de punto flotante en r0 y esperar un resultado razonable. Hay dos formas de superar esto. La primera es usar arreglos, y la segunda es pasar o devolver enteros y convertirlos a y desde números de punto flotante en el código.
10.1. Convenciones del documento¶
Notación: Sd, Sm, Sn denotan registros de la FPU, Rd, Rm, Rn denotan registros del núcleo ARM. Estos últimos pueden ser cualquier registro del núcleo ARM, aunque es poco probable que los registros R13-R15 sean apropiados en este 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)
Los registros pueden ser idénticos: vmul(S0, S0, S0) ejecutará S0 = S0*S0
10.3. Mover entre registros del núcleo ARM y de la FPU¶
vmov(Sd, Rm)
Sd = Rmvmov(Rd, Sm)
Rd = Sm
La FPU tiene un registro conocido como FPSCR, similar al APSR del núcleo ARM, que almacena códigos de condición además de otros datos. Las siguientes instrucciones proporcionan acceso a este.
vmrs(APSR_nzcv, FPSCR)
Mueve los indicadores N, Z, C y V de punto flotante a los indicadores N, Z, C y V del APSR.
Esto se hace después de una instrucción como una comparación de la FPU para permitir que los códigos de condición sean probados por el código ensamblador. La siguiente es una forma más general de la instrucción.
vmrs(Rd, FPSCR)
Rd = FPSCR
10.4. Mover entre registro de la FPU y memoria¶
vldr(Sd, [Rn, offset])
Sd = [Rn + offset]vstr(Sd, [Rn, offset])
[Rn + offset] = Sd
Donde [Rn + offset] denota la dirección de memoria obtenida al sumar Rn al desplazamiento. Este se especifica en bytes. Dado que cada valor de punto flotante ocupa una palabra de 32 bits, al acceder a arreglos de números de punto flotante el desplazamiento debe ser siempre un múltiplo de cuatro bytes.
10.5. Comparación de datos¶
vcmp(Sd, Sm)
Compara los valores en Sd y Sm y establece los indicadores N, Z, C y V de la FPU. A esto normalmente le seguiría vmrs(APSR_nzcv, FPSCR) para permitir que los resultados sean probados.
10.6. Convertir entre entero y punto flotante¶
vcvt_f32_s32(Sd, Sm)
Sd = float(Sm)vcvt_s32_f32(Sd, Sm)
Sd = int(Sm)