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 2005 Sun Microsystems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Use is subject to license terms.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .file "powl.s"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ Special cases:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ x ** 0 is 1
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ 1 ** y is 1 (C99)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ x ** NaN is NaN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ NaN ** y (except 0) is NaN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ x ** 1 is x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ +-(|x| > 1) ** +inf is +inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ +-(|x| > 1) ** -inf is +0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ +-(|x| < 1) ** +inf is +0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ +-(|x| < 1) ** -inf is +inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ (-1) ** +-inf is +1 (C99)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ +0 ** +y (except 0, NaN) is +0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ -0 ** +y (except 0, NaN, odd int) is +0
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/ -0 ** y (odd int) is - (+0 ** x)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ +inf ** +y (except 0, NaN) is +inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ +inf ** -y (except 0, NaN) is +0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ -inf ** +-y (except 0, NaN) is -0 ** -+y (NO z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ x ** -1 is 1/x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ x ** 2 is x*x
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
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include "libm.h"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr JasiukajtisLIBM_ANSI_PRAGMA_WEAK(powl,function)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include "xpg6.h"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .data
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .align 16
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisnegzero:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .float -0.0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtishalf:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .float 0.5
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisone:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .float 1.0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisnegone:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .float -1.0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtistwo:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .float 2.0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr JasiukajtisSnan:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .4byte 0x7f800001
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtispinfinity:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .4byte 0x7f800000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisninfinity:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .4byte 0xff800000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ENTRY(powl)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pushq %rbp
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movq %rsp,%rbp
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis PIC_SETUP(1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fldt 16(%rbp) / x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fxam / determine class of x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fnstsw %ax / store status in %ax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movb %ah,%dh / %dh <- condition code of x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fldt 32(%rbp) / y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fxam / determine class of y
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fnstsw %ax / store status in %ax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movb %ah,%dl / %dl <- condition code of y
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis call .pow_main /// LOCAL
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis PIC_WRAPUP
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis leave
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.pow_main:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x ** 0 is 1
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movb %dl,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis andb $0x45,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x40,%cl / C3=1 C2=0 C1=? C0=0 when +-0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jne 1f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / stack empty
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld1 / 1
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1: / y is not zero
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis PIC_G_LOAD(movzwq,__xpg6,rax)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis andl $_C99SUSv3_pow_treats_Inf_as_an_even_int,%eax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpl $0,%eax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis je 1f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / C99: 1 ** anything is 1
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld1 / 1, y, x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fucomip %st(2),%st / y, x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jp 1f / so that pow(NaN1,NaN2) returns NaN2
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jne 1f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x ** NaN is NaN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movb %dl,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis andb $0x45,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x01,%cl / C3=0 C2=0 C1=? C0=1 when +-NaN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jne 1f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(1) / y
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1: / y is not NaN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / NaN ** y (except 0) is NaN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movb %dh,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis andb $0x45,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x01,%cl / C3=0 C2=0 C1=? C0=1 when +-NaN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jne 1f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1: / x is not NaN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x ** 1 is x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld1 / 1, y, x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fcomip %st(1),%st / y, x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jne 1f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1: / y is not 1
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / +-(|x| > 1) ** +inf is +inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / +-(|x| > 1) ** -inf is +0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / +-(|x| < 1) ** +inf is +0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / +-(|x| < 1) ** -inf is +inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / +-(|x| = 1) ** +-inf is NaN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movb %dl,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis andb $0x47,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x05,%cl / C3=0 C2=1 C1=0 C0=1 when +inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis je .yispinf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x07,%cl / C3=0 C2=1 C1=1 C0=1 when -inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis je .yisninf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / +0 ** +y (except 0, NaN) is +0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / -0 ** +y (except 0, NaN, odd int) is +0
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 / -0 ** y (odd int) is - (+0 ** x)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movb %dh,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis andb $0x47,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x40,%cl / C3=1 C2=0 C1=0 C0=0 when +0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis je .xispzero
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x42,%cl / C3=1 C2=0 C1=1 C0=0 when -0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis je .xisnzero
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / +inf ** +y (except 0, NaN) is +inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / +inf ** -y (except 0, NaN) is +0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / -inf ** +-y (except 0, NaN) is -0 ** -+y (NO z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movb %dh,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis andb $0x47,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x05,%cl / C3=0 C2=1 C1=0 C0=1 when +inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis je .xispinf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x07,%cl / C3=0 C2=1 C1=1 C0=1 when -inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis je .xisninf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x ** -1 is 1/x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis flds PIC_L(negone) / -1, y, x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fcomip %st(1),%st / y, x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jne 1f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld %st(1) / x , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fdivrs PIC_L(one) / 1/x , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jmp .signok / check for over/underflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1: / y is not -1
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x ** 2 is x*x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis flds PIC_L(two) / 2, y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fcomip %st(1),%st / y, x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jne 1f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld %st(1) / x , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld %st(0) / x , x , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fmulp / x^2 , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jmp .signok / check for over/underflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1: / y is not 2
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x ** 1/2 is sqrt(x)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis flds PIC_L(half) / 1/2, y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fcomip %st(1),%st / y, x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jne 1f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld %st(1) / x , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fsqrt / sqrt(x) , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jmp .signok / check for over/underflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1: / y is not 1/2
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / make copies of x & y
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld %st(1) / x , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld %st(1) / y , x , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
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 Jasiukajtis fldz / 0 , y , x , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fcomip %st(2),%st / compare 0 with %st(2)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jb .merge / 0 < x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x < 0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis call .y_is_int
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpl $0,%ecx
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jne 1f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x < 0 & y != int so x**y = NaN (i flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / stack empty
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fldz
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fdiv %st,%st(0) / 0/0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1: / x < 0 & y = int
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fxch / x , y , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fchs / px = -x , y , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fxch / y , px , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.merge:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / px > 0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fxch / px , y , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x**y = exp(y*ln(x))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fyl2x / t=y*log2(px) , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld %st(0) / t , t , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis frndint / [t] , t , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fxch / t , [t] , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fucomi %st(1),%st
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis je 1f / t is integral
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fsub %st(1),%st / t-[t] , [t] , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis f2xm1 / 2**(t-[t])-1 , [t] , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fadds PIC_L(one) / 2**(t-[t]) , [t] , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fscale / 2**t = px**y , [t] , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jmp 2f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / t=[t] , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld1 / 1 , t , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fscale / 1*2**t = x**y , t , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis2:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(1) / x**y , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpl $1,%ecx
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jne .signok
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fchs / change sign since x<0 & y=-int
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.signok:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(2) / y , x**y
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x**y
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/ ------------------------------------------------------------------------
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.xispinf:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fldz
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fcomip %st(1),%st / compare 0 with %st(1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jb .retpinf / 0 < y
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jmp .retpzero / y < 0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.xisninf:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / -inf ** +-y is -0 ** -+y
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fchs / -y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis flds PIC_L(negzero) / -0 , -y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(2) / -y , -0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jmp .xisnzero
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.yispinf:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld %st(1) / x , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fabs / |x| , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis flds PIC_L(one) / 1 , |x| , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fcomip %st(1),%st / |x| , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis je .retponeorinvalid / x == -1 C99
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jb .retpinf / 1 < |x|
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jmp .retpzero / |x| < 1
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.yisninf:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld %st(1) / x , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fabs / |x| , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis flds PIC_L(one) / 1 , |x| , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fcomip %st(1),%st / |x| , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis je .retponeorinvalid / x == -1 C99
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jb .retpzero / 1 < |x|
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jmp .retpinf / |x| < 1
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.xispzero:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / y cannot be 0 or NaN ; stack has y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fldz / 0 , y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fcomip %st(1),%st / compare 0 with %st(1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jb .retpzero / 0 < y
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / x = +0 & y < 0 so x**y = +inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jmp .retpinfzflag / ret +inf & z flag
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.xisnzero:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / y cannot be 0 or NaN ; stack has y , x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis call .y_is_int
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpl $1,%ecx
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jne 1f / y is not an odd integer
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis / y is an odd integer
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fldz
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fcomip %st(1),%st / compare 0 with %st(1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jb .retnzero / 0 < y
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 movb %dh,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis andb $0x45,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpb $0x05,%cl / C3=0 C2=1 C1=? C0=1 when +-inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis je 2f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fdiv %st,%st(1) / y / x, x (raise z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis2:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / stack empty
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis flds PIC_L(ninfinity) / -inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1: / y is not an odd integer
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fldz
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fcomip %st(1),%st / compare 0 with %st(1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jb .retpzero / 0 < y
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 movb %dh,%cl
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis andb $0x45,%cl
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 jmp .retpinf / return +inf (NO z flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.retpzero:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / stack empty
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fldz / +0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.retnzero:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / stack empty
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis flds PIC_L(negzero) / -0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.retponeorinvalid:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis PIC_G_LOAD(movzwq,__xpg6,rax)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis andl $_C99SUSv3_pow_treats_Inf_as_an_even_int,%eax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpl $0,%eax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis je 1f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / stack empty
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fld1 / 1
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / stack empty
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis flds PIC_L(Snan) / Q NaN (i flag)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fwait
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.retpinf:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / stack empty
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis flds PIC_L(pinfinity) / +inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.retpinfzflag:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / x
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fstp %st(0) / stack empty
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fldz
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fdivrs PIC_L(one) / 1/0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
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/ %edx.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis.y_is_int:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movl 40(%rbp),%eax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis andl $0x7fff,%eax / exponent of y
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpl $0x403f,%eax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jae 1f / |y| >= 2^64, an even int
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpl $0x3fff,%eax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jb 2f / |y| < 1, can't be an int
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movl %eax,%ecx
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis subl $0x403e,%ecx
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis negl %ecx / 63 - unbiased exponent of y
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movq 32(%rbp),%rax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bsfq %rax,%rax / index of least sig. 1 bit
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis cmpl %ecx,%eax
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis jb 2f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ja 1f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movl $1,%ecx
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis1:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis movl $2,%ecx
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis2:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis xorl %ecx,%ecx
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ret
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .align 16
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis SET_SIZE(powl)