xref: /aosp_15_r20/external/musl/src/fenv/s390x/fenv.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <fenv.h>
2*c9945492SAndroid Build Coastguard Worker #include <features.h>
3*c9945492SAndroid Build Coastguard Worker 
get_fpc(void)4*c9945492SAndroid Build Coastguard Worker static inline unsigned get_fpc(void)
5*c9945492SAndroid Build Coastguard Worker {
6*c9945492SAndroid Build Coastguard Worker 	unsigned fpc;
7*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__("efpc %0" : "=r"(fpc));
8*c9945492SAndroid Build Coastguard Worker 	return fpc;
9*c9945492SAndroid Build Coastguard Worker }
10*c9945492SAndroid Build Coastguard Worker 
set_fpc(unsigned fpc)11*c9945492SAndroid Build Coastguard Worker static inline void set_fpc(unsigned fpc)
12*c9945492SAndroid Build Coastguard Worker {
13*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__("sfpc %0" :: "r"(fpc));
14*c9945492SAndroid Build Coastguard Worker }
15*c9945492SAndroid Build Coastguard Worker 
feclearexcept(int mask)16*c9945492SAndroid Build Coastguard Worker int feclearexcept(int mask)
17*c9945492SAndroid Build Coastguard Worker {
18*c9945492SAndroid Build Coastguard Worker 	mask &= FE_ALL_EXCEPT;
19*c9945492SAndroid Build Coastguard Worker 	set_fpc(get_fpc() & ~mask);
20*c9945492SAndroid Build Coastguard Worker 	return 0;
21*c9945492SAndroid Build Coastguard Worker }
22*c9945492SAndroid Build Coastguard Worker 
feraiseexcept(int mask)23*c9945492SAndroid Build Coastguard Worker int feraiseexcept(int mask)
24*c9945492SAndroid Build Coastguard Worker {
25*c9945492SAndroid Build Coastguard Worker 	mask &= FE_ALL_EXCEPT;
26*c9945492SAndroid Build Coastguard Worker 	set_fpc(get_fpc() | mask);
27*c9945492SAndroid Build Coastguard Worker 	return 0;
28*c9945492SAndroid Build Coastguard Worker }
29*c9945492SAndroid Build Coastguard Worker 
fetestexcept(int mask)30*c9945492SAndroid Build Coastguard Worker int fetestexcept(int mask)
31*c9945492SAndroid Build Coastguard Worker {
32*c9945492SAndroid Build Coastguard Worker 	return get_fpc() & mask & FE_ALL_EXCEPT;
33*c9945492SAndroid Build Coastguard Worker }
34*c9945492SAndroid Build Coastguard Worker 
fegetround(void)35*c9945492SAndroid Build Coastguard Worker int fegetround(void)
36*c9945492SAndroid Build Coastguard Worker {
37*c9945492SAndroid Build Coastguard Worker 	return get_fpc() & 3;
38*c9945492SAndroid Build Coastguard Worker }
39*c9945492SAndroid Build Coastguard Worker 
__fesetround(int r)40*c9945492SAndroid Build Coastguard Worker hidden int __fesetround(int r)
41*c9945492SAndroid Build Coastguard Worker {
42*c9945492SAndroid Build Coastguard Worker 	set_fpc(get_fpc() & ~3L | r);
43*c9945492SAndroid Build Coastguard Worker 	return 0;
44*c9945492SAndroid Build Coastguard Worker }
45*c9945492SAndroid Build Coastguard Worker 
fegetenv(fenv_t * envp)46*c9945492SAndroid Build Coastguard Worker int fegetenv(fenv_t *envp)
47*c9945492SAndroid Build Coastguard Worker {
48*c9945492SAndroid Build Coastguard Worker 	*envp = get_fpc();
49*c9945492SAndroid Build Coastguard Worker 	return 0;
50*c9945492SAndroid Build Coastguard Worker }
51*c9945492SAndroid Build Coastguard Worker 
fesetenv(const fenv_t * envp)52*c9945492SAndroid Build Coastguard Worker int fesetenv(const fenv_t *envp)
53*c9945492SAndroid Build Coastguard Worker {
54*c9945492SAndroid Build Coastguard Worker 	set_fpc(envp != FE_DFL_ENV ? *envp : 0);
55*c9945492SAndroid Build Coastguard Worker 	return 0;
56*c9945492SAndroid Build Coastguard Worker }
57