OSDN Git Service

Fix ia64-hpux ABI bug with varargs __float80 argument.
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 7 Jul 2005 00:20:49 +0000 (00:20 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 7 Jul 2005 00:20:49 +0000 (00:20 +0000)
* config/ia64/ia64.c (ia64_expand_movxf_movrf): Don't word swap when
reading/writing general registers.
(ia64_function_arg): Revert 2005-06-18 change.

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

gcc/ChangeLog
gcc/config/ia64/ia64.c

index 6a339a4..e19f26f 100644 (file)
@@ -1,6 +1,11 @@
 2005-07-06  James E. Wilson  <wilson@specifixinc.com>
 
 2005-07-06  James E. Wilson  <wilson@specifixinc.com>
 
-       * ia64.c (ia64_reorg): Check optimize before ia64_flag_schedule_isns2.
+       * config/ia64/ia64.c (ia64_reorg): Check optimize before
+       ia64_flag_schedule_isns2.
+
+       * config/ia64/ia64.c (ia64_expand_movxf_movrf): Don't word swap when
+       reading/writing general registers.
+       (ia64_function_arg): Revert 2005-06-18 change.
 
 2005-07-06  John David Anglin  <dave.anglin@nrc-crnc.gc.ca>
 
 
 2005-07-06  John David Anglin  <dave.anglin@nrc-crnc.gc.ca>
 
index 80fcfe3..1eb8106 100644 (file)
@@ -1363,10 +1363,13 @@ ia64_expand_movxf_movrf (enum machine_mode mode, rtx operands[])
 
       if (GET_CODE (operands[1]) == CONST_DOUBLE)
        {
 
       if (GET_CODE (operands[1]) == CONST_DOUBLE)
        {
+         /* Don't word-swap when reading in the constant.  */
          emit_move_insn (gen_rtx_REG (DImode, REGNO (op0)),
          emit_move_insn (gen_rtx_REG (DImode, REGNO (op0)),
-                         operand_subword (operands[1], 0, 0, mode));
+                         operand_subword (operands[1], WORDS_BIG_ENDIAN,
+                                          0, mode));
          emit_move_insn (gen_rtx_REG (DImode, REGNO (op0) + 1),
          emit_move_insn (gen_rtx_REG (DImode, REGNO (op0) + 1),
-                         operand_subword (operands[1], 1, 0, mode));
+                         operand_subword (operands[1], !WORDS_BIG_ENDIAN,
+                                          0, mode));
          return true;
        }
 
          return true;
        }
 
@@ -1376,8 +1379,9 @@ ia64_expand_movxf_movrf (enum machine_mode mode, rtx operands[])
 
       gcc_assert (GET_CODE (operands[1]) == MEM);
 
 
       gcc_assert (GET_CODE (operands[1]) == MEM);
 
-      out[WORDS_BIG_ENDIAN] = gen_rtx_REG (DImode, REGNO (op0));
-      out[!WORDS_BIG_ENDIAN] = gen_rtx_REG (DImode, REGNO (op0) + 1);
+      /* Don't word-swap when reading in the value.  */
+      out[0] = gen_rtx_REG (DImode, REGNO (op0));
+      out[1] = gen_rtx_REG (DImode, REGNO (op0) + 1);
 
       emit_move_insn (out[0], adjust_address (operands[1], DImode, 0));
       emit_move_insn (out[1], adjust_address (operands[1], DImode, 8));
 
       emit_move_insn (out[0], adjust_address (operands[1], DImode, 0));
       emit_move_insn (out[1], adjust_address (operands[1], DImode, 8));
@@ -1405,9 +1409,11 @@ ia64_expand_movxf_movrf (enum machine_mode mode, rtx operands[])
        {
          rtx in[2];
 
        {
          rtx in[2];
 
-          gcc_assert (GET_CODE (operands[0]) == MEM);
-         in[WORDS_BIG_ENDIAN] = gen_rtx_REG (DImode, REGNO (operands[1]));
-         in[!WORDS_BIG_ENDIAN] = gen_rtx_REG (DImode, REGNO (operands[1]) + 1);
+         gcc_assert (GET_CODE (operands[0]) == MEM);
+
+         /* Don't word-swap when writing out the value.  */
+         in[0] = gen_rtx_REG (DImode, REGNO (operands[1]));
+         in[1] = gen_rtx_REG (DImode, REGNO (operands[1]) + 1);
 
          emit_move_insn (adjust_address (operands[0], DImode, 0), in[0]);
          emit_move_insn (adjust_address (operands[0], DImode, 8), in[1]);
 
          emit_move_insn (adjust_address (operands[0], DImode, 0), in[0]);
          emit_move_insn (adjust_address (operands[0], DImode, 8), in[1]);
@@ -3917,19 +3923,6 @@ ia64_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
                    gen_rtx_EXPR_LIST (VOIDmode,
                     gen_rtx_REG (DImode, basereg + cum->words + offset),
                                      const0_rtx)));
                    gen_rtx_EXPR_LIST (VOIDmode,
                     gen_rtx_REG (DImode, basereg + cum->words + offset),
                                      const0_rtx)));
-      /* Similarly, an anonymous XFmode or RFmode value must be split
-        into two registers and padded appropriately.  */
-      else if (BYTES_BIG_ENDIAN && (mode == XFmode || mode == RFmode))
-       {
-         rtx loc[2];
-         loc[0] = gen_rtx_EXPR_LIST (VOIDmode,
-                    gen_rtx_REG (DImode, basereg + cum->words + offset),
-                                     const0_rtx);
-         loc[1] = gen_rtx_EXPR_LIST (VOIDmode,
-                    gen_rtx_REG (DImode, basereg + cum->words + offset + 1),
-                                     GEN_INT (UNITS_PER_WORD));
-         return gen_rtx_PARALLEL (mode, gen_rtvec_v (2, loc));
-       }
       else
        return gen_rtx_REG (mode, basereg + cum->words + offset);
     }
       else
        return gen_rtx_REG (mode, basereg + cum->words + offset);
     }