xref: /titanic_51/usr/src/lib/libm/i386/src/__reduction.s (revision ddc0e0b53c661f6e439e3b7072b3ef353eadb4af)
1*25c28e83SPiotr Jasiukajtis/*
2*25c28e83SPiotr Jasiukajtis * CDDL HEADER START
3*25c28e83SPiotr Jasiukajtis *
4*25c28e83SPiotr Jasiukajtis * The contents of this file are subject to the terms of the
5*25c28e83SPiotr Jasiukajtis * Common Development and Distribution License (the "License").
6*25c28e83SPiotr Jasiukajtis * You may not use this file except in compliance with the License.
7*25c28e83SPiotr Jasiukajtis *
8*25c28e83SPiotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*25c28e83SPiotr Jasiukajtis * or http://www.opensolaris.org/os/licensing.
10*25c28e83SPiotr Jasiukajtis * See the License for the specific language governing permissions
11*25c28e83SPiotr Jasiukajtis * and limitations under the License.
12*25c28e83SPiotr Jasiukajtis *
13*25c28e83SPiotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each
14*25c28e83SPiotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*25c28e83SPiotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the
16*25c28e83SPiotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying
17*25c28e83SPiotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner]
18*25c28e83SPiotr Jasiukajtis *
19*25c28e83SPiotr Jasiukajtis * CDDL HEADER END
20*25c28e83SPiotr Jasiukajtis */
21*25c28e83SPiotr Jasiukajtis/*
22*25c28e83SPiotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
23*25c28e83SPiotr Jasiukajtis */
24*25c28e83SPiotr Jasiukajtis/*
25*25c28e83SPiotr Jasiukajtis * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
26*25c28e83SPiotr Jasiukajtis * Use is subject to license terms.
27*25c28e83SPiotr Jasiukajtis */
28*25c28e83SPiotr Jasiukajtis
29*25c28e83SPiotr Jasiukajtis	.file	"__reduction.s"
30*25c28e83SPiotr Jasiukajtis
31*25c28e83SPiotr Jasiukajtis/
32*25c28e83SPiotr Jasiukajtis/    After argument reduction which returns n:
33*25c28e83SPiotr Jasiukajtis/       n mod 4     sin(x)      cos(x)        tan(x)
34*25c28e83SPiotr Jasiukajtis/     ----------------------------------------------------------
35*25c28e83SPiotr Jasiukajtis/          0          S           C             S/C
36*25c28e83SPiotr Jasiukajtis/          1          C          -S            -C/S
37*25c28e83SPiotr Jasiukajtis/          2         -S          -C             S/C
38*25c28e83SPiotr Jasiukajtis/          3         -C           S            -C/S
39*25c28e83SPiotr Jasiukajtis/     ----------------------------------------------------------
40*25c28e83SPiotr Jasiukajtis
41*25c28e83SPiotr Jasiukajtis#include "libm.h"
42*25c28e83SPiotr Jasiukajtis#include "libm_protos.h"
43*25c28e83SPiotr Jasiukajtis
44*25c28e83SPiotr Jasiukajtis	ENTRY(__reduction)
45*25c28e83SPiotr Jasiukajtis#ifndef PIC
46*25c28e83SPiotr Jasiukajtis	movl	12(%esp),%eax		/ load the high part of arg
47*25c28e83SPiotr Jasiukajtis#else
48*25c28e83SPiotr Jasiukajtis	movl	16(%esp),%eax		/ load the high part of arg
49*25c28e83SPiotr Jasiukajtis#endif
50*25c28e83SPiotr Jasiukajtis	andl	$0x7fffffff,%eax	/ clear sign
51*25c28e83SPiotr Jasiukajtis	cmpl	$0x3fe921fb,%eax	/ Is |x| < pi/4 (= 0x3fe921fb54...) ?
52*25c28e83SPiotr Jasiukajtis	jbe	.L0
53*25c28e83SPiotr Jasiukajtis	cmpl	$0x7ff00000,%eax	/ Is arg a NaN or an Inf ?
54*25c28e83SPiotr Jasiukajtis	jb	.L1
55*25c28e83SPiotr Jasiukajtis.L0:
56*25c28e83SPiotr Jasiukajtis#ifndef PIC
57*25c28e83SPiotr Jasiukajtis	fldl	8(%esp)			/ push arg
58*25c28e83SPiotr Jasiukajtis#else
59*25c28e83SPiotr Jasiukajtis	fldl	12(%esp)		/ push arg
60*25c28e83SPiotr Jasiukajtis#endif
61*25c28e83SPiotr Jasiukajtis	fwait
62*25c28e83SPiotr Jasiukajtis	movl	$0,%eax			/ set n = 0
63*25c28e83SPiotr Jasiukajtis	ret
64*25c28e83SPiotr Jasiukajtis.L1:
65*25c28e83SPiotr Jasiukajtis	pushl	%ebp
66*25c28e83SPiotr Jasiukajtis	movl	%esp,%ebp
67*25c28e83SPiotr Jasiukajtis	subl	$16,%esp
68*25c28e83SPiotr Jasiukajtis	PIC_SETUP(1)
69*25c28e83SPiotr Jasiukajtis	leal	-16(%ebp),%eax		/ address of y[0]
70*25c28e83SPiotr Jasiukajtis	pushl	%eax
71*25c28e83SPiotr Jasiukajtis#ifndef PIC
72*25c28e83SPiotr Jasiukajtis	pushl	16(%ebp)
73*25c28e83SPiotr Jasiukajtis	pushl	12(%ebp)
74*25c28e83SPiotr Jasiukajtis#else
75*25c28e83SPiotr Jasiukajtis	pushl	20(%ebp)
76*25c28e83SPiotr Jasiukajtis	pushl	16(%ebp)
77*25c28e83SPiotr Jasiukajtis#endif
78*25c28e83SPiotr Jasiukajtis	call	PIC_F(__rem_pio2)	/ call __rem_pio2(x,&y)
79*25c28e83SPiotr Jasiukajtis	fldl	-8(%ebp)		/ y[1]
80*25c28e83SPiotr Jasiukajtis	fldl	-16(%ebp)		/ y[0], y[1]
81*25c28e83SPiotr Jasiukajtis	faddp	%st,%st(1)		/ y[0]+y[1] round-to-extended
82*25c28e83SPiotr Jasiukajtis	addl	$28,%esp		/ 16+4*3
83*25c28e83SPiotr Jasiukajtis	andl	$3,%eax
84*25c28e83SPiotr Jasiukajtis	PIC_WRAPUP
85*25c28e83SPiotr Jasiukajtis	leave
86*25c28e83SPiotr Jasiukajtis	ret
87*25c28e83SPiotr Jasiukajtis	.align	4
88*25c28e83SPiotr Jasiukajtis	SET_SIZE(__reduction)
89