はじめに
- この記事はひとりNEONアドベントカレンダー2020 24日目の記事です。
- クリスマスイブですね。皆様いかがお過ごしですか
- 昨日は転置命令を紹介した
- 今日は、ポエムを書く予定だったけれど、変換命令
cvtを紹介する
可能な変換早見表
| to \ from | s16 |
u16 |
f16 |
s32 |
u32 |
f32 |
s64 |
u64 |
f64 |
|---|---|---|---|---|---|---|---|---|---|
s16 |
- | - | ZAMNP |
- | - | - | - | - | - |
u16 |
- | - | ZAMNP |
- | - | - | - | - | - |
f16 |
C |
C |
- | - | - | C |
- | - | - |
s32 |
- | - | - | - | _ | ZAMNP |
- | - | - |
u32 |
- | - | - | - | - | ZAMNP |
- | - | - |
f32 |
- | - | C |
C |
C |
- | - | - | CX |
s64 |
- | - | - | - | - | - | - | - | ZAMNP |
u64 |
- | - | - | - | - | - | - | - | ZAMNP |
f64 |
- | - | - | - | - | C |
C |
C |
- |
-
Zはrounding-to-Zeroを表し、0に向かって丸め込まれる(いわゆる切り捨て) -
Mはrounding-to-Minus-infinityを表し、負の無限大方向へ丸め込まる -
Pはrounding-to-Positive-infinityを表し、正の無限大方向へ丸め込まれる(切り上げに近い) -
Nはrounding-to-Nearest-ties-to-evenを表し、最近接丸めを行う(四捨五入に近い) -
Aはrounding-to-neArest-ties-to-awayを意味し、最近接丸めを行う(四捨五入に近い) -
Xはrounding-to-nearest-oddを表し、最近接丸めを行う(四捨五入に近い) -
Cは丸めモードがFPCRレジスタで制御される。デフォルトは切り捨て(rounding-to-zero)
IEEE 754 で制定されている丸め方法
- IEEE 754で制定されている丸め方法は、以下の5種類が制定されている
rounding-to-zerorounding-to-minus-infinityrounding-to-positive-infinityrounding-to-nearest-ties-to-evenrounding-to-nearest-ties-to-away
- 最新版はIEEE 754-2019が発行されている
- このあたり、だめぽラボさんの浮動小数点数小話を参考にして読んだ。
- IEEE 754-2019に即して、とても厳密に、詳しく解説している良書である
NEONでの変換命令
- 先程の早見表を見れば分かる通り、整数型→実数型への変換は、
FPCRレジスタによって丸め方法が決まる- まあ、整数を実数にするのなら大きい数値を使わない限り、別段心配しなくても良い
-
int32x4_tをfloat32x4_tに変換する命令はvcvtq_f32_s32である -
reinterpretの記事でも触れたが、末尾に型が2つ付く場合は<戻り値の要素の型>_<引数の要素の型>で表される
- 一方で、実数型→整数型への変換では、
FPCRレジスタ関係なく、命令ごとに丸め方法が違う- なお、非常にややこしいのだが、Arm v7でサポートされているのは
rounding-to-zeroのみである
- なお、非常にややこしいのだが、Arm v7でサポートされているのは
- なお、
float64x2_tからfloat32x2_tへの変換だけ、なぜかrounding-to-nearest-oddという、IEEE754 非準拠の変換モードが使われる命令がある。
おわりに
- 浮動小数点から整数型、及びその逆変換を紹介した
- 明日は最終日の予定で、ポエムを書く予定です