diff options
author | Bernd Edlinger <bernd.edlinger@hotmail.de> | 2019-08-15 11:37:21 +0000 |
---|---|---|
committer | Bernd Edlinger <edlinger@gcc.gnu.org> | 2019-08-15 11:37:21 +0000 |
commit | 834032457972caee7d4ae113c2201080178a229e (patch) | |
tree | a71101a7803f603ae78d10b5723ebc0c80b2a9f4 /gcc/function.c | |
parent | bbedc1ae06a2b1e8ac5e687c754618d56e417d6c (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 19 |
1 files changed, 18 insertions, 1 deletions
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); |