31 lines
		
	
	
		
			580 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			580 B
		
	
	
	
		
			C
		
	
	
	
	
	
#include <fenv.h>
 | 
						|
 | 
						|
long double
 | 
						|
roundl (long double x) {
 | 
						|
  long double retval;
 | 
						|
  unsigned short saved_cw, _cw;
 | 
						|
  __asm__ (
 | 
						|
	"fnstcw %0;"
 | 
						|
  	: "=m" (saved_cw)
 | 
						|
	); /* save  control word  */
 | 
						|
  _cw = ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)
 | 
						|
     	  | (x > 0.0 ? FE_UPWARD : FE_DOWNWARD); /* round away from zero */
 | 
						|
  __asm__ (
 | 
						|
	"fldcw %0;"
 | 
						|
	:
 | 
						|
	: "m" (_cw)
 | 
						|
	);  /* load the rounding control */
 | 
						|
  __asm__ (
 | 
						|
	"frndint;"
 | 
						|
	: "=t" (retval)
 | 
						|
	: "0" (x)
 | 
						|
	); /* do the rounding */
 | 
						|
  __asm__ (
 | 
						|
	"fldcw %0;"
 | 
						|
	:
 | 
						|
	: "m" (saved_cw)
 | 
						|
	); /* restore control word */
 | 
						|
  return retval;
 | 
						|
}
 | 
						|
 |