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