xref: /illumos-gate/usr/src/lib/libm/sparc/src/nextafter.S (revision b515258426fed6c7311fd3f1dea697cfbd4085c6)
1/*
2 * CDDL HEADER START
3 *
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.
7 *
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.
12 *
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]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
23 */
24/*
25 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
26 * Use is subject to license terms.
27 */
28
29	.file	"nextafter.S"
30
31#include "libm.h"
32LIBM_ANSI_PRAGMA_WEAK(nextafter,function)
33	.weak _nextafter
34	.type _nextafter,#function
35_nextafter	= __nextafter
36#include "libm_synonyms.h"
37#include "libm_protos.h"
38
39#if defined(LIBM_BUILD)	&& !defined(ELFOBJ)
40#define	mENTRY(x)	ENTRY(__libm/**/x)
41#define	mNAME(x)	NAME(__libm/**/x)
42#else
43#define	mENTRY(x)	ENTRY(x)
44#define	mNAME(x)	NAME(x)
45#endif
46
47	RO_DATA
48	.align	8
49.Lconstant:
50two54 	= 0x00
51	.word	0x43500000,0x0		!  2**54
52twom54 	= 0x08
53	.word	0x3c900000,0x0		!  2**-54
54tiny	= 0x10
55	.word	0x00100000,0x0		!  tiny
56
57! variable using fp
58x 	= -0x8
59y 	= -0x10
60
61	ENTRY(nextafter)
62	save	%sp,-128,%sp
63	PIC_SETUP(l7)
64	std	%i0,[%fp+x]
65	or	%g0,%i0,%o0		! save original arguments
66	or	%g0,%i1,%o1
67	std	%i2,[%fp+y]
68	or	%g0,%i2,%o2
69	or	%g0,%i3,%o3
70	ldd	[%fp+x],%f2		! x
71	ldd	[%fp+y],%f0		! y
72	fcmpd	%f2,%f0			! x:y
73	PIC_SET(l7,.Lconstant,l0)
74	sethi	%hi(0x80000000),%l1
75	andn	%i0,%l1,%l4
76	fbe	9f			! next_return
77	nop
78	fbu,a	9f			! next_return
79	fmuld	%f2,%f0,%f0		! + -> * for Cheetah
80	orcc	%i1,%l4,%g0		! see if x is zero
81	bne	1f
82	tst	%i0
83    ! x is zero, return sign(y)*min
84	and	%i2,%l1,%i0
85	ba	4f			! next_final
86	mov	1,%i1
871:	bge	2f
88	nop
89    ! x is negative
90	fbl	1f			! next_subulp
91	nop
92	fbg	3f			! next_addulp
93	nop
942:
95	fbl	3f			! next_addulp
96	nop
971:					! next_subulp
98	subcc	%i1,1,%i1
99	ba	4f			! next_final
100	subx	%i0,0,%i0
1013:					! next_addulp
102	addcc	%i1,1,%i1
103	addx	%i0,0,%i0
1044:					! next_final
105	sethi	%hi(0x7ff00000),%l3
106	std	%i0,[%fp+x]
107	andcc	%i0,%l3,%i2
108	be,a	1f			! xflow
109	ldd	[%l0+tiny],%f2
110	cmp	%i2,%l3
111	bne,a	9f			! next_return
112	ldd	[%fp+x],%f0
113	call	mNAME(_SVID_libm_err)	! overflow
114	or	%g0,46,%o4
115	ba	9f
116	nop
1171:					! xflow
118	fmuld	%f2,%f2,%f2
119	ldd	[%fp+x],%f0
1209:					! next_return
121	ret
122	restore
123
124	SET_SIZE(nextafter)
125