diff options
Diffstat (limited to 'sysdeps/ia64/fpu/e_log2l.S')
-rw-r--r-- | sysdeps/ia64/fpu/e_log2l.S | 816 |
1 files changed, 816 insertions, 0 deletions
diff --git a/sysdeps/ia64/fpu/e_log2l.S b/sysdeps/ia64/fpu/e_log2l.S new file mode 100644 index 0000000000..37af2f2553 --- /dev/null +++ b/sysdeps/ia64/fpu/e_log2l.S @@ -0,0 +1,816 @@ +.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# + + |