xref: /openbsd/lib/libc/arch/hppa/gen/fpsetround.c (revision 3bef86f7)
1 /*	$OpenBSD: fpsetround.c,v 1.5 2023/01/27 11:25:16 miod Exp $	*/
2 
3 /*
4  * Written by Miodrag Vallat.  Public domain
5  */
6 
7 #include <sys/types.h>
8 #include <ieeefp.h>
9 
10 fp_rnd
11 fpsetround(rnd_dir)
12 	fp_rnd rnd_dir;
13 {
14 	u_int64_t fpsr;
15 	fp_rnd old;
16 
17 	__asm__ volatile("fstd %%fr0,0(%1)" : "=m" (fpsr) : "r" (&fpsr));
18 	old = (fpsr >> 41) & 0x03;
19 	fpsr = (fpsr & 0xfffff9ff00000000LL) |
20 	    ((u_int64_t)(rnd_dir & 0x03) << 41);
21 	__asm__ volatile("fldd 0(%0),%%fr0" : : "r"(&fpsr), "m"(fpsr));
22 	return (old);
23 }
24