From 4a5698b5c914dff08aebc6149f54f0dacdc66b88 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Sun, 21 Feb 2021 11:06:18 -0800 Subject: [PATCH] Implement better hypot function --- build/bootstrap/compile.com | Bin 65536 -> 65536 bytes libc/integral/c.inc | 27 +++++----- libc/mem/mem.h | 3 +- libc/str/a64l.c | 51 ++++++++++++++++++ libc/str/l64a.c | 33 ++++++++++++ libc/str/str.h | 2 + libc/tinymath/{hypotl.S => hypot.c} | 33 ++++++------ libc/tinymath/{hypotf.S => hypotf.c} | 29 +++++----- libc/tinymath/hypotl.c | 31 +++++++++++ libc/x/x.h | 1 + libc/{tinymath/hypot.S => x/xdtoaf.c} | 28 +++++----- test/libc/str/a64l_test.c | 39 ++++++++++++++ test/libc/tinymath/hypot_test.c | 75 ++++++++++++++++++++++++++ tool/build/compile.c | 3 +- 14 files changed, 293 insertions(+), 62 deletions(-) create mode 100644 libc/str/a64l.c create mode 100644 libc/str/l64a.c rename libc/tinymath/{hypotl.S => hypot.c} (77%) rename libc/tinymath/{hypotf.S => hypotf.c} (77%) create mode 100644 libc/tinymath/hypotl.c rename libc/{tinymath/hypot.S => x/xdtoaf.c} (79%) create mode 100644 test/libc/str/a64l_test.c create mode 100644 test/libc/tinymath/hypot_test.c diff --git a/build/bootstrap/compile.com b/build/bootstrap/compile.com index 3524c0a3a586b8c1b66dc1ce4280d6bcfbd1c287..44d4fb7d1a7ca7ef07dfadc725341a5442aa1a90 100755 GIT binary patch delta 12264 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 delta 12569 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 8 #pragma GCC diagnostic ignored "-Wstringop-truncation" -#endif /* GCC8+ */ +#pragma GCC diagnostic ignored "-Wstringop-overflow" /* breaks strndup */ +#endif /* GCC8+ */ #if __GNUC__ + 0 >= 9 #pragma GCC diagnostic ignored /* "always true" breaks dce */ "-Waddress" #endif /* GCC9+ */ @@ -689,8 +690,8 @@ typedef uint64_t uintmax_t; "-Wincompatible-pointer-types-discards-qualifiers" #pragma clang diagnostic ignored "-Wbuiltin-requires-header" #pragma clang diagnostic ignored "-Wparentheses-equality" /*-save-temps*/ -#pragma clang diagnostic ignored "-Wunused-value" /*({-save-temps})*/ -#pragma clang diagnostic ignored "-Wstring-plus-int" /* special ed */ +#pragma clang diagnostic ignored "-Wunused-value" /*({-save-temps})*/ +#pragma clang diagnostic ignored "-Wstring-plus-int" /* special ed */ #pragma clang diagnostic ignored "-Wunused-value" /* extreme prejudice */ #pragma clang diagnostic ignored "-Wbuiltin-requires-header" #pragma clang diagnostic ignored \ diff --git a/libc/mem/mem.h b/libc/mem/mem.h index d7b12dc3..d2e711cb 100644 --- a/libc/mem/mem.h +++ b/libc/mem/mem.h @@ -22,8 +22,7 @@ void *reallocarray(void *, size_t, size_t) nodiscard; void *valloc(size_t) attributeallocsize((1)) vallocesque; void *pvalloc(size_t) attributeallocsize((1)) mallocesque; char *strdup(const char *) paramsnonnull() mallocesque; -char *strndup(const char *, size_t) paramsnonnull() - attributeallocsize((2)) mallocesque; +char *strndup(const char *, size_t) paramsnonnull() mallocesque; int posix_memalign(void **, size_t, size_t); /* wut */ bool __grow(void *, size_t *, size_t, size_t) paramsnonnull((1, 2)) libcesque; diff --git a/libc/str/a64l.c b/libc/str/a64l.c new file mode 100644 index 00000000..3986fa46 --- /dev/null +++ b/libc/str/a64l.c @@ -0,0 +1,51 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/str.h" + +static const signed char kBase64i[256] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x00 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, /* 0x20 */ + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, -1, -1, -1, -1, -1, -1, /* 0x30 */ + -1, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, /* 0x40 */ + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, -1, -1, -1, -1, /* 0x50 */ + -1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, /* 0x60 */ + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, /* 0x70 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xA0 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xB0 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xC0 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xD0 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xE0 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xF0 */ +}; + +/** + * Converts base64 to 32-bit integer. + */ +long a64l(const char *s) { + uint32_t i, v, x; + for (x = i = 0; i < 6; ++i) { + v = kBase64i[s[i] & 0xff]; + if (v == -1) break; + x |= v << (i * 6); + } + return (int32_t)x; +} diff --git a/libc/str/l64a.c b/libc/str/l64a.c new file mode 100644 index 00000000..28157c3a --- /dev/null +++ b/libc/str/l64a.c @@ -0,0 +1,33 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/str.h" + +/** + * Converts 32-bit integer to base64. + */ +char *l64a(long x) { + static char b[7]; + uint32_t u, i = 0; + for (u = x; u; u >>= 6) { + b[i++] = ("./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz")[u & 63]; + } + b[i] = '\0'; + return b; +} diff --git a/libc/str/str.h b/libc/str/str.h index dab0b0be..a3b52a6e 100644 --- a/libc/str/str.h +++ b/libc/str/str.h @@ -182,6 +182,8 @@ int timingsafe_memcmp(const void *, const void *, size_t); void *memmem(const void *, size_t, const void *, size_t) paramsnonnull() nothrow nocallback nosideeffect; char *strerror(int) returnsnonnull nothrow nocallback; +long a64l(const char *); +char *l64a(long); char *tinystrstr(const char *, const char *) strlenesque; char16_t *tinystrstr16(const char16_t *, const char16_t *) strlenesque; diff --git a/libc/tinymath/hypotl.S b/libc/tinymath/hypot.c similarity index 77% rename from libc/tinymath/hypotl.S rename to libc/tinymath/hypot.c index 2e7b8332..9f13aa95 100644 --- a/libc/tinymath/hypotl.S +++ b/libc/tinymath/hypot.c @@ -1,7 +1,7 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ ╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,19 +16,16 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.h" -.source __FILE__ +#include "libc/math.h" -// Returns euclidean distance in 2d space. -hypotl: push %rbp - mov %rsp,%rbp - .profilable - fldt 32(%rbp) - fldt 16(%rbp) - fmul %st,%st - fxch - fmul %st,%st - faddp - pop %rbp - ret - .endfn hypotl,globl +/** + * Returns euclidean distance. + */ +double hypot(double a, double b) { + double r; + if (isinf(a) || isinf(b)) return INFINITY; + if (isunordered(a, b)) return NAN; + if (!a) return 0; + r = b / a; + return fabs(a) * sqrt(1 + r * r); +} diff --git a/libc/tinymath/hypotf.S b/libc/tinymath/hypotf.c similarity index 77% rename from libc/tinymath/hypotf.S rename to libc/tinymath/hypotf.c index 1ff177bb..13d02c59 100644 --- a/libc/tinymath/hypotf.S +++ b/libc/tinymath/hypotf.c @@ -1,7 +1,7 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ ╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,15 +16,16 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.h" -.source __FILE__ +#include "libc/math.h" -// Returns euclidean distance in 2d space. -hypotf: .leafprologue - .profilable - mulss %xmm1,%xmm1 - mulss %xmm0,%xmm0 - addss %xmm1,%xmm0 - sqrtss %xmm0,%xmm0 - .leafepilogue - .endfn hypotf,globl +/** + * Returns euclidean distance. + */ +float hypotf(float a, float b) { + float r; + if (isinf(a) || isinf(b)) return INFINITY; + if (isunordered(a, b)) return NAN; + if (!a) return 0; + r = b / a; + return fabsf(a) * sqrtf(1 + r * r); +} diff --git a/libc/tinymath/hypotl.c b/libc/tinymath/hypotl.c new file mode 100644 index 00000000..29b390a0 --- /dev/null +++ b/libc/tinymath/hypotl.c @@ -0,0 +1,31 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" + +/** + * Returns euclidean distance. + */ +long double hypotl(long double a, long double b) { + long double r; + if (isinf(a) || isinf(b)) return INFINITY; + if (isunordered(a, b)) return NAN; + if (!a) return 0; + r = b / a; + return fabsl(a) * sqrtl(1 + r * r); +} diff --git a/libc/x/x.h b/libc/x/x.h index ce3339e4..f1c87832 100644 --- a/libc/x/x.h +++ b/libc/x/x.h @@ -29,6 +29,7 @@ int xwrite(int, const void *, uint64_t); ╚────────────────────────────────────────────────────────────────────────────│*/ void xdie(void) wontreturn; +char *xdtoaf(float) _XMAL; char *xdtoa(long double) _XMAL; char *xasprintf(const char *, ...) printfesque(1) paramsnonnull((1)) _XMAL; char *xvasprintf(const char *, va_list) _XPNN _XMAL; diff --git a/libc/tinymath/hypot.S b/libc/x/xdtoaf.c similarity index 79% rename from libc/tinymath/hypot.S rename to libc/x/xdtoaf.c index 2669b211..4f039dc2 100644 --- a/libc/tinymath/hypot.S +++ b/libc/x/xdtoaf.c @@ -1,5 +1,5 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ ╞══════════════════════════════════════════════════════════════════════════════╡ │ Copyright 2020 Justine Alexandra Roberts Tunney │ │ │ @@ -16,15 +16,17 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.h" -.source __FILE__ +#include "libc/mem/mem.h" +#include "libc/x/x.h" +#include "third_party/gdtoa/gdtoa.h" -// Returns euclidean distance in 2d space. -hypot: .leafprologue - .profilable - mulsd %xmm1,%xmm1 - mulsd %xmm0,%xmm0 - addsd %xmm1,%xmm0 - sqrtsd %xmm0,%xmm0 - .leafepilogue - .endfn hypot,globl +/** + * Converts double to string w/ high-accuracy the easy way. + * + * @return string that needs to be free'd + */ +char *xdtoaf(float d) { + char *p = xmalloc(32); + g_ffmt_p(p, &d, 7, 32, 2); + return p; +} diff --git a/test/libc/str/a64l_test.c b/test/libc/str/a64l_test.c new file mode 100644 index 00000000..7d171a9f --- /dev/null +++ b/test/libc/str/a64l_test.c @@ -0,0 +1,39 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/str.h" +#include "libc/testlib/ezbench.h" +#include "libc/testlib/testlib.h" + +TEST(l64a, test) { + EXPECT_STREQ("", l64a(0)); + EXPECT_STREQ("zzzzz1", l64a(-1)); + EXPECT_STREQ("zzzzz/", l64a(0x7fffffff)); +} + +TEST(a64l, test) { + EXPECT_EQ(0, a64l("")); + EXPECT_EQ(-1, a64l("zzzzz1")); + EXPECT_EQ(0x7fffffff, a64l("zzzzz/")); +} + +BENCH(a64l, bench) { + EZBENCH2( + "a64l", donothing, + a64l("./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); +} diff --git a/test/libc/tinymath/hypot_test.c b/test/libc/tinymath/hypot_test.c new file mode 100644 index 00000000..e6804c09 --- /dev/null +++ b/test/libc/tinymath/hypot_test.c @@ -0,0 +1,75 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/testlib/ezbench.h" +#include "libc/testlib/testlib.h" +#include "libc/x/x.h" + +TEST(hypot, test) { + EXPECT_STREQ("0", gc(xdtoa(hypot(0, 0)))); + EXPECT_STREQ("5", gc(xdtoa(hypot(3, 4)))); + EXPECT_STREQ("5", gc(xdtoa(hypot(-3, -4)))); + EXPECT_STREQ("1.414213562373095e+154", gc(xdtoa(hypot(1e154, 1e154)))); + EXPECT_STREQ("NAN", gc(xdtoa(hypot(0, NAN)))); + EXPECT_STREQ("NAN", gc(xdtoa(hypot(NAN, 0)))); + EXPECT_STREQ("NAN", gc(xdtoa(hypot(NAN, NAN)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypot(INFINITY, 0)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypot(0, INFINITY)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypot(INFINITY, NAN)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypot(NAN, INFINITY)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypot(INFINITY, INFINITY)))); +} + +TEST(hypotf, test) { + EXPECT_STREQ("0", gc(xdtoa(hypotf(0, 0)))); + EXPECT_STREQ("5", gc(xdtoa(hypotf(3, 4)))); + EXPECT_STREQ("5", gc(xdtoa(hypotf(-3, -4)))); + EXPECT_STREQ("1.414214e+38", gc(xdtoaf(hypotf(1e38, 1e38)))); + EXPECT_STREQ("NAN", gc(xdtoa(hypotf(0, NAN)))); + EXPECT_STREQ("NAN", gc(xdtoa(hypotf(NAN, 0)))); + EXPECT_STREQ("NAN", gc(xdtoa(hypotf(NAN, NAN)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypotf(INFINITY, 0)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypotf(0, INFINITY)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypotf(INFINITY, NAN)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypotf(NAN, INFINITY)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypotf(INFINITY, INFINITY)))); +} + +TEST(hypotl, test) { + EXPECT_STREQ("0", gc(xdtoa(hypotl(0, 0)))); + EXPECT_STREQ("5", gc(xdtoa(hypotl(3, 4)))); + EXPECT_STREQ("5", gc(xdtoa(hypotl(-3, -4)))); + EXPECT_STREQ("1.414213562373095e+4931", gc(xdtoa(hypotl(1e4931L, 1e4931L)))); + EXPECT_STREQ("NAN", gc(xdtoa(hypotl(0, NAN)))); + EXPECT_STREQ("NAN", gc(xdtoa(hypotl(NAN, 0)))); + EXPECT_STREQ("NAN", gc(xdtoa(hypotl(NAN, NAN)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypotl(INFINITY, 0)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypotl(0, INFINITY)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypotl(INFINITY, NAN)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypotl(NAN, INFINITY)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(hypotl(INFINITY, INFINITY)))); +} + +BENCH(hypot, bench) { + volatile double a = 2; + volatile double b = 3; + EZBENCH2("hypotf", donothing, EXPROPRIATE(hypotf(a, b))); + EZBENCH2("hypot", donothing, EXPROPRIATE(hypot(a, b))); + EZBENCH2("hypotl", donothing, EXPROPRIATE(hypotl(a, b))); +} diff --git a/tool/build/compile.c b/tool/build/compile.c index 0a20b18a..be45681a 100644 --- a/tool/build/compile.c +++ b/tool/build/compile.c @@ -126,6 +126,7 @@ const char *const kGccOnlyFlags[] = { "--noexecstack", "-Wa,--nocompress-debug-sections", "-Wa,--noexecstack", + "-Wa,-msse2avx", "-Wno-unused-but-set-variable", "-Wunsafe-loop-optimizations", "-fbranch-target-load-optimize", @@ -386,8 +387,6 @@ int main(int argc, char *argv[]) { } else if (!strcmp(argv[i], "-msse2avx")) { if (isgcc) { AddArg(argv[i]); - } else if (isclang) { - AddArg("-Wa,-msse2avx"); } } else if (!strcmp(argv[i], "-fsanitize=address")) { if (isgcc && ccversion >= 6) wantasan = true;