aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Edlinger <bernd.edlinger@hotmail.de>2019-08-15 11:37:21 +0000
committerBernd Edlinger <edlinger@gcc.gnu.org>2019-08-15 11:37:21 +0000
commit834032457972caee7d4ae113c2201080178a229e (patch)
treea71101a7803f603ae78d10b5723ebc0c80b2a9f4
parentbbedc1ae06a2b1e8ac5e687c754618d56e417d6c (diff)
downloadgcc-834032457972caee7d4ae113c2201080178a229e.zip
gcc-834032457972caee7d4ae113c2201080178a229e.tar.gz
gcc-834032457972caee7d4ae113c2201080178a229e.tar.bz2
function.c (assign_parm_setup_reg): Handle misaligned stack arguments.
2019-08-15 Bernd Edlinger <bernd.edlinger@hotmail.de> * function.c (assign_parm_setup_reg): Handle misaligned stack arguments. From-SVN: r274531
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/function.c19
2 files changed, 22 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 49aabbe..2aa7a8c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2019-08-15 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ * function.c (assign_parm_setup_reg): Handle misaligned stack arguments.
+
2019-08-15 Martin Liska <mliska@suse.cz>
* tree-ssa-dce.c (propagate_necessity): We can't reach now
diff --git a/gcc/function.c b/gcc/function.c
index 8274975..e368f7c 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -3127,6 +3127,7 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
int unsignedp = TYPE_UNSIGNED (TREE_TYPE (parm));
bool did_conversion = false;
bool need_conversion, moved;
+ enum insn_code icode;
rtx rtl;
/* Store the parm in a pseudoregister during the function, but we may
@@ -3188,7 +3189,6 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
conversion. We verify that this insn does not clobber any
hard registers. */
- enum insn_code icode;
rtx op0, op1;
icode = can_extend_p (promoted_nominal_mode, data->passed_mode,
@@ -3291,6 +3291,23 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
did_conversion = true;
}
+ else if (MEM_P (data->entry_parm)
+ && GET_MODE_ALIGNMENT (promoted_nominal_mode)
+ > MEM_ALIGN (data->entry_parm)
+ && (((icode = optab_handler (movmisalign_optab,
+ promoted_nominal_mode))
+ != CODE_FOR_nothing)
+ || targetm.slow_unaligned_access (promoted_nominal_mode,
+ MEM_ALIGN (data->entry_parm))))
+ {
+ if (icode != CODE_FOR_nothing)
+ emit_insn (GEN_FCN (icode) (parmreg, validated_mem));
+ else
+ rtl = parmreg = extract_bit_field (validated_mem,
+ GET_MODE_BITSIZE (promoted_nominal_mode), 0,
+ unsignedp, parmreg,
+ promoted_nominal_mode, VOIDmode, false, NULL);
+ }
else
emit_move_insn (parmreg, validated_mem);