125c28e83SPiotr Jasiukajtis/* 225c28e83SPiotr Jasiukajtis * CDDL HEADER START 325c28e83SPiotr Jasiukajtis * 425c28e83SPiotr Jasiukajtis * The contents of this file are subject to the terms of the 525c28e83SPiotr Jasiukajtis * Common Development and Distribution License (the "License"). 625c28e83SPiotr Jasiukajtis * You may not use this file except in compliance with the License. 725c28e83SPiotr Jasiukajtis * 825c28e83SPiotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 925c28e83SPiotr Jasiukajtis * or http://www.opensolaris.org/os/licensing. 1025c28e83SPiotr Jasiukajtis * See the License for the specific language governing permissions 1125c28e83SPiotr Jasiukajtis * and limitations under the License. 1225c28e83SPiotr Jasiukajtis * 1325c28e83SPiotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each 1425c28e83SPiotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1525c28e83SPiotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the 1625c28e83SPiotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying 1725c28e83SPiotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner] 1825c28e83SPiotr Jasiukajtis * 1925c28e83SPiotr Jasiukajtis * CDDL HEADER END 2025c28e83SPiotr Jasiukajtis */ 2125c28e83SPiotr Jasiukajtis/* 2225c28e83SPiotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 2325c28e83SPiotr Jasiukajtis */ 2425c28e83SPiotr Jasiukajtis/* 2525c28e83SPiotr Jasiukajtis * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 2625c28e83SPiotr Jasiukajtis * Use is subject to license terms. 2725c28e83SPiotr Jasiukajtis */ 2825c28e83SPiotr Jasiukajtis 2925c28e83SPiotr Jasiukajtis .file "exp2l.s" 3025c28e83SPiotr Jasiukajtis 3125c28e83SPiotr Jasiukajtis#include "libm.h" 3225c28e83SPiotr JasiukajtisLIBM_ANSI_PRAGMA_WEAK(exp2l,function) 3325c28e83SPiotr Jasiukajtis 3425c28e83SPiotr Jasiukajtis ENTRY(exp2l) 3525c28e83SPiotr Jasiukajtis movl 16(%rsp),%ecx / cx <--sign&bexp(x) 3625c28e83SPiotr Jasiukajtis andl $0x7fff,%ecx / ecx <-- zero_xtnd(bexp(x)) 3725c28e83SPiotr Jasiukajtis cmpl $0x3fff,%ecx / Is |x| <= 1? 3825c28e83SPiotr Jasiukajtis jb .shortcut / If so, take a shortcut. 3925c28e83SPiotr Jasiukajtis je .check_tail / |x| may be slightly > 1 4025c28e83SPiotr Jasiukajtis.general_case: / Here, |x| > 1 or x is NaN 4125c28e83SPiotr Jasiukajtis cmpl $0x7fff,%ecx / bexp(|x|) = bexp(INF)? 4225c28e83SPiotr Jasiukajtis je .not_finite / if so, x is not finite 4325c28e83SPiotr Jasiukajtis.finite_non_special: / Here, 1 < |x| < INF 4425c28e83SPiotr Jasiukajtis fldt 8(%rsp) / push arg 4525c28e83SPiotr Jasiukajtis fld %st(0) / duplicate stack top 4625c28e83SPiotr Jasiukajtis frndint / [x],x 4725c28e83SPiotr Jasiukajtis fucomi %st(1),%st / x integral? 4825c28e83SPiotr Jasiukajtis je .x_integral / branch if x integral 4925c28e83SPiotr Jasiukajtis fxch / x, [x] 5025c28e83SPiotr Jasiukajtis fsub %st(1),%st / x-[x], [x] 5125c28e83SPiotr Jasiukajtis f2xm1 / 2**(x-[x])-1, [x] 5225c28e83SPiotr Jasiukajtis fld1 / 1,2**(x-[x])-1, [x] 5325c28e83SPiotr Jasiukajtis faddp %st,%st(1) / 2**(x-[x]), [x] 5425c28e83SPiotr Jasiukajtis fscale / 2**x = 2**(arg), [x] 5525c28e83SPiotr Jasiukajtis fstp %st(1) 5625c28e83SPiotr Jasiukajtis ret 5725c28e83SPiotr Jasiukajtis 5825c28e83SPiotr Jasiukajtis.x_integral: 5925c28e83SPiotr Jasiukajtis fstp %st(0) / ,x 6025c28e83SPiotr Jasiukajtis fld1 / 1 = 2**0, x 6125c28e83SPiotr Jasiukajtis fscale / 2**(0 + x) = 2**x, x 6225c28e83SPiotr Jasiukajtis fstp %st(1) / 2**x 6325c28e83SPiotr Jasiukajtis ret 6425c28e83SPiotr Jasiukajtis 6525c28e83SPiotr Jasiukajtis.check_tail: 6625c28e83SPiotr Jasiukajtis movl 12(%rsp),%ecx / ecx <-- hi_32(sgnfcnd(x)) 6725c28e83SPiotr Jasiukajtis cmpl $0x80000000,%ecx / Is |x| <= 1? 6825c28e83SPiotr Jasiukajtis ja .finite_non_special 6925c28e83SPiotr Jasiukajtis movl 8(%rsp),%edx / edx <-- lo_32(sgnfcnd(x)) 7025c28e83SPiotr Jasiukajtis cmpl $0x0,%edx / Is |x| slightly > 1? 7125c28e83SPiotr Jasiukajtis ja .finite_non_special / branch if |x| slightly > 1 7225c28e83SPiotr Jasiukajtis.shortcut: 7325c28e83SPiotr Jasiukajtis / Here, |x| < 1, 7425c28e83SPiotr Jasiukajtis / whence x is in f2xm1's domain. 7525c28e83SPiotr Jasiukajtis fldt 8(%rsp) / push x 7625c28e83SPiotr Jasiukajtis f2xm1 / 2**x - 1 7725c28e83SPiotr Jasiukajtis fld1 / 1,2**x - 1 7825c28e83SPiotr Jasiukajtis faddp %st,%st(1) / 2**x 7925c28e83SPiotr Jasiukajtis ret 8025c28e83SPiotr Jasiukajtis 8125c28e83SPiotr Jasiukajtis.not_finite: 8225c28e83SPiotr Jasiukajtis movl 12(%rsp),%ecx / ecx <-- hi_32(sgnfcnd(x)) 8325c28e83SPiotr Jasiukajtis cmpl $0x80000000,%ecx / hi_32(|x|) = hi_32(INF)? 84*55fea89dSDan Cross jne .NaN_or_pinf / if not, x is NaN 8525c28e83SPiotr Jasiukajtis movl 8(%rsp),%edx / edx <-- lo_32(x) 8625c28e83SPiotr Jasiukajtis cmpl $0,%edx / lo_32(x) = 0? 8725c28e83SPiotr Jasiukajtis jne .NaN_or_pinf / if not, x is NaN 8825c28e83SPiotr Jasiukajtis movl 16(%rsp),%eax / ax <-- sign&bexp((x)) 8925c28e83SPiotr Jasiukajtis andl $0x8000,%eax / here, x is infinite, but +/-? 9025c28e83SPiotr Jasiukajtis jz .NaN_or_pinf / branch if x = +INF 9125c28e83SPiotr Jasiukajtis fldz / Here, x = -inf, so return 0 9225c28e83SPiotr Jasiukajtis ret 9325c28e83SPiotr Jasiukajtis 9425c28e83SPiotr Jasiukajtis.NaN_or_pinf: 9525c28e83SPiotr Jasiukajtis / Here, x = NaN or +inf, so load x and return immediately. 9625c28e83SPiotr Jasiukajtis fldt 8(%rsp) 9725c28e83SPiotr Jasiukajtis ret 9825c28e83SPiotr Jasiukajtis .align 16 9925c28e83SPiotr Jasiukajtis SET_SIZE(exp2l) 100