5261 libm should stop using synonyms.h
[illumos-gate.git] / usr / src / lib / libm / amd64 / src / fmod.s
blob94a267f4adbf9ddd3112c60ed07a7ebfc35b3030
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
22 * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
25 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
26 * Use is subject to license terms.
29 .file "fmod.s"
31 #include "libm.h"
32 LIBM_ANSI_PRAGMA_WEAK(fmod,function)
33 #include "libm_protos.h"
35 ENTRY(fmod)
36 push %rbp
37 movq %rsp,%rbp
38 subq $16,%rsp
39 movlpd %xmm1,-16(%rbp)
40 movlpd %xmm0,-8(%rbp)
42 movl -12(%rbp),%eax / eax <-- hi_32(y)
43 andl $0x7fffffff,%eax / eax <-- hi_32(|y|)
44 orl -16(%rbp),%eax / eax <-- lo_32(y)|hi_32(|y|)
45 je .yzero
47 fldl -16(%rbp) / y
48 fldl -8(%rbp) / x
49 .loop:
50 fprem / partial remainder
51 fstsw %ax / store status word
52 andw $0x400,%ax / check for incomplete reduction
53 jne .loop / loop while reduction incomplete
54 fstpl -8(%rbp)
55 movsd -8(%rbp),%xmm0
56 fstp %st(0)
57 leave
58 ret
60 .yzero:
61 PIC_SETUP(1)
62 movl $27,%edi
63 movl $2,%eax
64 call PIC_F(_SVID_libm_err)
65 PIC_WRAPUP
66 leave
67 ret
68 .align 4
69 SET_SIZE(fmod)