__fpscr_values
__fpscr_values は gcc で生成するコードで使われる様なので、テストプログラムを書いてみた。
int main(void) { volatile float f0, f1, f2; volatile double d0, d1, d2; f0 = 2.0; f1 = 3.0; f2 = f0 * f1; d0 = 2.0; d1 = 3.0; d2 = d0 * d1; return 0; }
float の演算を行う前に __fpscr_values[0]、double の場合は __fpscr_values[1] を fpscr にロードするのね。
これのために __set_fpscr() があるのか。ふーん。
ってことは __fpscr_values には適当な初期値を設定しておくか、src/lib/csu あたりで __set_fpscr() を呼んで __fpscr_values を設定してあげないと駄目か。
.text .Ltext0: .align 1 .global main .type main, @function main: .LFB2: .file 1 "a.c" .loc 1 3 0 mov.l r14,@-r15 .LCFI0: add #-36,r15 .LCFI1: mov r15,r14 .LCFI2: .loc 1 7 0 ; f0 = 2.0; mov r14,r2 add #32,r2 mova .L3,r0 fmov.s @r0+,fr1 fmov.s fr1,@r2 .LVL0: .loc 1 8 0 ; f1 = 3.0; mov r14,r1 add #28,r1 fmov.s @r0+,fr1 fmov.s fr1,@r1 .LVL1: .loc 1 9 0 ; f2 = f0 * f1; fmov.s @r2,fr1 fmov.s @r1,fr2 mov.l .L4,r1 lds.l @r1+,fpscr ; r1 = &__fpscr_values[0] fmul fr2,fr1 mov r14,r1 add #24,r1 fmov.s fr1,@r1 .LVL2: .loc 1 11 0 ; d0 = 2.0; add #-16,r2 mova .L5,r0 fmov.s @r0+,fr3 fmov.s @r0+,fr2 add #4,r2 fmov.s fr2,@r2 .LVL3: fmov.s fr3,@-r2 .loc 1 12 0 ; d1 = 3.0; add #-16,r1 fmov.s @r0+,fr3 fmov.s @r0+,fr2 add #4,r1 fmov.s fr2,@r1 .LVL4: fmov.s fr3,@-r1 .loc 1 13 0 ; d2 = d0 * d1; fmov.s @r2+,fr3 fmov.s @r2,fr2 fmov.s @r1+,fr5 fmov.s @r1,fr4 mov.l .L6,r1 lds.l @r1+,fpscr ; r1 = &__fpscr_values[1] fmul dr4,dr2 mov r14,r1 add #4,r1 fmov.s fr2,@r1 .LVL5: fmov.s fr3,@-r1 .loc 1 16 0 ; return 0; mov #0,r0 add #36,r14 mov r14,r15 mov.l @r15+,r14 rts nop .L7: .align 2 .L3: .long 1073741824 .long 1077936128 .L4: .long __fpscr_values .L5: .long 0 .long 1073741824 .long 0 .long 1074266112 .L6: .long __fpscr_values+4 .LFE2: .size main, .-main