1/* $NetBSD: e_exp.S,v 1.12 2002/02/27 16:32:46 christos Exp $ */ 2 3/* 4 * Copyright (c) 1993,94 Winning Strategies, Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Winning Strategies, Inc. 18 * 4. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33/* 34 * Written by: 35 * J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc. 36 */ 37 38#include <machine/asm.h> 39 40#include "abi.h" 41 42RCSID("$NetBSD: e_exp.S,v 1.12 2002/02/27 16:32:46 christos Exp $") 43#if 0 44RCSID("$FreeBSD: src/lib/msun/i387/e_exp.S,v 1.8.2.1 2000/07/10 09:16:28 obrien Exp $") 45#endif 46 47/* e^x = 2^(x * log2(e)) */ 48ENTRY(__ieee754_exp) 49#ifndef __i386__ 50 /* 51 * XXX: This code is broken and needs to be merged with the i386 case. 52 */ 53 fstcw -12(%rsp) 54 movw -12(%rsp),%dx 55 orw $0x0180,%dx 56 movw %dx,-16(%rsp) 57 fldcw -16(%rsp) 58 movsd %xmm0,-8(%rsp) 59 fldl -8(%rsp) 60 61 fldl2e 62 fmulp /* x * log2(e) */ 63 fld %st(0) 64 frndint /* int(x * log2(e)) */ 65 fxch %st(1) 66 fsub %st(1),%st /* fract(x * log2(e)) */ 67 f2xm1 /* 2^(fract(x * log2(e))) - 1 */ 68 fld1 69 faddp /* 2^(fract(x * log2(e))) */ 70 fscale /* e^x */ 71 fstp %st(1) 72 73 fstpl -8(%rsp) 74 movsd -8(%rsp),%xmm0 75 fldcw -12(%rsp) 76 ret 77#else 78 /* 79 * If x is +-Inf, then the subtraction would give Inf-Inf = NaN. 80 * Avoid this. Also avoid it if x is NaN for convenience. 81 */ 82 movl 8(%esp),%eax 83 andl $0x7fffffff,%eax 84 cmpl $0x7ff00000,%eax 85 jae x_Inf_or_NaN 86 87 fldl 4(%esp) 88 89 /* 90 * Ensure that the rounding mode is to nearest (to give the smallest 91 * possible fraction) and that the precision is as high as possible. 92 * We may as well mask interrupts if we switch the mode. 93 */ 94 fstcw 4(%esp) 95 movl 4(%esp),%eax 96 andl $0x0300,%eax 97 cmpl $0x0300,%eax /* RC == 0 && PC == 3? */ 98 je 1f /* jump if mode is good */ 99 movl $0x137f,8(%esp) 100 fldcw 8(%esp) 1011: 102 fldl2e 103 fmulp /* x * log2(e) */ 104 fst %st(1) 105 frndint /* int(x * log2(e)) */ 106 fst %st(2) 107 fsubrp /* fract(x * log2(e)) */ 108 f2xm1 /* 2^(fract(x * log2(e))) - 1 */ 109 fld1 110 faddp /* 2^(fract(x * log2(e))) */ 111 fscale /* e^x */ 112 fstp %st(1) 113 je 1f 114 fldcw 4(%esp) 1151: 116 ret 117 118x_Inf_or_NaN: 119 /* 120 * Return 0 if x is -Inf. Otherwise just return x, although the 121 * C version would return (x + x) (Real Indefinite) if x is a NaN. 122 */ 123 cmpl $0xfff00000,8(%esp) 124 jne x_not_minus_Inf 125 cmpl $0,4(%esp) 126 jne x_not_minus_Inf 127 fldz 128 ret 129 130x_not_minus_Inf: 131 fldl 4(%esp) 132 ret 133#endif 134