Add truncxfhf2 with tests to compiler-rt (#120372)

Fixes #105181
This commit is contained in:
B I Mohammed Abbas 2024-12-31 03:44:43 +05:30 committed by GitHub
parent 332d2647ff
commit 28ae2ff2a4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 90 additions and 0 deletions

View File

@ -310,6 +310,7 @@ set(x86_80_BIT_SOURCES
mulxc3.c mulxc3.c
powixf2.c powixf2.c
trunctfxf2.c trunctfxf2.c
truncxfhf2.c
) )
if (NOT MSVC) if (NOT MSVC)

View File

@ -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);
}

View File

@ -0,0 +1,74 @@
// RUN: %clang_builtins %s %librt -o %t && %run %t
// REQUIRES: librt_has_truncxfhf2
#include <stdio.h>
#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