Merge branch 'vendor/GDB'
[dragonfly.git] / lib / libm / arch / i386 / s_floorf.S
1 /*
2  * Written by J.T. Conklin <jtc@NetBSD.org>.
3  * Public domain.
4  *
5  * $NetBSD: s_floorf.S,v 1.7 2004/07/16 18:40:24 drochner Exp $
6  * $DragonFly: src/lib/libm/arch/i386/s_floorf.S,v 1.1 2005/07/26 21:15:19 joerg Exp $
7  */
8
9 #include <machine/asm.h>
10
11 ENTRY(floorf)
12 #ifdef __i386__
13         pushl   %ebp
14         movl    %esp,%ebp
15         subl    $8,%esp
16
17         fstcw   -4(%ebp)                /* store fpu control word */
18         movw    -4(%ebp),%dx
19         orw     $0x0400,%dx             /* round towards -oo */
20         andw    $0xf7ff,%dx
21         movw    %dx,-8(%ebp)
22         fldcw   -8(%ebp)                /* load modfied control word */
23
24         flds    8(%ebp);                /* round */
25         frndint
26
27         fldcw   -4(%ebp)                /* restore original control word */
28
29         leave
30 #else
31         movss   %xmm0, -4(%rsp)
32         fstcw   -8(%rsp)
33         movw    -8(%rsp),%dx
34         orw     $0x0400,%dx
35         andw    $0xf7ff,%dx  
36         movw    %dx,-12(%rsp)
37         fldcw   -12(%rsp)
38         flds    -4(%rsp)
39         frndint
40         fldcw   -8(%rsp)
41         fstps   -4(%rsp)
42         movss   -4(%rsp),%xmm0
43 #endif
44         ret