xref: /third_party/musl/src/fenv/powerpc/fenv.S (revision 570af302)
1570af302Sopenharmony_ci#if !defined(_SOFT_FLOAT) && !defined(__NO_FPRS__)
2570af302Sopenharmony_ci.global feclearexcept
3570af302Sopenharmony_ci.type feclearexcept,@function
4570af302Sopenharmony_cifeclearexcept:
5570af302Sopenharmony_ci	andis. 3,3,0x3e00
6570af302Sopenharmony_ci	/* if (r3 & FE_INVALID) r3 |= all_invalid_flags */
7570af302Sopenharmony_ci	andis. 0,3,0x2000
8570af302Sopenharmony_ci	stwu 1,-16(1)
9570af302Sopenharmony_ci	beq- 0,1f
10570af302Sopenharmony_ci	oris 3,3,0x01f8
11570af302Sopenharmony_ci	ori  3,3,0x0700
12570af302Sopenharmony_ci1:
13570af302Sopenharmony_ci	/*
14570af302Sopenharmony_ci	 * note: fpscr contains various fpu status and control
15570af302Sopenharmony_ci	 * flags and we dont check if r3 may alter other flags
16570af302Sopenharmony_ci	 * than the exception related ones
17570af302Sopenharmony_ci	 * ufpscr &= ~r3
18570af302Sopenharmony_ci	 */
19570af302Sopenharmony_ci	mffs 0
20570af302Sopenharmony_ci	stfd 0,8(1)
21570af302Sopenharmony_ci	lwz 9,12(1)
22570af302Sopenharmony_ci	andc 9,9,3
23570af302Sopenharmony_ci	stw 9,12(1)
24570af302Sopenharmony_ci	lfd 0,8(1)
25570af302Sopenharmony_ci	mtfsf 255,0
26570af302Sopenharmony_ci
27570af302Sopenharmony_ci	/* return 0 */
28570af302Sopenharmony_ci	li 3,0
29570af302Sopenharmony_ci	addi 1,1,16
30570af302Sopenharmony_ci	blr
31570af302Sopenharmony_ci
32570af302Sopenharmony_ci.global feraiseexcept
33570af302Sopenharmony_ci.type feraiseexcept,@function
34570af302Sopenharmony_ciferaiseexcept:
35570af302Sopenharmony_ci	andis. 3,3,0x3e00
36570af302Sopenharmony_ci	/* if (r3 & FE_INVALID) r3 |= software_invalid_flag */
37570af302Sopenharmony_ci	andis. 0,3,0x2000
38570af302Sopenharmony_ci	stwu 1,-16(1)
39570af302Sopenharmony_ci	beq- 0,1f
40570af302Sopenharmony_ci	ori 3,3,0x0400
41570af302Sopenharmony_ci1:
42570af302Sopenharmony_ci	/* fpscr |= r3 */
43570af302Sopenharmony_ci	mffs 0
44570af302Sopenharmony_ci	stfd 0,8(1)
45570af302Sopenharmony_ci	lwz 9,12(1)
46570af302Sopenharmony_ci	or 9,9,3
47570af302Sopenharmony_ci	stw 9,12(1)
48570af302Sopenharmony_ci	lfd 0,8(1)
49570af302Sopenharmony_ci	mtfsf 255,0
50570af302Sopenharmony_ci
51570af302Sopenharmony_ci	/* return 0 */
52570af302Sopenharmony_ci	li 3,0
53570af302Sopenharmony_ci	addi 1,1,16
54570af302Sopenharmony_ci	blr
55570af302Sopenharmony_ci
56570af302Sopenharmony_ci.global fetestexcept
57570af302Sopenharmony_ci.type fetestexcept,@function
58570af302Sopenharmony_cifetestexcept:
59570af302Sopenharmony_ci	andis. 3,3,0x3e00
60570af302Sopenharmony_ci	/* return r3 & fpscr */
61570af302Sopenharmony_ci	stwu 1,-16(1)
62570af302Sopenharmony_ci	mffs 0
63570af302Sopenharmony_ci	stfd 0,8(1)
64570af302Sopenharmony_ci	lwz 9,12(1)
65570af302Sopenharmony_ci	addi 1,1,16
66570af302Sopenharmony_ci	and 3,3,9
67570af302Sopenharmony_ci	blr
68570af302Sopenharmony_ci
69570af302Sopenharmony_ci.global fegetround
70570af302Sopenharmony_ci.type fegetround,@function
71570af302Sopenharmony_cifegetround:
72570af302Sopenharmony_ci	/* return fpscr & 3 */
73570af302Sopenharmony_ci	stwu 1,-16(1)
74570af302Sopenharmony_ci	mffs 0
75570af302Sopenharmony_ci	stfd 0,8(1)
76570af302Sopenharmony_ci	lwz 3,12(1)
77570af302Sopenharmony_ci	addi 1,1,16
78570af302Sopenharmony_ci	clrlwi 3,3,30
79570af302Sopenharmony_ci	blr
80570af302Sopenharmony_ci
81570af302Sopenharmony_ci.global __fesetround
82570af302Sopenharmony_ci.hidden __fesetround
83570af302Sopenharmony_ci.type __fesetround,@function
84570af302Sopenharmony_ci__fesetround:
85570af302Sopenharmony_ci	/*
86570af302Sopenharmony_ci	 * note: invalid input is not checked, r3 < 4 must hold
87570af302Sopenharmony_ci	 * fpscr = (fpscr & -4U) | r3
88570af302Sopenharmony_ci	 */
89570af302Sopenharmony_ci	stwu 1,-16(1)
90570af302Sopenharmony_ci	mffs 0
91570af302Sopenharmony_ci	stfd 0,8(1)
92570af302Sopenharmony_ci	lwz 9,12(1)
93570af302Sopenharmony_ci	clrrwi 9,9,2
94570af302Sopenharmony_ci	or 9,9,3
95570af302Sopenharmony_ci	stw 9,12(1)
96570af302Sopenharmony_ci	lfd 0,8(1)
97570af302Sopenharmony_ci	mtfsf 255,0
98570af302Sopenharmony_ci
99570af302Sopenharmony_ci	/* return 0 */
100570af302Sopenharmony_ci	li 3,0
101570af302Sopenharmony_ci	addi 1,1,16
102570af302Sopenharmony_ci	blr
103570af302Sopenharmony_ci
104570af302Sopenharmony_ci.global fegetenv
105570af302Sopenharmony_ci.type fegetenv,@function
106570af302Sopenharmony_cifegetenv:
107570af302Sopenharmony_ci	/* *r3 = fpscr */
108570af302Sopenharmony_ci	mffs 0
109570af302Sopenharmony_ci	stfd 0,0(3)
110570af302Sopenharmony_ci	/* return 0 */
111570af302Sopenharmony_ci	li 3,0
112570af302Sopenharmony_ci	blr
113570af302Sopenharmony_ci
114570af302Sopenharmony_ci.global fesetenv
115570af302Sopenharmony_ci.type fesetenv,@function
116570af302Sopenharmony_cifesetenv:
117570af302Sopenharmony_ci	cmpwi 3, -1
118570af302Sopenharmony_ci	bne 1f
119570af302Sopenharmony_ci	mflr 4
120570af302Sopenharmony_ci	bl 2f
121570af302Sopenharmony_ci	.zero 8
122570af302Sopenharmony_ci2:	mflr 3
123570af302Sopenharmony_ci	mtlr 4
124570af302Sopenharmony_ci1:	/* fpscr = *r3 */
125570af302Sopenharmony_ci	lfd 0,0(3)
126570af302Sopenharmony_ci	mtfsf 255,0
127570af302Sopenharmony_ci	/* return 0 */
128570af302Sopenharmony_ci	li 3,0
129570af302Sopenharmony_ci	blr
130570af302Sopenharmony_ci#endif
131