10. 浮動小数点命令

これらの命令は、ARM 浮動小数点コプロセッサ(OpenMV Cam のようにこれを搭載したプラットフォーム)の使用をサポートします。FPU には s0-s31 として知られる 32 個のレジスタがあり、それぞれが単精度浮動小数点数を保持できます。データは vmov 命令によって FPU レジスタと ARM コアレジスタの間で受け渡しできます。

MicroPython はアセンブラ関数への浮動小数点数の受け渡しをサポートしておらず、r0 に浮動小数点数を入れて妥当な結果を期待することもできない点に注意してください。これを克服する方法は 2 つあります。1 つ目は配列を使用すること、2 つ目は整数を受け渡し(および/または返却)し、コード内で浮動小数点数との間で変換することです。

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 にオフセットを加えて得られるメモリアドレスを表します。これはバイト単位で指定します。各浮動小数点値は 32 ビットワードを占めるため、浮動小数点数の配列にアクセスする際、オフセットは常に 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)