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