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

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 = Rm

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