__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