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