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 + 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)
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 = Rmvmov(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)