xref: /openbsd-src/lib/libc/arch/mips64/gen/fpsetsticky.c (revision 298116df5b000b61a69743d21c92035418df8900)
1*298116dfSespie /*	$OpenBSD: fpsetsticky.c,v 1.2 2005/08/07 16:40:15 espie Exp $ */
20eea0d08Spefo /*
30eea0d08Spefo  * Written by J.T. Conklin, Apr 11, 1995
40eea0d08Spefo  * Public domain.
50eea0d08Spefo  */
60eea0d08Spefo 
70eea0d08Spefo #include <ieeefp.h>
80eea0d08Spefo 
90eea0d08Spefo fp_except
fpsetsticky(sticky)100eea0d08Spefo fpsetsticky(sticky)
110eea0d08Spefo 	fp_except sticky;
120eea0d08Spefo {
130eea0d08Spefo 	fp_except old;
140eea0d08Spefo 	fp_except new;
150eea0d08Spefo 
160eea0d08Spefo 	__asm__("cfc1 %0,$31" : "=r" (old));
170eea0d08Spefo 
180eea0d08Spefo 	new = old;
190eea0d08Spefo 	new &= ~(0x1f << 2);
200eea0d08Spefo 	new |= ((sticky & 0x1f) << 2);
210eea0d08Spefo 
220eea0d08Spefo 	__asm__("ctc1 %0,$31" : : "r" (new));
230eea0d08Spefo 
240eea0d08Spefo 	return (old >> 2) & 0x1f;
250eea0d08Spefo }
26