Home | History | Annotate | Line # | Download | only in gen
fpsetsticky.c revision 1.1
      1  1.1  chs /*	$NetBSD: fpsetsticky.c,v 1.1 2004/07/24 19:09:29 chs Exp $	*/
      2  1.1  chs 
      3  1.1  chs /*	$OpenBSD: fpsetsticky.c,v 1.4 2004/01/05 06:06:16 otto Exp $	*/
      4  1.1  chs 
      5  1.1  chs /*
      6  1.1  chs  * Written by Miodrag Vallat.  Public domain
      7  1.1  chs  */
      8  1.1  chs 
      9  1.1  chs #include <sys/types.h>
     10  1.1  chs #include <ieeefp.h>
     11  1.1  chs 
     12  1.1  chs fp_except
     13  1.1  chs fpsetsticky(fp_except mask)
     14  1.1  chs {
     15  1.1  chs 	uint64_t fpsr;
     16  1.1  chs 	fp_except old;
     17  1.1  chs 
     18  1.1  chs 	__asm__ __volatile__("fstd %%fr0,0(%1)" : "=m" (fpsr) : "r" (&fpsr));
     19  1.1  chs 	old = (fpsr >> 59) & 0x1f;
     20  1.1  chs 	fpsr = (fpsr & 0x07ffffff00000000LL) | ((uint64_t)(mask & 0x1f) << 59);
     21  1.1  chs 	__asm__ __volatile__("fldd 0(%0),%%fr0" : : "r" (&fpsr));
     22  1.1  chs 	return (old);
     23  1.1  chs }
     24