diff options
author | Szabolcs Nagy <nsz@port70.net> | 2017-10-22 18:06:00 +0000 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2019-04-17 23:43:53 -0400 |
commit | 3f94c648ef32c95fa7f5c94b5cb8f2b764fc1938 (patch) | |
tree | 078300c87fed8d8e673f1b94ef4e6bad95cf587a /src/math/exp2f_data.h | |
parent | 098868b338e9afd3ef844070a94b9b10360d913f (diff) | |
download | musl-3f94c648ef32c95fa7f5c94b5cb8f2b764fc1938.tar.gz musl-3f94c648ef32c95fa7f5c94b5cb8f2b764fc1938.tar.bz2 musl-3f94c648ef32c95fa7f5c94b5cb8f2b764fc1938.tar.xz musl-3f94c648ef32c95fa7f5c94b5cb8f2b764fc1938.zip |
math: new exp2f and expf
from https://github.com/ARM-software/optimized-routines,
commit 04884bd04eac4b251da4026900010ea7d8850edc
In expf TOINT_INTRINSICS is kept, but is unused, it would require support
for __builtin_round and __builtin_lround as single instruction.
code size change: +94 bytes.
benchmark on x86_64 before, after, speedup:
-Os:
expf rthruput: 9.19 ns/call 8.11 ns/call 1.13x
expf latency: 34.19 ns/call 18.77 ns/call 1.82x
exp2f rthruput: 5.59 ns/call 6.52 ns/call 0.86x
exp2f latency: 17.93 ns/call 16.70 ns/call 1.07x
-O3:
expf rthruput: 9.12 ns/call 4.92 ns/call 1.85x
expf latency: 34.44 ns/call 18.99 ns/call 1.81x
exp2f rthruput: 5.58 ns/call 4.49 ns/call 1.24x
exp2f latency: 17.95 ns/call 16.94 ns/call 1.06x
Diffstat (limited to 'src/math/exp2f_data.h')
-rw-r--r-- | src/math/exp2f_data.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/math/exp2f_data.h b/src/math/exp2f_data.h new file mode 100644 index 00000000..fe744f15 --- /dev/null +++ b/src/math/exp2f_data.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2017-2018, Arm Limited. + * SPDX-License-Identifier: MIT + */ +#ifndef _EXP2F_DATA_H +#define _EXP2F_DATA_H + +#include <features.h> +#include <stdint.h> + +/* Shared between expf, exp2f and powf. */ +#define EXP2F_TABLE_BITS 5 +#define EXP2F_POLY_ORDER 3 +extern hidden const struct exp2f_data { + uint64_t tab[1 << EXP2F_TABLE_BITS]; + double shift_scaled; + double poly[EXP2F_POLY_ORDER]; + double shift; + double invln2_scaled; + double poly_scaled[EXP2F_POLY_ORDER]; +} __exp2f_data; + +#endif |