summaryrefslogtreecommitdiff
path: root/gcc/config/mips
diff options
context:
space:
mode:
authortomtab <tomtab@138bc75d-0d04-0410-961f-82ee72b054a4>2017-02-07 10:34:47 +0000
committertomtab <tomtab@138bc75d-0d04-0410-961f-82ee72b054a4>2017-02-07 10:34:47 +0000
commitf8e2f4060766d1ddb03033f25f11150edba71ace (patch)
treee7dda8125e655d4fbed0778af7368dbd690e6bfe /gcc/config/mips
parent0a2ca5e978804dacd7a3941f0a2c806148c1d076 (diff)
downloadgcc-f8e2f4060766d1ddb03033f25f11150edba71ace.tar.gz
MIPS: Fix mode mismatch error between Loongson builtin arguments and insn
operands. gcc/ * config/mips/mips.c (mips_expand_builtin_insn): Convert the QImode argument of the pshufh, psllh, psllw, psrah, psraw, psrlh, psrlw builtins to SImode and emit a zero-extend, if necessary. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@245243 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/mips')
-rw-r--r--gcc/config/mips/mips.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index da7fa8fcea1..7974a16541d 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -16571,9 +16571,27 @@ mips_expand_builtin_insn (enum insn_code icode, unsigned int nops,
{
machine_mode imode;
int rangelo = 0, rangehi = 0, error_opno = 0;
+ rtx sireg;
switch (icode)
{
+ /* The third operand of these instructions is in SImode, so we need to
+ bring the corresponding builtin argument from QImode into SImode. */
+ case CODE_FOR_loongson_pshufh:
+ case CODE_FOR_loongson_psllh:
+ case CODE_FOR_loongson_psllw:
+ case CODE_FOR_loongson_psrah:
+ case CODE_FOR_loongson_psraw:
+ case CODE_FOR_loongson_psrlh:
+ case CODE_FOR_loongson_psrlw:
+ gcc_assert (has_target_p && nops == 3 && ops[2].mode == QImode);
+ sireg = gen_reg_rtx (SImode);
+ emit_insn (gen_zero_extendqisi2 (sireg,
+ force_reg (QImode, ops[2].value)));
+ ops[2].value = sireg;
+ ops[2].mode = SImode;
+ break;
+
case CODE_FOR_msa_addvi_b:
case CODE_FOR_msa_addvi_h:
case CODE_FOR_msa_addvi_w: