1.file "significand.s" 2 3 4// Copyright (c) 2000 - 2003, Intel Corporation 5// All rights reserved. 6// 7// 8// Redistribution and use in source and binary forms, with or without 9// modification, are permitted provided that the following conditions are 10// met: 11// 12// * Redistributions of source code must retain the above copyright 13// notice, this list of conditions and the following disclaimer. 14// 15// * Redistributions in binary form must reproduce the above copyright 16// notice, this list of conditions and the following disclaimer in the 17// documentation and/or other materials provided with the distribution. 18// 19// * The name of Intel Corporation may not be used to endorse or promote 20// products derived from this software without specific prior written 21// permission. 22 23// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 24// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 25// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 26// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS 27// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 28// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 29// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 30// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 31// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING 32// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34// 35// Intel Corporation is the author of this code, and requests that all 36// problem reports or change requests be submitted to it directly at 37// http://www.intel.com/software/products/opensource/libraries/num.htm. 38// 39// History 40//============================================================== 41// 02/02/00 Initial version 42// 04/04/00 Unwind support added 43// 05/31/00 Fixed bug when x a double-extended denormal 44// 05/20/02 Cleaned up namespace and sf0 syntax 45// 02/10/03 Reordered header: .section, .global, .proc, .align 46// 47// API 48//============================================================== 49// double significand(double x) 50// 51// Overview of operation 52//============================================================== 53// If x = sig * 2**n with 1 <= sig < 2 54// significand returns sig 55// 56// predicate registers used: 57// p6, p7 58// 59// floating-point registers used: 60// f8, f9, f10 61 62.section .text 63GLOBAL_LIBM_ENTRY(significand) 64 65// qnan snan inf norm unorm 0 -+ 66// 1 1 1 0 0 1 11 67 68// f10 gets f8(sign) with f1(exp,significand) 69{ .mfi 70 nop.m 999 71 fmerge.s f10 = f8,f1 72 nop.i 999 73} 74{ .mfi 75 nop.m 999 76 fnorm.s0 f9 = f8 77 nop.i 999 ;; 78} 79 80// Test for denormal input 81{ .mfi 82 nop.m 999 83 fclass.m.unc p7,p0 = f8, 0x0b 84 nop.i 999 ;; 85} 86 87// p6 = TRUE ==> x is not (nan,inf,0) 88// return sign(f8) exp(f1) significand(f8) 89// else x is (nan,inf,0) 90// return sign(f8) exp(f8) significand(f8), normalized. 91{ .mfi 92 nop.m 999 93 fclass.m.unc p0,p6 = f8, 0xe7 94 nop.i 999 ;; 95} 96 97{ .mmb 98 nop.m 999 99 nop.m 999 100(p7) br.cond.spnt SIGNIFICAND_DENORM ;; // Branch if x denormal 101} 102 103{ .mfi 104 nop.m 999 105(p6) fmerge.se f8 = f10,f8 106 nop.i 999 ;; 107} 108 109{ .mfb 110 nop.m 999 111 fnorm.d.s0 f8 = f8 112 br.ret.sptk b0 ;; 113} 114 115SIGNIFICAND_DENORM: 116// Here if x denorm 117{ .mfi 118 nop.m 999 119 fmerge.se f8 = f10,f9 120 nop.i 999 ;; 121} 122 123// Check if fnorm(x) still denormal, means x double-extended denormal 124{ .mfi 125 nop.m 999 126 fclass.m.unc p7,p0 = f9, 0x0b 127 nop.i 999 ;; 128} 129 130// This will be the final result unless x double-extended denormal 131{ .mfi 132 nop.m 999 133 fnorm.d.s0 f8 = f8 134 nop.i 999 ;; 135} 136 137// If x double-extended denorm, then significand ok, but must merge in 138// correct signexp 139{ .mfi 140 nop.m 999 141(p7) fmerge.se f8 = f10,f8 142 nop.i 999 ;; 143} 144 145// Final normalization if x double-extended denorm 146{ .mfb 147 nop.m 999 148(p7) fnorm.d.s0 f8 = f8 149 br.ret.sptk b0 ;; 150} 151 152GLOBAL_LIBM_END(significand) 153