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 "ieee_funcl.s"
3025c28e83SPiotr Jasiukajtis
3125c28e83SPiotr Jasiukajtis#include "libm.h"
3225c28e83SPiotr Jasiukajtis
3325c28e83SPiotr Jasiukajtis	ENTRY(isinfl)
34*55fea89dSDan Cross	movl	16(%rsp),%eax		/ ax <-- sign and bexp of x
3525c28e83SPiotr Jasiukajtis	notl	%eax
3625c28e83SPiotr Jasiukajtis	andq	$0x7fff,%rax
3725c28e83SPiotr Jasiukajtis	jz	.L6
3825c28e83SPiotr Jasiukajtis	movq	$0,%rax
3925c28e83SPiotr Jasiukajtis.not_inf:
4025c28e83SPiotr Jasiukajtis	ret
4125c28e83SPiotr Jasiukajtis
4225c28e83SPiotr Jasiukajtis.L6:					/ here, (eax) = 0.0
4325c28e83SPiotr Jasiukajtis	movl	12(%rsp),%ecx
4425c28e83SPiotr Jasiukajtis	xorl	$0x80000000,%ecx	/ handle unsupported implicitly
4525c28e83SPiotr Jasiukajtis	orl	8(%rsp), %ecx
4625c28e83SPiotr Jasiukajtis	jnz	.not_inf
4725c28e83SPiotr Jasiukajtis	movq	$1,%rax
4825c28e83SPiotr Jasiukajtis	ret
4925c28e83SPiotr Jasiukajtis	.align	16
5025c28e83SPiotr Jasiukajtis	SET_SIZE(isinfl)
5125c28e83SPiotr Jasiukajtis
5225c28e83SPiotr Jasiukajtis	ENTRY(isnormall)
5325c28e83SPiotr Jasiukajtis					/ TRUE iff (x is finite, but
5425c28e83SPiotr Jasiukajtis					/	    neither subnormal nor zero)
55*55fea89dSDan Cross					/      iff (msb(sgnfcnd(x) /= 0
5625c28e83SPiotr Jasiukajtis					/	    &  0 < bexp(x) < 0x7fff)
5725c28e83SPiotr Jasiukajtis	movl	12(%rsp),%eax		/ eax <-- hi_32(sgnfcnd(x))
5825c28e83SPiotr Jasiukajtis	andl	$-0x80000000,%eax	/ eax[31]  <-- msb(sgnfcnd(x)),
5925c28e83SPiotr Jasiukajtis					/ rest_of(eax) <-- 0
6025c28e83SPiotr Jasiukajtis	jz	.L8			/ jump iff msb(sgnfcnd(x)) = 0
6125c28e83SPiotr Jasiukajtis	movl	16(%rsp),%eax		/ ax <-- sign and bexp of x
6225c28e83SPiotr Jasiukajtis	notl	%eax			/ ax[0..14] <-- not(bexp(x))
6325c28e83SPiotr Jasiukajtis	andq	$0x7fff,%rax		/ eax  <-- zero_xtnd(not(bexp(x)))
6425c28e83SPiotr Jasiukajtis	jz	.L8			/ jump	iff bexp(x) = 0x7fff or 0
6525c28e83SPiotr Jasiukajtis	xorq	$0x7fff,%rax		/ treat pseudo-denormal as subnormal
6625c28e83SPiotr Jasiukajtis	jz	.L8
6725c28e83SPiotr Jasiukajtis	movq	$1,%rax
6825c28e83SPiotr Jasiukajtis.L8:
6925c28e83SPiotr Jasiukajtis	ret
7025c28e83SPiotr Jasiukajtis	.align	16
7125c28e83SPiotr Jasiukajtis	SET_SIZE(isnormall)
7225c28e83SPiotr Jasiukajtis
7325c28e83SPiotr Jasiukajtis	ENTRY(issubnormall)
7425c28e83SPiotr Jasiukajtis					/ TRUE iff (bexp(x) = 0 &
7525c28e83SPiotr Jasiukajtis					/ msb(sgnfcnd(x)) = 0 & frac(x) /= 0)
7625c28e83SPiotr Jasiukajtis	movl	12(%rsp),%eax		/ eax <-- hi_32(sgnfcnd(x))
7725c28e83SPiotr Jasiukajtis	testl	$0x80000000,%eax	/ eax[31] = msb(sgnfcnd(x));
7825c28e83SPiotr Jasiukajtis					/ set ZF if it's 0.
7925c28e83SPiotr Jasiukajtis	jz	.may_be_subnorm		/ jump iff msb(sgnfcnd(x)) = 0
8025c28e83SPiotr Jasiukajtis.not_subnorm:
8125c28e83SPiotr Jasiukajtis	movq	$0,%rax
8225c28e83SPiotr Jasiukajtis	ret
8325c28e83SPiotr Jasiukajtis.may_be_subnorm:
8425c28e83SPiotr Jasiukajtis	testl	$0x7fff,16(%rsp)	/ set ZF iff bexp(x)  = 0
8525c28e83SPiotr Jasiukajtis	jnz	.not_subnorm		/ jump   iff bexp(x) /= 0
8625c28e83SPiotr Jasiukajtis	orl	8(%rsp),%eax		/ (eax) = 0 iff sgnfcnd(x) = 0
8725c28e83SPiotr Jasiukajtis	jz	.not_subnorm
8825c28e83SPiotr Jasiukajtis	movq	$1,%rax
8925c28e83SPiotr Jasiukajtis	ret
9025c28e83SPiotr Jasiukajtis	.align	16
9125c28e83SPiotr Jasiukajtis	SET_SIZE(issubnormall)
9225c28e83SPiotr Jasiukajtis
9325c28e83SPiotr Jasiukajtis	ENTRY(iszerol)
9425c28e83SPiotr Jasiukajtis	movl	16(%rsp),%eax		/ ax <-- sign and bexp of x
9525c28e83SPiotr Jasiukajtis	andl	$0x7fff,%eax		/ eax <-- zero_xtnd(bexp(x))
9625c28e83SPiotr Jasiukajtis	jz	.may_be_zero		/ jump iff bexp(x) = 0
9725c28e83SPiotr Jasiukajtis.not_zero:
9825c28e83SPiotr Jasiukajtis	movq	$0,%rax
9925c28e83SPiotr Jasiukajtis	ret
10025c28e83SPiotr Jasiukajtis.may_be_zero:				/ here, (eax) = 0
10125c28e83SPiotr Jasiukajtis	orl	12(%rsp),%eax		/ is hi_32(sgnfcnd(x)) = 0?
10225c28e83SPiotr Jasiukajtis	jnz	.not_zero		/ jump iff hi_32(sgnfcnd(x)) /= 0
10325c28e83SPiotr Jasiukajtis	orl	8(%rsp),%eax		/ is lo_32(sgnfcnd(x)) = 0?
10425c28e83SPiotr Jasiukajtis	jnz	.not_zero		/ jump iff lo_32(sgnfcnd(x)) /= 0
10525c28e83SPiotr Jasiukajtis	movq	$1,%rax
10625c28e83SPiotr Jasiukajtis	ret
10725c28e83SPiotr Jasiukajtis	.align	16
10825c28e83SPiotr Jasiukajtis	SET_SIZE(iszerol)
10925c28e83SPiotr Jasiukajtis
11025c28e83SPiotr Jasiukajtis	ENTRY(signbitl)
11125c28e83SPiotr Jasiukajtis	movl	16(%rsp),%eax		/ eax[15] <-- sign_bit(x)
11225c28e83SPiotr Jasiukajtis	shrl	$15,%eax		/ eax <-- zero_xtnd(sign_bit(x))
11325c28e83SPiotr Jasiukajtis	andq	$1,%rax
11425c28e83SPiotr Jasiukajtis	ret
11525c28e83SPiotr Jasiukajtis	.align	16
11625c28e83SPiotr Jasiukajtis	SET_SIZE(signbitl)
117