[libc][libm][GPU] Populating 'libmgpu.a' for math on the GPU

This commit populates `libmgpu.a` with wrappers for the following built-ins
- modf, modff
- nearbyint, nearbyintf
- remainder, remainderf
- remquo, remquof
- rint, rintf
- scalbn, scalbnf
- sqrt, sqrtf
- tan, tanf
- tanh, tanhf
- trunc, truncf
and wrappers the following vendor implementations
- nextafter, nextafterf
- sincos, sincosf
- sinh, sinhf
- sinf
- tan, tanf
- tanh, tanhf

Reviewed By: jhuber6

Differential Revision: https://reviews.llvm.org/D153395
This commit is contained in:
Anton Rydahl
2023-08-01 13:24:57 -07:00
committed by antonrydahl
parent 5754f5af3c
commit 53f5bfdb58
43 changed files with 1027 additions and 10 deletions

View File

@@ -150,9 +150,32 @@ set(TARGET_LIBM_ENTRYPOINTS
libc.src.math.pow
libc.src.math.powf
libc.src.math.sin
libc.src.math.modf
libc.src.math.modff
libc.src.math.nearbyint
libc.src.math.nearbyintf
libc.src.math.nextafter
libc.src.math.nextafterf
libc.src.math.remainder
libc.src.math.remainderf
libc.src.math.remquo
libc.src.math.remquof
libc.src.math.rint
libc.src.math.rintf
libc.src.math.round
libc.src.math.roundf
libc.src.math.roundl
libc.src.math.scalbn
libc.src.math.scalbnf
libc.src.math.sinh
libc.src.math.sinhf
libc.src.math.sqrt
libc.src.math.sqrtf
libc.src.math.tan
libc.src.math.tanf
libc.src.math.tanh
libc.src.math.tanhf
libc.src.math.trunc
libc.src.math.truncf
)
set(TARGET_LLVMLIBC_ENTRYPOINTS

View File

@@ -198,6 +198,8 @@ add_math_entrypoint_object(sincosf)
add_math_entrypoint_object(sin)
add_math_entrypoint_object(sinf)
add_math_entrypoint_object(sinh)
add_math_entrypoint_object(sinhf)
add_math_entrypoint_object(sqrt)
@@ -206,6 +208,8 @@ add_math_entrypoint_object(sqrtl)
add_math_entrypoint_object(tan)
add_math_entrypoint_object(tanf)
add_math_entrypoint_object(tanh)
add_math_entrypoint_object(tanhf)
add_math_entrypoint_object(trunc)

View File

@@ -203,6 +203,106 @@ add_math_entrypoint_gpu_object(
-O2
)
add_math_entrypoint_gpu_object(
modf
SRCS
modf.cpp
HDRS
../modf.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
modff
SRCS
modff.cpp
HDRS
../modff.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
nearbyint
SRCS
nearbyint.cpp
HDRS
../nearbyint.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
nearbyintf
SRCS
nearbyintf.cpp
HDRS
../nearbyintf.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
remainder
SRCS
remainder.cpp
HDRS
../remainder.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
remainderf
SRCS
remainderf.cpp
HDRS
../remainderf.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
remquo
SRCS
remquo.cpp
HDRS
../remquo.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
remquof
SRCS
remquof.cpp
HDRS
../remquof.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
rint
SRCS
rint.cpp
HDRS
../rint.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
rintf
SRCS
rintf.cpp
HDRS
../rintf.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
round
SRCS
@@ -212,3 +312,123 @@ add_math_entrypoint_gpu_object(
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
scalbn
SRCS
scalbn.cpp
HDRS
../scalbn.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
scalbnf
SRCS
scalbnf.cpp
HDRS
../scalbnf.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
sinh
SRCS
sinh.cpp
HDRS
../sinh.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
sinhf
SRCS
sinhf.cpp
HDRS
../sinhf.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
sqrt
SRCS
sqrt.cpp
HDRS
../sqrt.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
sqrtf
SRCS
sqrtf.cpp
HDRS
../sqrtf.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
tan
SRCS
tan.cpp
HDRS
../tan.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
tanf
SRCS
tanf.cpp
HDRS
../tanf.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
tanh
SRCS
tanh.cpp
HDRS
../tanh.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
tanhf
SRCS
tanhf.cpp
HDRS
../tanhf.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
trunc
SRCS
trunc.cpp
HDRS
../trunc.h
COMPILE_OPTIONS
-O2
)
add_math_entrypoint_gpu_object(
truncf
SRCS
truncf.cpp
HDRS
../truncf.h
COMPILE_OPTIONS
-O2
)

View File

@@ -0,0 +1,18 @@
//===-- Implementation of the GPU modf function ---------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/modf.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, modf, (double x, double *iptr)) {
return __builtin_modf(x, iptr);
}
} // namespace __llvm_libc

