1/* 2 * Public domain. 3 */ 4 5#include <libm-alias-ldouble.h> 6#include <machine/asm.h> 7 8ENTRY(__floorl) 9 fldt 8(%rsp) 10 11 fnstenv -28(%rsp) /* store fpu environment */ 12 13 /* We use here %edx although only the low 1 bits are defined. 14 But none of the operations should care and they are faster 15 than the 16 bit operations. */ 16 movl $0x400,%edx /* round towards -oo */ 17 orl -28(%rsp),%edx 18 andl $0xf7ff,%edx 19 movl %edx,-32(%rsp) 20 fldcw -32(%rsp) /* load modified control word */ 21 22 frndint /* round */ 23 24 /* Preserve "invalid" exceptions from sNaN input. */ 25 fnstsw 26 andl $0x1, %eax 27 orl %eax, -24(%rsp) 28 29 fldenv -28(%rsp) /* restore original environment */ 30 31 ret 32END (__floorl) 33libm_alias_ldouble (__floor, floor) 34