25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER START
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 * 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 * 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 * CDDL HEADER END
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Use is subject to license terms.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ Note: 0^SNaN should not signal "invalid" but this implementation
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ does because y is placed on the NPX stack.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ +0 ** -y (except 0, NaN) is +inf (z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ -0 ** -y (except 0, NaN, odd int) is +inf (z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ -inf ** +-y (except 0, NaN) is -0 ** -+y (NO z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ -x ** y (an integer) is (-1)**(y) * (+x)**(y)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ x ** y (x negative & y not integer) is NaN (i flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .long 0x7f800001
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .long 0x7f800000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .long 0xff800000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x40,%cl / C3=1 C2=0 C1=? C0=0 when +-0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis andl $_C99SUSv3_pow_treats_Inf_as_an_even_int,%eax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jp 1f / so that pow(NaN1,NaN2) returns NaN2
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x01,%cl / C3=0 C2=0 C1=? C0=1 when +-NaN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x01,%cl / C3=0 C2=0 C1=? C0=1 when +-NaN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x05,%cl / C3=0 C2=1 C1=0 C0=1 when +inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x07,%cl / C3=0 C2=1 C1=1 C0=1 when -inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / +0 ** -y (except 0, NaN) is +inf (z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / -0 ** -y (except 0, NaN, odd int) is +inf (z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x40,%cl / C3=1 C2=0 C1=0 C0=0 when +0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x42,%cl / C3=1 C2=0 C1=1 C0=0 when -0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / -inf ** +-y (except 0, NaN) is -0 ** -+y (NO z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x05,%cl / C3=0 C2=1 C1=0 C0=1 when +inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x07,%cl / C3=0 C2=1 C1=1 C0=1 when -inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / -x ** y (an integer) is (-1)**(y) * (+x)**(y)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x ** y (x negative & y not integer) is NaN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movl $0,%ecx / track whether to flip sign of result
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1: / x < 0 & y = int
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fxch / x , y , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis frndint / [t] , t , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fxch / t , [t] , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fadds PIC_L(one) / 2**(t-[t]) , [t] , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ ------------------------------------------------------------------------
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x = -0 & y < 0 (odd int) return -inf (z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x = -inf & y != 0 or NaN return -inf (NO z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x05,%cl / C3=0 C2=1 C1=? C0=1 when +-inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x = -0 & y < 0 (not odd int) return +inf (z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x = -inf & y not 0 or NaN return +inf (NO z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x05,%cl / C3=0 C2=1 C1=? C0=1 when +-inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jne .retpinfzflag / ret +inf & divide-by-0 flag
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis andl $_C99SUSv3_pow_treats_Inf_as_an_even_int,%eax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ Set %ecx to 2 if y is an even integer, 1 if y is an odd integer,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ 0 otherwise. Assume y is not zero. Do not raise inexact or modify
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movl %eax,%ecx
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis subl $150,%ecx
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis negl %ecx / 23 - unbiased exponent of y
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bsfl %eax,%eax / index of least sig. 1 bit
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpl %ecx,%eax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis xorl %ecx,%ecx
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis SET_SIZE(powf)