10. Liukulukukäskyt¶
Nämä käskyt tukevat ARM-liukulukukoprosessorin käyttöä (alustoilla kuten OpenMV Cam, jotka on sellaisella varustettu). FPU:ssa on 32 rekisteriä nimeltä s0-s31, joista kukin voi sisältää yhden tarkkuuden liukuluvun. Dataa voidaan siirtää FPU-rekisterien ja ARM-ydinrekisterien välillä vmov-käskyllä.
Huomaa, että MicroPython ei tue liukulukujen välittämistä assembler-funktioille, etkä myöskään voi sijoittaa liukulukua rekisteriin r0 ja odottaa järkevää tulosta. Tämän voi kiertää kahdella tavalla. Ensimmäinen on käyttää taulukoita, ja toinen on välittää ja/tai palauttaa kokonaislukuja ja muuntaa liukuluvuiksi ja takaisin koodissa.
10.1. Dokumenttikäytännöt¶
Merkintätapa: Sd, Sm, Sn tarkoittavat FPU-rekistereitä, Rd, Rm, Rn tarkoittavat ARM-ydinrekistereitä. Jälkimmäiset voivat olla mitä tahansa ARM-ydinrekistereitä, vaikka rekisterit R13-R15 eivät todennäköisesti ole sopivia tässä yhteydessä.
10.2. Aritmetiikka¶
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)
Rekisterit voivat olla samoja: vmul(S0, S0, S0) suorittaa S0 = S0*S0
10.3. Siirto ARM-ydin- ja FPU-rekisterien välillä¶
vmov(Sd, Rm)
Sd = Rmvmov(Rd, Sm)
Rd = Sm
FPU:ssa on rekisteri nimeltä FPSCR, joka muistuttaa ARM-ytimen APSR:ää ja joka tallentaa ehtokoodit sekä muuta dataa. Seuraavat käskyt tarjoavat pääsyn siihen.
vmrs(APSR_nzcv, FPSCR)
Siirrä liukuluvun N-, Z-, C- ja V-liput APSR:n N-, Z-, C- ja V-lippuihin.
Tämä tehdään käskyn, kuten FPU-vertailun, jälkeen, jotta ehtokoodit voidaan testata assembler-koodilla. Seuraava on käskyn yleisempi muoto.
vmrs(Rd, FPSCR)
Rd = FPSCR
10.4. Siirto FPU-rekisterin ja muistin välillä¶
vldr(Sd, [Rn, offset])
Sd = [Rn + offset]vstr(Sd, [Rn, offset])
[Rn + offset] = Sd
Missä [Rn + offset] tarkoittaa muistiosoitetta, joka saadaan lisäämällä Rn:ään offset. Tämä määritetään tavuina. Koska kukin liukulukuarvo vie 32-bittisen sanan, liukulukutaulukoita käytettäessä offsetin on aina oltava neljän tavun monikerta.
10.5. Datan vertailu¶
vcmp(Sd, Sm)
Vertaa arvoja Sd ja Sm ja aseta FPU:n N-, Z-, C- ja V-liput. Tätä seuraisi normaalisti vmrs(APSR_nzcv, FPSCR), jotta tulokset voidaan testata.
10.6. Muunnos kokonaisluvun ja liukuluvun välillä¶
vcvt_f32_s32(Sd, Sm)
Sd = float(Sm)vcvt_s32_f32(Sd, Sm)
Sd = int(Sm)