diff options
author | Daniel Jacobowitz <drow@mvista.com> | 2002-11-17 22:33:31 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@gcc.gnu.org> | 2002-11-17 22:33:31 +0000 |
commit | d2b2c7cd3d7fed1db53c65fda35e0ebf28717876 (patch) | |
tree | 9ef611e9decc1d1ee0f83f21c95d93ad00913776 | |
parent | 6ddb1bc19f3860740acc0ed31e54ab8cfac07dd2 (diff) | |
download | gcc-d2b2c7cd3d7fed1db53c65fda35e0ebf28717876.zip gcc-d2b2c7cd3d7fed1db53c65fda35e0ebf28717876.tar.gz gcc-d2b2c7cd3d7fed1db53c65fda35e0ebf28717876.tar.bz2 |
sh.c (gen_shl_and): Don't create a zero_extend if the operand is not an arith_reg_operand.
* sh.c (gen_shl_and): Don't create a zero_extend if the operand
is not an arith_reg_operand.
From-SVN: r59201
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/sh/sh.c | 28 |
2 files changed, 26 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6434f60..f27dedb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-11-17 Daniel Jacobowitz <drow@mvista.com> + + * sh.c (gen_shl_and): Don't create a zero_extend if the operand + is not an arith_reg_operand. + 2002-11-17 Graham Stott <graham.stott@btinternet.com> * real.c (real_to_decimal): Fix buffer overrun when buffer size diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index d2cc471..0ce5e06 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -1823,11 +1823,16 @@ gen_shl_and (dest, left_rtx, mask_rtx, source) if (first < 0) { + enum machine_mode mode + = ((mask << right) <= 0xff) ? QImode : HImode; + rtx lowpart = gen_lowpart (mode, source); + + if (no_new_pseudos && ! TARGET_SHMEDIA + && ! arith_reg_operand (lowpart, mode)) + return -1; emit_insn ((mask << right) <= 0xff - ? gen_zero_extendqisi2(dest, - gen_lowpart (QImode, source)) - : gen_zero_extendhisi2(dest, - gen_lowpart (HImode, source))); + ? gen_zero_extendqisi2(dest, lowpart) + : gen_zero_extendhisi2(dest, lowpart)); source = dest; } if (source != dest) @@ -1846,9 +1851,18 @@ gen_shl_and (dest, left_rtx, mask_rtx, source) mask <<= first; } if (first >= 0) - emit_insn (mask <= 0xff - ? gen_zero_extendqisi2(dest, gen_lowpart (QImode, dest)) - : gen_zero_extendhisi2(dest, gen_lowpart (HImode, dest))); + { + enum machine_mode mode = (mask <= 0xff) ? QImode : HImode; + rtx lowpart = gen_lowpart (mode, dest); + + if (no_new_pseudos && ! TARGET_SHMEDIA + && ! arith_reg_operand (lowpart, mode)) + return -1; + emit_insn (mask <= 0xff + ? gen_zero_extendqisi2(dest, lowpart) + : gen_zero_extendhisi2(dest, lowpart)); + } + if (total_shift > 0) { operands[2] = GEN_INT (total_shift); |