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" 32 LIBM_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: 50 two54 = 0x00 51 .word 0x43500000,0x0 ! 2**54 52 twom54 = 0x08 53 .word 0x3c900000,0x0 ! 2**-54 54 tiny = 0x10 55 .word 0x00100000,0x0 ! tiny 56 57 ! variable using fp 58 x = -0x8 59 y = -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 87 1: bge 2f 88 nop 89 ! x is negative 90 fbl 1f ! next_subulp 91 nop 92 fbg 3f ! next_addulp 93 nop 94 2: 95 fbl 3f ! next_addulp 96 nop 97 1: ! next_subulp 98 subcc %i1,1,%i1 99 ba 4f ! next_final 100 subx %i0,0,%i0 101 3: ! next_addulp 102 addcc %i1,1,%i1 103 addx %i0,0,%i0 104 4: ! 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 117 1: ! xflow 118 fmuld %f2,%f2,%f2 119 ldd [%fp+x],%f0 120 9: ! next_return 121 ret 122 restore 123 124 SET_SIZE(nextafter)