View File

@@ -0,0 +1,18 @@
//===-- Implementation of the GPU modff function --------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/modff.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, modff, (float x, float *iptr)) {
return __builtin_modff(x, iptr);
}
} // namespace __llvm_libc

View File

@@ -0,0 +1,18 @@
//===-- Implementation of the GPU nearbyint function ----------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/nearbyint.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, nearbyint, (double x)) {
return __builtin_nearbyint(x);
}
} // namespace __llvm_libc

View File

@@ -0,0 +1,18 @@
//===-- Implementation of the GPU nearbyintf function ---------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/nearbyintf.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, nearbyintf, (float x)) {
return __builtin_nearbyintf(x);
}
} // namespace __llvm_libc

View File

@@ -0,0 +1,18 @@
//===-- Implementation of the GPU remainder function ----------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/remainder.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, remainder, (double x, double y)) {
return __builtin_remainder(x, y);
}
} // namespace __llvm_libc

View File

@@ -0,0 +1,18 @@
//===-- Implementation of the GPU remainderf function ---------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/remainderf.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, remainderf, (float x, float y)) {
return __builtin_remainderf(x, y);
}
} // namespace __llvm_libc

View File

@@ -0,0 +1,18 @@
//===-- Implementation of the GPU remquo function -------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/remquo.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, remquo, (double x, double y, int *quo)) {
return __builtin_remquo(x, y, quo);
}
} // namespace __llvm_libc

View File

@@ -0,0 +1,18 @@
//===-- Implementation of the GPU remquof function ------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/remquof.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, remquof, (float x, float y, int *quo)) {
return __builtin_remquof(x, y, quo);
}
} // namespace __llvm_libc

View File

@@ -0,0 +1,16 @@
//===-- Implementation of the GPU rint function ---------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/rint.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, rint, (double x)) { return __builtin_rint(x); }
} // namespace __llvm_libc

View File

@@ -0,0 +1,16 @@
//===-- Implementation of the GPU rintf function --------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/rintf.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, rintf, (float x)) { return __builtin_rintf(x); }
} // namespace __llvm_libc

View File

@@ -0,0 +1,18 @@
//===-- Implementation of the GPU scalbn function -------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/scalbn.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, scalbn, (double x, int y)) {
return __builtin_scalbn(x, y);
}
} // namespace __llvm_libc

View File

@@ -0,0 +1,18 @@
//===-- Implementation of the GPU scalbnf function ------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/scalbnf.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, scalbnf, (float x, int y)) {
return __builtin_scalbnf(x, y);
}
} // namespace __llvm_libc

View File

@@ -0,0 +1,16 @@
//===-- Implementation of the GPU sinh function ---------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/sinh.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, sinh, (double x)) { return __builtin_sinh(x); }
} // namespace __llvm_libc

View File

@@ -0,0 +1,16 @@
//===-- Implementation of the GPU sinhf function --------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/sinhf.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, sinhf, (float x)) { return __builtin_sinhf(x); }
} // namespace __llvm_libc

View File

@@ -0,0 +1,16 @@
//===-- Implementation of the GPU sqrt function ---------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/sqrt.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, sqrt, (double x)) { return __builtin_sqrt(x); }
} // namespace __llvm_libc

View File

@@ -0,0 +1,16 @@
//===-- Implementation of the GPU sqrtf function --------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/sqrtf.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, sqrtf, (float x)) { return __builtin_sqrtf(x); }
} // namespace __llvm_libc

16
libc/src/math/gpu/tan.cpp Normal file
View File

@@ -0,0 +1,16 @@
//===-- Implementation of the GPU tan function ----------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/tan.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, tan, (double x)) { return __builtin_tan(x); }
} // namespace __llvm_libc

View File

@@ -0,0 +1,16 @@
//===-- Implementation of the GPU tanf function ---------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/tanf.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, tanf, (float x)) { return __builtin_tanf(x); }
} // namespace __llvm_libc

View File

@@ -0,0 +1,16 @@
//===-- Implementation of the GPU tanh function ---------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/tanh.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, tanh, (double x)) { return __builtin_tanh(x); }
} // namespace __llvm_libc

