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:
Richard Henderson 2010-04-14 08:06:00 -07:00 committed by Aurelien Jarno
parent af2660894f
commit a042ef9470

View file

@ -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;