Changes for 4.5.0 snapshot
[newlib-cygwin.git] / winsup / cygwin / math / ceill.S
blob61d6199293d742660abffc79a7ebd4c09854b180
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   "ceill.S"
9         .text
10 #ifdef __x86_64__
11         .align 8
12 #else
13         .align 4
14 #endif
15         .globl __MINGW_USYMBOL(ceill)
16         .def    __MINGW_USYMBOL(ceill); .scl    2;      .type   32;     .endef
17 __MINGW_USYMBOL(ceill):
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    $0x0800,%edx            /* round towards +oo */
28         orl     8(%rsp),%edx
29         andl    $0xfbff,%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, #0x00400000 /* Round towards Plus 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
54         fstcw   4(%esp)
55         movl    $0x0800,%edx
56         orl     4(%esp),%edx
57         andl    $0xfbff,%edx
58         movl    %edx,(%esp)
59         fldcw   (%esp)
60         frndint
61         fldcw   4(%esp)
62         addl $8,%esp
63         ret
64 #endif