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