parent
332d2647ff
commit
28ae2ff2a4
@ -310,6 +310,7 @@ set(x86_80_BIT_SOURCES
|
||||
mulxc3.c
|
||||
powixf2.c
|
||||
trunctfxf2.c
|
||||
truncxfhf2.c
|
||||
)
|
||||
|
||||
if (NOT MSVC)
|
||||
|
15
compiler-rt/lib/builtins/truncxfhf2.c
Normal file
15
compiler-rt/lib/builtins/truncxfhf2.c
Normal 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);
|
||||
}
|
74
compiler-rt/test/builtins/Unit/truncxfhf2_test.c
Normal file
74
compiler-rt/test/builtins/Unit/truncxfhf2_test.c
Normal 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
|
Loading…
x
Reference in New Issue
Block a user