1/* 2 * Public domain. 3 */ 4 5#include <machine/asm.h> 6#include <libm-alias-double.h> 7 8RCSID("$NetBSD: s_floor.S,v 1.4 1995/05/09 00:01:59 jtc Exp $") 9 10ENTRY(__floor) 11 fldl 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 fldenv 4(%esp) /* restore original environment */ 29 30 addl $32,%esp 31 cfi_adjust_cfa_offset (-32) 32 ret 33END (__floor) 34libm_alias_double (__floor, floor) 35