tcg-i386: Eliminate extra move from qemu_ld64.
If the address register overlaps one of the output registers simply issue the clobbering load last, rather than emitting an extra move of the address register. Signed-off-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
af2660894f
commit
a042ef9470
@ -744,22 +744,20 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
/* XXX: could be nicer */
|
if (bswap) {
|
||||||
if (r0 == data_reg) {
|
int t = data_reg;
|
||||||
r1 = TCG_REG_EDX;
|
data_reg = data_reg2;
|
||||||
if (r1 == data_reg)
|
data_reg2 = t;
|
||||||
r1 = TCG_REG_EAX;
|
|
||||||
tcg_out_mov(s, r1, r0);
|
|
||||||
r0 = r1;
|
|
||||||
}
|
}
|
||||||
if (!bswap) {
|
if (r0 != data_reg) {
|
||||||
tcg_out_ld(s, TCG_TYPE_I32, data_reg, r0, GUEST_BASE);
|
tcg_out_ld(s, TCG_TYPE_I32, data_reg, r0, GUEST_BASE);
|
||||||
tcg_out_ld(s, TCG_TYPE_I32, data_reg2, r0, GUEST_BASE + 4);
|
tcg_out_ld(s, TCG_TYPE_I32, data_reg2, r0, GUEST_BASE + 4);
|
||||||
} else {
|
} else {
|
||||||
tcg_out_ld(s, TCG_TYPE_I32, data_reg, r0, GUEST_BASE + 4);
|
tcg_out_ld(s, TCG_TYPE_I32, data_reg2, r0, GUEST_BASE + 4);
|
||||||
|
tcg_out_ld(s, TCG_TYPE_I32, data_reg, r0, GUEST_BASE);
|
||||||
|
}
|
||||||
|
if (bswap) {
|
||||||
tcg_out_bswap32(s, data_reg);
|
tcg_out_bswap32(s, data_reg);
|
||||||
|
|
||||||
tcg_out_ld(s, TCG_TYPE_I32, data_reg2, r0, GUEST_BASE);
|
|
||||||
tcg_out_bswap32(s, data_reg2);
|
tcg_out_bswap32(s, data_reg2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user