]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
expmed.c (extract_bit_field_1): Also use a temporary and convert_extracted_bit_field...
authorAdam Nemet <anemet@caviumnetworks.com>
Tue, 18 Nov 2008 02:08:24 +0000 (02:08 +0000)
committerAdam Nemet <nemet@gcc.gnu.org>
Tue, 18 Nov 2008 02:08:24 +0000 (02:08 +0000)
* expmed.c (extract_bit_field_1): Also use a temporary and
convert_extracted_bit_field when the conversion from ext_mode to
the target mode requires explicit truncation.

testsuite/
* gcc.c-torture/execute/20081117-1.c: New test.

From-SVN: r141960

gcc/ChangeLog
gcc/expmed.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20081117-1.c [new file with mode: 0644]

index 0477d27532c54a1654339c6bcf0883073749b049..da96cb50c607b18fa558b8368888f7ccb1efd573 100644 (file)
@@ -1,3 +1,9 @@
+2008-11-17  Adam Nemet  <anemet@caviumnetworks.com>
+
+       * expmed.c (extract_bit_field_1): Also use a temporary and
+       convert_extracted_bit_field when the conversion from ext_mode to
+       the target mode requires explicit truncation.
+
 2008-11-17  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * config/mips/mips.h (REG_ALLOC_ORDER): Put accumulators first.
index 0c7e611e188a091bfd495e1a44c7b81e593097fe..70a0d18bcb52afb7a1408532cea52bca2a7cf762 100644 (file)
@@ -1533,7 +1533,13 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
 
       if (GET_MODE (xtarget) != ext_mode)
        {
-         if (REG_P (xtarget))
+         /* Don't use LHS paradoxical subreg if explicit truncation is needed
+            between the mode of the extraction (word_mode) and the target
+            mode.  Instead, create a temporary and use convert_move to set
+            the target.  */
+         if (REG_P (xtarget)
+             && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE (xtarget)),
+                                       GET_MODE_BITSIZE (ext_mode)))
            {
              xtarget = gen_lowpart (ext_mode, xtarget);
              if (GET_MODE_SIZE (ext_mode)
index 2bc3201729925629593ab03b18dd60f4a18d198e..0af6cad0a3d0776efbe07c698a644f48bfba3661 100644 (file)
@@ -1,3 +1,7 @@
+2008-11-17  Adam Nemet  <anemet@caviumnetworks.com>
+
+       * gcc.c-torture/execute/20081117-1.c: New test.
+
 2008-11-17  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * gcc.target/mips/dspr2-MULT.c: Just check for $ac1 and $ac2.
diff --git a/gcc/testsuite/gcc.c-torture/execute/20081117-1.c b/gcc/testsuite/gcc.c-torture/execute/20081117-1.c
new file mode 100644 (file)
index 0000000..bff7464
--- /dev/null
@@ -0,0 +1,24 @@
+extern void abort (void);
+
+struct s
+{
+  unsigned long long a:16;
+  unsigned long long b:32;
+  unsigned long long c:16;
+};
+
+__attribute__ ((noinline)) unsigned
+f (struct s s, unsigned i)
+{
+  return s.b == i;
+}
+
+struct s s = { 1, 0x87654321u, 2};
+
+int
+main ()
+{
+  if (!f (s, 0x87654321u))
+    abort ();
+  return 0;
+}