ユーザ用ツール

サイト用ツール


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
VFP NEON VFP SIMD FP
D32 VSP VDP TE DIV SQR SV RM FZ NaN NLS NI NSP NHP VHP FMA MISC MISC
ARM1176JZF-S vfpv2 -
Cortex-A8 vfpv3+NEON ◎2 ◎2 ◎2 - ◎1 ◎1 ◎1 ◎1 ◎1 ◎1 ◎1 ◎1 ◎1 - - -
Cortex-A9 vfpv3-D16 - - - - - - -
Cortex-A9 vfpv3+NEON - - -
Cortex-A5 vfpv4-D16 - - - - - - -
Cortex-A5 vfpv4+NEON - -
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-A53 AA64 NEON ◎2 ◎2 ◎2 - ◎1 ◎1 - ◎1 ◎1 ◎1 ◎1 ◎1 ◎1 ◎1 ◎2 ◎1 3 4
Cortex-A57 AA64 NEON ◎2 ◎2 ◎2 - ◎1 ◎1 - ◎1 ◎1 ◎1 ◎1 ◎1 ◎1 ◎1 ◎2 ◎1 3 4
  • D32 0- 3: D16 / D32
  • VSP 4- 7: VFP Single precision
  • VDP 8-11: VFP double precision
  • TE 12-15: Trap
  • DIV 16-19: VFP hw divide
  • SQR 20-23: VFP hw square root
  • SV 24-27: VFP short vector
  • RM 28-31: VFP all rounding mode supported
  • FZ 0- 3: VFP Full denormal arithmetic
  • Nan 4- 7: VFP Propagation of NaN values
  • NLS 8-11: NEON Load/store instructions
  • NI 12-15: NEON Integier instructions
  • NSP 16-19: NEON single precision operations
  • NHP 20-23: NEON half-precision operations
  • VHP 24-27: VFP half-precision operations
  • FMA 28-31: Fused Multiply Add

MVFR0/MVFR1 は特権命令からのアクセスのみ。

SV 未対応の場合 FPSCR Len に 0 以外を設定すると例外が発生する。互換性維持のためソフトウエアでエミュレーションする。 FPSCR はユーザーモードでもアクセスできる。

参考にしたページ

opengl/fpu_vfp.txt · 最終更新: 2014/04/15 10:13 by oga