From 7a0ca3fde761b5dd4ddb31ff18b31d18bb90c60d Mon Sep 17 00:00:00 2001 From: B I Mohammed Abbas Date: Wed, 18 Dec 2024 11:55:45 +0530 Subject: [PATCH] Add truncxfhf2 with tests to compiler-rt --- compiler-rt/lib/builtins/CMakeLists.txt | 1 + compiler-rt/lib/builtins/truncxfhf2.c | 15 ++++ .../test/builtins/Unit/truncxfhf2_test.c | 74 +++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 compiler-rt/lib/builtins/truncxfhf2.c create mode 100644 compiler-rt/test/builtins/Unit/truncxfhf2_test.c diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt index 3a868c11e7288..0581688c05466 100644 --- a/compiler-rt/lib/builtins/CMakeLists.txt +++ b/compiler-rt/lib/builtins/CMakeLists.txt @@ -310,6 +310,7 @@ set(x86_80_BIT_SOURCES mulxc3.c powixf2.c trunctfxf2.c + truncxfhf2.c ) if (NOT MSVC) diff --git a/compiler-rt/lib/builtins/truncxfhf2.c b/compiler-rt/lib/builtins/truncxfhf2.c new file mode 100644 index 0000000000000..0f0639865dbfd --- /dev/null +++ b/compiler-rt/lib/builtins/truncxfhf2.c @@ -0,0 +1,15 @@ +//===-- lib/truncsfhf2.c - long double -> half conversion ---------*- 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 +// +//===----------------------------------------------------------------------===// + +#define SRC_SINGLE +#define DST_HALF +#include "fp_trunc_impl.inc" + +COMPILER_RT_ABI dst_t __truncxfhf2(xf_float a) { + return __truncXfYf2__((float)a); +} diff --git a/compiler-rt/test/builtins/Unit/truncxfhf2_test.c b/compiler-rt/test/builtins/Unit/truncxfhf2_test.c new file mode 100644 index 0000000000000..9038a91a5b4c1 --- /dev/null +++ b/compiler-rt/test/builtins/Unit/truncxfhf2_test.c @@ -0,0 +1,74 @@ +// RUN: %clang_builtins %s %librt -o %t && %run %t +// REQUIRES: librt_has_truncxfhf2 + +#include + +#include "fp_test.h" + +#if HAS_80_BIT_LONG_DOUBLE + +TYPE_FP16 __truncxfhf2(xf_float f); + +int test_truncxfhf2(uint16_t inputHi, uint64_t inputLo, uint16_t e) { + xf_float a = F80FromRep80(inputHi, inputLo); + TYPE_FP16 x = __truncxfhf2(a); + int ret = compareResultH(x, e); + if (ret) { + printf("error in test__truncxfhf2(%Lf) = %#.4x, " + "expected %#.4x\n", + a, toRep16(x), e); + } + return ret; +} + +int main() { + // Small positive value + if (test_truncxfhf2(UINT16_C(0x3ffb), UINT64_C(0xccc0000000000000), + UINT16_C(0x2e66))) + return 1; + + // Small negative value + if (test_truncxfhf2(UINT16_C(0xbffb), UINT64_C(0xccc0000000000000), + UINT16_C(0xae66))) + return 1; + + // Zero + if (test_truncxfhf2(UINT16_C(0x0), UINT64_C(0x0), UINT16_C(0))) + return 1; + + // Smallest positive non-zero value + if (test_truncxfhf2(UINT16_C(0x3fef), UINT64_C(0x8000000000000000), + UINT16_C(0x0100))) + return 1; + + // Smallest negative non-zero value + if (test_truncxfhf2(UINT16_C(0xbfef), UINT64_C(0x8000000000000000), + UINT16_C(0x8100))) + return 1; + + // Positive infinity + if (test_truncxfhf2(UINT16_C(0x7fff), UINT64_C(0x8000000000000000), + UINT16_C(0x7c00U))) + return 1; + + // Negative infinity + if (test_truncxfhf2(UINT16_C(0xffff), UINT64_C(0x8000000000000000), + UINT16_C(0xfc00U))) + return 1; + + // NaN + if (test_truncxfhf2(UINT16_C(0x7fff), UINT64_C(0xc000000000000000), + UINT16_C(0x7e00U))) + return 1; + + return 0; +} + +#else + +int main() { + printf("skipped\n"); + return 0; +} + +#endif