opengl:fpu_vfp
目次
ARM FPU (VFP/NEON) の種類
レジスタ数と機能の比較
ISA | VFP | Vector(*1) | 32bit s-reg | 64bit d-reg | 128bit q-reg | Half | MAD | FMA |
---|---|---|---|---|---|---|---|---|
ARMv6 | VFPv2 | ◎ | s0 - s31 (32) | d0 - d15 (16) | – | – | ◎ | – |
ARMv7A | VFPv3-D16 | △ | s0 - s31 (32) | d0 - d15 (16) | – | △ | ◎ | – |
ARMv7A | VFPv3 NEON | △ | s0 - s31 (32) | d0 - d31 (32) | q0 - q15 (16) | △ | ◎ | – |
ARMv7A | VFPv4-D16 | – | s0 - s31 (32) | d0 - d15 (16) | – | ◎ | ◎ | ◎ |
ARMv7A | VFPv4 NEON | – | s0 - s31 (32) | d0 - d31 (32) | q0 - q15 (16) | ◎ | ◎ | ◎ |
ARMv8A 32bit | AArch32 NEON | – | s0 - s31 (32) | d0 - d31 (32) | q0 - q15 (16) | ◎ | ◎ | ◎ |
ARMv8A 64bit | AArch64 NEON | – | s0 - s31 (32) | d0 - d31 (32) | v0 - v31 (32) | ◎ | – | ◎ |
- Vector(*1): VFP の Short Vector mode
- △ = CPU core の実装依存
ARM レジスタ早見表
AArch32 (ARMv7A)
VFP-D16 | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
32bit | s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7 | s8 | s9 | s10 | s11 | s12 | s13 | s14 | s15 | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 |
64bit | d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | d8 | d9 | d10 | d11 | d12 | d13 | d14 | d15 | ||||||||||||||||
128bit | q0 | q1 | q2 | q3 | q4 | q5 | q6 | q7 | ||||||||||||||||||||||||
NEON Extension | ||||||||||||||||||||||||||||||||
64bit | d16 | d17 | d18 | d19 | d20 | d21 | d22 | d23 | d24 | d25 | d26 | d27 | d28 | d29 | d30 | d31 | ||||||||||||||||
128bit | q8 | q9 | q10 | q11 | q12 | q13 | q14 | q15 |
- d16-d31, q8-q15 は 32bit s-register としてアクセスすることができない
- SIMD 整数演算では 8bit, 16bit 単位の演算も可能
AArch64 (ARMv8A)
AArch64 NEON | |||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Vector | v0 | v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 | ~ | v31 | ||||||||||||||||||||||||||||||
32bit | s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7 | s8 | s31 | |||||||||||||||||||||||||||||||
64bit | d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | d8 | d31 | |||||||||||||||||||||||||||||||
128bit | q0 | q1 | q2 | q3 | q4 | q5 | q6 | q7 | q8 | q31 |
- 8bit = Bx, 16bit = Hx アクセスも可能
- 命令によっては空欄部分も Vx.S[n] や Vx.D[n] 等の指定でアクセス可能。例えば v0 の場合 v0.s[0]~v0.s[3] or v0.d[0]~v0.d[1]
コンパイラオプションとの対応付け
gcc/clang の option 指定の違い (-mfpu option)
-mfpu= | VFP | DREG | NEON | half | 説明 |
---|---|---|---|---|---|
vfp | VFPv2 | 16 | - | - | ARM11 世代。vector mode (short vector) が特徴だったが、VFPv3 以降は段階的に廃止の方向へ。 |
vfpv3 | VFPv3 | 32 | - | - | 無指定は neon ありとみなし double d-register を 32 個まで持てる。ただしコンパイラは neon 命令を生成しない。 |
neon | VFPv3 | 32 | Y | - | vfpv3 と同じだが neon 命令を生成する。 |
vfpv3-d16 | VFPv3 | 16 | - | - | d16 が付いている場合は NEON 無し。double レジスタが半分の 16個しかない。vfpv2 相当。 |
vfpv3-fp16 | VFPv3 | 32 | - | Y | vfpv3 と同じだが half 型 (16bit float) 変換拡張命令に対応している。 |
vfpv3-d16-fp16 | VFPv3 | 16 | - | Y | d16 かつ half 対応 |
neon-fp16 | VFPv3 | 32 | Y | Y | vfpv3-fp16 と同じで neon 命令の生成も行う。 |
vfpv3xd | VFPv3 | – | - | - | single のみ。倍精度なし。 |
vfpv3xd-fp16 | VFPv3 | – | - | Y | single のみ。倍精度なし。half 対応 |
vfpv4 | VFPv4 | 32 | - | Y | VFPv4 は IEEE754 対応の FMA が追加されている。VFPv4 は標準で half (fp16) も搭載。 |
vfpv4-d16 | VFPv4 | 16 | - | Y | vfpv4 における double が半分のバージョン。NEON 無しのモデル。Cortex-A5 等にあり。 |
neon-vfpv4 | VFPv4 | 32 | Y | Y | vfpv4 に加えて NEON 命令を用いてコンパイルを行う。d32 対応。 |
fpv4-sp-d16 | VFPv4 | – | - | Y | single のみ 32個。Cortex-M4 専用? |
fp-armv8 | AA64 | 32 | - | Y | ARMv8A AArch64 (arm64) の FPU を用いる。neon vector 命令を使わない。スカラーのみ |
neon-fp-armv8 | AA64 | 32 | Y | Y | ARMv8A AArch64 (arm64) の FPU を用いる。neon vector 命令を使用する。 |
crypto-neon-fp-armv8 | AA64 | 32 | Y | Y | crypto 命令に対応。 |
例 -mfpu=vfpv3-d16
- gcc の ARMv7A NEON 最適化は -funsafe-math-optimizations が必要。IEEE754 を満たしていないため。
ARM VFP の機能ビット詳細
MVFR0 | MVFR1 | MVFR2 | AA64PFR0 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
VFP | NEON | VFP | SIMD | FP | VFP | SIMD | |||||||||||||||
D32 | VSP | VDP | TE | DIV | SQR | SV | RM | FZ | NaN | NLS | NI | NSP | NHP | VHP | FMA | MISC | MISC | FP | ASMD | ||
ARM1176JZF-S | vfpv2 | - | Y | Y | Y | Y | Y | Y | |||||||||||||
Cortex-A8 | vfpv3+NEON | 2 | 2 | 2 | - | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | - | ||||
Cortex-A9 | vfpv3-D16 | - | Y | Y | - | Y | Y | Y | Y | Y | Y | - | - | - | - | Y | - | ||||
Cortex-A9 | vfpv3+NEON | Y | Y | Y | - | Y | Y | - | Y | Y | Y | Y | Y | Y | Y | Y | - | ||||
Cortex-A5 | vfpv4-D16 | - | Y | Y | - | Y | Y | - | Y | Y | Y | - | - | - | - | Y | Y | ||||
Cortex-A5 | vfpv4+NEON | Y | Y | Y | - | Y | Y | - | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||
Cortex-A15 | vfpv4+NEON | 2 | 2 | 2 | - | 1 | 1 | - | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||||
Cortex-A7 | vfpv4+NEON | 2 | 2 | 2 | - | 1 | 1 | - | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||||
Cortex-A17 | vfpv4+NEON | 2 | 2 | 2 | - | 1 | 1 | - | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||||
Cortex-A53 | AA64 ASIMD | 2 | 2 | 2 | - | 1 | 1 | - | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 1 | 3 | 4 | 0 | 0 |
Cortex-A57 | AA64 ASIMD | 2 | 2 | 2 | - | 1 | 1 | - | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 1 | 3 | 4 | 0 | 0 |
Cortex-A72 | AA64 ASIMD | 2 | 2 | 2 | - | 1 | 1 | - | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 1 | 3 | 4 | 0 | 0 |
Cortex-A35 | AA64 ASIMD | 2 | 2 | 2 | - | 1 | 1 | - | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 1 | 3 | 4 | 0 | 0 |
Cortex-A73 | AA64 ASIMD | 2 | 2 | 2 | - | 1 | 1 | - | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 1 | 3 | 4 | F/0 | F/0 |
Cortex-A55 | AA64 ASIMD | 2 | 2 | 2 | - | 1 | 1 | - | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | 1 | 3 | 4 | F/1 | F/1 |
Cortex-A75 | AA64 ASIMD | 2 | 2 | 2 | - | 1 | 1 | - | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | 1 | 3 | 4 | 1 | 1 |
Cortex-A76 | AA64 ASIMD | 2 | 2 | 2 | - | 1 | 1 | - | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | 1 | 3 | 4 | 1 | 1 |
MVFR0 | Bit | ||
---|---|---|---|
D32 | SIMDReg | 0- 3 | D16 / D32 |
VSP | FPSP | 4- 7 | VFP Single precision |
VDP | FPDP | 8-11 | |
TE | FPTrap | 12-15 | Trap |
DIV | FPDivide | 16-19 | VFP hw divide |
SQR | FPSqrt | 20-23 | VFP hw square root |
SV | FPShVec | 24-27 | VFP short vector |
RM | FPRound | 28-31 | VFP all rounding mode supported |
MVFR1 | Bit | ||
FZ | FPFtZ | 0- 3 | VFP Full denormal arithmetic |
Nan | FPDNaN | 4- 7 | VFP Propagation of NaN values |
NLS | SIMDLS | 8-11 | NEON Load/store instructions |
NI | SIMDInt | 12-15 | NEON Integier instructions |
NSP | SIMDSP | 16-19 | NEON single precision operations |
NHP | SIMDHP | 20-23 | NEON half-precision operations |
VHP | FPHP | 24-27 | VFP half-precision operations |
FMA | SIMDFMAC | 28-31 | Fused Multiply Add |
MVFR2 | Bit | ||
MISC | SIMDMisc | 0-3 | |
MISC | FPMisc | 4-7 | |
ID_AA64PFR0 | Bit | ||
EL0 | EL0 | 0-3 | |
EL1 | EL1 | 4-7 | |
EL2 | EL2 | 8-11 | |
EL3 | EL3 | 12-15 | |
FP | FP | 16-19 | Floating-point, 15=not implemented, 0=implemented, 1=+half |
ASMD | AdvSIMD | 20-23 | Advanced SIMD 15=not implemented, 0=implemented, 1=+half |
GIC | GIC | 24-27 |
MVFR0/MVFR1 は特権命令からのアクセスのみ。
SV 未対応の場合 FPSCR Len に 0 以外を設定すると例外が発生する。互換性維持のためソフトウエアでエミュレーションする。 FPSCR はユーザーモードでもアクセスできる。
参考にしたページ
opengl/fpu_vfp.txt · 最終更新: 2019/01/03 15:54 by oga