diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1425635917b..3a795f630d2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2003-06-01  Richard Henderson  <rth@redhat.com>
+
+	* alpha-tdep.c (alpha_push_dummy_call): Store sp.  Tidy copies
+	from arg_reg_buffer to regcache to avoid double conversion.
+
 2003-06-01  Mark Kettenis  <kettenis@gnu.org>
 
 	* i386-linux-nat.c (child_resume): Use I386_ESP_REGNUM instead of
diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c
index fd8c88ee75d..a591d08f619 100644
--- a/gdb/alpha-tdep.c
+++ b/gdb/alpha-tdep.c
@@ -314,14 +314,15 @@ alpha_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
   /* Load the argument registers.  */
   for (i = 0; i < required_arg_regs; i++)
     {
-      LONGEST val;
-
-      val = extract_unsigned_integer (arg_reg_buffer + i*ALPHA_REGISTER_SIZE,
-				      ALPHA_REGISTER_SIZE);
-      regcache_cooked_write_signed (regcache, ALPHA_A0_REGNUM + i, val);
-      regcache_cooked_write_signed (regcache, ALPHA_FPA0_REGNUM + i, val);
+      regcache_cooked_write (regcache, ALPHA_A0_REGNUM + i,
+			     arg_reg_buffer + i*ALPHA_REGISTER_SIZE);
+      regcache_cooked_write (regcache, ALPHA_FPA0_REGNUM + i,
+			     arg_reg_buffer + i*ALPHA_REGISTER_SIZE);
     }
 
+  /* Finally, update the stack pointer.  */
+  regcache_cooked_write_signed (regcache, ALPHA_SP_REGNUM, sp);
+
   return sp;
 }