From a6cb87fba6129b4e89cf53dd2521347505fa2049 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Mon, 25 Oct 2004 08:33:04 +0000 Subject: [PATCH] frv.md (movdi, movdf): Handle wide-constant splits with wider-than-32-bit HOST_WIDE_INTs. * config/frv/frv.md (movdi, movdf): Handle wide-constant splits with wider-than-32-bit HOST_WIDE_INTs. From-SVN: r89524 --- gcc/ChangeLog | 5 +++++ gcc/config/frv/frv.md | 30 ++++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ce83ce91299..e216c9ac83c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-10-25 Alexandre Oliva + + * config/frv/frv.md (movdi, movdf): Handle wide-constant splits + with wider-than-32-bit HOST_WIDE_INTs. + 2004-10-25 David Billinghurst * config/mips/mips.c(mips_output_filename): Remove unused diff --git a/gcc/config/frv/frv.md b/gcc/config/frv/frv.md index ee17edabed8..21eef863b65 100644 --- a/gcc/config/frv/frv.md +++ b/gcc/config/frv/frv.md @@ -1833,7 +1833,7 @@ (match_operand:DI 1 "const_int_operand" ""))] "reload_completed" [(set (match_dup 2) (match_dup 4)) - (set (match_dup 3) (match_dup 1))] + (set (match_dup 3) (match_dup 5))] " { rtx op0 = operands[0]; @@ -1841,7 +1841,18 @@ operands[2] = gen_highpart (SImode, op0); operands[3] = gen_lowpart (SImode, op0); - operands[4] = GEN_INT ((INTVAL (op1) < 0) ? -1 : 0); + if (HOST_BITS_PER_WIDE_INT <= 32) + { + operands[4] = GEN_INT ((INTVAL (op1) < 0) ? -1 : 0); + operands[5] = op1; + } + else + { + operands[4] = GEN_INT ((((unsigned HOST_WIDE_INT)INTVAL (op1) >> 16) + >> 16) ^ ((unsigned HOST_WIDE_INT)1 << 31) + - ((unsigned HOST_WIDE_INT)1 << 31)); + operands[5] = GEN_INT (trunc_int_for_mode (INTVAL (op1), SImode)); + } }") (define_split @@ -2031,7 +2042,7 @@ (match_operand:DF 1 "const_int_operand" ""))] "reload_completed" [(set (match_dup 2) (match_dup 4)) - (set (match_dup 3) (match_dup 1))] + (set (match_dup 3) (match_dup 5))] " { rtx op0 = operands[0]; @@ -2039,7 +2050,18 @@ operands[2] = gen_highpart (SImode, op0); operands[3] = gen_lowpart (SImode, op0); - operands[4] = GEN_INT ((INTVAL (op1) < 0) ? -1 : 0); + if (HOST_BITS_PER_WIDE_INT <= 32) + { + operands[4] = GEN_INT ((INTVAL (op1) < 0) ? -1 : 0); + operands[5] = op1; + } + else + { + operands[4] = GEN_INT ((((unsigned HOST_WIDE_INT)INTVAL (op1) >> 16) + >> 16) ^ ((unsigned HOST_WIDE_INT)1 << 31) + - ((unsigned HOST_WIDE_INT)1 << 31)); + operands[5] = GEN_INT (trunc_int_for_mode (INTVAL (op1), SImode)); + } }") (define_split -- 2.30.2