(alpha_builtin_saveregs): Use ptr_mode and conversions when need so
authorRichard Kenner <kenner@gcc.gnu.org>
Fri, 16 Jun 1995 10:53:32 +0000 (06:53 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Fri, 16 Jun 1995 10:53:32 +0000 (06:53 -0400)
works for both OSF and NT.

From-SVN: r9995

gcc/config/alpha/alpha.c

index bdcd305983ccb8c1b3c59f53f16b9d50407a321e..cd67fe3c21380cbd9e08d4dfd1c372e7bbc49413 100644 (file)
@@ -1156,20 +1156,27 @@ alpha_builtin_saveregs (arglist)
          ? plus_constant (virtual_incoming_args_rtx, 6 * UNITS_PER_WORD)
          : plus_constant (virtual_incoming_args_rtx, - (6 * UNITS_PER_WORD)));
 
+  addr = force_operand (addr, NULL_RTX);
+
   /* Allocate the va_list constructor */
   block = assign_stack_local (BLKmode, 2 * UNITS_PER_WORD, BITS_PER_WORD);
   RTX_UNCHANGING_P (block) = 1;
   RTX_UNCHANGING_P (XEXP (block, 0)) = 1;
 
-  /* Store the address of the first integer register in the
-     __va_base member.  */
-  emit_move_insn (change_address (block, Pmode, XEXP (block, 0)),
-                 force_operand (addr, NULL_RTX));
+  /* Store the address of the first integer register in the __base member.
+     Note that our offsets are correct for both 32- and 64-bit pointers
+     due to the alignment of the __offset field (a long).  */
+
+#ifdef POINTERS_EXTEND_UNSIGNED
+  addr = convert_memory_address (ptr_mode, addr);
+#endif
+
+  emit_move_insn (change_address (block, ptr_mode, XEXP (block, 0)), addr);
 
   /* Store the argsize as the __va_offset member.  */
-  emit_move_insn (change_address (block, Pmode,
+  emit_move_insn (change_address (block, ptr_mode,
                                  plus_constant (XEXP (block, 0),
-                                                UNITS_PER_WORD)),
+                                                GET_MODE_SIZE (ptr_mode))),
                  force_operand (argsize, NULL_RTX));
 
   /* Return the address of the va_list constructor, but don't put it in a