10. Instrukcije s pomičnim zarezom

Ove instrukcije podržavaju korištenje ARM koprocesora za pomični zarez (na platformama poput OpenMV Cam koje su njime opremljene). FPU ima 32 registra poznata kao s0-s31 od kojih svaki može držati float jednostruke preciznosti. Podaci se mogu prenositi između FPU registara i ARM jezgrenih registara pomoću instrukcije vmov.

Imajte na umu da MicroPython ne podržava prosljeđivanje floatova asemblerskim funkcijama, niti možete staviti float u r0 i očekivati razuman rezultat. Postoje dva načina da se to prevlada. Prvi je korištenje polja, a drugi je prosljeđivanje i/ili vraćanje cijelih brojeva te pretvaranje u i iz floatova u kodu.

10.1. Konvencije dokumenta

Notacija: Sd, Sm, Sn označavaju FPU registre, Rd, Rm, Rn označavaju ARM jezgrene registre. Potonji mogu biti bilo koji ARM jezgreni registar iako registri R13-R15 vjerojatno nisu prikladni u ovom kontekstu.

10.2. Aritmetika

  • 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)

Registri mogu biti identični: vmul(S0, S0, S0) će izvršiti S0 = S0*S0

10.3. Premještanje između ARM jezgrenih i FPU registara

  • vmov(Sd, Rm) Sd = Rm

  • vmov(Rd, Sm) Rd = Sm

FPU ima registar poznat kao FPSCR, sličan APSR-u ARM jezgre, koji pohranjuje uvjetne kodove i druge podatke. Sljedeće instrukcije omogućuju pristup ovome.

  • vmrs(APSR_nzcv, FPSCR)

Premjesti zastavice N, Z, C i V s pomičnim zarezom na zastavice N, Z, C i V registra APSR.

Ovo se radi nakon instrukcije poput FPU usporedbe kako bi se omogućilo ispitivanje uvjetnih kodova asemblerskim kodom. Sljedeće je općenitiji oblik instrukcije.

  • vmrs(Rd, FPSCR) Rd = FPSCR

10.4. Premještanje između FPU registra i memorije

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

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

Gdje [Rn + offset] označava memorijsku adresu dobivenu dodavanjem Rn na offset. Ovo je navedeno u bajtovima. Budući da svaka float vrijednost zauzima 32-bitnu riječ, pri pristupu poljima floatova offset uvijek mora biti višekratnik četiri bajta.

10.5. Usporedba podataka

  • vcmp(Sd, Sm)

Usporedi vrijednosti u Sd i Sm te postavi FPU zastavice N, Z, C i V. Nakon ovoga obično slijedi vmrs(APSR_nzcv, FPSCR) kako bi se omogućilo ispitivanje rezultata.

10.6. Pretvorba između cijelog broja i floata

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

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