2009-06-27 00:47:03 +08:00
|
|
|
//===-- fixunstfdi_test.c - Test __fixunstfdi -----------------------------===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
2010-11-17 06:13:33 +08:00
|
|
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
|
|
|
// Source Licenses. See LICENSE.TXT for details.
|
2009-06-27 00:47:03 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file tests __fixunstfdi for the compiler_rt library.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2015-03-09 05:08:39 +08:00
|
|
|
#include <stdio.h>
|
|
|
|
|
[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
|
|
|
#if _ARCH_PPC || __aarch64__
|
2009-06-27 00:47:03 +08:00
|
|
|
|
|
|
|
#include "int_lib.h"
|
|
|
|
|
|
|
|
// Returns: convert a to a unsigned long long, rounding toward zero.
|
|
|
|
// Negative values all become zero.
|
|
|
|
|
[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
|
|
|
// Assumption: long double is a 128 bit floating point type
|
2009-06-27 00:47:03 +08:00
|
|
|
// du_int is a 64 bit integral type
|
|
|
|
// value in long double is representable in du_int or is negative
|
|
|
|
// (no range checking performed)
|
|
|
|
|
2015-04-24 23:45:57 +08:00
|
|
|
COMPILER_RT_ABI du_int __fixunstfdi(long double a);
|
2009-06-27 00:47:03 +08:00
|
|
|
|
|
|
|
int test__fixunstfdi(long double a, du_int expected)
|
|
|
|
{
|
|
|
|
du_int x = __fixunstfdi(a);
|
|
|
|
if (x != expected)
|
|
|
|
printf("error in __fixunstfdi(%LA) = %llX, expected %llX\n",
|
|
|
|
a, x, expected);
|
|
|
|
return x != expected;
|
|
|
|
}
|
|
|
|
|
|
|
|
char assumption_1[sizeof(du_int) == 2*sizeof(su_int)] = {0};
|
|
|
|
char assumption_2[sizeof(du_int)*CHAR_BIT == 64] = {0};
|
|
|
|
char assumption_3[sizeof(long double)*CHAR_BIT == 128] = {0};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
[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
|
|
|
#if _ARCH_PPC || __aarch64__
|
2009-06-27 00:47:03 +08:00
|
|
|
if (test__fixunstfdi(0.0, 0))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
if (test__fixunstfdi(0.5, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(0.99, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(1.0, 1))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(1.5, 1))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(1.99, 1))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(2.0, 2))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(2.01, 2))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(-0.5, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(-0.99, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(-1.0, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(-1.5, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(-1.99, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(-2.0, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(-2.01, 0))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
if (test__fixunstfdi(0x1.FFFFFEp+62, 0x7FFFFF8000000000LL))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(0x1.FFFFFCp+62, 0x7FFFFF0000000000LL))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
if (test__fixunstfdi(-0x1.FFFFFEp+62, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(-0x1.FFFFFCp+62, 0))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
if (test__fixunstfdi(0x1.FFFFFFFFFFFFFp+62, 0x7FFFFFFFFFFFFC00LL))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(0x1.FFFFFFFFFFFFEp+62, 0x7FFFFFFFFFFFF800LL))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
if (test__fixunstfdi(-0x1.FFFFFFFFFFFFFp+62, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(-0x1.FFFFFFFFFFFFEp+62, 0))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
if (test__fixunstfdi(0x1.FFFFFFFFFFFFFFFEp+63L, 0xFFFFFFFFFFFFFFFFLL))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(0x1.0000000000000002p+63L, 0x8000000000000001LL))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(0x1.0000000000000000p+63L, 0x8000000000000000LL))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(0x1.FFFFFFFFFFFFFFFCp+62L, 0x7FFFFFFFFFFFFFFFLL))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(0x1.FFFFFFFFFFFFFFF8p+62L, 0x7FFFFFFFFFFFFFFELL))
|
|
|
|
return 1;
|
[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
|
|
|
if (test__fixunstfdi(0x1.p+64L, 0xFFFFFFFFFFFFFFFFLL))
|
|
|
|
return 1;
|
2009-06-27 00:47:03 +08:00
|
|
|
|
|
|
|
if (test__fixunstfdi(-0x1.0000000000000000p+63L, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(-0x1.FFFFFFFFFFFFFFFCp+62L, 0))
|
|
|
|
return 1;
|
|
|
|
if (test__fixunstfdi(-0x1.FFFFFFFFFFFFFFF8p+62L, 0))
|
|
|
|
return 1;
|
|
|
|
|
2011-05-30 05:43:29 +08:00
|
|
|
#else
|
|
|
|
printf("skipped\n");
|
2009-06-27 00:47:03 +08:00
|
|
|
#endif
|
|
|
|
return 0;
|
|
|
|
}
|