nextafter.S revision ddc0e0b53c661f6e439e3b7072b3ef353eadb4af
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
*/
/*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
.file "nextafter.S"
#include "libm.h"
LIBM_ANSI_PRAGMA_WEAK(nextafter,function)
.weak _nextafter
.type _nextafter,#function
_nextafter = __nextafter
#include "libm_protos.h"
RO_DATA
.align 8
.Lconstant:
two54 = 0x00
.word 0x43500000,0x0 ! 2**54
twom54 = 0x08
.word 0x3c900000,0x0 ! 2**-54
tiny = 0x10
.word 0x00100000,0x0 ! tiny
! variable using fp
x = -0x8
y = -0x10
ENTRY(nextafter)
save %sp,-128,%sp
PIC_SETUP(l7)
std %i0,[%fp+x]
or %g0,%i0,%o0 ! save original arguments
or %g0,%i1,%o1
std %i2,[%fp+y]
or %g0,%i2,%o2
or %g0,%i3,%o3
ldd [%fp+x],%f2 ! x
ldd [%fp+y],%f0 ! y
fcmpd %f2,%f0 ! x:y
PIC_SET(l7,.Lconstant,l0)
sethi %hi(0x80000000),%l1
andn %i0,%l1,%l4
fbe 9f ! next_return
nop
fbu,a 9f ! next_return
fmuld %f2,%f0,%f0 ! + -> * for Cheetah
orcc %i1,%l4,%g0 ! see if x is zero
bne 1f
tst %i0
! x is zero, return sign(y)*min
and %i2,%l1,%i0
ba 4f ! next_final
mov 1,%i1
1: bge 2f
nop
! x is negative
fbl 1f ! next_subulp
nop
fbg 3f ! next_addulp
nop
2:
fbl 3f ! next_addulp
nop
1: ! next_subulp
subcc %i1,1,%i1
ba 4f ! next_final
subx %i0,0,%i0
3: ! next_addulp
addcc %i1,1,%i1
addx %i0,0,%i0
4: ! next_final
sethi %hi(0x7ff00000),%l3
std %i0,[%fp+x]
andcc %i0,%l3,%i2
be,a 1f ! xflow
ldd [%l0+tiny],%f2
cmp %i2,%l3
bne,a 9f ! next_return
ldd [%fp+x],%f0
call NAME(_SVID_libm_err) ! overflow
or %g0,46,%o4
ba 9f
nop
1: ! xflow
fmuld %f2,%f2,%f2
ldd [%fp+x],%f0
9: ! next_return
ret
restore
SET_SIZE(nextafter)