Bug 235413 - [LIBM] optizimation for cexp and cexpf
Summary: [LIBM] optizimation for cexp and cexpf
Status: New
Alias: None
Product: Base System
Classification: Unclassified
Component: bin (show other bugs)
Version: CURRENT
Hardware: Any Any
: --- Affects Only Me
Assignee: freebsd-bugs mailing list
URL:
Keywords: patch
Depends on:
Blocks:
 
Reported: 2019-02-02 00:28 UTC by Steve Kargl
Modified: 2019-02-27 18:23 UTC (History)
0 users

See Also:


Attachments
patch (1.75 KB, patch)
2019-02-02 00:28 UTC, Steve Kargl
no flags Details | Diff
New patch with cexpl implementation included (21.83 KB, patch)
2019-02-27 01:56 UTC, Steve Kargl
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Steve Kargl freebsd_committer 2019-02-02 00:28:44 UTC
Created attachment 201620 [details]
patch

The attach patch utilizes sincos[f] in the computation
of cexp[f].  For 20 million random z=x+Iy drawn in the
box defined by x,y in [0,MAX_EXP*LN2], this amounts to
a 8.7% and 11.4% speed improvement over computing sin[f]
and cos[f] individually in cexp[f].
Comment 1 Steve Kargl freebsd_committer 2019-02-27 01:56:55 UTC
Created attachment 202398 [details]
New patch with cexpl implementation included

The new patch cexpl.diff supercedes the old path.  It includes the changes in the old patch as well as implementations for long double complex cexpl().  This patch depends on https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=236063

A suitable commit messages is 

* lib/msun/src/math_private.h:
  . Add an EXTRACT_LDBL80_WORDS2() macro to get access to the high and
    low word of a 64-bit significand as well as the expsign.
  . Add prototype for __ldexp_expl().
  . Add prototype for __ldexp_cexpl().

* lib/msun/src/s_cexp.c:
  . A float.h to get LDBL_MANT_DIG.
  . Add c and s to declaration, and sort.
  . Move x = 0 case to be the first case tested.  This is in preparation
    for fixing constanting folding in GCC.
  . Use sincos() instead of a call to sin() and to cos().
  . A week_refrence for LDBL_MANT_DIG == 53.

* lib/msun/src/s_cexpf.c:
  . Add c and s to declaration, and sort.
  . Move x = 0 case to be the first case tested.  This is in preparation
    for fixing constanting folding in GCC.
  . Use sincosf() instead of a call to sinf() and to cosf().

* lib/msun/src/k_exp.c:
  . Add c and s to declaration, and sort.
  . Use sincos() instead of a call to sin() and to cos().
  
* lib/msun/src/k_expf.c
  . Add c and s to declaration, and sort.
  . Use sincosf() instead of a call to sinf() and to cosf().

* lib/msun/ld128/k_cexpl.c:
  . Copy src/k_exp.c to here.  #if 0 ... #endif all code and have
    functions return NaN.  These functions are currently unused,
    and await someone who cares.
  . Issue a compile-time warning about the sloppiness.

* lib/msun/ld128/s_cexpl.c:
  . Copy src/s_cexp.c to here.
  . Convert "double complex" to "long double complex" without use of
    bit-twiddling.
  . Add compile-time warning about the sloppiness.
  . Add run-time warning about the sloppiness.

* lib/msun/ld80/k_cexpl.c:
  . Copy src/k_exp.c to here.
  . Convert "double complex" to "long double complex".  Use bit-twiddling.

* lib/msun/ld80/s_cexpl.c:
  . Copy src/s_cexp.c to here.
  . Convert "double complex" to "long double complex".  Use bit-twiddling
    where bits are grabbed with new EXTRACT_LDBL80_WORDS2() macro.

* lib/msun/man/cexp.3:
  . Document the addtion of cexpl.

* include/complex.h:
  . Add prototype for cexpl().
Comment 2 Steve Kargl freebsd_committer 2019-02-27 18:23:03 UTC
Argh.  bde has pointed out some silly mistakes in the code.
He would also like to see the bit-twiddling reworked.  So,
the current patch should be considered informative at best.