diff options
author | gjl <gjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-02-08 13:23:34 +0000 |
---|---|---|
committer | gjl <gjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-02-08 13:23:34 +0000 |
commit | 992b73877ae072a910fca6e95ace1ffa1c3c94b6 (patch) | |
tree | f151da27f7789e368ab8961edc7f453c040b899a | |
parent | ab3c098631532ebc0c8e72bf96893711c6c7d1aa (diff) | |
download | gcc-992b73877ae072a910fca6e95ace1ffa1c3c94b6.tar.gz |
gcc/
PR tree-optimization/56064
* fixed-value.c (fixed_from_double_int): Sign/zero extend payload
bits according to mode.
* fixed-value.h (fixed_from_double_int)
(const_fixed_from_double_int): Adjust comments.
gcc/testsuite/
PR tree-optimization/56064
* gcc.dg/fixed-point/view-convert-2.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@195885 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fixed-value.c | 10 | ||||
-rw-r--r-- | gcc/fixed-value.h | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/fixed-point/view-convert-2.c | 139 |
5 files changed, 162 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d7b0e643b7f..55e90b4abdf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2013-02-08 Georg-Johann Lay <avr@gjlay.de> + + PR tree-optimization/56064 + * fixed-value.c (fixed_from_double_int): Sign/zero extend payload + bits according to mode. + * fixed-value.h (fixed_from_double_int) + (const_fixed_from_double_int): Adjust comments. + 2013-02-08 Richard Biener <rguenther@suse.de> PR lto/56231 diff --git a/gcc/fixed-value.c b/gcc/fixed-value.c index 2e97a492619..18ce47e3657 100644 --- a/gcc/fixed-value.c +++ b/gcc/fixed-value.c @@ -83,7 +83,7 @@ check_real_for_fixed_mode (REAL_VALUE_TYPE *real_value, enum machine_mode mode) /* Construct a CONST_FIXED from a bit payload and machine mode MODE. - The bits in PAYLOAD are used verbatim. */ + The bits in PAYLOAD are sign-extended/zero-extended according to MODE. */ FIXED_VALUE_TYPE fixed_from_double_int (double_int payload, enum machine_mode mode) @@ -92,7 +92,13 @@ fixed_from_double_int (double_int payload, enum machine_mode mode) gcc_assert (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_DOUBLE_INT); - value.data = payload; + if (SIGNED_SCALAR_FIXED_POINT_MODE_P (mode)) + value.data = payload.sext (1 + GET_MODE_IBIT (mode) + GET_MODE_FBIT (mode)); + else if (UNSIGNED_SCALAR_FIXED_POINT_MODE_P (mode)) + value.data = payload.zext (GET_MODE_IBIT (mode) + GET_MODE_FBIT (mode)); + else + gcc_unreachable(); + value.mode = mode; return value; diff --git a/gcc/fixed-value.h b/gcc/fixed-value.h index 5ffe67ca87a..f59466ad4f1 100644 --- a/gcc/fixed-value.h +++ b/gcc/fixed-value.h @@ -50,12 +50,12 @@ extern FIXED_VALUE_TYPE fconst1[MAX_FCONST1]; extern rtx const_fixed_from_fixed_value (FIXED_VALUE_TYPE, enum machine_mode); /* Construct a FIXED_VALUE from a bit payload and machine mode MODE. - The bits in PAYLOAD are used verbatim. */ + The bits in PAYLOAD are sign-extended/zero-extended according to MODE. */ extern FIXED_VALUE_TYPE fixed_from_double_int (double_int, enum machine_mode); /* Return a CONST_FIXED from a bit payload and machine mode MODE. - The bits in PAYLOAD are used verbatim. */ + The bits in PAYLOAD are sign-extended/zero-extended according to MODE. */ static inline rtx const_fixed_from_double_int (double_int payload, enum machine_mode mode) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1209b9439e6..31f0bf2844f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-02-08 Georg-Johann Lay <avr@gjlay.de> + + PR tree-optimization/56064 + * gcc.dg/fixed-point/view-convert-2.c: New test. + 2013-02-08 Michael Matz <matz@suse.de> PR tree-optimization/52448 diff --git a/gcc/testsuite/gcc.dg/fixed-point/view-convert-2.c b/gcc/testsuite/gcc.dg/fixed-point/view-convert-2.c new file mode 100644 index 00000000000..fbce5185e16 --- /dev/null +++ b/gcc/testsuite/gcc.dg/fixed-point/view-convert-2.c @@ -0,0 +1,139 @@ +/* PR tree-optimization/56064 */ +/* { dg-do run } */ +/* { dg-options "-std=gnu99 -O2" } */ + +extern void abort (void); +extern void exit (int); + +void test_k (void) +{ + _Accum a; + __INT32_TYPE__ i = -__INT32_MAX__; + + if (sizeof (a) != sizeof (i)) + return; + + __builtin_memcpy (&a, &i, sizeof (a)); + + if (a >= 0k) + abort(); +} + +void test_0k (void) +{ + _Accum a; + __INT32_TYPE__ i = 0; + + if (sizeof (a) != sizeof (i)) + return; + + __builtin_memcpy (&a, &i, sizeof (a)); + + if (a != 0k) + abort(); +} + + +void test_hr (void) +{ + short _Fract a; + __INT8_TYPE__ i = -__INT8_MAX__; + + if (sizeof (a) != sizeof (i)) + return; + + __builtin_memcpy (&a, &i, sizeof (a)); + + if (a >= 0hr) + abort(); +} + +void test_0hr (void) +{ + short _Fract a; + __INT8_TYPE__ i = 0; + + if (sizeof (a) != sizeof (i)) + return; + + __builtin_memcpy (&a, &i, sizeof (a)); + + if (a != 0hr) + abort(); +} + + +void test_si (void) +{ + _Accum a = __ACCUM_MIN__; + __INT32_TYPE__ i; + + if (sizeof (a) != sizeof (i)) + return; + + __builtin_memcpy (&i, &a, sizeof (i)); + + if (i >= 0) + abort(); +} + +void test_0si (void) +{ + _Accum a = 0; + __INT32_TYPE__ i; + + if (sizeof (a) != sizeof (i)) + return; + + __builtin_memcpy (&i, &a, sizeof (i)); + + if (i != 0) + abort(); +} + + +void test_qi (void) +{ + short _Fract a = __SFRACT_MIN__; + __INT8_TYPE__ i; + + if (sizeof (a) != sizeof (i)) + return; + + __builtin_memcpy (&i, &a, sizeof (i)); + + if (i >= 0) + abort(); +} + +void test_0qi (void) +{ + short _Fract a = 0hr; + __INT8_TYPE__ i; + + if (sizeof (a) != sizeof (i)) + return; + + __builtin_memcpy (&i, &a, sizeof (i)); + + if (i != 0) + abort(); +} + + +int main (void) +{ + test_hr(); + test_k(); + test_qi(); + test_si(); + + test_0hr(); + test_0k(); + test_0qi(); + test_0si(); + + exit (0); + + return 0; +} |