1*0bcd3eebSkettenis /* $OpenBSD: flt_rounds.c,v 1.1 2021/04/28 15:38:59 kettenis Exp $ */
2*0bcd3eebSkettenis
3*0bcd3eebSkettenis /*
4*0bcd3eebSkettenis * Written by Mark Kettenis based on the hppa version written by
5*0bcd3eebSkettenis * Miodrag Vallat. Public domain.
6*0bcd3eebSkettenis */
7*0bcd3eebSkettenis
8*0bcd3eebSkettenis #include <sys/types.h>
9*0bcd3eebSkettenis #include <float.h>
10*0bcd3eebSkettenis
11*0bcd3eebSkettenis static const int map[] = {
12*0bcd3eebSkettenis 1, /* round to nearest, ties to even */
13*0bcd3eebSkettenis 0, /* round to zero */
14*0bcd3eebSkettenis 3, /* round to negative infinity */
15*0bcd3eebSkettenis 2, /* round to positive infinity */
16*0bcd3eebSkettenis 4, /* round to nearest, ties away from zero */
17*0bcd3eebSkettenis -1, /* invalid */
18*0bcd3eebSkettenis -1, /* invalid */
19*0bcd3eebSkettenis -1 /* invalid */
20*0bcd3eebSkettenis };
21*0bcd3eebSkettenis
22*0bcd3eebSkettenis int
__flt_rounds(void)23*0bcd3eebSkettenis __flt_rounds(void)
24*0bcd3eebSkettenis {
25*0bcd3eebSkettenis uint32_t frm;
26*0bcd3eebSkettenis
27*0bcd3eebSkettenis __asm volatile ("frrm %0" : "=r"(frm));
28*0bcd3eebSkettenis return map[frm];
29*0bcd3eebSkettenis }
30*0bcd3eebSkettenis DEF_STRONG(__flt_rounds);
31