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 + 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)
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 = Rmvmov(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)