aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/ia64/fpu/e_log2l.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/ia64/fpu/e_log2l.S')
-rw-r--r--sysdeps/ia64/fpu/e_log2l.S817
1 files changed, 0 insertions, 817 deletions
diff --git a/sysdeps/ia64/fpu/e_log2l.S b/sysdeps/ia64/fpu/e_log2l.S
deleted file mode 100644
index b3fe63f182..0000000000
--- a/sysdeps/ia64/fpu/e_log2l.S
+++ /dev/null
@@ -1,817 +0,0 @@
-.file "log2l.s"
-
-
-// Copyright (c) 2000 - 2003, Intel Corporation
-// All rights reserved.
-//
-// Contributed 2000 by the Intel Numerics Group, Intel Corporation
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-//
-// * The name of Intel Corporation may not be used to endorse or promote
-// products derived from this software without specific prior written
-// permission.
-
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS
-// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING
-// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Intel Corporation is the author of this code, and requests that all
-// problem reports or change requests be submitted to it directly at
-// http://www.intel.com/software/products/opensource/libraries/num.htm.
-//
-// History
-//==============================================================
-// 09/25/00 Initial version
-// 11/22/00 Fixed accuracy bug (for mantissas near 1, 2)
-// 12/07/00 Fixed C_1l constant, eliminated rounding errors in
-// reduced argument (x*frcpa(x)-1)
-// 05/20/02 Cleaned up namespace and sf0 syntax
-// 02/10/03 Reordered header: .section, .global, .proc, .align
-//
-// API
-//==============================================================
-// long double log2l(long double)
-//
-// Overview of operation
-//==============================================================
-// Background
-//
-// Implementation
-//
-// Let x = 2^l * m, where m=1.b1 b2 ... b8 b9 ... b52
-// y=frcpa(m), r=m*y-1, f=b1 b2 .. b8
-// T_hi is a table that stores the 24 most significant bits of log2(1/y)
-// (in entries 1..255) in single precision format
-// T_low is a table that stores (log2(1/y)-T_high), rounded to double
-// precision
-//
-// f is used as an index; T_high[255]=T_low[255]=0
-//
-// If f=0 and b9=0, r is set to 2^{-8}* 0.b9 b10 ... b52 = m-1 (fractional part of m),
-// and 0 is used instead of T_high[0], T_low[0]
-// (polynomial evaluation only, for m=1+r, 0<=r<2^{-9})
-// If f=255, r is set to (m-2)/2 (T[255]=0, and only polynomial evaluation is used
-// for m=2(1-r'), 0<=r'<2^{-9})
-//
-// If 2^{-9}<=m<2-2^{-8} or (input not near 1), let C1r=(2^{16}+C1*r)-2^{16}
-// and let E=((RN(m*y)-1)-r)+(m*y-RN(m*y))
-// Else let C1r=C1*r (rounded to 64 significant bits) and let E=0
-//
-// Let D=C1*r-C1r
-//
-//
-// log2l(x) is approximated as
-// (l+T_high[f]+C1r) + (D+r*(c1+c2*r+c3*r^2...+c8*r^7)+(T_low[f]+C_1*E))
-//
-
-
-// Special values
-//==============================================================
-// log2l(0)=-inf, raises Divide by Zero
-// log2l(+inf)=inf
-// log2l(x)=NaN, raises Invalid if x<0
-//
-
-
-// Registers used
-//==============================================================
-// f6-f15, f32-f36
-// r2-r3, r23-r23
-// p6,p7,p8,p12
-//
-
-
-GR_SAVE_B0 = r33
-GR_SAVE_PFS = r34
-GR_SAVE_GP = r35 // This reg. can safely be used
-GR_SAVE_SP = r36
-
-GR_Parameter_X = r37
-GR_Parameter_Y = r38
-GR_Parameter_RESULT = r39
-GR_Parameter_TAG = r40
-
-FR_X = f10
-FR_Y = f1
-FR_RESULT = f8
-
-
-
-
-// Data tables
-//==============================================================
-
-RODATA
-
-.align 16
-
-LOCAL_OBJECT_START(poly_coeffs)
-
-data8 0xb8aa3b295c17f0bc, 0x00003fff // C_1
-data8 0x3fca61762a7aded9, 0xbfc71547652b82fe // C_7, C_8
-data8 0x3fd2776c50ef9bfe, 0xbfcec709dc3a03fd // C_5, C_6
-data8 0x3fdec709dc3a03fd, 0xbfd71547652b82fe // C_3, C_4
-//data8 0xd871319ff0342580, 0x0000bfbd // C_1l (low part of C1)
-data8 0x82f0025f2dc582ee, 0x0000bfbe // C_1l (low part of C1)
-data8 0xb8aa3b295c17f0bc, 0x0000bffe // C_2
-LOCAL_OBJECT_END(poly_coeffs)
-
-
-
-
-LOCAL_OBJECT_START(T_table)
-
-data4 0x3b38d875, 0x3c0ae7f4, 0x3c67f738, 0x3ca2b253
-data4 0x3ccbb91d, 0x3cfac91e, 0x3d1504a5, 0x3d29c4a0
-data4 0x3d419264, 0x3d567aa6, 0x3d6e76ca, 0x3d81c3f7
-data4 0x3d8c5630, 0x3d9876e9, 0x3da31e0a, 0x3dadcf09
-data4 0x3db889f9, 0x3dc34eec, 0x3dce1df5, 0x3dd8f726
-data4 0x3de3da94, 0x3deec851, 0x3df82ea4, 0x3e0197dd
-data4 0x3e071dad, 0x3e0ca8ca, 0x3e116d6e, 0x3e170281
-data4 0x3e1bcfbc, 0x3e216ee9, 0x3e2644dc, 0x3e2b1ee1
-data4 0x3e30cd12, 0x3e35affd, 0x3e3a970f, 0x3e3f824f
-data4 0x3e4544c0, 0x3e4a3926, 0x3e4f31d1, 0x3e542ec7
-data4 0x3e593012, 0x3e5e35b7, 0x3e633fbf, 0x3e677625
-data4 0x3e6c884b, 0x3e719eea, 0x3e76ba0a, 0x3e7bd9b2
-data4 0x3e80111d, 0x3e82a523, 0x3e84ccec, 0x3e876533
-data4 0x3e89ffd1, 0x3e8c2d22, 0x3e8e5c18, 0x3e90fd0a
-data4 0x3e932fa9, 0x3e95d506, 0x3e980b5a, 0x3e9a4361
-data4 0x3e9c7d1f, 0x3e9f2b16, 0x3ea168a0, 0x3ea3a7ea
-data4 0x3ea5e8f5, 0x3ea82bc4, 0x3eaa705b, 0x3eacb6bb
-data4 0x3eaefee7, 0x3eb148e3, 0x3eb394b1, 0x3eb5e255
-data4 0x3eb831d0, 0x3eba8327, 0x3ebcd65c, 0x3ebeb3e0
-data4 0x3ec10a7a, 0x3ec362f9, 0x3ec5bd63, 0x3ec7a0b3
-data4 0x3ec9fe96, 0x3ecc5e6c, 0x3ece4619, 0x3ed0a978
-data4 0x3ed293fe, 0x3ed4faf1, 0x3ed6e859, 0x3ed952eb
-data4 0x3edb433c, 0x3eddb178, 0x3edfa4bc, 0x3ee19953
-data4 0x3ee40cee, 0x3ee60484, 0x3ee7fd73, 0x3ee9f7bb
-data4 0x3eec7280, 0x3eee6fda, 0x3ef06e94, 0x3ef26eb1
-data4 0x3ef47031, 0x3ef67317, 0x3ef8f8b2, 0x3efafec5
-data4 0x3efd0644, 0x3eff0f32, 0x3f008cc8, 0x3f0192b0
-data4 0x3f029952, 0x3f03a0b0, 0x3f0466b2, 0x3f056f5a
-data4 0x3f0678c0, 0x3f0782e6, 0x3f088dcc, 0x3f099973
-data4 0x3f0aa5dd, 0x3f0b6fac, 0x3f0c7d6d, 0x3f0d8bf4
-data4 0x3f0e575b, 0x3f0f673e, 0x3f1077e9, 0x3f1144ef
-data4 0x3f1256fc, 0x3f1369d6, 0x3f143880, 0x3f154cc1
-data4 0x3f161c7a, 0x3f173227, 0x3f1802f2, 0x3f191a0f
-data4 0x3f19ebee, 0x3f1b047e, 0x3f1bd775, 0x3f1cf17b
-data4 0x3f1dc58e, 0x3f1ee10f, 0x3f1fb63f, 0x3f208bea
-data4 0x3f21a98f, 0x3f22805c, 0x3f2357a7, 0x3f247778
-data4 0x3f254fe9, 0x3f2628d9, 0x3f270249, 0x3f2824fb
-data4 0x3f28ff97, 0x3f29dab4, 0x3f2ab654, 0x3f2b9277
-data4 0x3f2cb8c8, 0x3f2d961e, 0x3f2e73fa, 0x3f2f525b
-data4 0x3f303143, 0x3f3110b1, 0x3f31f0a7, 0x3f32d125
-data4 0x3f33b22b, 0x3f3493bc, 0x3f3575d6, 0x3f36587b
-data4 0x3f373bab, 0x3f381f68, 0x3f3903b1, 0x3f39e888
-data4 0x3f3acdec, 0x3f3bb3e0, 0x3f3c9a63, 0x3f3d8177
-data4 0x3f3e1bd4, 0x3f3f03d9, 0x3f3fec71, 0x3f40d59b
-data4 0x3f41bf59, 0x3f42a9ab, 0x3f434635, 0x3f443180
-data4 0x3f451d61, 0x3f4609d9, 0x3f46a7d3, 0x3f479549
-data4 0x3f488357, 0x3f492261, 0x3f4a1171, 0x3f4b011c
-data4 0x3f4ba139, 0x3f4c91e8, 0x3f4d8334, 0x3f4e246a
-data4 0x3f4f16be, 0x3f5009b1, 0x3f50ac02, 0x3f51a001
-data4 0x3f524305, 0x3f533812, 0x3f53dbca, 0x3f54d1e7
-data4 0x3f55c8a8, 0x3f566d85, 0x3f57655b, 0x3f580af0
-data4 0x3f58b0d0, 0x3f59aa2c, 0x3f5a50c7, 0x3f5b4b3c
-data4 0x3f5bf294, 0x3f5cee26, 0x3f5d963c, 0x3f5e92ed
-data4 0x3f5f3bc3, 0x3f5fe4e7, 0x3f60e32d, 0x3f618d13
-data4 0x3f623748, 0x3f63372a, 0x3f63e223, 0x3f648d6b
-data4 0x3f658eee, 0x3f663afe, 0x3f66e75e, 0x3f67ea86
-data4 0x3f6897b0, 0x3f69452c, 0x3f69f2f9, 0x3f6af847
-data4 0x3f6ba6e2, 0x3f6c55d0, 0x3f6d0510, 0x3f6e0c8d
-data4 0x3f6ebc9f, 0x3f6f6d04, 0x3f701dbe, 0x3f70cecd
-data4 0x3f718030, 0x3f728ae6, 0x3f733d20, 0x3f73efaf
-data4 0x3f74a296, 0x3f7555d3, 0x3f760967, 0x3f76bd53
-data4 0x3f777197, 0x3f7880a1, 0x3f7935c2, 0x3f79eb3c
-data4 0x3f7aa10f, 0x3f7b573b, 0x3f7c0dc2, 0x3f7cc4a3
-data4 0x3f7d7bdf, 0x3f7e3376, 0x3f7eeb68, 0x00000000
-LOCAL_OBJECT_END(T_table)
-
-
-
-LOCAL_OBJECT_START(T_low)
-
-
-data8 0x3dc0b97f689876ef, 0x3dfd5d906028ac01
-data8 0x3df8b9cbb8d7240b, 0x3de0c941a2f220cd
-data8 0x3e09c6aecba15936, 0x3dfa6d528241827c
-data8 0x3dd0bad25714903c, 0x3e2776b01dc036a2
-data8 0x3e2b914bc77f158b, 0x3e1c0fafd29dc74a
-data8 0x3e28dadc119cd3de, 0x3e3bca869da085be
-data8 0x3e19d1e700f2200a, 0x3e3e13530cc37504
-data8 0x3e3936464d9c41ee, 0x3e3c3fa21c9499d0
-data8 0x3e3259e079b6c6e8, 0x3e2a364069c4f7f3
-data8 0x3e1274c84f6c6364, 0x3e3796170159f454
-data8 0x3e26e1e389f4364e, 0x3e28cedda8c7f658
-data8 0x3e376c2028433268, 0x3e4aee6d650c82e1
-data8 0x3e33e65094fbeeb4, 0x3e4c7d125aa92c5d
-data8 0x3e1559a4b69691d8, 0x3e18efabeb7d7221
-data8 0x3e4c2b255abaa8de, 0x3e37436952a4538b
-data8 0x3e4e6807f4ba00b8, 0x3e33ff5964190e42
-data8 0x3e4f5d798cead43c, 0x3e4f3676443bf453
-data8 0x3e4660f8d5bc1bf5, 0x3e2d4f9f3ab04f36
-data8 0x3e357f7a64ccd537, 0x3e394caf7c9b05af
-data8 0x3e225c7d17ab29b0, 0x3e4eb202f6d55a12
-data8 0x3e32faa68b19bcd2, 0x3e45ee1c9b566a8b
-data8 0x3e4770a67de054ff, 0x3e42234fb9de6d6b
-data8 0x3e4ad139825c6e19, 0x3e47f3d334814a93
-data8 0x3e2af1ec402867b6, 0x3e2bfbda0c956e3d
-data8 0x3e4287b831e77ff2, 0x3e54bf0eb77f7b89
-data8 0x3e5b9259a1029607, 0x3e4a764b015e699d
-data8 0x3e4d0b68ea883ab5, 0x3e33e829ecdadf46
-data8 0x3e52f27efef3031b, 0x3e3073979e4af89e
-data8 0x3e3b980f2cd6c253, 0x3e2a5f0f5f7f66a9
-data8 0x3e37788738117b02, 0x3e58aa29a784d52f
-data8 0x3e4f5504c4ff2466, 0x3e002d40340fa647
-data8 0x3e5f53b64592f4c3, 0x3e543f222c526802
-data8 0x3e5680e547a872fa, 0x3e5e234bd1154450
-data8 0x3e3000edc18b6d21, 0x3e1c3c1f000942a8
-data8 0x3e51eeae0e442d6e, 0x3e4fb265376623f2
-data8 0x3e57b5941782d830, 0x3e3a4b83f24ae52c
-data8 0x3e5a5fb4f23978de, 0x3e51ed071563fb02
-data8 0x3e49e2071f51a7a8, 0x3e5e43ae5b924234
-data8 0x3dfa2be9aedf374a, 0x3e56dea3dbba67d5
-data8 0x3e3375fe732b3c3e, 0x3e5a0c6f91f2e77e
-data8 0x3e55e1bf1c969e41, 0x3e30a5a5166b8eee
-data8 0x3e53e6e9a539d46c, 0x3e542981b3d7b0e6
-data8 0x3e595fd8ff36ad64, 0x3e5edeb9e65cbbb4
-data8 0x3e46aeab4d3434c1, 0x3e4ea3ff0564b010
-data8 0x3e59b00be2e3c25a, 0x3e5b887cd7b0821f
-data8 0x3e5f666668547b4d, 0x3e4d0733a805273f
-data8 0x3e26a2ff21c4aec5, 0x3e4c336f7a3a78f3
-data8 0x3e11ad12b628e2d0, 0x3e56d43ff3f0ea64
-data8 0x3e238809433cccd2, 0x3e40d9734147d40f
-data8 0x3e54245fe3e24e06, 0x3e251441fce4d48c
-data8 0x3e517114efc5d1f9, 0x3e5e9a99154b0d82
-data8 0x3e442a71337970f8, 0x3e420c7c69211fdf
-data8 0x3e537e7d5d43c6a7, 0x3e4376c66ad9ad8b
-data8 0x3e49054d678a4f1c, 0x3e5d23cb3bc19f18
-data8 0x3e6ebcd449dcab2b, 0x3e67f5fc2849c88a
-data8 0x3e63f388395d3e84, 0x3e65c1103b0ad7e9
-data8 0x3e6d5d1dd031f353, 0x3e5a159dae75c4d0
-data8 0x3e4d5e22aa75f71d, 0x3e5e379ee62e1e35
-data8 0x3e4df082213cb2dc, 0x3e6bfa06c156f521
-data8 0x3e66e2d3c19b517b, 0x3e426b7098590071
-data8 0x3e541bd027e9854e, 0x3e5061dd924b0ac0
-data8 0x3e6dae01df373a03, 0x3e3baec80b207b0b
-data8 0x3e6b6a6fe06bebac, 0x3e61aebcfc3ab5d1
-data8 0x3e584ee3e7c79d83, 0x3e6b3c1b2840cb40
-data8 0x3e6c842085d6befd, 0x3e6ac04fd7b141e0
-data8 0x3e6c48250474141d, 0x3e2d889b86125f69
-data8 0x3e6e74740225dad0, 0x3e45940d31d50a7c
-data8 0x3e695476a6c39ddc, 0x3e6d9a6d857a060a
-data8 0x3e4a3e9bb4b69337, 0x3e484f3ce4707ed6
-data8 0x3e39dd125d25fc27, 0x3e563fb400de8732
-data8 0x3e5fdd6d0ee28b48, 0x3e669d15b869bb07
-data8 0x3e40687cfad7964d, 0x3e69317990d43957
-data8 0x3e633d57e24ae1bd, 0x3e618bf03710eabb
-data8 0x3e4b4df6fccd1160, 0x3e3fb26ddaa1ec45
-data8 0x3e3810a5e1817fd4, 0x3e6857373642fa5c
-data8 0x3e673db6193add31, 0x3e63200c8acbc9c3
-data8 0x3e3d2dee448ebb62, 0x3e6a19723a80db6a
-data8 0x3e5e7cdab8fd3e6a, 0x3e671855cd660672
-data8 0x3e473c3c78a85ecd, 0x3e5f5e23056a7cf2
-data8 0x3e52538519527367, 0x3e4b573bcf2580e9
-data8 0x3e6d6f856fe90c60, 0x3e2d932a8487642e
-data8 0x3e5236fc78b6174c, 0x3e50cb91d406db50
-data8 0x3e650e8bd562aa57, 0x3e424ee3d9a82f2e
-data8 0x3e59363960e1e3d9, 0x3e379604c1150a3e
-data8 0x3e6d914f6c2ac258, 0x3e62967a451a7b48
-data8 0x3e684b5f01139cb2, 0x3e448bbfbf6d292c
-data8 0x3e6227e7fb487e73, 0x3e6d39d50290f458
-data8 0x3e58368342b4b668, 0x3e65dc0c25bd1763
-data8 0x3e61b7dc362e22b5, 0x3e671691f094bb80
-data8 0x3e5011642d5123f2, 0x3e4c4eb7f11e41be
-data8 0x3e5dcee36ca242cf, 0x3e6791cefff688f1
-data8 0x3e60e23c8dda4ecd, 0x3e48e6a22fe78cfe
-data8 0x3e6d703f244adc86, 0x3e6a281a85a5049d
-data8 0x3e570f20e6403d9e, 0x3e2211518a12956f
-data8 0x3e6737d1e54d71df, 0x3e66b1881476f5e9
-data8 0x3e6e1bbeef085376, 0x3e47cad4944a32be
-data8 0x3e527f2c738e7ee9, 0x3e699883a4b9fb29
-data8 0x3e5c17d1108740d9, 0x3e5d4a9c79a43389
-data8 0x3e49fdc24462ba3b, 0x3e24dbb3a60cceb2
-data8 0x3e5c5bf618780748, 0x3e5c38005b0c778c
-data8 0x3e6be168dd6dd3fe, 0x3e633ab9370693b0
-data8 0x3dd290556b0ae339, 0x3e607c317927096a
-data8 0x3e59651353b3d90e, 0x3e4d8751e5e0ae0d
-data8 0x3e46c81023272a85, 0x3e6b23c988f391b2
-data8 0x3e608741d215209c, 0x3e60b8ba506d758f
-data8 0x3e62ddbe74803297, 0x3e5dbb8b5087587d
-data8 0x3e642aa529048131, 0x3e3dcbda6835dcf4
-data8 0x3e6db503ce854d2a, 0x3e6dd00b49bc6849
-data8 0x3e4db2f11243bc84, 0x3e3b9848efc2ea97
-data8 0x3e58f18e17c82609, 0x3e6ed8645e16c312
-data8 0x3e4065bdb60a5dd4, 0x3e490453c6e6c30a
-data8 0x3e62373994aa31ba, 0x3e56305f0e6b2a95
-data8 0x3e68c1601a6614ee, 0x3e614e204f19d93f
-data8 0x3e6e5037ca773299, 0x3e693f98892561a6
-data8 0x3e639de4f4bf700d, 0x3e416c071e93fd97
-data8 0x3e65466991b415ef, 0x3e6896a324afac9d
-data8 0x3e44f64802e2f11c, 0x3e64d7d747e2191a
-data8 0x3e6174b7581de84c, 0x3e44c7b946e1d43c
-data8 0x3e6a3bcbe30512ec, 0x3e5d3ed411c95ce4
-data8 0x3e3e5b5735cfaf8e, 0x3e6e538ab34efb51
-data8 0x3e514e204f19d93f, 0x3e5a88e6550c89a4
-data8 0x3e66b97a5d9dfd8b, 0x3e5f46b1e14ebaf3
-data8 0x3e357665f6893f5d, 0x3e6bbf633078d1d5
-data8 0x3e5e7337a212c417, 0x3e3570fde15fc8cc
-data8 0x3e21119402da92b4, 0x3e6566e830d1ff3b
-data8 0x3e558883e480e220, 0x3e589ca3a68da411
-data8 0x3e44eb66df73d648, 0x3e1a0a629b1b7e68
-data8 0x3e54cc207b8c1116, 0x0000000000000000
-LOCAL_OBJECT_END(T_low)
-
-
-.section .text
-GLOBAL_IEEE754_ENTRY(log2l)
-
-{ .mfi
- alloc r32=ar.pfs,1,4,4,0
- // normalize x
- // y=frcpa(x)
- frcpa.s1 f41,p0=f1,f8
- // r26=bias-1
- mov r26=0xfffe
-}
-{.mfi
- // r23=bias+16
- mov r23=0xffff+16
- fma.s1 f7=f8,f1,f0
- // r2 = pointer to C_1...C_6 followed by T_table
- addl r2 = @ltoff(poly_coeffs), gp;;
-}
-{.mfi
- // get significand
- getf.sig r25=f8
- // f8 denormal ?
- fclass.m p8,p10=f8,0x9
- // r24=bias-8
- mov r24=0xffff-8;;
-}
-{.mfi
- setf.exp f36=r26
- nop.f 0
- // r27=bias
- mov r27=0xffff;;
-}
-
-{.mmf
- getf.exp r29=f8
- // load start address for C_1...C_7 followed by T_table
- ld8 r2=[r2]
- // will continue only for positive normal/unnormal numbers
- fclass.m.unc p0,p12 = f8, 0x19;;
-}
-
-
-.pred.rel "mutex",p8,p10
-{.mfi
- // denormal input, repeat get significand (after normalization)
- (p8) getf.sig r25=f7
- // x=1 ?
- fcmp.eq.s0 p6,p0=f8,f1
- // get T_index
- (p10) shr.u r28=r25,63-8
-}
-{.mfi
- // f32=2^16
- setf.exp f32=r23
- nop.f 0
- mov r26=0x804;;
-}
-
-{.mfi
- // denormal input, repeat get exponent (after normalization)
- (p8) getf.exp r29=f7
- // f33=0
- mov f33=f0
- // r26=0x80400...0 (threshold for using polynomial approximation)
- shl r26=r26,64-12;;
-}
-
-{.mfb
- add r3=16,r2
- // r=x*y-1
- fms.s1 f6=f41,f8,f1
- (p12) br.cond.spnt SPECIAL_log2l
-}
-{.mfi
- // load C_1
- ldfe f14=[r2],48
- // RN(x*y)
- fma.s1 f43=f41,f8,f0
- mov r23=0xff;;
-}
-
-{.mmi
- // load C_7, C_8
- ldfpd f10,f11=[r3],16
- // load C_3,C_4
- ldfpd f15,f42=[r2],16
- (p8) shr.u r28=r25,63-8;;
-}
-
-
-{.mfi
- // load C_5, C_6
- ldfpd f12,f13=[r3]
- // pseudo-zero ?
- fcmp.eq.s0 p7,p0=f7,f0
- // if first 9 bits after leading 1 are all zero, then p8=1
- cmp.ltu p8,p12=r25,r26
-}
-{.mfi
- // load C1l
- ldfe f34=[r2],16
- fmerge.se f7=f1,f7
- // get T_index
- and r28=r28,r23;;
-}
-{.mfi
- // r29=exponent-bias
- sub r29=r29,r27
- // if first 8 bits after leading bit are 0, use polynomial approx. only
- (p8) fms.s1 f6=f7,f1,f1
- // start address of T_low
- add r3=1024+16,r2
-}
-{.mfi
- // load C_2
- ldfe f35=[r2],16
- // x=1, return 0
- (p6) fma.s0 f8=f0,f0,f0
- // first 8 bits after leading 1 are all ones ?
- cmp.eq p10,p0=r23,r28;;
-}
-
-{.mfb
- // if first 8 bits after leading 1 are all ones, use polynomial approx. only
- // add 1 to the exponent additive term, and estimate log2(1-r)
- (p10) add r29=1,r29
- nop.f 0
- (p7) br.cond.spnt LOG2_PSEUDO_ZERO
-}
-{.mfi
- // get T_low adress
- shladd r3=r28,3,r3
- // if first 8 bits after leading 1 are all ones, use polynomial approx. only
- (p10) fms.s1 f6=f7,f36,f1
- // p10 --> p8=1, p12=0
- (p10) cmp.eq p8,p12=r0,r0;;
-}
-
-{.mfi
- // get T_high address
- shladd r2=r28,2,r2
- // L(x*y)=x*y-RN(x*y)
- fms.s1 f41=f41,f8,f43
- nop.i 0
-}
-{.mfi
- // p13=p12
- (p12) cmp.eq.unc p13,p0=r0,r0
- // RtH=RN(x*y)-1 (will eliminate rounding errors in r)
- fms.s1 f43=f43,f1,f1
- nop.i 0;;
-}
-
-.pred.rel "mutex",p8,p12
-{.mfb
- // load T_high (unless first 9 bits after leading 1 are 0)
- (p12) ldfs f7=[r2]
- // set T_high=0 (if first 9 bits after leading 1 are 0)
- (p8) fma.s1 f7=f0,f0,f0
- // x=1, return
- (p6) br.ret.spnt b0
-}
-.pred.rel "mutex",p8,p12
-{.mfi
- // p12: load T_low
- (p12) ldfd f36=[r3]
- // p8: set T_low=0
- (p8) fma.s1 f36=f0,f0,f0
- (p8) cmp.eq p8,p12=r29,r0;; //nop.i 0;;
-}
-
-.pred.rel "mutex",p8,p12
-{.mfi
- // f8=expon - bias
- setf.sig f8=r29
- // general case: 2^{16}+C1*r
- (p12) fma.s1 f33=f6,f14,f32
- nop.i 0
-}
-{.mfi
- // r26=1
- mov r26=1
- // p8 (mantissa is close to 1, or close to 2): 2^{-8}+C1*r
- (p8) fma.s1 f32=f6,f14,f33
- nop.i 0;;
-}
-
-{.mfi
- nop.m 0
- // P78=C_7+C_8*r
- fma.s1 f10=f11,f6,f10
- // r26=2^{63}
- shl r26=r26,63
-}
-{.mfi
- nop.m 0
- // P34=C_3+r*C_4
- fma.s1 f15=f42,f6,f15
- nop.i 0;;
-}
-{.mfi
- nop.m 0
- // r2=r*r
- fma.s1 f11=f6,f6,f0
- nop.i 0
-}
-{.mfi
- nop.m 0
- // P56=C_5+C_6*r
- fma.s1 f13=f13,f6,f12
- nop.i 0;;
-}
-
-{.mfi
- nop.m 0
- // Rth-r
- (p13) fms.s1 f43=f43,f1,f6
- nop.i 0
-}
-{.mfi
- // significand(x)=1 ?
- cmp.eq p0,p6=r25,r26
- // P12=C1l+C_2*r
- fma.s1 f34=f35,f6,f34
- nop.i 0;;
-}
-
-.pred.rel "mutex",p8,p12
-{.mfi
- nop.m 0
- // p12: C1r=(2^{16}+C1*r)-2^{16}
- (p12) fms.s1 f32=f33,f1,f32
- nop.i 0
-}
-{.mfi
- nop.m 0
- // p8: C1r=C1*r (double extended)
- (p8) fms.s1 f32=f32,f1,f33
- nop.i 0;;
-}
-
-{.mfi
- nop.m 0
- // L(x*y)*C_1+T_low
- (p13) fma.s1 f36=f41,f14,f36
- nop.i 0
-}
-{.mfi
- nop.m 0
- // P58=P56+r2*P78
- fma.s1 f13=f11,f10,f13
- nop.i 0;;
-}
-{.mfi
- nop.m 0
- // P14=P12+r2*P34
- fma.s1 f15=f15,f11,f34
- nop.i 0
-}
-{.mfi
- nop.m 0
- // r4=r2*r2
- fma.s1 f11=f11,f11,f0
- nop.i 0;;
-}
-
-{.mfi
- nop.m 0
- // normalize additive term (l=exponent of x)
- fcvt.xf f8=f8
- nop.i 0;;
-}
-
-
-{.mfi
- nop.m 0
- // D=C1*r-C1r
- (p6) fms.s1 f12=f14,f6,f32
- nop.i 0;;
-}
-
-{.mfi
- nop.m 0
- // T_low'=(Rth-r)*C1+(L(x*y)*C1+T_low)
- (p13) fma.s1 f36=f43,f14,f36
- nop.i 0;;
-}
-{.mfi
- nop.m 0
- // P18=P14+r4*P58
- (p6) fma.s1 f13=f11,f13,f15
- nop.i 0;;
-}
-
-{.mfi
- nop.m 0
- // add T_high+l
- (p6) fma.s1 f8=f8,f1,f7
- nop.i 0;;
-}
-
-
-{.mfi
- nop.m 0
- // D+T_low
- (p6) fma.s1 f12=f12,f1,f36
- nop.i 0;;
-}
-
-
-{.mfi
- nop.m 0
- // (T_high+l)+C1r
- (p6) fma.s1 f8=f8,f1,f32
- nop.i 0
-}
-{.mfi
- nop.m 0
- // (D+T_low)+r*P18
- (p6) fma.s1 f13=f13,f6,f12
- nop.i 0;;
-}
-
-//{.mfb
-//nop.m 0
-//mov f8=f36
-//fma.s0 f8=f13,f6,f0
-//br.ret.sptk b0;;
-//}
-
-
-{.mfb
- nop.m 0
- // result=((T_high+l)+C1r)+((D+T_low)+r*P18)
- (p6) fma.s0 f8=f13,f1,f8
- // return
- br.ret.sptk b0;;
-}
-
-
-SPECIAL_log2l:
-{.mfi
- nop.m 0
- mov FR_X=f8
- nop.i 0
-}
-{.mfi
- nop.m 0
- // x=+Infinity ?
- fclass.m p7,p0=f8,0x21
- nop.i 0;;
-}
-{.mfi
- nop.m 0
- // x=+/-Zero ?
- fclass.m p8,p0=f7,0x7
- nop.i 0;;
-}
-{.mfi
- nop.m 0
- // x=-Infinity, -normal, -denormal ?
- fclass.m p6,p0=f8,0x3a
- nop.i 0;;
-}
-{.mfb
- nop.m 0
- // log2l(+Infinity)=+Infinity
- nop.f 0
- (p7) br.ret.spnt b0;;
-}
-{.mfi
- (p8) mov GR_Parameter_TAG = 168
- // log2l(+/-0)=-infinity, raises Divide by Zero
- // set f8=-0
- (p8) fmerge.ns f8=f0,f8
- nop.i 0;;
-}
-{.mfb
- nop.m 0
- (p8) frcpa.s0 f8,p0=f1,f8
- (p8) br.cond.sptk __libm_error_region;;
-}
-{.mfb
- (p6) mov GR_Parameter_TAG = 169
- // x<0: return NaN, raise Invalid
- (p6) frcpa.s0 f8,p0=f0,f0
- (p6) br.cond.sptk __libm_error_region;;
-}
-
-
-{.mfb
- nop.m 0
- // Remaining cases: NaNs
- fma.s0 f8=f8,f1,f0
- br.ret.sptk b0;;
-}
-
-LOG2_PSEUDO_ZERO:
-
-{.mfi
- nop.m 0
- mov FR_X=f8
- nop.i 0
-}
-{.mfi
- mov GR_Parameter_TAG = 168
- // log2l(+/-0)=-infinity, raises Divide by Zero
- // set f8=-0
- fmerge.ns f8=f0,f8
- nop.i 0;;
-}
-{.mfb
- nop.m 0
- frcpa.s0 f8,p0=f1,f8
- br.cond.sptk __libm_error_region;;
-}
-
-
-GLOBAL_IEEE754_END(log2l)
-
-
-LOCAL_LIBM_ENTRY(__libm_error_region)
-.prologue
-{ .mfi
- add GR_Parameter_Y=-32,sp // Parameter 2 value
- nop.f 0
-.save ar.pfs,GR_SAVE_PFS
- mov GR_SAVE_PFS=ar.pfs // Save ar.pfs
-}
-{ .mfi
-.fframe 64
- add sp=-64,sp // Create new stack
- nop.f 0
- mov GR_SAVE_GP=gp // Save gp
-};;
-{ .mmi
- stfe [GR_Parameter_Y] = FR_Y,16 // STORE Parameter 2 on stack
- add GR_Parameter_X = 16,sp // Parameter 1 address
-.save b0, GR_SAVE_B0
- mov GR_SAVE_B0=b0 // Save b0
-};;
-.body
-{ .mib
- stfe [GR_Parameter_X] = FR_X // STORE Parameter 1 on stack
- add GR_Parameter_RESULT = 0,GR_Parameter_Y // Parameter 3 address
- nop.b 0
-}
-{ .mib
- stfe [GR_Parameter_Y] = FR_RESULT // STORE Parameter 3 on stack
- add GR_Parameter_Y = -16,GR_Parameter_Y
- br.call.sptk b0=__libm_error_support# // Call error handling function
-};;
-{ .mmi
- nop.m 0
- nop.m 0
- add GR_Parameter_RESULT = 48,sp
-};;
-{ .mmi
- ldfe f8 = [GR_Parameter_RESULT] // Get return result off stack
-.restore sp
- add sp = 64,sp // Restore stack pointer
- mov b0 = GR_SAVE_B0 // Restore return address
-};;
-{ .mib
- mov gp = GR_SAVE_GP // Restore gp
- mov ar.pfs = GR_SAVE_PFS // Restore ar.pfs
- br.ret.sptk b0 // Return
-};;
-
-LOCAL_LIBM_END(__libm_error_region)
-.type __libm_error_support#,@function
-.global __libm_error_support#
-
-