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