[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
|
2018-11-01 08:00:03 +08:00
|
|
|
// REQUIRES: int128
|
2009-06-27 00:47:03 +08:00
|
|
|
//===-- fixunsdfti_test.c - Test __fixunsdfti -----------------------------===//
|
|
|
|
//
|
2019-01-19 18:56:40 +08:00
|
|
|
// 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
|
2009-06-27 00:47:03 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file tests __fixunsdfti for the compiler_rt library.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "int_lib.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
// Returns: convert a to a unsigned long long, rounding toward zero.
|
|
|
|
// Negative values all become zero.
|
|
|
|
|
|
|
|
// Assumption: double is a IEEE 64 bit floating point type
|
|
|
|
// tu_int is a 64 bit integral type
|
|
|
|
// value in double is representable in tu_int or is negative
|
|
|
|
// (no range checking performed)
|
|
|
|
|
|
|
|
// seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm
|
|
|
|
|
2014-03-19 05:35:30 +08:00
|
|
|
#ifdef CRT_HAS_128BIT
|
2009-06-27 00:47:03 +08:00
|
|
|
|
2015-04-24 23:45:57 +08:00
|
|
|
COMPILER_RT_ABI tu_int __fixunsdfti(double a);
|
2009-06-27 00:47:03 +08:00
|
|
|
|
|
|
|
int test__fixunsdfti(double a, tu_int expected)
|
|
|
|
{
|
|
|
|
tu_int x = __fixunsdfti(a);
|
|
|
|
if (x != expected)
|
|
|
|
{
|
|
|
|
utwords xt;
|
|
|
|
xt.all = x;
|
|
|
|
utwords expectedt;
|
|
|
|
expectedt.all = expected;
|
|
|
|
printf("error in __fixunsdfti(%A) = 0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n",
|
2009-10-28 01:49:07 +08:00
|
|
|
a, xt.s.high, xt.s.low, expectedt.s.high, expectedt.s.low);
|
2009-06-27 00:47:03 +08:00
|
|
|
}
|
|
|
|
return x != expected;
|
|
|
|
}
|
|
|
|
|
|
|
|
char assumption_1[sizeof(tu_int) == 2*sizeof(du_int)] = {0};
|
|
|
|
char assumption_2[sizeof(su_int)*CHAR_BIT == 32] = {0};
|
|
|
|
char assumption_3[sizeof(double)*CHAR_BIT == 64] = {0};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
2014-03-19 05:35:30 +08:00
|
|
|
#ifdef CRT_HAS_128BIT
|
2009-06-27 00:47:03 +08:00
|
|
|
if (test__fixunsdfti(0.0, 0))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
if (test__fixunsdfti(0.5, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(0.99, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(1.0, 1))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(1.5, 1))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(1.99, 1))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(2.0, 2))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(2.01, 2))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(-0.5, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(-0.99, 0))
|
|
|
|
return 1;
|
|
|
|
#if !TARGET_LIBGCC
|
|
|
|
if (test__fixunsdfti(-1.0, 0)) // libgcc ignores "returns 0 for negative input" spec
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(-1.5, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(-1.99, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(-2.0, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(-2.01, 0))
|
|
|
|
return 1;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (test__fixunsdfti(0x1.FFFFFEp+62, 0x7FFFFF8000000000LL))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(0x1.FFFFFCp+62, 0x7FFFFF0000000000LL))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
#if !TARGET_LIBGCC
|
|
|
|
if (test__fixunsdfti(-0x1.FFFFFEp+62, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(-0x1.FFFFFCp+62, 0))
|
|
|
|
return 1;
|
|
|
|
#endif
|
|
|
|
|
2018-11-01 08:00:03 +08:00
|
|
|
if (test__fixunsdfti(0x1.FFFFFFFFFFFFFp+63, 0xFFFFFFFFFFFFF800ULL))
|
2009-06-27 00:47:03 +08:00
|
|
|
return 1;
|
2018-11-01 08:00:03 +08:00
|
|
|
if (test__fixunsdfti(0x1.0000000000000p+63, 0x8000000000000000ULL))
|
2009-06-27 00:47:03 +08:00
|
|
|
return 1;
|
2018-11-01 08:00:03 +08:00
|
|
|
if (test__fixunsdfti(0x1.FFFFFFFFFFFFFp+62, 0x7FFFFFFFFFFFFC00ULL))
|
2009-06-27 00:47:03 +08:00
|
|
|
return 1;
|
2018-11-01 08:00:03 +08:00
|
|
|
if (test__fixunsdfti(0x1.FFFFFFFFFFFFEp+62, 0x7FFFFFFFFFFFF800ULL))
|
2009-06-27 00:47:03 +08:00
|
|
|
return 1;
|
|
|
|
|
2018-11-01 08:00:03 +08:00
|
|
|
if (test__fixunsdfti(0x1.FFFFFFFFFFFFFp+127, make_ti(0xFFFFFFFFFFFFF800ULL, 0)))
|
2009-06-27 00:47:03 +08:00
|
|
|
return 1;
|
2018-11-01 08:00:03 +08:00
|
|
|
if (test__fixunsdfti(0x1.0000000000000p+127, make_ti(0x8000000000000000ULL, 0)))
|
2009-06-27 00:47:03 +08:00
|
|
|
return 1;
|
2018-11-01 08:00:03 +08:00
|
|
|
if (test__fixunsdfti(0x1.FFFFFFFFFFFFFp+126, make_ti(0x7FFFFFFFFFFFFC00ULL, 0)))
|
2009-06-27 00:47:03 +08:00
|
|
|
return 1;
|
2018-11-01 08:00:03 +08:00
|
|
|
if (test__fixunsdfti(0x1.FFFFFFFFFFFFEp+126, make_ti(0x7FFFFFFFFFFFF800ULL, 0)))
|
2009-06-27 00:47:03 +08:00
|
|
|
return 1;
|
2018-11-01 08:00:03 +08:00
|
|
|
if (test__fixunsdfti(0x1.0000000000000p+128, make_ti(0xFFFFFFFFFFFFFFFFULL,
|
|
|
|
0xFFFFFFFFFFFFFFFFULL)))
|
[compiler-rt][aarch64] New tests for 128-bit floating-point builtins, fixes of tests and __fixuint
Summary:
The following tests for 128-bit floating-point type behaved in a strange way, thought it were bugs, but seem to be mistakes in tests:
* `fixtfsi` test checked for `0x80000001` as a value returned for number less than can be represented, while `LONG_MIN` should be returned on saturation;
* `fixunstfdi` wasn't enabled for AArch64, only for PPC, but there is nothing PPC specific in that test;
* `multf3` tried to underflow multiplication by producing result with 16383 exponent, while there are still 112 bits of fraction plus implicit bit, so resultant exponent should be 16497.
Tests for some other builtins didn't exist:
* `fixtfdi`
* `fixtfti`
* `fixunstfti`
They were made by copying similar files and adjusting for wider types and adding/removing some reasonable/extra checks.
Also `__fixuint` seems to have off by one error, updated tests to catch this case.
Reviewers: rengolin, zatrazz, howard.hinnant, t.p.northover, jmolloy, enefaim
Subscribers: aemerson, llvm-commits, rengolin
Differential Revision: http://reviews.llvm.org/D14187
llvm-svn: 252180
2015-11-06 02:36:42 +08:00
|
|
|
return 1;
|
2009-06-27 00:47:03 +08:00
|
|
|
|
|
|
|
#if !TARGET_LIBGCC
|
|
|
|
if (test__fixunsdfti(-0x1.FFFFFFFFFFFFFp+62, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunsdfti(-0x1.FFFFFFFFFFFFEp+62, 0))
|
|
|
|
return 1;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|
|
|
|
return 0;
|
|
|
|
}
|