xref: /freebsd-11-stable/lib/libc/sparc64/gen/fpsetround.c (revision 8579151e4ba4e6c7f3355bf2ef52baf626a9c374)
1 /*	$NetBSD: fpsetround.c,v 1.2 2002/01/13 21:45:51 thorpej Exp $	*/
2 
3 /*
4  * Written by J.T. Conklin, Apr 10, 1995
5  * Public domain.
6  */
7 
8 #include <sys/cdefs.h>
9 __FBSDID("$FreeBSD$");
10 
11 #include <machine/fsr.h>
12 #include <ieeefp.h>
13 
14 fp_rnd_t
fpsetround(rnd_dir)15 fpsetround(rnd_dir)
16 	fp_rnd_t rnd_dir;
17 {
18 	unsigned int old;
19 	unsigned int new;
20 
21 	__asm__("st %%fsr,%0" : "=m" (old));
22 
23 	new = old;
24 	new &= ~FSR_RD_MASK;
25 	new |= FSR_RD((unsigned int)rnd_dir & 0x03);
26 
27 	__asm__("ld %0,%%fsr" : : "m" (new));
28 
29 	return ((fp_rnd_t)FSR_GET_RD(old));
30 }
31