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