xref: /minix3/lib/libm/arch/i387/s_floor.S (revision 84d9c625bfea59e274550651111ae9edfdc40fbd)
12fe8fb19SBen Gras/*
22fe8fb19SBen Gras * Written by J.T. Conklin <jtc@NetBSD.org>.
32fe8fb19SBen Gras * Public domain.
42fe8fb19SBen Gras */
52fe8fb19SBen Gras
62fe8fb19SBen Gras#include <machine/asm.h>
72fe8fb19SBen Gras
8*84d9c625SLionel SambucRCSID("$NetBSD: s_floor.S,v 1.9 2011/06/18 21:24:51 joerg Exp $")
92fe8fb19SBen Gras
102fe8fb19SBen GrasENTRY(floor)
112fe8fb19SBen Gras#ifdef __i386__
122fe8fb19SBen Gras	pushl	%ebp
132fe8fb19SBen Gras	movl	%esp,%ebp
142fe8fb19SBen Gras	subl	$8,%esp
152fe8fb19SBen Gras
162fe8fb19SBen Gras	fstcw	-4(%ebp)		/* store fpu control word */
172fe8fb19SBen Gras	movw	-4(%ebp),%dx
182fe8fb19SBen Gras	orw	$0x0400,%dx		/* round towards -oo */
192fe8fb19SBen Gras	andw	$0xf7ff,%dx
202fe8fb19SBen Gras	movw	%dx,-8(%ebp)
212fe8fb19SBen Gras	fldcw	-8(%ebp)		/* load modfied control word */
222fe8fb19SBen Gras
23*84d9c625SLionel Sambuc	fldl	8(%ebp)			/* round */
242fe8fb19SBen Gras	frndint
252fe8fb19SBen Gras
262fe8fb19SBen Gras	fldcw	-4(%ebp)		/* restore original control word */
272fe8fb19SBen Gras
282fe8fb19SBen Gras	leave
292fe8fb19SBen Gras#else
302fe8fb19SBen Gras	movsd	%xmm0, -8(%rsp)
312fe8fb19SBen Gras	fstcw	-12(%rsp)
322fe8fb19SBen Gras	movw	-12(%rsp),%dx
332fe8fb19SBen Gras	orw	$0x0400,%dx
342fe8fb19SBen Gras	andw	$0xf7ff,%dx
352fe8fb19SBen Gras	movw	%dx,-16(%rsp)
362fe8fb19SBen Gras	fldcw	-16(%rsp)
372fe8fb19SBen Gras	fldl	-8(%rsp)
382fe8fb19SBen Gras	frndint
392fe8fb19SBen Gras	fldcw	-12(%rsp)
402fe8fb19SBen Gras	fstpl	-8(%rsp)
412fe8fb19SBen Gras	movsd	-8(%rsp),%xmm0
422fe8fb19SBen Gras#endif
432fe8fb19SBen Gras	ret
44