1178580Simp/*	$NetBSD: fpsetround.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: fpsetround.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(fpsetround,_fpsetround)
20178580Simp#endif
21178580Simp
22178580Simpfp_rnd_t
23178580Simpfpsetround(fp_rnd_t rnd_dir)
24178580Simp{
25178580Simp	fp_rnd_t old;
26178580Simp	fp_rnd_t new;
27178580Simp
28178580Simp	__asm("cfc1 %0,$31" : "=r" (old));
29178580Simp
30178580Simp	new = old;
31178580Simp	new &= ~0x03;
32178580Simp	new |= (rnd_dir & 0x03);
33178580Simp
34178580Simp	__asm("ctc1 %0,$31" : : "r" (new));
35178580Simp
36178580Simp	return old & 0x03;
37178580Simp}
38