1178580Simp/* $NetBSD: fpsetmask.c,v 1.5 2005/12/24 23:10:08 perry Exp $ */ 2178580Simp 3178580Simp/* 4178580Simp * Written by J.T. Conklin, Apr 11, 1995 5178580Simp * Public domain. 6178580Simp */ 7178580Simp 8178580Simp#include <sys/cdefs.h> 9178580Simp__FBSDID("$FreeBSD$"); 10178580Simp#if defined(LIBC_SCCS) && !defined(lint) 11178580Simp__RCSID("$NetBSD: fpsetmask.c,v 1.5 2005/12/24 23:10:08 perry Exp $"); 12178580Simp#endif /* LIBC_SCCS and not lint */ 13178580Simp 14178580Simp#include "namespace.h" 15178580Simp 16178580Simp#include <ieeefp.h> 17178580Simp 18178580Simp#ifdef __weak_alias 19178580Simp__weak_alias(fpsetmask,_fpsetmask) 20178580Simp#endif 21178580Simp 22178580Simpfp_except_t 23178580Simpfpsetmask(mask) 24178580Simp fp_except_t mask; 25178580Simp{ 26178580Simp fp_except_t old; 27178580Simp fp_except_t new; 28178580Simp 29178580Simp __asm("cfc1 %0,$31" : "=r" (old)); 30178580Simp 31178580Simp new = old; 32178580Simp new &= ~(0x1f << 7); 33178580Simp new |= ((mask & 0x1f) << 7); 34178580Simp 35178580Simp __asm("ctc1 %0,$31" : : "r" (new)); 36178580Simp 37178580Simp return (old >> 7) & 0x1f; 38178580Simp} 39