1. 18 4月, 2015 1 次提交
  2. 12 3月, 2015 3 次提交
    • S
      add aarch64 port · 01ef3dd9
      Szabolcs Nagy 提交于
      This adds complete aarch64 target support including bigendian subarch.
      
      Some of the long double math functions are known to be broken otherwise
      interfaces should be fully functional, but at this point consider this
      port experimental.
      
      Initial work on this port was done by Sireesh Tripurari and Kevin Bortis.
      01ef3dd9
    • S
      math: add dummy implementations of 128 bit long double functions · f4e4632a
      Szabolcs Nagy 提交于
      This is in preparation for the aarch64 port only to have the long
      double math symbols available on ld128 platforms. The implementations
      should be fixed up later once we have proper tests for these functions.
      
      Added bigendian handling for ld128 bit manipulations too.
      f4e4632a
    • S
      math: add ld128 exp2l based on the freebsd implementation · 53cfe0c6
      Szabolcs Nagy 提交于
      Changed the special case handling and bit manipulation to better
      match the double version.
      53cfe0c6
  3. 09 2月, 2015 3 次提交
  4. 06 11月, 2014 2 次提交
    • S
      math: use fnstsw consistently instead of fstsw in x87 asm · ec431894
      Szabolcs Nagy 提交于
      fnstsw does not wait for pending unmasked x87 floating-point exceptions
      and it is the same as fstsw when all exceptions are masked which is the
      only environment libc supports.
      ec431894
    • S
      math: fix x86_64 and x32 asm not to use sahf instruction · a732e80d
      Szabolcs Nagy 提交于
      Some early x86_64 cpus (released before 2006) did not support sahf/lahf
      instructions so they should be avoided (intel manual says they are only
      supported if CPUID.80000001H:ECX.LAHF-SAHF[bit 0] = 1).
      
      The workaround simplifies exp2l and expm1l because fucomip can be
      used instead of the fucomp;fnstsw;sahf sequence copied from i386.
      
      In fmodl and remainderl sahf is replaced by a simple bit test.
      a732e80d
  5. 31 10月, 2014 2 次提交
    • S
      math: use the rounding idiom consistently · 0ce946cf
      Szabolcs Nagy 提交于
      the idiomatic rounding of x is
      
        n = x + toint - toint;
      
      where toint is either 1/EPSILON (x is non-negative) or 1.5/EPSILON
      (x may be negative and nearest rounding mode is assumed) and EPSILON is
      according to the evaluation precision (the type of toint is not very
      important, because single precision float can represent the 1/EPSILON of
      ieee binary128).
      
      in case of FLT_EVAL_METHOD!=0 this avoids a useless store to double or
      float precision, and the long double code became cleaner with
      1/LDBL_EPSILON instead of ifdefs for toint.
      
      __rem_pio2f and __rem_pio2 functions slightly changed semantics:
      on i386 a double-rounding is avoided so close to half-way cases may
      get evaluated differently eg. as sin(pi/4-eps) instead of cos(pi/4+eps)
      0ce946cf
    • S
      fix rint.c and rintf.c when FLT_EVAL_METHOD!=0 · 79ca8609
      Szabolcs Nagy 提交于
      The old code used the rounding idiom incorrectly:
      
        y = (double)(x + 0x1p52) - 0x1p52;
      
      the cast is useless if FLT_EVAL_METHOD==0 and causes a second rounding
      if FLT_EVAL_METHOD==2 which can give incorrect result in nearest rounding
      mode, so the correct idiom is to add/sub a power-of-2 according to the
      characteristics of double_t.
      
      This did not cause actual bug because only i386 is affected where rint
      is implemented in asm.
      
      Other rounding functions use a similar idiom, but they give correct
      results because they only rely on getting a neighboring integer result
      and the rounding direction is fixed up separately independently of the
      current rounding mode. However they should be fixed to use the idiom
      correctly too.
      79ca8609
  6. 08 10月, 2014 1 次提交
    • R
      always provide __fpclassifyl and __signbitl definitions · 0539e6da
      Rich Felker 提交于
      previously the external definitions of these functions were omitted on
      archs where long double is the same as double, since the code paths in
      the math.h macros which would call them are unreachable. however, even
      if they are unreachable, the definitions are still mandatory. omitting
      them is invalid C, and in the case of a non-optimizing compiler, will
      result in a link error.
      0539e6da
  7. 18 9月, 2014 1 次提交
  8. 08 9月, 2014 2 次提交
  9. 12 4月, 2014 1 次提交
    • S
      math: fix aliasing violation in long double wrappers · 73c870ed
      Szabolcs Nagy 提交于
      modfl and sincosl were passing long double* instead of double*
      to the wrapped double precision functions (on archs where long
      double and double have the same size).
      This is fixed now by using temporaries (this is not optimized
      to a single branch so the generated code is a bit bigger).
      Found by Morten Welinder.
      73c870ed
  10. 23 2月, 2014 2 次提交
  11. 09 1月, 2014 1 次提交
  12. 12 12月, 2013 1 次提交
  13. 24 11月, 2013 1 次提交
    • S
      math: clean up __rem_pio2 · 3fdf94ec
      Szabolcs Nagy 提交于
      - remove the HAVE_EFFICIENT_IRINT case: fn is an exact integer, so
        it can be converted to int32_t a bit more efficiently than with a
        cast (the rounding mode change can be avoided), but musl does not
        support this case on any arch.
      - __rem_pio2: use double_t where possible
      - __rem_pio2f: use less assignments to avoid stores on i386
      - use unsigned int bit manipulation (and union instead of macros)
      - use hexfloat literals instead of named constants
      3fdf94ec
  14. 21 11月, 2013 2 次提交
  15. 28 10月, 2013 1 次提交
    • S
      math: extensive log*.c cleanup · 71d23b31
      Szabolcs Nagy 提交于
      The log, log2 and log10 functions share a lot of code and to a lesser
      extent log1p too. A small part of the code was kept separately in
      __log1p.h, but since it did not capture much of the common code and
      it was inlined anyway, it did not solve the issue properly. Now the
      log functions have significant code duplication, which may be resolved
      later, until then they need to be modified together.
      
      logl, log10l, log2l, log1pl:
      * Fix the sign when the return value should be -inf.
      * Remove the volatile hack from log10l (seems unnecessary)
      
      log1p, log1pf:
      * Change the handling of small inputs: only |x|<2^-53 is special
        (then it is enough to return x with the usual subnormal handling)
        this fixes the sign of log1p(0) in downward rounding.
      * Do not handle the k==0 case specially (other than skipping the
        elaborate argument reduction)
      * Do not handle 1+x close to power-of-two specially (this code was
        used rarely, did not give much speed up and the precision wasn't
        better than the general)
      * Fix the correction term formula (c=1-(u-x) was used incorrectly
        when x<1 but (double)(x+1)==2, this was not a critical issue)
      * Use the exact same method for calculating log(1+f) as in log
        (except in log1p the c correction term is added to the result).
      
      log, logf, log10, log10f, log2, log2f:
      * Use double_t and float_t consistently.
      * Now the first part of log10 and log2 is identical to log (until the
        return statement, hopefully this makes maintainence easier).
      * Most special case formulas were removed (close to power-of-two and
        k==0 cases), they increase the code size without providing precision
        or performance benefits (and obfuscate the code).
        Only x==1 is handled specially so in downward rounding mode the
        sign of zero is correct (the general formula happens to give -0).
      * For x==0 instead of -1/0.0 or -two54/0.0, return -1/(x*x) to force
        raising the exception at runtime.
      * Arg reduction code is changed (slightly simplified)
      * The thresholds for arg reduction to [sqrt(2)/2,sqrt(2)] are now
        consistently the [0x3fe6a09e00000000,0x3ff6a09dffffffff] and the
        [0x3f3504f3,0x3fb504f2] intervals for double and float reductions
        respectively (the exact threshold values are not critical)
      * Remove the obsolete comment for the FLT_EVAL_METHOD!=0 case in log2f
        (The same code is used for all eval methods now, on i386 slightly
        simpler code could be used, but we have asm there anyway)
      
      all:
      * Fix signed int arithmetics (using unsigned for bitmanipulation)
      * Fix various comments
      71d23b31
  16. 08 10月, 2013 2 次提交
  17. 06 10月, 2013 1 次提交
  18. 05 10月, 2013 2 次提交
  19. 13 9月, 2013 1 次提交
    • R
      fix x86_64 lrintl asm, again · 2f1de805
      Rich Felker 提交于
      the underlying problem was not incorrect sign extension (fixed in the
      previous commit to this file by nsz) but that code that treats "long"
      as 32-bit was copied blindly from i386 to x86_64.
      
      now lrintl is identical to llrintl on x86_64, as it should be.
      2f1de805
  20. 07 9月, 2013 2 次提交
    • S
      067aea7c
    • S
      math: remove STRICT_ASSIGN macro · 9b0fcb44
      Szabolcs Nagy 提交于
      gcc did not always drop excess precision according to c99 at assignments
      before version 4.5 even if -std=c99 was requested which caused badly
      broken mathematical functions on i386 when FLT_EVAL_METHOD!=0
      
      but STRICT_ASSIGN was not used consistently and it is worked around for
      old compilers with -ffloat-store so it is no longer needed
      
      the new convention is to get the compiler respect c99 semantics and when
      excess precision is not harmful use float_t or double_t or to specialize
      code using FLT_EVAL_METHOD
      9b0fcb44
  21. 06 9月, 2013 2 次提交
    • S
      math: support invalid ld80 representations in fpclassify · f657fe4b
      Szabolcs Nagy 提交于
      apparently gnulib requires invalid long double representations
      to be handled correctly in printf so we classify them according
      to how the fpu treats them: bad inf is nan, bad nan is nan,
      bad normal is nan and bad subnormal/zero is minimal normal
      f657fe4b
    • S
      math: fix atanh (overflow and underflow issues) · f4d9bfb3
      Szabolcs Nagy 提交于
      in atanh exception handling was left to the called log functions,
      but the argument to those functions could underflow or overflow.
      
      use double_t and float_t to avoid some useless stores on x86
      f4d9bfb3
  22. 05 9月, 2013 6 次提交