xref: /openbsd-src/lib/libc/arch/m88k/gen/fpsetround.c (revision 0b514a0798ffc86c581fc3611e7adb25cce99305)
1*0b514a07Smiod /*	$OpenBSD: fpsetround.c,v 1.4 2013/01/05 11:20:55 miod Exp $	*/
2d5b3c078Smiod 
3443998a4Ssmurph /*
4443998a4Ssmurph  * Written by J.T. Conklin, Apr 10, 1995
5443998a4Ssmurph  * Public domain.
6443998a4Ssmurph  * Ported to 88k by Nivas Madhur
7443998a4Ssmurph  */
8443998a4Ssmurph 
9443998a4Ssmurph #include <ieeefp.h>
10443998a4Ssmurph 
11443998a4Ssmurph fp_rnd
fpsetround(rnd_dir)12443998a4Ssmurph fpsetround(rnd_dir)
13443998a4Ssmurph 	fp_rnd rnd_dir;
14443998a4Ssmurph {
15443998a4Ssmurph 	fp_rnd old;
16443998a4Ssmurph 	fp_rnd new;
17443998a4Ssmurph 
18*0b514a07Smiod 	__asm__ volatile("fldcr %0, %%fcr63" : "=r" (old));
19443998a4Ssmurph 
20443998a4Ssmurph 	new = old;
21443998a4Ssmurph 	new &= ~(0x03 << 14); 		/* clear old value */
22443998a4Ssmurph 	new |= ((rnd_dir & 0x03) << 14);/* and set new one */
23443998a4Ssmurph 
24*0b514a07Smiod 	__asm__ volatile("fstcr %0, %%fcr63" : : "r" (new));
25443998a4Ssmurph 
26443998a4Ssmurph 	return (old >> 14) & 0x03;
27443998a4Ssmurph }
28