diff options
author | Terry Guo <terry.guo@arm.com> | 2014-11-17 07:06:54 +0000 |
---|---|---|
committer | Xuepeng Guo <xguo@gcc.gnu.org> | 2014-11-17 07:06:54 +0000 |
commit | c121b4b78ba57d9a87c3cf355319fcf8c7adc2aa (patch) | |
tree | 418601fb757b64778d7a02bae1a1ec4baeda832a /gcc/testsuite/gcc.target/arm/thumb1-ual-1.c | |
parent | 4696acf0d351041af6c75cf6a33703c0acdbdc76 (diff) | |
download | gcc-c121b4b78ba57d9a87c3cf355319fcf8c7adc2aa.tar.gz |
thumb1.md (*addsi3_cbranch_scratch): Updated to UAL format.
gcc/
2014-11-17 Terry Guo <terry.guo@arm.com>
* config/arm/thumb1.md (*addsi3_cbranch_scratch): Updated to UAL
format.
gcc/testsuite/
2014-11-17 Terry Guo <terry.guo@arm.com>
* gcc.target/arm/thumb1-ual-1.c: New test.
From-SVN: r217647
Diffstat (limited to 'gcc/testsuite/gcc.target/arm/thumb1-ual-1.c')
-rw-r--r-- | gcc/testsuite/gcc.target/arm/thumb1-ual-1.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/arm/thumb1-ual-1.c b/gcc/testsuite/gcc.target/arm/thumb1-ual-1.c new file mode 100644 index 00000000000..a2e439c6c4b --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/thumb1-ual-1.c @@ -0,0 +1,87 @@ +/* Test Thumb1 insn pattern addsi3_cbranch_scratch. */ +/* { dg-options "-O2" } */ +/* { dg-skip-if "" { ! { arm_thumb1 } } } */ + +struct real_value { + + unsigned int cl : 2; + unsigned int decimal : 1; + unsigned int sign : 1; + unsigned int signalling : 1; + unsigned int canonical : 1; + unsigned int uexp : (32 - 6); + unsigned long sig[((128 + (8 * 4)) / (8 * 4))]; +}; + +enum real_value_class { + rvc_zero, + rvc_normal, + rvc_inf, + rvc_nan +}; + +extern void exit(int); +extern int foo(long long *, int, int); + +int +real_to_integer (const struct real_value *r, int *fail, int precision) +{ + long long val[2 * (((64*(8)) + 64) / 64)]; + int exp; + int words, w; + int result; + + switch (r->cl) + { + case rvc_zero: + underflow: + return 100; + + case rvc_inf: + case rvc_nan: + overflow: + *fail = 1; + + if (r->sign) + return 200; + else + return 300; + + case rvc_normal: + if (r->decimal) + return 400; + + exp = ((int)((r)->uexp ^ (unsigned int)(1 << ((32 - 6) - 1))) - (1 << ((32 - 6) - 1))); + if (exp <= 0) + goto underflow; + + + if (exp > precision) + goto overflow; + words = (precision + 64 - 1) / 64; + w = words * 64; + for (int i = 0; i < words; i++) + { + int j = ((128 + (8 * 4)) / (8 * 4)) - (words * 2) + (i * 2); + if (j < 0) + val[i] = 0; + else + val[i] = r->sig[j]; + j += 1; + if (j >= 0) + val[i] |= (unsigned long long) r->sig[j] << (8 * 4); + } + + + result = foo(val, words, w); + + if (r->sign) + return -result; + else + return result; + + default: + exit(2); + } +} + |