This patch adds a set of exhaustive tests for half-precision math. The functions included in this set were selected based on the following criteria: - An implementation exists in `libc/src/math/generic` (i.e., it is not just a wrapper around a compiler built-in). - The corresponding LLVM CPU libm implementation is correctly rounded. - The function is listed in Table 69 of the OpenCL C Specification v3.0.19. This patch also fixes the testing range of the following functions: `acos`, `acosf`, `asin`, `asinf`, and `log1p`.
173 lines
5.2 KiB
C++
173 lines
5.2 KiB
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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// This file contains platform-specific definitions and forward declarations
|
|
/// for device-side APIs used by the kernels.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef CONFORMANCE_DEVICE_CODE_DEVICEAPIS_HPP
|
|
#define CONFORMANCE_DEVICE_CODE_DEVICEAPIS_HPP
|
|
|
|
#include <stdint.h>
|
|
|
|
typedef _Float16 float16;
|
|
|
|
#ifdef __AMDGPU__
|
|
|
|
// The ROCm device library uses control globals to alter codegen for the
|
|
// different targets. To avoid needing to link them in manually, we simply
|
|
// define them here.
|
|
extern "C" {
|
|
extern const inline uint8_t __oclc_unsafe_math_opt = 0;
|
|
extern const inline uint8_t __oclc_daz_opt = 0;
|
|
extern const inline uint8_t __oclc_correctly_rounded_sqrt32 = 1;
|
|
extern const inline uint8_t __oclc_finite_only_opt = 0;
|
|
extern const inline uint32_t __oclc_ISA_version = 9000;
|
|
}
|
|
|
|
// These aliases cause Clang to emit the control constants with ODR linkage.
|
|
// This allows us to link against the symbols without preventing them from being
|
|
// optimized out or causing symbol collisions.
|
|
[[gnu::alias("__oclc_unsafe_math_opt")]] const uint8_t __oclc_unsafe_math_opt__;
|
|
[[gnu::alias("__oclc_daz_opt")]] const uint8_t __oclc_daz_opt__;
|
|
[[gnu::alias("__oclc_correctly_rounded_sqrt32")]] const uint8_t
|
|
__oclc_correctly_rounded_sqrt32__;
|
|
[[gnu::alias("__oclc_finite_only_opt")]] const uint8_t __oclc_finite_only_opt__;
|
|
[[gnu::alias("__oclc_ISA_version")]] const uint32_t __oclc_ISA_version__;
|
|
|
|
#endif // __AMDGPU__
|
|
|
|
#ifdef CUDA_MATH_FOUND
|
|
|
|
extern "C" {
|
|
|
|
double __nv_acos(double);
|
|
float __nv_acosf(float);
|
|
float __nv_acoshf(float);
|
|
double __nv_asin(double);
|
|
float __nv_asinf(float);
|
|
float __nv_asinhf(float);
|
|
float __nv_atanf(float);
|
|
float __nv_atan2f(float, float);
|
|
float __nv_atanhf(float);
|
|
double __nv_cbrt(double);
|
|
float __nv_cbrtf(float);
|
|
double __nv_cos(double);
|
|
float __nv_cosf(float);
|
|
float __nv_coshf(float);
|
|
float __nv_cospif(float);
|
|
float __nv_erff(float);
|
|
double __nv_exp(double);
|
|
float __nv_expf(float);
|
|
double __nv_exp10(double);
|
|
float __nv_exp10f(float);
|
|
double __nv_exp2(double);
|
|
float __nv_exp2f(float);
|
|
double __nv_expm1(double);
|
|
float __nv_expm1f(float);
|
|
double __nv_hypot(double, double);
|
|
float __nv_hypotf(float, float);
|
|
double __nv_log(double);
|
|
float __nv_logf(float);
|
|
double __nv_log10(double);
|
|
float __nv_log10f(float);
|
|
double __nv_log1p(double);
|
|
float __nv_log1pf(float);
|
|
double __nv_log2(double);
|
|
float __nv_log2f(float);
|
|
float __nv_powf(float, float);
|
|
float __nv_roundf(float);
|
|
double __nv_sin(double);
|
|
float __nv_sinf(float);
|
|
void __nv_sincos(double, double *, double *);
|
|
void __nv_sincosf(float, float *, float *);
|
|
float __nv_sinhf(float);
|
|
float __nv_sinpif(float);
|
|
double __nv_tan(double);
|
|
float __nv_tanf(float);
|
|
float __nv_tanhf(float);
|
|
} // extern "C"
|
|
|
|
#endif // CUDA_MATH_FOUND
|
|
|
|
#ifdef HIP_MATH_FOUND
|
|
|
|
extern "C" {
|
|
|
|
double __ocml_acos_f64(double);
|
|
float __ocml_acos_f32(float);
|
|
float16 __ocml_acos_f16(float16);
|
|
float __ocml_acosh_f32(float);
|
|
float16 __ocml_acosh_f16(float16);
|
|
double __ocml_asin_f64(double);
|
|
float __ocml_asin_f32(float);
|
|
float16 __ocml_asin_f16(float16);
|
|
float __ocml_asinh_f32(float);
|
|
float16 __ocml_asinh_f16(float16);
|
|
float __ocml_atan_f32(float);
|
|
float16 __ocml_atan_f16(float16);
|
|
float __ocml_atan2_f32(float, float);
|
|
float __ocml_atanh_f32(float);
|
|
float16 __ocml_atanh_f16(float16);
|
|
double __ocml_cbrt_f64(double);
|
|
float __ocml_cbrt_f32(float);
|
|
double __ocml_cos_f64(double);
|
|
float __ocml_cos_f32(float);
|
|
float16 __ocml_cos_f16(float16);
|
|
float __ocml_cosh_f32(float);
|
|
float16 __ocml_cosh_f16(float16);
|
|
float __ocml_cospi_f32(float);
|
|
float __ocml_erf_f32(float);
|
|
double __ocml_exp_f64(double);
|
|
float __ocml_exp_f32(float);
|
|
float16 __ocml_exp_f16(float16);
|
|
double __ocml_exp10_f64(double);
|
|
float __ocml_exp10_f32(float);
|
|
float16 __ocml_exp10_f16(float16);
|
|
double __ocml_exp2_f64(double);
|
|
float __ocml_exp2_f32(float);
|
|
float16 __ocml_exp2_f16(float16);
|
|
double __ocml_expm1_f64(double);
|
|
float __ocml_expm1_f32(float);
|
|
float16 __ocml_expm1_f16(float16);
|
|
double __ocml_hypot_f64(double, double);
|
|
float __ocml_hypot_f32(float, float);
|
|
double __ocml_log_f64(double);
|
|
float __ocml_log_f32(float);
|
|
float16 __ocml_log_f16(float16);
|
|
double __ocml_log10_f64(double);
|
|
float __ocml_log10_f32(float);
|
|
float16 __ocml_log10_f16(float16);
|
|
double __ocml_log1p_f64(double);
|
|
float __ocml_log1p_f32(float);
|
|
double __ocml_log2_f64(double);
|
|
float __ocml_log2_f32(float);
|
|
float16 __ocml_log2_f16(float16);
|
|
float __ocml_pow_f32(float, float);
|
|
float __ocml_round_f32(float);
|
|
double __ocml_sin_f64(double);
|
|
float __ocml_sin_f32(float);
|
|
float16 __ocml_sin_f16(float16);
|
|
double __ocml_sincos_f64(double, double *);
|
|
float __ocml_sincos_f32(float, float *);
|
|
float __ocml_sinh_f32(float);
|
|
float16 __ocml_sinh_f16(float16);
|
|
float __ocml_sinpi_f32(float);
|
|
double __ocml_tan_f64(double);
|
|
float __ocml_tan_f32(float);
|
|
float16 __ocml_tan_f16(float16);
|
|
float __ocml_tanh_f32(float);
|
|
float16 __ocml_tanh_f16(float16);
|
|
} // extern "C"
|
|
|
|
#endif // HIP_MATH_FOUND
|
|
|
|
#endif // CONFORMANCE_DEVICE_CODE_DEVICEAPIS_HPP
|