10. Lebegőpontos utasítások

Ezek az utasítások támogatják az ARM lebegőpontos társprocesszor használatát (olyan platformokon, mint az OpenMV Cam, amelyek fel vannak szerelve eggyel). Az FPU 32 regiszterrel rendelkezik, amelyeket s0-s31 néven ismerünk, és mindegyik egy egyszeres pontosságú lebegőpontos értéket tárolhat. Az adatok az FPU-regiszterek és az ARM-magregiszterek között a vmov utasítással adhatók át.

Vedd figyelembe, hogy a MicroPython nem támogatja lebegőpontos értékek átadását assembler-függvényeknek, és nem teheted lebegőpontos értéket az r0 regiszterbe sem ésszerű eredményre számítva. Ennek leküzdésére két mód van. Az első a tömbök használata, a második pedig egészek átadása és/vagy visszaadása, majd a kódban lebegőpontossá és vissza való konvertálásuk.

10.1. Dokumentumkonvenciók

Jelölés: Sd, Sm, Sn az FPU-regisztereket jelöli, Rd, Rm, Rn az ARM-magregisztereket. Az utóbbiak bármely ARM-magregiszter lehetnek, bár az R13-R15 regiszterek valószínűleg nem megfelelőek ebben a kontextusban.

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)

A regiszterek lehetnek azonosak: a vmul(S0, S0, S0) végrehajtja az S0 = S0*S0 műveletet

10.3. Mozgatás az ARM-mag és az FPU-regiszterek között

  • vmov(Sd, Rm) Sd = Rm

  • vmov(Rd, Sm) Rd = Sm

Az FPU rendelkezik egy FPSCR néven ismert regiszterrel, amely hasonló az ARM-mag APSR-jéhez, és amely a feltételkódokat valamint egyéb adatokat tárol. Az alábbi utasítások hozzáférést biztosítanak ehhez.

  • vmrs(APSR_nzcv, FPSCR)

Mozgasd a lebegőpontos N, Z, C és V jelzőket az APSR N, Z, C és V jelzőibe.

Ezt egy utasítás, például egy FPU-összehasonlítás után végzik, hogy a feltételkódok tesztelhetők legyenek az assembler-kód által. Az alábbi az utasítás egy általánosabb formája.

  • vmrs(Rd, FPSCR) Rd = FPSCR

10.4. Mozgatás az FPU-regiszter és a memória között

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

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

Ahol a [Rn + offset] az Rn-hez az offset hozzáadásával kapott memóriacímet jelöli. Ez bájtban van megadva. Mivel minden lebegőpontos érték egy 32 bites szót foglal el, lebegőpontos tömbök elérésekor az offsetnek mindig négy bájt többszörösének kell lennie.

10.5. Adatok összehasonlítása

  • vcmp(Sd, Sm)

Hasonlítsd össze az Sd és Sm értékeit, és állítsd be az FPU N, Z, C és V jelzőit. Ezt normál esetben egy vmrs(APSR_nzcv, FPSCR) utasítás követi, hogy az eredmények tesztelhetők legyenek.

10.6. Konvertálás egész és lebegőpontos között

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

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