10. Instrukce s pohyblivou řádovou čárkou

Tyto instrukce podporují použití koprocesoru ARM pro pohyblivou řádovou čárku (na platformách, jako jsou OpenMV Cam, které jím jsou vybaveny). FPU má 32 registrů známých jako s0-s31, z nichž každý může pojmout float jednoduché přesnosti. Data lze přenášet mezi registry FPU a registry jádra ARM pomocí instrukce vmov.

Vezměte na vědomí, že MicroPython nepodporuje předávání floatů funkcím assembleru, ani nemůžete vložit float do r0 a očekávat rozumný výsledek. Existují dva způsoby, jak to obejít. Prvním je použití polí a druhým je předávání a/nebo vracení celých čísel a převod na floaty a z nich v kódu.

10.1. Konvence dokumentu

Notace: Sd, Sm, Sn označují registry FPU, Rd, Rm, Rn označují registry jádra ARM. Posledně jmenované mohou být jakékoli registry jádra ARM, ačkoli registry R13-R15 jsou v tomto kontextu nepravděpodobně vhodné.

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)

Registry mohou být shodné: vmul(S0, S0, S0) provede S0 = S0*S0

10.3. Přesun mezi registry jádra ARM a FPU

  • vmov(Sd, Rm) Sd = Rm

  • vmov(Rd, Sm) Rd = Sm

FPU má registr známý jako FPSCR, podobný registru APSR jádra ARM, který ukládá podmínkové kódy a další data. Následující instrukce poskytují přístup k němu.

  • vmrs(APSR_nzcv, FPSCR)

Přesune příznaky N, Z, C a V pohyblivé řádové čárky do příznaků N, Z, C a V registru APSR.

Toto se provádí po instrukci, jako je porovnání FPU, aby bylo možné testovat podmínkové kódy z kódu assembleru. Následující je obecnější forma této instrukce.

  • vmrs(Rd, FPSCR) Rd = FPSCR

10.4. Přesun mezi registrem FPU a pamětí

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

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

Kde [Rn + offset] označuje paměťovou adresu získanou přičtením Rn k offsetu. Ten je zadán v bajtech. Protože každá hodnota float zabírá 32bitové slovo, při přístupu k polím floatů musí být offset vždy násobkem čtyř bajtů.

10.5. Porovnání dat

  • vcmp(Sd, Sm)

Porovná hodnoty v Sd a Sm a nastaví příznaky N, Z, C a V FPU. Po tomto by normálně následovalo vmrs(APSR_nzcv, FPSCR), aby bylo možné výsledky testovat.

10.6. Převod mezi celým číslem a floatem

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

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