View File

@@ -0,0 +1,16 @@
//===-- Implementation of the GPU tanhf function --------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/tanhf.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, tanhf, (float x)) { return __builtin_tanhf(x); }
} // namespace __llvm_libc

View File

@@ -0,0 +1,16 @@
//===-- Implementation of the GPU trunc function --------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/trunc.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, trunc, (double x)) { return __builtin_trunc(x); }
} // namespace __llvm_libc

View File

@@ -0,0 +1,16 @@
//===-- Implementation of the GPU truncf function -------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/truncf.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, truncf, (float x)) { return __builtin_truncf(x); }
} // namespace __llvm_libc

View File

@@ -315,6 +315,28 @@ add_entrypoint_object(
-O2
)
add_entrypoint_object(
nextafter
SRCS
nextafter.cpp
HDRS
../../nextafter.h
COMPILE_OPTIONS
${bitcode_link_flags}
-O2
)
add_entrypoint_object(
nextafterf
SRCS
nextafterf.cpp
HDRS
../../nextafterf.h
COMPILE_OPTIONS
${bitcode_link_flags}
-O2
)
add_entrypoint_object(
pow
SRCS
@@ -347,3 +369,102 @@ add_entrypoint_object(
${bitcode_link_flags}
-O2
)
add_entrypoint_object(
sinf
SRCS
sinf.cpp
HDRS
../../sinf.h
COMPILE_OPTIONS
${bitcode_link_flags}
-O2
)
add_entrypoint_object(
sincos
SRCS
sincos.cpp
HDRS
../../sincos.h
COMPILE_OPTIONS
${bitcode_link_flags}
-O2
)
add_entrypoint_object(
sincosf
SRCS
sincosf.cpp
HDRS
../../sincosf.h
COMPILE_OPTIONS
${bitcode_link_flags}
-O2
)
add_entrypoint_object(
sinh
SRCS
sinh.cpp
HDRS
../../sinh.h
COMPILE_OPTIONS
${bitcode_link_flags}
-O2
)
add_entrypoint_object(
sinhf
SRCS
sinhf.cpp
HDRS
../../sinhf.h
COMPILE_OPTIONS
${bitcode_link_flags}
-O2
)
add_entrypoint_object(
tan
SRCS
tan.cpp
HDRS
../../tan.h
COMPILE_OPTIONS
${bitcode_link_flags}
-O2
)
add_entrypoint_object(
tanf
SRCS
tanf.cpp
HDRS
../../tanf.h
COMPILE_OPTIONS
${bitcode_link_flags}
-O2
)
add_entrypoint_object(
tanh
SRCS
tanh.cpp
HDRS
../../tanh.h
COMPILE_OPTIONS
${bitcode_link_flags}
-O2
)
add_entrypoint_object(
tanhf
SRCS
tanhf.cpp
HDRS
../../tanhf.h
COMPILE_OPTIONS
${bitcode_link_flags}
-O2
)

View File

@@ -42,9 +42,28 @@ LIBC_INLINE long long llrint(double x) { return __builtin_rint(x); }
LIBC_INLINE long long llrintf(float x) { return __builtin_rintf(x); }
LIBC_INLINE long long llround(double x) { return __builtin_round(x); }
LIBC_INLINE long long llroundf(float x) { return __builtin_roundf(x); }
LIBC_INLINE double nextafter(double x, double y) {
return __ocml_nextafter_f64(x, y);
}
LIBC_INLINE float nextafterf(float x, float y) {
return __ocml_nextafter_f32(x, y);
}
LIBC_INLINE double pow(double x, double y) { return __ocml_pow_f64(x, y); }
LIBC_INLINE float powf(float x, float y) { return __ocml_pow_f32(x, y); }
LIBC_INLINE double sin(double x) { return __ocml_sin_f64(x); }
LIBC_INLINE float sinf(float x) { return __ocml_sin_f32(x); }
LIBC_INLINE void sincos(double x, double *sinptr, double *cosptr) {
*sinptr = __ocml_sincos_f64(x, cosptr);
}
LIBC_INLINE void sincosf(float x, float *sinptr, float *cosptr) {
*sinptr = __ocml_sincos_f32(x, cosptr);
}
LIBC_INLINE double sinh(double x) { return __ocml_sinh_f64(x); }
LIBC_INLINE float sinhf(float x) { return __ocml_sinh_f32(x); }
LIBC_INLINE double tan(double x) { return __ocml_tan_f64(x); }
LIBC_INLINE float tanf(float x) { return __ocml_tan_f32(x); }
LIBC_INLINE double tanh(double x) { return __ocml_tanh_f64(x); }
LIBC_INLINE float tanhf(float x) { return __ocml_tanh_f32(x); }
} // namespace internal
} // namespace __llvm_libc

