10. Flyttalsinstruktioner

Dessa instruktioner stöder användningen av ARM:s flyttalscoprocessor (på plattformar som OpenMV Cams som är utrustade med en). FPU:n har 32 register kända som s0-s31 där vart och ett kan hålla ett flyttal med enkel precision. Data kan skickas mellan FPU-registren och ARM-kärnregistren med instruktionen vmov.

Observera att MicroPython inte stöder att skicka flyttal till assemblerfunktioner, och du kan inte heller placera ett flyttal i r0 och förvänta dig ett rimligt resultat. Det finns två sätt att övervinna detta. Det första är att använda arrayer, och det andra är att skicka och/eller returnera heltal och konvertera till och från flyttal i koden.

10.1. Dokumentkonventioner

Notation: Sd, Sm, Sn betecknar FPU-register, Rd, Rm, Rn betecknar ARM-kärnregister. De senare kan vara vilket ARM-kärnregister som helst även om registren R13-R15 sannolikt inte är lämpliga i detta sammanhang.

10.2. Aritmetik

  • vadd(Sd, Sn, Sm) Sd = Sn + Sm

  • vsub(Sd, Sn, Sm) Sd = Sn - Sm

  • vneg(Sd, Sm) Sd = -Sm

  • vmul(Sd, Sn, Sm) Sd = Sn * Sm

  • vdiv(Sd, Sn, Sm) Sd = Sn / Sm

  • vsqrt(Sd, Sm) Sd = sqrt(Sm)

Register kan vara identiska: vmul(S0, S0, S0) kommer att exekvera S0 = S0*S0

10.3. Flytta mellan ARM-kärnregister och FPU-register

  • vmov(Sd, Rm) Sd = Rm

  • vmov(Rd, Sm) Rd = Sm

FPU:n har ett register känt som FPSCR, liknande ARM-kärnans APSR, som lagrar villkorskoder plus andra data. Följande instruktioner ger åtkomst till detta.

  • vmrs(APSR_nzcv, FPSCR)

Flytta flyttalsflaggorna N, Z, C och V till APSR-flaggorna N, Z, C och V.

Detta görs efter en instruktion såsom en FPU-jämförelse för att möjliggöra att villkorskoderna kan testas av assemblerkoden. Följande är en mer generell form av instruktionen.

  • vmrs(Rd, FPSCR) Rd = FPSCR

10.4. Flytta mellan FPU-register och minne

  • vldr(Sd, [Rn, offset]) Sd = [Rn + offset]

  • vstr(Sd, [Rn, offset]) [Rn + offset] = Sd

Där [Rn + offset] betecknar minnesadressen som erhålls genom att addera Rn till offseten. Detta anges i byte. Eftersom varje flyttalsvärde upptar ett 32-bitarsord måste offseten alltid vara en multipel av fyra byte vid åtkomst till arrayer av flyttal.

10.5. Datajämförelse

  • vcmp(Sd, Sm)

Jämför värdena i Sd och Sm och sätt FPU-flaggorna N, Z, C och V. Detta skulle normalt följas av vmrs(APSR_nzcv, FPSCR) för att möjliggöra att resultaten kan testas.

10.6. Konvertera mellan heltal och flyttal

  • vcvt_f32_s32(Sd, Sm) Sd = float(Sm)

  • vcvt_s32_f32(Sd, Sm) Sd = int(Sm)