13447SN/A/*	$OpenBSD: flt_rounds.c,v 1.6 2016/07/26 19:07:09 guenther Exp $	*/
23447SN/A/*
33447SN/A * Copyright (c) 2006 Miodrag Vallat.
43447SN/A *
53447SN/A * Permission to use, copy, modify, and distribute this software for any
63447SN/A * purpose with or without fee is hereby granted, provided that the above
73447SN/A * copyright notice, this permission notice, and the disclaimer below
83447SN/A * appear in all copies.
93447SN/A *
103447SN/A * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
113447SN/A * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
123447SN/A * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
133447SN/A * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
143447SN/A * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
153447SN/A * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
163447SN/A * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
173447SN/A */
183447SN/A
193447SN/A#include <sys/types.h>
203447SN/A#include <float.h>
213447SN/A#include <ieeefp.h>
223447SN/A
233447SN/Astatic const int rndmap[] = {
243447SN/A	1,	/* round to nearest */
253447SN/A	0,	/* round to zero */
263447SN/A	2,	/* round to positive infinity */
273447SN/A	3	/* round to negative infinity */
283447SN/A};
2911707Stpivovarova
3011707Stpivovarovaint
3111707Stpivovarova__flt_rounds()
323447SN/A{
333447SN/A#if !defined(SOFTFLOAT)
3411707Stpivovarova	register_t fpscr;
3511707Stpivovarova
363447SN/A	__asm__ volatile ("sts fpscr, %0" : "=r" (fpscr));
373447SN/A	return rndmap[fpscr & 0x03];
383447SN/A#else
393447SN/A	return rndmap[fpgetround()];
403447SN/A#endif
413447SN/A}
423447SN/ADEF_STRONG(__flt_rounds);
433447SN/A