xref: /titanic_52/usr/src/lib/libm/i386/src/ieee_funcl.s (revision ddc0e0b53c661f6e439e3b7072b3ef353eadb4af)
1*25c28e83SPiotr Jasiukajtis/*
2*25c28e83SPiotr Jasiukajtis * CDDL HEADER START
3*25c28e83SPiotr Jasiukajtis *
4*25c28e83SPiotr Jasiukajtis * The contents of this file are subject to the terms of the
5*25c28e83SPiotr Jasiukajtis * Common Development and Distribution License (the "License").
6*25c28e83SPiotr Jasiukajtis * You may not use this file except in compliance with the License.
7*25c28e83SPiotr Jasiukajtis *
8*25c28e83SPiotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*25c28e83SPiotr Jasiukajtis * or http://www.opensolaris.org/os/licensing.
10*25c28e83SPiotr Jasiukajtis * See the License for the specific language governing permissions
11*25c28e83SPiotr Jasiukajtis * and limitations under the License.
12*25c28e83SPiotr Jasiukajtis *
13*25c28e83SPiotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each
14*25c28e83SPiotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*25c28e83SPiotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the
16*25c28e83SPiotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying
17*25c28e83SPiotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner]
18*25c28e83SPiotr Jasiukajtis *
19*25c28e83SPiotr Jasiukajtis * CDDL HEADER END
20*25c28e83SPiotr Jasiukajtis */
21*25c28e83SPiotr Jasiukajtis/*
22*25c28e83SPiotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
23*25c28e83SPiotr Jasiukajtis */
24*25c28e83SPiotr Jasiukajtis/*
25*25c28e83SPiotr Jasiukajtis * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
26*25c28e83SPiotr Jasiukajtis * Use is subject to license terms.
27*25c28e83SPiotr Jasiukajtis */
28*25c28e83SPiotr Jasiukajtis
29*25c28e83SPiotr Jasiukajtis        .file "ieee_funcl.s"
30*25c28e83SPiotr Jasiukajtis
31*25c28e83SPiotr Jasiukajtis#include "libm.h"
32*25c28e83SPiotr Jasiukajtis
33*25c28e83SPiotr Jasiukajtis	ENTRY(isinfl)
34*25c28e83SPiotr Jasiukajtis	movl	12(%esp),%eax		/ ax <-- sign and bexp of x
35*25c28e83SPiotr Jasiukajtis	notl	%eax
36*25c28e83SPiotr Jasiukajtis	andl	$0x00007fff,%eax
37*25c28e83SPiotr Jasiukajtis	jz	.L6
38*25c28e83SPiotr Jasiukajtis	movl	$0,%eax
39*25c28e83SPiotr Jasiukajtis.not_inf:
40*25c28e83SPiotr Jasiukajtis	ret
41*25c28e83SPiotr Jasiukajtis
42*25c28e83SPiotr Jasiukajtis.L6:					/ here, (eax) = 0.0
43*25c28e83SPiotr Jasiukajtis	movl	8(%esp),%ecx
44*25c28e83SPiotr Jasiukajtis	xorl	$0x80000000,%ecx	/ handle unsupported implicitly
45*25c28e83SPiotr Jasiukajtis	orl	4(%esp), %ecx
46*25c28e83SPiotr Jasiukajtis	jnz	.not_inf
47*25c28e83SPiotr Jasiukajtis	movl	$1,%eax
48*25c28e83SPiotr Jasiukajtis	ret
49*25c28e83SPiotr Jasiukajtis	.align	4
50*25c28e83SPiotr Jasiukajtis	SET_SIZE(isinfl)
51*25c28e83SPiotr Jasiukajtis
52*25c28e83SPiotr Jasiukajtis	ENTRY(isnormall)
53*25c28e83SPiotr Jasiukajtis					/ TRUE iff (x is finite, but
54*25c28e83SPiotr Jasiukajtis					/	    neither subnormal nor zero)
55*25c28e83SPiotr Jasiukajtis					/      iff (msb(sgnfcnd(x) /= 0
56*25c28e83SPiotr Jasiukajtis					/	    &  0 < bexp(x) < 0x7fff)
57*25c28e83SPiotr Jasiukajtis	movl	8(%esp),%eax		/ eax <-- hi_32(sgnfcnd(x))
58*25c28e83SPiotr Jasiukajtis	andl	$0x80000000,%eax	/ eax[31]  <-- msb(sgnfcnd(x)),
59*25c28e83SPiotr Jasiukajtis					/ rest_of(eax) <-- 0
60*25c28e83SPiotr Jasiukajtis	jz	.L8			/ jump iff msb(sgnfcnd(x)) = 0
61*25c28e83SPiotr Jasiukajtis	movl	12(%esp),%eax		/ ax <-- sign and bexp of x
62*25c28e83SPiotr Jasiukajtis	notl	%eax			/ ax[0..14] <-- not(bexp(x))
63*25c28e83SPiotr Jasiukajtis	andl	$0x00007fff,%eax	/ eax  <-- zero_xtnd(not(bexp(x)))
64*25c28e83SPiotr Jasiukajtis	jz	.L8			/ jump	iff bexp(x) = 0x7fff or 0
65*25c28e83SPiotr Jasiukajtis	xorl	$0x00007fff,%eax	/ treat pseudo-denormal as subnormal
66*25c28e83SPiotr Jasiukajtis	jz	.L8
67*25c28e83SPiotr Jasiukajtis	movl	$1,%eax
68*25c28e83SPiotr Jasiukajtis.L8:
69*25c28e83SPiotr Jasiukajtis	ret
70*25c28e83SPiotr Jasiukajtis	.align	4
71*25c28e83SPiotr Jasiukajtis	SET_SIZE(isnormall)
72*25c28e83SPiotr Jasiukajtis
73*25c28e83SPiotr Jasiukajtis	ENTRY(issubnormall)
74*25c28e83SPiotr Jasiukajtis					/ TRUE iff (bexp(x) = 0 &
75*25c28e83SPiotr Jasiukajtis					/ msb(sgnfcnd(x)) = 0 & frac(x) /= 0)
76*25c28e83SPiotr Jasiukajtis	movl	8(%esp),%eax		/ eax <-- hi_32(sgnfcnd(x))
77*25c28e83SPiotr Jasiukajtis	testl	$0x80000000,%eax	/ eax[31] = msb(sgnfcnd(x));
78*25c28e83SPiotr Jasiukajtis					/ set ZF if it's 0.
79*25c28e83SPiotr Jasiukajtis	jz	.may_be_subnorm		/ jump iff msb(sgnfcnd(x)) = 0
80*25c28e83SPiotr Jasiukajtis.not_subnorm:
81*25c28e83SPiotr Jasiukajtis	movl	$0,%eax
82*25c28e83SPiotr Jasiukajtis.quicker_out:
83*25c28e83SPiotr Jasiukajtis	ret
84*25c28e83SPiotr Jasiukajtis.may_be_subnorm:
85*25c28e83SPiotr Jasiukajtis	testl	$0x00007fff,12(%esp)	/ set ZF iff bexp(x)  = 0
86*25c28e83SPiotr Jasiukajtis	jnz	.not_subnorm		/ jump   iff bexp(x) /= 0
87*25c28e83SPiotr Jasiukajtis	orl	4(%esp),%eax		/ (eax) = 0 iff sgnfcnd(x) = 0
88*25c28e83SPiotr Jasiukajtis	jz	.quicker_out
89*25c28e83SPiotr Jasiukajtis	movl	$1,%eax
90*25c28e83SPiotr Jasiukajtis	ret
91*25c28e83SPiotr Jasiukajtis	.align	4
92*25c28e83SPiotr Jasiukajtis	SET_SIZE(issubnormall)
93*25c28e83SPiotr Jasiukajtis
94*25c28e83SPiotr Jasiukajtis	ENTRY(iszerol)
95*25c28e83SPiotr Jasiukajtis	movl	12(%esp),%eax		/ ax <-- sign and bexp of x
96*25c28e83SPiotr Jasiukajtis	andl	$0x00007fff,%eax	/ eax <-- zero_xtnd(bexp(x))
97*25c28e83SPiotr Jasiukajtis	jz	.may_be_zero		/ jump iff bexp(x) = 0
98*25c28e83SPiotr Jasiukajtis.not_zero:
99*25c28e83SPiotr Jasiukajtis	movl	$0,%eax
100*25c28e83SPiotr Jasiukajtis	ret
101*25c28e83SPiotr Jasiukajtis.may_be_zero:				/ here, (eax) = 0
102*25c28e83SPiotr Jasiukajtis	orl	8(%esp),%eax		/ is hi_32(sgnfcnd(x)) = 0?
103*25c28e83SPiotr Jasiukajtis	jnz	.not_zero		/ jump iff hi_32(sgnfcnd(x)) /= 0
104*25c28e83SPiotr Jasiukajtis	orl	4(%esp),%eax		/ is lo_32(sgnfcnd(x)) = 0?
105*25c28e83SPiotr Jasiukajtis	jnz	.not_zero		/ jump iff lo_32(sgnfcnd(x)) /= 0
106*25c28e83SPiotr Jasiukajtis	movl	$1,%eax
107*25c28e83SPiotr Jasiukajtis	ret
108*25c28e83SPiotr Jasiukajtis	.align	4
109*25c28e83SPiotr Jasiukajtis	SET_SIZE(iszerol)
110*25c28e83SPiotr Jasiukajtis
111*25c28e83SPiotr Jasiukajtis	ENTRY(signbitl)
112*25c28e83SPiotr Jasiukajtis	movl	10(%esp),%eax		/ eax[31] <-- sign_bit(x)
113*25c28e83SPiotr Jasiukajtis	shrl	$31,%eax		/ eax <-- zero_xtnd(sign_bit(x))
114*25c28e83SPiotr Jasiukajtis	ret
115*25c28e83SPiotr Jasiukajtis	.align	4
116*25c28e83SPiotr Jasiukajtis	SET_SIZE(signbitl)
117