[Builtin] Implement lit-test support (part 1 of 2: test cases update)
Original r297566 is splitted into two parts.
This is part one, which adds "RUN" command for test cases.
Unit/arm/call_apsr.S is updated to support thumb1.
It also fixes a bug in arm/aeabi_uldivmod_test.c
gcc_personality_test is XFAILED as the framework cannot handle it so far.
cpu_model_test is also XFAILED for now as it is expected to return non-zero.
TODO: A few tests are XFAILed for armhf and aarch64.
We need further investigating. [1,2] Tracks the issue.
[1] https://bugs.llvm.org//show_bug.cgi?id=32260
[2] https://bugs.llvm.org//show_bug.cgi?id=32261
Reviewers: rengolin, compnerd, jroelofs, erik.pilkington, arphaman
Reviewed By: jroelofs
Subscribers: jroelofs, aemerson, srhines, nemanjai, llvm-commits, mgorny
Differential Revision: https://reviews.llvm.org/D30802
llvm-svn: 298339
2017-03-21 13:32:51 +08:00
|
|
|
// RUN: %clang_builtins %s %librt -o %t && %run %t
|
[compiler-rt] Add AArch64 to CMake configuration and several missing builtins
Summary:
Currently CMake doesn't build builtins for AArch64 and if one does this anyway
it's likely that at least `__multc3`, `__floatditf` and `__floatunditf` will be
missing. There is actually more builtins to add, but these come from
different libc implementations, thus providing them makes compiler-rt for
AArch64 good enough at least for basic usage.
Builtins implementation were originally taken from FreeBSD project:
* [[ https://reviews.freebsd.org/D2173 | __multc3 ]]
* [[ https://reviews.freebsd.org/D2174 | __floatditf and __floatunditf ]]
Until they have been tested to find mistakes in `__float*` functions.
`__floatditf` was based on `__floatsitf`, which had the same mistakes
(fixed it in r243746).
Version of the builtins in this patch are fixed and complemented with basic
tests. Additionally they were tested via GCC's torture (this is what revealed
these issues).
P.S. Ed (author of FreeBSD patches) asked for feedback on the list some time ago (here [[ http://lists.cs.uiuc.edu/pipermail/llvmdev/2015-March/084064.html | here ]])
and got no response, but it seems to be worth adding these builtins as is and
extracting common part later.
Reviewers: howard.hinnant, t.p.northover, jmolloy, enefaim, rengolin, zatrazz
Subscribers: asl, emaste, samsonov, aemerson, llvm-commits, rengolin
Differential Revision: http://reviews.llvm.org/D11679
llvm-svn: 245296
2015-08-18 21:43:37 +08:00
|
|
|
//===-- floatditf_test.c - Test __floatditf -------------------------------===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
|
|
|
// Source Licenses. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file tests __floatditf for the compiler_rt library.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "int_lib.h"
|
|
|
|
#include <math.h>
|
|
|
|
#include <complex.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
#if __LDBL_MANT_DIG__ == 113
|
|
|
|
|
|
|
|
#include "fp_test.h"
|
|
|
|
|
|
|
|
// Returns: long integer converted to long double
|
|
|
|
|
|
|
|
COMPILER_RT_ABI long double __floatditf(long long a);
|
|
|
|
|
|
|
|
int test__floatditf(long long a, uint64_t expectedHi, uint64_t expectedLo)
|
|
|
|
{
|
|
|
|
long double x = __floatditf(a);
|
|
|
|
int ret = compareResultLD(x, expectedHi, expectedLo);
|
|
|
|
|
|
|
|
if (ret)
|
|
|
|
printf("error in __floatditf(%Ld) = %.20Lf, "
|
|
|
|
"expected %.20Lf\n", a, x, fromRep128(expectedHi, expectedLo));
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
char assumption_1[sizeof(long double) * CHAR_BIT == 128] = {0};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
#if __LDBL_MANT_DIG__ == 113
|
|
|
|
if (test__floatditf(0x7fffffffffffffff, UINT64_C(0x403dffffffffffff), UINT64_C(0xfffc000000000000)))
|
|
|
|
return 1;
|
|
|
|
if (test__floatditf(0x123456789abcdef1, UINT64_C(0x403b23456789abcd), UINT64_C(0xef10000000000000)))
|
|
|
|
return 1;
|
|
|
|
if (test__floatditf(0x2, UINT64_C(0x4000000000000000), UINT64_C(0x0)))
|
|
|
|
return 1;
|
|
|
|
if (test__floatditf(0x1, UINT64_C(0x3fff000000000000), UINT64_C(0x0)))
|
|
|
|
return 1;
|
|
|
|
if (test__floatditf(0x0, UINT64_C(0x0), UINT64_C(0x0)))
|
|
|
|
return 1;
|
|
|
|
if (test__floatditf(0xffffffffffffffff, UINT64_C(0xbfff000000000000), UINT64_C(0x0)))
|
|
|
|
return 1;
|
|
|
|
if (test__floatditf(0xfffffffffffffffe, UINT64_C(0xc000000000000000), UINT64_C(0x0)))
|
|
|
|
return 1;
|
|
|
|
if (test__floatditf(-0x123456789abcdef1, UINT64_C(0xc03b23456789abcd), UINT64_C(0xef10000000000000)))
|
|
|
|
return 1;
|
|
|
|
if (test__floatditf(0x8000000000000000, UINT64_C(0xc03e000000000000), UINT64_C(0x0)))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
#else
|
|
|
|
printf("skipped\n");
|
|
|
|
|
|
|
|
#endif
|
|
|
|
return 0;
|
|
|
|
}
|