about summary refs log tree commit diff
path: root/src/math/exp_data.h
diff options
context:
space:
mode:
authorSzabolcs Nagy <nsz@port70.net>2018-11-30 21:39:47 +0000
committerRich Felker <dalias@aerifal.cx>2019-04-17 23:45:25 -0400
commite16f7b3c02e17d0ace779a11f0d53a9c05fdd434 (patch)
treef60943599162fe681d5753aa6744b471ec4193a9 /src/math/exp_data.h
parent2a3210cf4abff0a69ff3e7adc66591dfe6ab2197 (diff)
downloadmusl-e16f7b3c02e17d0ace779a11f0d53a9c05fdd434.tar.gz
musl-e16f7b3c02e17d0ace779a11f0d53a9c05fdd434.tar.xz
musl-e16f7b3c02e17d0ace779a11f0d53a9c05fdd434.zip
math: new exp and exp2
from https://github.com/ARM-software/optimized-routines,
commit 04884bd04eac4b251da4026900010ea7d8850edc

TOINT_INTRINSICS and EXP_USE_TOINT_NARROW cases are unused.

The underflow exception is signaled if the result is in the subnormal
range even if the result is exact (e.g. exp2(-1023.0)).

code size change: -1672 bytes.
benchmark on x86_64 before, after, speedup:

-Os:
   exp rthruput:  12.73 ns/call  6.68 ns/call 1.91x
    exp latency:  45.78 ns/call 21.79 ns/call 2.1x
  exp2 rthruput:   6.35 ns/call  5.26 ns/call 1.21x
   exp2 latency:  26.00 ns/call 16.58 ns/call 1.57x
-O3:
   exp rthruput:  12.75 ns/call  6.73 ns/call 1.89x
    exp latency:  45.91 ns/call 21.80 ns/call 2.11x
  exp2 rthruput:   6.47 ns/call  5.40 ns/call 1.2x
   exp2 latency:  26.03 ns/call 16.54 ns/call 1.57x
Diffstat (limited to 'src/math/exp_data.h')
-rw-r--r--src/math/exp_data.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/math/exp_data.h b/src/math/exp_data.h
new file mode 100644
index 00000000..3e24bac5
--- /dev/null
+++ b/src/math/exp_data.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018, Arm Limited.
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef _EXP_DATA_H
+#define _EXP_DATA_H
+
+#include <features.h>
+#include <stdint.h>
+
+#define EXP_TABLE_BITS 7
+#define EXP_POLY_ORDER 5
+#define EXP_USE_TOINT_NARROW 0
+#define EXP2_POLY_ORDER 5
+extern hidden const struct exp_data {
+	double invln2N;
+	double shift;
+	double negln2hiN;
+	double negln2loN;
+	double poly[4]; /* Last four coefficients.  */
+	double exp2_shift;
+	double exp2_poly[EXP2_POLY_ORDER];
+	uint64_t tab[2*(1 << EXP_TABLE_BITS)];
+} __exp_data;
+
+#endif