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