817 lines
22 KiB
ArmAsm
817 lines
22 KiB
ArmAsm
.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#
|
|
|
|
|