tcg/ppc: Prefer mask over andi.
Prefer the instruction that isn't required to modify cr0. Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
5bfd75a35c
commit
1e1df962e3
|
@ -700,14 +700,14 @@ static void tcg_out_andi32(TCGContext *s, TCGReg dst, TCGReg src, uint32_t c)
|
||||||
{
|
{
|
||||||
int mb, me;
|
int mb, me;
|
||||||
|
|
||||||
if ((c & 0xffff) == c) {
|
if (mask_operand(c, &mb, &me)) {
|
||||||
|
tcg_out_rlw(s, RLWINM, dst, src, 0, mb, me);
|
||||||
|
} else if ((c & 0xffff) == c) {
|
||||||
tcg_out32(s, ANDI | SAI(src, dst, c));
|
tcg_out32(s, ANDI | SAI(src, dst, c));
|
||||||
return;
|
return;
|
||||||
} else if ((c & 0xffff0000) == c) {
|
} else if ((c & 0xffff0000) == c) {
|
||||||
tcg_out32(s, ANDIS | SAI(src, dst, c >> 16));
|
tcg_out32(s, ANDIS | SAI(src, dst, c >> 16));
|
||||||
return;
|
return;
|
||||||
} else if (mask_operand(c, &mb, &me)) {
|
|
||||||
tcg_out_rlw(s, RLWINM, dst, src, 0, mb, me);
|
|
||||||
} else {
|
} else {
|
||||||
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_R0, c);
|
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_R0, c);
|
||||||
tcg_out32(s, AND | SAB(src, dst, TCG_REG_R0));
|
tcg_out32(s, AND | SAB(src, dst, TCG_REG_R0));
|
||||||
|
@ -719,18 +719,18 @@ static void tcg_out_andi64(TCGContext *s, TCGReg dst, TCGReg src, uint64_t c)
|
||||||
int mb, me;
|
int mb, me;
|
||||||
|
|
||||||
assert(TCG_TARGET_REG_BITS == 64);
|
assert(TCG_TARGET_REG_BITS == 64);
|
||||||
if ((c & 0xffff) == c) {
|
if (mask64_operand(c, &mb, &me)) {
|
||||||
tcg_out32(s, ANDI | SAI(src, dst, c));
|
|
||||||
return;
|
|
||||||
} else if ((c & 0xffff0000) == c) {
|
|
||||||
tcg_out32(s, ANDIS | SAI(src, dst, c >> 16));
|
|
||||||
return;
|
|
||||||
} else if (mask64_operand(c, &mb, &me)) {
|
|
||||||
if (mb == 0) {
|
if (mb == 0) {
|
||||||
tcg_out_rld(s, RLDICR, dst, src, 0, me);
|
tcg_out_rld(s, RLDICR, dst, src, 0, me);
|
||||||
} else {
|
} else {
|
||||||
tcg_out_rld(s, RLDICL, dst, src, 0, mb);
|
tcg_out_rld(s, RLDICL, dst, src, 0, mb);
|
||||||
}
|
}
|
||||||
|
} else if ((c & 0xffff) == c) {
|
||||||
|
tcg_out32(s, ANDI | SAI(src, dst, c));
|
||||||
|
return;
|
||||||
|
} else if ((c & 0xffff0000) == c) {
|
||||||
|
tcg_out32(s, ANDIS | SAI(src, dst, c >> 16));
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_R0, c);
|
tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_R0, c);
|
||||||
tcg_out32(s, AND | SAB(src, dst, TCG_REG_R0));
|
tcg_out32(s, AND | SAB(src, dst, TCG_REG_R0));
|
||||||
|
|
Loading…
Reference in New Issue