diff options
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r-- | gcc/optabs.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c index a8a7e4f..3755670 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -6624,8 +6624,8 @@ expand_vec_perm (enum machine_mode mode, rtx v0, rtx v1, rtx sel, rtx target) icode = direct_optab_handler (vec_perm_const_optab, qimode); if (icode != CODE_FOR_nothing) { - tmp = expand_vec_perm_1 (icode, gen_lowpart (qimode, target), - gen_lowpart (qimode, v0), + tmp = mode != qimode ? gen_reg_rtx (qimode) : target; + tmp = expand_vec_perm_1 (icode, tmp, gen_lowpart (qimode, v0), gen_lowpart (qimode, v1), sel_qi); if (tmp) return gen_lowpart (mode, tmp); @@ -6674,7 +6674,7 @@ expand_vec_perm (enum machine_mode mode, rtx v0, rtx v1, rtx sel, rtx target) } tmp = gen_rtx_CONST_VECTOR (qimode, vec); sel = gen_lowpart (qimode, sel); - sel = expand_vec_perm (qimode, sel, sel, tmp, NULL); + sel = expand_vec_perm (qimode, gen_reg_rtx (qimode), sel, tmp, NULL); gcc_assert (sel != NULL); /* Add the byte offset to each byte element. */ @@ -6689,8 +6689,8 @@ expand_vec_perm (enum machine_mode mode, rtx v0, rtx v1, rtx sel, rtx target) gcc_assert (sel_qi != NULL); } - tmp = expand_vec_perm_1 (icode, gen_lowpart (qimode, target), - gen_lowpart (qimode, v0), + tmp = mode != qimode ? gen_reg_rtx (qimode) : target; + tmp = expand_vec_perm_1 (icode, tmp, gen_lowpart (qimode, v0), gen_lowpart (qimode, v1), sel_qi); if (tmp) tmp = gen_lowpart (mode, tmp); |