From f523247a949634754be7caa14bd4a76c427275e2 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Fri, 29 Dec 2000 08:38:19 +0000 Subject: [PATCH] function.c (assign_parms): Convert arguments passed by reference to the right mode. * function.c (assign_parms): Convert arguments passed by reference to the right mode. From-SVN: r38528 --- gcc/ChangeLog | 5 +++++ gcc/function.c | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a306e56042..63a9049ad00 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-12-29 Alexandre Oliva + + * function.c (assign_parms): Convert arguments passed by + reference to the right mode. + 2000-12-28 Geoffrey Keating * c-parse.in (select_or_iter_stmt): Use truthvalue_conversion diff --git a/gcc/function.c b/gcc/function.c index 0dabd918ea4..278c432c38c 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -4726,7 +4726,22 @@ assign_parms (fndecl) Pmode above. We must use the actual mode of the parm. */ parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm))); mark_user_reg (parmreg); - emit_move_insn (parmreg, DECL_RTL (parm)); + if (GET_MODE (parmreg) != GET_MODE (DECL_RTL (parm))) + { + rtx tempreg = gen_reg_rtx (GET_MODE (DECL_RTL (parm))); + + push_to_sequence (conversion_insns); + emit_move_insn (tempreg, DECL_RTL (parm)); + DECL_RTL (parm) + = convert_to_mode (GET_MODE (parmreg), tempreg, + TREE_UNSIGNED (TREE_TYPE (parm))); + emit_move_insn (parmreg, DECL_RTL (parm)); + conversion_insns = get_insns(); + did_conversion = 1; + end_sequence (); + } + else + emit_move_insn (parmreg, DECL_RTL (parm)); DECL_RTL (parm) = parmreg; /* STACK_PARM is the pointer, not the parm, and PARMREG is now the parm. */ -- 2.30.2