summaryrefslogtreecommitdiffstats
path: root/gcc/config/sh/sh.c
diff options
context:
space:
mode:
authordrow <drow@138bc75d-0d04-0410-961f-82ee72b054a4>2002-11-17 22:33:31 +0000
committerdrow <drow@138bc75d-0d04-0410-961f-82ee72b054a4>2002-11-17 22:33:31 +0000
commit925cf7ab585f432e5297e373aadaf3da078bd75a (patch)
tree9ef611e9decc1d1ee0f83f21c95d93ad00913776 /gcc/config/sh/sh.c
parenta210f14b5f977c6d7b6339810031b63f112f6cf4 (diff)
downloadppe42-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.c28
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);
OpenPOWER on IntegriCloud