Commit afad3d2c by Jim Wilson

(gen_shl_and, gen_shl_sext): use gen_lowpart to generate rtx in the appropriate…

(gen_shl_and, gen_shl_sext): use gen_lowpart to generate rtx in the appropriate mode for zero/sign-extension.

(gen_shl_and, gen_shl_sext): use gen_lowpart to
generate rtx in the appropriate mode for zero/sign-extension.
Don't generate a zero bit shift.
(gen_shl_sext) directly use gen_ashift instead of gen_ashrsi3 .

From-SVN: r12884
parent 5156628f
...@@ -1232,10 +1232,10 @@ gen_shl_and (dest, left_rtx, mask_rtx, source) ...@@ -1232,10 +1232,10 @@ gen_shl_and (dest, left_rtx, mask_rtx, source)
if (first < 0) if (first < 0)
{ {
emit_insn ((mask << right) == 0xff emit_insn ((mask << right) == 0xff
? gen_zero_extendqisi2(dest, gen_rtx (SUBREG, QImode, ? gen_zero_extendqisi2(dest,
source, 0)) gen_lowpart (QImode, source))
: gen_zero_extendhisi2(dest, gen_rtx (SUBREG, HImode, : gen_zero_extendhisi2(dest,
source, 0))); gen_lowpart (HImode, source)));
source = dest; source = dest;
} }
if (source != dest) if (source != dest)
...@@ -1255,10 +1255,8 @@ gen_shl_and (dest, left_rtx, mask_rtx, source) ...@@ -1255,10 +1255,8 @@ gen_shl_and (dest, left_rtx, mask_rtx, source)
} }
if (first >= 0) if (first >= 0)
emit_insn (mask == 0xff emit_insn (mask == 0xff
? gen_zero_extendqisi2(dest, gen_rtx (SUBREG, QImode, ? gen_zero_extendqisi2(dest, gen_lowpart (QImode, dest))
dest, 0)) : gen_zero_extendhisi2(dest, gen_lowpart (HImode, dest)));
: gen_zero_extendhisi2(dest, gen_rtx (SUBREG, HImode,
dest, 0)));
if (total_shift > 0) if (total_shift > 0)
{ {
operands[2] = GEN_INT (total_shift); operands[2] = GEN_INT (total_shift);
...@@ -1283,10 +1281,13 @@ gen_shl_and (dest, left_rtx, mask_rtx, source) ...@@ -1283,10 +1281,13 @@ gen_shl_and (dest, left_rtx, mask_rtx, source)
source = dest; source = dest;
} }
emit_insn (gen_andsi3 (dest, source, GEN_INT (mask))); emit_insn (gen_andsi3 (dest, source, GEN_INT (mask)));
operands[0] = dest; if (total_shift)
operands[1] = dest; {
operands[2] = GEN_INT (total_shift); operands[0] = dest;
shift_gen_fun (ASHIFT, operands); operands[1] = dest;
operands[2] = GEN_INT (total_shift);
shift_gen_fun (ASHIFT, operands);
}
break; break;
} }
else else
...@@ -1351,6 +1352,8 @@ shl_sext_kind (left_rtx, size_rtx, costp) ...@@ -1351,6 +1352,8 @@ shl_sext_kind (left_rtx, size_rtx, costp)
{ {
/* 16 bit shift / sign extend / 16 bit shift */ /* 16 bit shift / sign extend / 16 bit shift */
cost = shift_insns[16 - insize] + 1 + ashiftrt_insns[16 - size]; cost = shift_insns[16 - insize] + 1 + ashiftrt_insns[16 - size];
/* If ashiftrt_insns[16 - size] is 8, this choice will be overridden
below, by alternative 3 or something even better. */
if (cost < best_cost) if (cost < best_cost)
{ {
kind = 5; kind = 5;
...@@ -1470,41 +1473,50 @@ gen_shl_sext (dest, left_rtx, size_rtx, source) ...@@ -1470,41 +1473,50 @@ gen_shl_sext (dest, left_rtx, size_rtx, source)
if (dest != source) if (dest != source)
emit_insn (gen_movsi (dest, source)); emit_insn (gen_movsi (dest, source));
operands[0] = dest; operands[0] = dest;
operands[2] = GEN_INT (ext - insize); if (ext - insize)
gen_shifty_hi_op (ASHIFT, operands); {
operands[2] = GEN_INT (ext - insize);
gen_shifty_hi_op (ASHIFT, operands);
}
emit_insn (kind & 1 emit_insn (kind & 1
? gen_extendqisi2(dest, gen_rtx (SUBREG, QImode, dest, 0)) ? gen_extendqisi2(dest, gen_lowpart (QImode, dest))
: gen_extendhisi2(dest, gen_rtx (SUBREG, HImode, dest, 0))); : gen_extendhisi2(dest, gen_lowpart (HImode, dest)));
if (kind <= 2) if (kind <= 2)
{ {
operands[2] = GEN_INT (shift2); if (shift2)
gen_shifty_op (ASHIFT, operands); {
operands[2] = GEN_INT (shift2);
gen_shifty_op (ASHIFT, operands);
}
} }
else else
{ {
if (shift2 >= 0) if (shift2 > 0)
{ {
operands[2] = GEN_INT (shift2); operands[2] = GEN_INT (shift2);
gen_shifty_hi_op (ASHIFT, operands); gen_shifty_hi_op (ASHIFT, operands);
} }
else else if (shift2)
{ {
operands[2] = GEN_INT (-shift2); operands[2] = GEN_INT (-shift2);
gen_shifty_hi_op (LSHIFTRT, operands); gen_shifty_hi_op (LSHIFTRT, operands);
} }
emit_insn (size <= 8 emit_insn (size <= 8
? gen_extendqisi2 (dest, ? gen_extendqisi2 (dest, gen_lowpart (QImode, dest))
gen_rtx (SUBREG, QImode, dest, 0)) : gen_extendhisi2 (dest, gen_lowpart (HImode, dest)));
: gen_extendhisi2 (dest,
gen_rtx (SUBREG, HImode, dest, 0)));
} }
break; break;
} }
case 5: case 5:
emit_insn (gen_shl_sext_ext (dest, source, GEN_INT (16 - insize), {
GEN_INT (16))); int i = 16 - size;
emit_insn (gen_ashrsi3 (dest, dest, GEN_INT (16 - size))); emit_insn (gen_shl_sext_ext (dest, source, GEN_INT (16 - insize),
break; GEN_INT (16)));
/* Don't use gen_ashrsi3 because it generates new pseudos. */
while (--i >= 0)
gen_ashift (ASHIFTRT, 1, dest);
break;
}
case 6: case 6:
case 7: case 7:
/* Don't expand fine-grained when combining, because that will /* Don't expand fine-grained when combining, because that will
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment