From 2289ca2bd33a8077ae9842f4f56730f759a0225e Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Wed, 22 Mar 2023 14:11:35 -0700 Subject: [PATCH] risc-v: use clang's builtins for more of libm. This completes the set, and gets riscv64 to parity with arm64. Test: llvm-objdump -d Test: bionic-unit-tests-static --gtest_filter='math*' Bug: https://github.com/google/android-riscv64/issues/11 Change-Id: I4230005abcd8d6025d82f1e8afe5831fad2db04d --- libm/Android.bp | 39 ++++++++------------------------------- libm/builtins.cpp | 10 +++++----- 2 files changed, 13 insertions(+), 36 deletions(-) diff --git a/libm/Android.bp b/libm/Android.bp index cc0d66657..4c34fb6cc 100644 --- a/libm/Android.bp +++ b/libm/Android.bp @@ -94,8 +94,6 @@ cc_library { "upstream-freebsd/lib/msun/src/s_cbrtf.c", "upstream-freebsd/lib/msun/src/s_ccosh.c", "upstream-freebsd/lib/msun/src/s_ccoshf.c", - "upstream-freebsd/lib/msun/src/s_ceil.c", - "upstream-freebsd/lib/msun/src/s_ceilf.c", "upstream-freebsd/lib/msun/src/s_cexp.c", "upstream-freebsd/lib/msun/src/s_cexpf.c", "upstream-freebsd/lib/msun/src/s_cimag.c", @@ -130,8 +128,6 @@ cc_library { "upstream-freebsd/lib/msun/src/s_fdim.c", "upstream-freebsd/lib/msun/src/s_finite.c", "upstream-freebsd/lib/msun/src/s_finitef.c", - "upstream-freebsd/lib/msun/src/s_floor.c", - "upstream-freebsd/lib/msun/src/s_floorf.c", "upstream-freebsd/lib/msun/src/s_fma.c", "upstream-freebsd/lib/msun/src/s_fmaf.c", "upstream-freebsd/lib/msun/src/s_fmax.c", @@ -282,10 +278,8 @@ cc_library { arm: { srcs: [ "arm/fenv.c", - ], - exclude_srcs: [ - "upstream-freebsd/lib/msun/src/s_floor.c", - "upstream-freebsd/lib/msun/src/s_floorf.c", + "upstream-freebsd/lib/msun/src/s_ceil.c", + "upstream-freebsd/lib/msun/src/s_ceilf.c", ], instruction_set: "arm", pack_relocations: false, @@ -303,10 +297,6 @@ cc_library { "arm64/fenv.c", ], exclude_srcs: [ - "upstream-freebsd/lib/msun/src/s_ceil.c", - "upstream-freebsd/lib/msun/src/s_ceilf.c", - "upstream-freebsd/lib/msun/src/s_floor.c", - "upstream-freebsd/lib/msun/src/s_floorf.c", "upstream-freebsd/lib/msun/src/s_fma.c", "upstream-freebsd/lib/msun/src/s_fmaf.c", "upstream-freebsd/lib/msun/src/s_fmax.c", @@ -337,11 +327,6 @@ cc_library { ], exclude_srcs: [ - // TODO: do the rest when our clang has https://reviews.llvm.org/D136508. - // TODO: "upstream-freebsd/lib/msun/src/s_ceil.c", - // TODO: "upstream-freebsd/lib/msun/src/s_ceilf.c", - // TODO: "upstream-freebsd/lib/msun/src/s_floor.c", - // TODO: "upstream-freebsd/lib/msun/src/s_floorf.c", "upstream-freebsd/lib/msun/src/s_fma.c", "upstream-freebsd/lib/msun/src/s_fmaf.c", "upstream-freebsd/lib/msun/src/s_fmax.c", @@ -356,12 +341,12 @@ cc_library { "upstream-freebsd/lib/msun/src/s_lrintf.c", "upstream-freebsd/lib/msun/src/s_lround.c", "upstream-freebsd/lib/msun/src/s_lroundf.c", - // TODO: "upstream-freebsd/lib/msun/src/s_rint.c", - // TODO: "upstream-freebsd/lib/msun/src/s_rintf.c", - // TODO: "upstream-freebsd/lib/msun/src/s_round.c", - // TODO: "upstream-freebsd/lib/msun/src/s_roundf.c", - // TODO: "upstream-freebsd/lib/msun/src/s_trunc.c", - // TODO: "upstream-freebsd/lib/msun/src/s_truncf.c", + "upstream-freebsd/lib/msun/src/s_rint.c", + "upstream-freebsd/lib/msun/src/s_rintf.c", + "upstream-freebsd/lib/msun/src/s_round.c", + "upstream-freebsd/lib/msun/src/s_roundf.c", + "upstream-freebsd/lib/msun/src/s_trunc.c", + "upstream-freebsd/lib/msun/src/s_truncf.c", ], version_script: ":libm.riscv64.map", }, @@ -373,10 +358,6 @@ cc_library { "x86/lrintf.S", ], exclude_srcs: [ - "upstream-freebsd/lib/msun/src/s_ceil.c", - "upstream-freebsd/lib/msun/src/s_ceilf.c", - "upstream-freebsd/lib/msun/src/s_floor.c", - "upstream-freebsd/lib/msun/src/s_floorf.c", "upstream-freebsd/lib/msun/src/s_lrint.c", "upstream-freebsd/lib/msun/src/s_lrintf.c", "upstream-freebsd/lib/msun/src/s_rint.c", @@ -400,10 +381,6 @@ cc_library { "x86_64/lrintf.S", ], exclude_srcs: [ - "upstream-freebsd/lib/msun/src/s_ceil.c", - "upstream-freebsd/lib/msun/src/s_ceilf.c", - "upstream-freebsd/lib/msun/src/s_floor.c", - "upstream-freebsd/lib/msun/src/s_floorf.c", "upstream-freebsd/lib/msun/src/s_llrint.c", "upstream-freebsd/lib/msun/src/s_llrintf.c", "upstream-freebsd/lib/msun/src/s_lrint.c", diff --git a/libm/builtins.cpp b/libm/builtins.cpp index 96c006d7e..41e145b9f 100644 --- a/libm/builtins.cpp +++ b/libm/builtins.cpp @@ -22,7 +22,7 @@ double fabs(double x) { return __builtin_fabs(x); } float fabsf(float x) { return __builtin_fabsf(x); } long double fabsl(long double x) { return __builtin_fabsl(x); } -#if defined(__aarch64__) || defined(__i386__) || defined(__x86_64__) +#if defined(__aarch64__) || defined(__riscv) || defined(__i386__) || defined(__x86_64__) float ceilf(float x) { return __builtin_ceilf(x); } double ceil(double x) { return __builtin_ceil(x); } #if defined(__ILP32__) @@ -46,7 +46,7 @@ namespace s_floorf { } float floorf(float x) { return s_floorf::floorf(x); } double floor(double x) { return s_floor::floor(x); } -#elif defined(__arm__) || defined(__aarch64__) || defined(__i386__) || defined(__x86_64__) +#else float floorf(float x) { return __builtin_floorf(x); } double floor(double x) { return __builtin_floor(x); } #if defined(__ILP32__) @@ -79,7 +79,7 @@ long long llround(double x) { return __builtin_llround(x); } long long llroundf(float x) { return __builtin_llroundf(x); } #endif -#if defined(__aarch64__) || defined(__i386__) || defined(__x86_64__) +#if defined(__aarch64__) || defined(__riscv) || defined(__i386__) || defined(__x86_64__) float rintf(float x) { return __builtin_rintf(x); } double rint(double x) { return __builtin_rint(x); } #if defined(__ILP32__) @@ -87,7 +87,7 @@ __weak_reference(rint, rintl); #endif #endif -#if defined(__aarch64__) +#if defined(__aarch64__) || defined(__riscv) float roundf(float x) { return __builtin_roundf(x); } double round(double x) { return __builtin_round(x); } #endif @@ -98,7 +98,7 @@ double sqrt(double x) { return __builtin_sqrt(x); } __weak_reference(sqrt, sqrtl); #endif -#if defined(__aarch64__) || defined(__i386__) || defined(__x86_64__) +#if defined(__aarch64__) || defined(__riscv) || defined(__i386__) || defined(__x86_64__) float truncf(float x) { return __builtin_truncf(x); } double trunc(double x) { return __builtin_trunc(x); } #if defined(__ILP32__)