* config/xtensa/xtensa.c (xtensa_output_literal): Mask out high bits
authorbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 May 2007 17:05:14 +0000 (17:05 +0000)
committerbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 May 2007 17:05:14 +0000 (17:05 +0000)
for floating-point values if HOST_BITS_PER_LONG > 32.  Use split_double
instead of operand_subword.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124578 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/xtensa/xtensa.c

index a5b1469..36211dc 100644 (file)
@@ -1,3 +1,9 @@
+2007-05-09  Bob Wilson  <bob.wilson@acm.org>
+
+       * config/xtensa/xtensa.c (xtensa_output_literal): Mask out high bits
+       for floating-point values if HOST_BITS_PER_LONG > 32.  Use split_double
+       instead of operand_subword.
+
 2007-05-08  Bernd Schmidt  <bernd.schmidt@analog.com>
 
        * config/bfin/bfin.h (LOCAL_ALIGNMENT): Define.
index 43bcc58..81e7797 100644 (file)
@@ -1939,6 +1939,7 @@ xtensa_output_literal (FILE *file, rtx x, enum machine_mode mode, int labelno)
   long value_long[2];
   REAL_VALUE_TYPE r;
   int size;
+  rtx first, second;
 
   fprintf (file, "\t.literal .LC%u, ", (unsigned) labelno);
 
@@ -1952,11 +1953,18 @@ xtensa_output_literal (FILE *file, rtx x, enum machine_mode mode, int labelno)
        {
        case SFmode:
          REAL_VALUE_TO_TARGET_SINGLE (r, value_long[0]);
+#if HOST_BITS_PER_LONG > 32
+         value_long[0] &= 0xffffffff;
+#endif
          fprintf (file, "0x%08lx\n", value_long[0]);
          break;
 
        case DFmode:
          REAL_VALUE_TO_TARGET_DOUBLE (r, value_long);
+#if HOST_BITS_PER_LONG > 32
+         value_long[0] &= 0xffffffff;
+         value_long[1] &= 0xffffffff;
+#endif
          fprintf (file, "0x%08lx, 0x%08lx\n",
                   value_long[0], value_long[1]);
          break;
@@ -1978,9 +1986,10 @@ xtensa_output_literal (FILE *file, rtx x, enum machine_mode mode, int labelno)
          break;
 
        case 8:
-         output_addr_const (file, operand_subword (x, 0, 0, DImode));
+         split_double (x, &first, &second);
+         output_addr_const (file, first);
          fputs (", ", file);
-         output_addr_const (file, operand_subword (x, 1, 0, DImode));
+         output_addr_const (file, second);
          fputs ("\n", file);
          break;