xref: /openbsd/lib/libc/arch/m88k/gen/fpsetsticky.c (revision 0b514a07)
1*0b514a07Smiod /*	$OpenBSD: fpsetsticky.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 m88k by Nivas Madhur.
7443998a4Ssmurph  */
8443998a4Ssmurph 
9443998a4Ssmurph #include <ieeefp.h>
10443998a4Ssmurph 
11443998a4Ssmurph fp_except
fpsetsticky(sticky)12443998a4Ssmurph fpsetsticky(sticky)
13443998a4Ssmurph 	fp_except sticky;
14443998a4Ssmurph {
15443998a4Ssmurph 	fp_except old;
16443998a4Ssmurph 	fp_except new;
17443998a4Ssmurph 
18*0b514a07Smiod 	__asm__ volatile("fldcr %0, %%fcr62" : "=r" (old));
19443998a4Ssmurph 
20443998a4Ssmurph 	new = old;
21443998a4Ssmurph 	new &= ~(0x1f);
22443998a4Ssmurph 	new |= (sticky & 0x1f);
23443998a4Ssmurph 
24*0b514a07Smiod 	__asm__ volatile("fstcr %0, %%fcr62" : : "r" (new));
25443998a4Ssmurph 
26443998a4Ssmurph 	return (old & 0x1f);
27443998a4Ssmurph }
28