diff options
Diffstat (limited to 'sysdeps/ia64/fpu/e_log2l.S')
-rw-r--r-- | sysdeps/ia64/fpu/e_log2l.S | 817 |
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# - - |