10. Instrucțiuni în virgulă mobilă¶
Aceste instrucțiuni susțin utilizarea coprocesorului ARM în virgulă mobilă (pe platforme precum camerele OpenMV Cam care sunt echipate cu unul). FPU-ul are 32 de registre cunoscute ca s0-s31, fiecare dintre acestea putând conține un număr în virgulă mobilă cu precizie simplă. Datele pot fi transferate între registrele FPU și registrele de bază ARM cu instrucțiunea vmov.
Rețineți că MicroPython nu acceptă transmiterea de numere în virgulă mobilă către funcțiile de asamblare și nici nu puteți plasa un număr în virgulă mobilă în r0 și să vă așteptați la un rezultat rezonabil. Există două moduri de a depăși acest lucru. Primul este să folosiți tablouri, iar al doilea este să transmiteți și/sau să returnați numere întregi și să le convertiți în și din numere în virgulă mobilă în cod.
10.1. Convenții ale documentului¶
Notație: Sd, Sm, Sn denotă registrele FPU, Rd, Rm, Rn denotă registrele de bază ARM. Acestea din urmă pot fi orice registru de bază ARM, deși registrele R13-R15 este puțin probabil să fie potrivite în acest context.
10.2. Aritmetică¶
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)
Registrele pot fi identice: vmul(S0, S0, S0) va executa S0 = S0*S0
10.3. Transfer între registrele de bază ARM și registrele FPU¶
vmov(Sd, Rm)
Sd = Rmvmov(Rd, Sm)
Rd = Sm
FPU-ul are un registru cunoscut ca FPSCR, similar cu APSR al nucleului ARM, care stochează coduri de condiție plus alte date. Următoarele instrucțiuni oferă acces la acesta.
vmrs(APSR_nzcv, FPSCR)
Transferă indicatorii N, Z, C și V din virgulă mobilă către indicatorii N, Z, C și V din APSR.
Acest lucru se face după o instrucțiune precum o comparație FPU pentru a permite testarea codurilor de condiție de către codul de asamblare. Următoarea este o formă mai generală a instrucțiunii.
vmrs(Rd, FPSCR)
Rd = FPSCR
10.4. Transfer între registrul FPU și memorie¶
vldr(Sd, [Rn, offset])
Sd = [Rn + offset]vstr(Sd, [Rn, offset])
[Rn + offset] = Sd
Unde [Rn + offset] denotă adresa de memorie obținută prin adunarea lui Rn la offset. Acesta este specificat în octeți. Deoarece fiecare valoare în virgulă mobilă ocupă un cuvânt de 32 de biți, la accesarea tablourilor de numere în virgulă mobilă, offset-ul trebuie să fie întotdeauna un multiplu de patru octeți.
10.5. Comparare de date¶
vcmp(Sd, Sm)
Compară valorile din Sd și Sm și setează indicatorii N, Z, C și V ai FPU. Acest lucru ar fi urmat în mod normal de vmrs(APSR_nzcv, FPSCR) pentru a permite testarea rezultatelor.
10.6. Conversie între întreg și virgulă mobilă¶
vcvt_f32_s32(Sd, Sm)
Sd = float(Sm)vcvt_s32_f32(Sd, Sm)
Sd = int(Sm)