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