Cygwin: pinfo: use stpcpy where appropriate
[newlib-cygwin.git] / winsup / cygwin / math / floorl.S
blob19ab3f099619c66a7f8a2ec388c9b35783147ed5
1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 #include <_mingw_mac.h>
8         .file   "floorl.S"
9         .text
10 #ifdef __x86_64__
11         .align 8
12 #else
13         .align 4
14 #endif
15         .globl __MINGW_USYMBOL(floorl)
16         .def    __MINGW_USYMBOL(floorl);        .scl    2;      .type   32;     .endef
17 __MINGW_USYMBOL(floorl):
18 #if defined(_AMD64_) || defined(__x86_64__)
19         fldt    (%rdx)
20         subq    $24,%rsp
22         fstcw   8(%rsp)                 /* store fpu control word */
24         /* We use here %edx although only the low 1 bits are defined.
25            But none of the operations should care and they are faster
26            than the 16 bit operations.  */
27         movl    $0x400,%edx             /* round towards -oo */
28         orl     8(%rsp),%edx
29         andl    $0xf7ff,%edx
30         movl    %edx,(%rsp)
31         fldcw   (%rsp)                  /* load modified control word */
33         frndint                         /* round */
35         fldcw   8(%rsp)                 /* restore original control word */
37         addq    $24,%rsp
38         movq    %rcx,%rax
39         movq    $0,8(%rcx)
40         fstpt   (%rcx)
41         ret
42 #elif defined(_ARM_) || defined(__arm__)
43         vmrs    r1, fpscr
44         bic             r0, r1, #0x00c00000
45         orr             r0, r0, #0x00800000 /* Round towards Minus Infinity */
46         vmsr    fpscr, r0
47         vcvtr.s32.f64   s0, d0
48         vcvt.f64.s32    d0, s0
49         vmsr    fpscr, r1
50         bx      lr
51 #elif defined(_X86_) || defined(__i386__)
52         fldt    4(%esp)
53         subl    $8,%esp
55         fstcw   4(%esp)                 /* store fpu control word */
57         /* We use here %edx although only the low 1 bits are defined.
58            But none of the operations should care and they are faster
59            than the 16 bit operations.  */
60         movl    $0x400,%edx             /* round towards -oo */
61         orl     4(%esp),%edx
62         andl    $0xf7ff,%edx
63         movl    %edx,(%esp)
64         fldcw   (%esp)                  /* load modified control word */
66         frndint                         /* round */
68         fldcw   4(%esp)                 /* restore original control word */
70         addl    $8,%esp
71         ret
72 #endif