メンドクセーのでなるべく後回しにしていたのですが、やる順番です。勝手命名、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。