VFP関連のメモ

とりあえずVFPを使う場合の最小のスタートアップコード。 _stack_initは適当にリンカスクリプトにでも書く事にする。とりあえずSVC modeのスタックだけ初期化しておけばいいだろう。
OSの場合は、普通VFP命令を実行して、Undefined Instructionが起こってから例外ハンドラで有効にするんだろうけど。使わないのにいちいちVFPレジスタの退避と復帰をしてたら効率悪いもんな。CPUの初期化部分を大分省いてるけど、そんなのはデバッガがやってくれるから関係ない。


.arm
.text
.globl _start
_start:
/* Initialize Stack */
mov r0, #0x13+0xc0
msr cpsr, r0
ldr sp, stack_init
bic sp, sp, #3

/* Full access to VFP */
mrc p15, 0, r0, c1, c0, 2
orr r0, r0, #(0xf << 20)
mcr p15, 0, r0, c1, c0, 2

/* Enable VFP function */
mov r0, #0x40000000
fmxr fpexc, r0
b main

stack_init:
.long _stack_init