View File

@@ -34,13 +34,24 @@ int __ocml_ilogb_f64(double);
int __ocml_ilogb_f32(float);
float __ocml_ldexp_f32(float, int);
double __ocml_ldexp_f64(double, int);
float __ocml_nextafter_f32(float, float);
double __ocml_nextafter_f64(double, double);
float __ocml_pow_f32(float, float);
double __ocml_pow_f64(double, double);
double __ocml_rint_f64(double);
float __ocml_rint_f32(float);
double __ocml_round_f64(double);
float __ocml_round_f32(float);
float __ocml_sin_f32(float);
double __ocml_sin_f64(double);
float __ocml_sincos_f32(float, float *);
double __ocml_sincos_f64(double, double *);
float __ocml_sinh_f32(float);
double __ocml_sinh_f64(double);
float __ocml_tan_f32(float);
double __ocml_tan_f64(double);
float __ocml_tanh_f32(float);
double __ocml_tanh_f64(double);
}
} // namespace __llvm_libc

View File

@@ -1,4 +1,4 @@
//===-- Implementation of the GPU roundl function -------------------------===//
//===-- Implementation of the nextafter function for GPU ------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,18 +6,15 @@
//
//===----------------------------------------------------------------------===//
#include "src/math/roundl.h"
#include "src/__support/FPUtil/PlatformDefs.h"
#include "src/math/nextafter.h"
#include "src/__support/common.h"
#include "common.h"
namespace __llvm_libc {
#ifndef LONG_DOUBLE_IS_DOUBLE
#error "GPU targets do not support long doubles"
#endif
LLVM_LIBC_FUNCTION(long double, roundl, (long double x)) {
return __builtin_round(x);
LLVM_LIBC_FUNCTION(double, nextafter, (double x, double y)) {
return internal::nextafter(x, y);
}
} // namespace __llvm_libc

20
libc/src/math/gpu/vendor/nextafterf.cpp vendored Normal file
View File

@@ -0,0 +1,20 @@
//===-- Implementation of the nextafterf function for GPU -----------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/nextafterf.h"
#include "src/__support/common.h"
#include "common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, nextafterf, (float x, float y)) {
return internal::nextafterf(x, y);
}
} // namespace __llvm_libc

View File

@@ -38,9 +38,20 @@ long long __nv_llrint(double);
long long __nv_llrintf(float);
long long __nv_llround(double);
long long __nv_llroundf(float);
double __nv_nextafter(double, double);
float __nv_nextafterf(float, float);
double __nv_pow(double, double);
float __nv_powf(float, float);
double __nv_sin(double);
float __nv_sinf(float);
void __nv_sincos(double, double *, double *);
void __nv_sincosf(float, float *, float *);
double __nv_sinh(double);
float __nv_sinhf(float);
double __nv_tan(double);
float __nv_tanf(float);
double __nv_tanh(double);
float __nv_tanhf(float);
}
} // namespace __llvm_libc

View File

@@ -41,9 +41,26 @@ LIBC_INLINE long long llrint(double x) { return __nv_llrint(x); }
LIBC_INLINE long long llrintf(float x) { return __nv_llrintf(x); }
LIBC_INLINE long long llround(double x) { return __nv_llround(x); }
LIBC_INLINE long long llroundf(float x) { return __nv_llroundf(x); }
LIBC_INLINE double nextafter(double x, double y) {
return __nv_nextafter(x, y);
}
LIBC_INLINE float nextafterf(float x, float y) { return __nv_nextafterf(x, y); }
LIBC_INLINE double pow(double x, double y) { return __nv_pow(x, y); }
LIBC_INLINE float powf(float x, float y) { return __nv_powf(x, y); }
LIBC_INLINE double sin(double x) { return __nv_sin(x); }
LIBC_INLINE float sinf(float x) { return __nv_sinf(x); }
LIBC_INLINE void sincos(double x, double *sinptr, double *cosptr) {
return __nv_sincos(x, sinptr, cosptr);
}
LIBC_INLINE void sincosf(float x, float *sinptr, float *cosptr) {
return __nv_sincosf(x, sinptr, cosptr);
}
LIBC_INLINE double sinh(double x) { return __nv_sinh(x); }
LIBC_INLINE float sinhf(float x) { return __nv_sinhf(x); }
LIBC_INLINE double tan(double x) { return __nv_tan(x); }
LIBC_INLINE float tanf(float x) { return __nv_tanf(x); }
LIBC_INLINE double tanh(double x) { return __nv_tanh(x); }
LIBC_INLINE float tanhf(float x) { return __nv_tanhf(x); }
} // namespace internal
} // namespace __llvm_libc

