10. 浮動小数点命令
これらの命令は、(FPU を搭載した Pyboard のようなプラットフォームで) ARM の浮動小数点コプロセッサを使うためのものです。FPU は s0-s31 という 32 個のレジスタを持ち、それぞれが単精度の浮動小数点数を保持できます。データは vmov 命令で FPU のレジスタと ARM コアのレジスタの間で受け渡しできます。
MicroPython はアセンブラ関数に float を渡すことをサポートしていないので、 r0 に float を入れてもまともな結果は得られません。これを回避する方法は2つあります。1つは配列を使う方法、もう1つは整数を渡したり返したりして、コード内で float との変換を行う方法です。
10.1. この文書の表記規則
表記: Sd, Sm, Sn は FPU のレジスタを、 Rd, Rm, Rn は ARM コアのレジスタを表します。後者は任意の ARM コアレジスタで構いませんが、この文脈でレジスタ R13-R15 が適切なことはまずありません。
10.2. 算術演算
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)
レジスタは同一でも構いません: vmul(S0, S0, S0) は S0 = S0*S0 を実行します
10.3. ARM コアと FPU のレジスタ間での移動
vmov(Sd, Rm)
Sd = Rmvmov(Rd, Sm)
Rd = Sm
FPU には、ARM コアの APSR に相当する FPSCR というレジスタがあり、条件コードとその他のデータを保持しています。次の命令でこれにアクセスできます。
vmrs(APSR_nzcv, FPSCR)
浮動小数点の N、Z、C、V フラグを APSR の N、Z、C、V フラグに移動します。
これは、アセンブラのコードで条件コードを調べられるようにするため、FPU の比較などの命令の後に実行します。以下は、この命令のより一般的な形式です。
vmrs(Rd, FPSCR)
Rd = FPSCR
10.4. FPU レジスタとメモリ間での移動
vldr(Sd, [Rn, offset])
Sd = [Rn + offset]vstr(Sd, [Rn, offset])
[Rn + offset] = Sd
[Rn + offset] は、Rn にオフセットを加えて得られるメモリアドレスを表します。これはバイト単位で指定します。各 float の値は 32 ビットのワードを占めるので、float の配列にアクセスするときは、オフセットは常に4バイトの倍数でなければなりません。
10.5. データの比較
vcmp(Sd, Sm)
Sd と Sm の値を比較し、FPU の N、Z、C、V フラグを設定します。通常はこの後に vmrs(APSR_nzcv, FPSCR) を続けて、結果を調べられるようにします。
10.6. 整数と浮動小数点数の間の変換
vcvt_f32_s32(Sd, Sm)
Sd = float(Sm)vcvt_s32_f32(Sd, Sm)
Sd = int(Sm)