1 /* $OpenBSD: fpsetround.c,v 1.4 2014/04/18 15:09:52 guenther 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)); 22 return (old); 23 } 24