20
libc/src/math/gpu/vendor/sincos.cpp vendored Normal file
View File

@@ -0,0 +1,20 @@
//===-- Implementation of the sincos function for GPU ---------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/sincos.h"
#include "src/__support/common.h"
#include "common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(void, sincos, (double x, double *sinptr, double *cosptr)) {
return internal::sincos(x, sinptr, cosptr);
}
} // namespace __llvm_libc

20
libc/src/math/gpu/vendor/sincosf.cpp vendored Normal file
View File

@@ -0,0 +1,20 @@
//===-- Implementation of the sincosf function for GPU --------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/sincosf.h"
#include "src/__support/common.h"
#include "common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(void, sincosf, (float x, float *sinptr, float *cosptr)) {
return internal::sincosf(x, sinptr, cosptr);
}
} // namespace __llvm_libc

18
libc/src/math/gpu/vendor/sinf.cpp vendored Normal file
View File

@@ -0,0 +1,18 @@
//===-- Implementation of the sinf function for GPU -----------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/sinf.h"
#include "src/__support/common.h"
#include "common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, sinf, (float x)) { return internal::sinf(x); }
} // namespace __llvm_libc

18
libc/src/math/gpu/vendor/sinh.cpp vendored Normal file
View File

@@ -0,0 +1,18 @@
//===-- Implementation of the sinh function for GPU -----------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/sinh.h"
#include "src/__support/common.h"
#include "common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, sinh, (double x)) { return internal::sinh(x); }
} // namespace __llvm_libc

18
libc/src/math/gpu/vendor/sinhf.cpp vendored Normal file
View File

@@ -0,0 +1,18 @@
//===-- Implementation of the sinhf function for GPU ----------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/sinhf.h"
#include "src/__support/common.h"
#include "common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, sinhf, (float x)) { return internal::sinhf(x); }
} // namespace __llvm_libc

18
libc/src/math/gpu/vendor/tan.cpp vendored Normal file
View File

@@ -0,0 +1,18 @@
//===-- Implementation of the tan function for GPU ------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/tan.h"
#include "src/__support/common.h"
#include "common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, tan, (double x)) { return internal::tan(x); }
} // namespace __llvm_libc

18
libc/src/math/gpu/vendor/tanf.cpp vendored Normal file
View File

@@ -0,0 +1,18 @@
//===-- Implementation of the tanf function for GPU -----------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/tanf.h"
#include "src/__support/common.h"
#include "common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, tanf, (float x)) { return internal::tanf(x); }
} // namespace __llvm_libc

18
libc/src/math/gpu/vendor/tanh.cpp vendored Normal file
View File

@@ -0,0 +1,18 @@
//===-- Implementation of the tanh function for GPU -----------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/tanh.h"
#include "src/__support/common.h"
#include "common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, tanh, (double x)) { return internal::tanh(x); }
} // namespace __llvm_libc

18
libc/src/math/gpu/vendor/tanhf.cpp vendored Normal file
View File

@@ -0,0 +1,18 @@
//===-- Implementation of the tanhf function for GPU ----------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "src/math/tanhf.h"
#include "src/__support/common.h"
#include "common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, tanhf, (float x)) { return internal::tanhf(x); }
} // namespace __llvm_libc

18
libc/src/math/sinh.h Normal file
View File

@@ -0,0 +1,18 @@
//===-- Implementation header for sinh --------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_SRC_MATH_SINH_H
#define LLVM_LIBC_SRC_MATH_SINH_H
namespace __llvm_libc {
double sinh(double x);
} // namespace __llvm_libc
#endif // LLVM_LIBC_SRC_MATH_SINH_H

18
libc/src/math/tanh.h Normal file
View File

@@ -0,0 +1,18 @@
//===-- Implementation header for tanh --------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_SRC_MATH_TANH_H
#define LLVM_LIBC_SRC_MATH_TANH_H
namespace __llvm_libc {
double tanh(double x);
} // namespace __llvm_libc
#endif // LLVM_LIBC_SRC_MATH_TANH_H