xref: /openbsd-src/lib/libc/arch/riscv64/gen/flt_rounds.c (revision 0bcd3eeb4adbf1b8039f4f7f536d66f59ccf461f)
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