1*2fe8fb19SBen Gras /* $NetBSD: fpsetsticky.c,v 1.5 2005/12/24 23:10:08 perry Exp $ */ 2*2fe8fb19SBen Gras 3*2fe8fb19SBen Gras /* 4*2fe8fb19SBen Gras * Written by J.T. Conklin, Apr 10, 1995 5*2fe8fb19SBen Gras * Public domain. 6*2fe8fb19SBen Gras */ 7*2fe8fb19SBen Gras 8*2fe8fb19SBen Gras #include <sys/cdefs.h> 9*2fe8fb19SBen Gras #if defined(LIBC_SCCS) && !defined(lint) 10*2fe8fb19SBen Gras __RCSID("$NetBSD: fpsetsticky.c,v 1.5 2005/12/24 23:10:08 perry Exp $"); 11*2fe8fb19SBen Gras #endif /* LIBC_SCCS and not lint */ 12*2fe8fb19SBen Gras 13*2fe8fb19SBen Gras #include "namespace.h" 14*2fe8fb19SBen Gras 15*2fe8fb19SBen Gras #include <ieeefp.h> 16*2fe8fb19SBen Gras 17*2fe8fb19SBen Gras #ifdef __weak_alias 18*2fe8fb19SBen Gras __weak_alias(fpsetsticky,_fpsetsticky) 19*2fe8fb19SBen Gras #endif 20*2fe8fb19SBen Gras 21*2fe8fb19SBen Gras fp_except 22*2fe8fb19SBen Gras fpsetsticky(sticky) 23*2fe8fb19SBen Gras fp_except sticky; 24*2fe8fb19SBen Gras { 25*2fe8fb19SBen Gras fp_except old; 26*2fe8fb19SBen Gras fp_except new; 27*2fe8fb19SBen Gras 28*2fe8fb19SBen Gras __asm("st %%fsr,%0" : "=m" (*&old)); 29*2fe8fb19SBen Gras 30*2fe8fb19SBen Gras new = old; 31*2fe8fb19SBen Gras new &= ~(0x1f << 5); 32*2fe8fb19SBen Gras new |= ((sticky & 0x1f) << 5); 33*2fe8fb19SBen Gras 34*2fe8fb19SBen Gras __asm("ld %0,%%fsr" : : "m" (*&new)); 35*2fe8fb19SBen Gras 36*2fe8fb19SBen Gras return (old >> 5) & 0x1f; 37*2fe8fb19SBen Gras } 38