1 #if !defined(_SOFT_FLOAT) && !defined(__NO_FPRS__)
2 .global feclearexcept
3 .type feclearexcept,@function
4 feclearexcept:
5 	andis. 3,3,0x3e00
6 	/* if (r3 & FE_INVALID) r3 |= all_invalid_flags */
7 	andis. 0,3,0x2000
8 	stwu 1,-16(1)
9 	beq- 0,1f
10 	oris 3,3,0x01f8
11 	ori  3,3,0x0700
12 1:
13 	/*
14 	 * note: fpscr contains various fpu status and control
15 	 * flags and we dont check if r3 may alter other flags
16 	 * than the exception related ones
17 	 * ufpscr &= ~r3
18 	 */
19 	mffs 0
20 	stfd 0,8(1)
21 	lwz 9,12(1)
22 	andc 9,9,3
23 	stw 9,12(1)
24 	lfd 0,8(1)
25 	mtfsf 255,0
26 
27 	/* return 0 */
28 	li 3,0
29 	addi 1,1,16
30 	blr
31 
32 .global feraiseexcept
33 .type feraiseexcept,@function
34 feraiseexcept:
35 	andis. 3,3,0x3e00
36 	/* if (r3 & FE_INVALID) r3 |= software_invalid_flag */
37 	andis. 0,3,0x2000
38 	stwu 1,-16(1)
39 	beq- 0,1f
40 	ori 3,3,0x0400
41 1:
42 	/* fpscr |= r3 */
43 	mffs 0
44 	stfd 0,8(1)
45 	lwz 9,12(1)
46 	or 9,9,3
47 	stw 9,12(1)
48 	lfd 0,8(1)
49 	mtfsf 255,0
50 
51 	/* return 0 */
52 	li 3,0
53 	addi 1,1,16
54 	blr
55 
56 .global fetestexcept
57 .type fetestexcept,@function
58 fetestexcept:
59 	andis. 3,3,0x3e00
60 	/* return r3 & fpscr */
61 	stwu 1,-16(1)
62 	mffs 0
63 	stfd 0,8(1)
64 	lwz 9,12(1)
65 	addi 1,1,16
66 	and 3,3,9
67 	blr
68 
69 .global fegetround
70 .type fegetround,@function
71 fegetround:
72 	/* return fpscr & 3 */
73 	stwu 1,-16(1)
74 	mffs 0
75 	stfd 0,8(1)
76 	lwz 3,12(1)
77 	addi 1,1,16
78 	clrlwi 3,3,30
79 	blr
80 
81 .global __fesetround
82 .hidden __fesetround
83 .type __fesetround,@function
84 __fesetround:
85 	/*
86 	 * note: invalid input is not checked, r3 < 4 must hold
87 	 * fpscr = (fpscr & -4U) | r3
88 	 */
89 	stwu 1,-16(1)
90 	mffs 0
91 	stfd 0,8(1)
92 	lwz 9,12(1)
93 	clrrwi 9,9,2
94 	or 9,9,3
95 	stw 9,12(1)
96 	lfd 0,8(1)
97 	mtfsf 255,0
98 
99 	/* return 0 */
100 	li 3,0
101 	addi 1,1,16
102 	blr
103 
104 .global fegetenv
105 .type fegetenv,@function
106 fegetenv:
107 	/* *r3 = fpscr */
108 	mffs 0
109 	stfd 0,0(3)
110 	/* return 0 */
111 	li 3,0
112 	blr
113 
114 .global fesetenv
115 .type fesetenv,@function
116 fesetenv:
117 	cmpwi 3, -1
118 	bne 1f
119 	mflr 4
120 	bl 2f
121 	.zero 8
122 2:	mflr 3
123 	mtlr 4
124 1:	/* fpscr = *r3 */
125 	lfd 0,0(3)
126 	mtfsf 255,0
127 	/* return 0 */
128 	li 3,0
129 	blr
130 #endif
131