ぐだぐだ低レベルプログラミング(153)ARM64(AArach64)SIMD 整数変換系

Joseph Halfmoon

メンドクセーのでなるべく後回しにしていたのですが、やる順番です。勝手命名、SIMD「整数変換系」です。浮動小数の数値を「整数」に変換したりその逆をするもの。前回が浮動小数の数値のフォーマット変換(単精度から倍精度とか)であったのでここでやっとかないとイケない感じ。毎度のことですが叫ばざるを得ません。命令多過ぎA64と。

※「ぐだぐだ低レベルプログラミング」投稿順indexはこちら

※実機動作確認には以下を使用しております。

    • Raspberry Pi 4 model B、Cortex-A72コア(ARMv8-A)
    • Raspberry Pi OS (64bit) bullseye
    • gcc (Debian 10.2.1-6) 10.2.1 20210110

ARMv8もいろいろレベルがあり、Arm Cortex-A72はARMv8の中でもベーシックな(命令数の少ない)ARMv8p0です。

※A64の最新のマニュアルは以下でダウンロード可能です。

Arm Architecture Reference Manual for A-profile architecture

今回は表をまとめるだけで疲れてしまったので、実習は無っす。手抜き。

「整数値」への変換

浮動小数から整数値への変換といっても大きく2つあります。変換後が

    • フォーマットは浮動小数だけれども整数値
    • フォーマットも整数

前者は、変換前も変換後も浮動小数のフォーマットなのだけれども、小数点以下を「丸め」てしまってピタリ整数値になるように値を調整しただけのもの。

それに対して後者は、変換前が浮動小数フォーマットの数値だったものを変換後は整数フォーマットの数値に変換してしまったものであります。

画面に印字するとどちらも整数に見えるかもしれないけれども、中身は大違いだと。

整数フォーマット

浮動小数から整数、あるいは整数から浮動小数への変換の場合、整数側は符号付か符号無かで命令が異なります。符号付きと符号無で表現可能なレンジが異なるのでこれは指定しないと変換できんと。

要素のビット幅

唯一ともいえる救いが、この「整数変換系」では前後で要素のビット幅に変更がない、という点です。単精度なら32ビット幅、整数フォーマットにしても32ビット幅のまま。なお、ARMv8p0では半精度浮動小数(16ビット)はサポートされていない(ARMv8p2以降でサポート)ので、練習対象は倍精度(64ビット)、単精度(32ビット)です。

「丸め」モード

小数点以下を処理して整数にする場合には「丸め」を考えないとならないです。FPCRレジスタの中にある丸めを制御するビットに従うというのが基本じゃないかと思います(第106回にFPCRのビット配置の図あり。また丸めモードについて言及の第108回もあり。)しかし、命令多過ぎA64です。FPCRの中のモードビットなどに影響されず所定の丸めモードを適用できる命令もそろえてます。以下の表で current はPFCRのモードビットの「現在設定」に従うものであります。

SIMD「整数変換系」の一覧

さて一覧が以下に。

Mnemonic Source Destination Rounding mode
FRINT32X FP FP(32bit幅整数値) current
FRINT32Z FP FP(32bit幅整数値) toward zero
FRINT64X FP FP(64bit幅整数値) current
FRINT64Z FP FP(64bit幅整数値) toward zero
FRINTA FP FP(整数値) nearest with ties to away
FRINTI FP FP(整数値) current
FRINTM FP FP(整数値) toward minus infinity
FRINTN FP FP(整数値) nearest with ties to even
FRINTP FP FP(整数値) toward positive infinity
FRINTX FP FP(整数値) exact, using current rounding mode
FRINTZ FP FP(整数値) toward zero
FCVTAS FP 符号付整数 nearest with ties to away
FCVTAU FP 符号無整数 nearest with ties to away
FCVTMS FP 符号付整数 toward minus infinity
FCVTMU FP 符号無整数 toward minus infinity
FCVTNS FP 符号付整数 nearest with ties to even
FCVTNU FP 符号無整数 nearest with ties to even
FCVTPS FP 符号付整数 toward positive infinity
FCVTPU FP 符号無整数 toward positive infinity
FCVTZS FP 符号付整数 toward zero
FCVTZU FP 符号無整数 toward zero
SCVTF 符号付整数 FP current
UCVTF 符号無整数 FP current

繰り返します。命令多過ぎA64。

ぐだぐだ低レベルプログラミング(152)ARM64(AArach64)SIMD FCVTL へ戻る

ぐだぐだ低レベルプログラミング(154)ARM64(AArach64)SIMD from整数 へ進む