このドキュメンテーションは、MicroPython の最新開発ブランチのためのものです。 リリースバージョンでは利用できない機能に言及することがあります。

特定のリリースのドキュメントをお探しの場合は、左側のドロップダウンメニューを使って、 望みのバージョンを選択します。

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

レジスタは同一でも構いません: vmul(S0, S0, S0) は S0 = S0*S0 を実行します

10.3. ARM コアと FPU のレジスタ間での移動

  • vmov(Sd, Rm) Sd = Rm

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