diff options
| author | drow <drow@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-11-17 22:33:31 +0000 |
|---|---|---|
| committer | drow <drow@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-11-17 22:33:31 +0000 |
| commit | 925cf7ab585f432e5297e373aadaf3da078bd75a (patch) | |
| tree | 9ef611e9decc1d1ee0f83f21c95d93ad00913776 /gcc/config/sh/sh.c | |
| parent | a210f14b5f977c6d7b6339810031b63f112f6cf4 (diff) | |
| download | ppe42-gcc-925cf7ab585f432e5297e373aadaf3da078bd75a.tar.gz ppe42-gcc-925cf7ab585f432e5297e373aadaf3da078bd75a.zip | |
* sh.c (gen_shl_and): Don't create a zero_extend if the operand
is not an arith_reg_operand.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@59201 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/sh/sh.c')
| -rw-r--r-- | gcc/config/sh/sh.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index d2cc47186d9..0ce5e06ce86 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); |

