mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-23 23:05:38 +00:00
tcg/mips: fix add2
The add2 code in the tcg_out_addsub2 function doesn't take into account the case where rl == al == bl. In that case we can't compute the carry after the addition. As it corresponds to a multiplication by 2, the carry bit is the bit 31. While this is a corner case, this prevents x86-64 guests to boot on a MIPS host. Backports commit c99d69694af4ed15b33e3f7c2e3ef6972c14358d from qemu
This commit is contained in:
parent
4e68b4167d
commit
45927edecf
|
@ -1271,6 +1271,9 @@ static void tcg_out_addsub2(TCGContext *s, TCGReg rl, TCGReg rh, TCGReg al,
|
||||||
if (cbl) {
|
if (cbl) {
|
||||||
tcg_out_opc_imm(s, OPC_ADDIU, rl, al, bl);
|
tcg_out_opc_imm(s, OPC_ADDIU, rl, al, bl);
|
||||||
tcg_out_opc_imm(s, OPC_SLTIU, TCG_TMP0, rl, bl);
|
tcg_out_opc_imm(s, OPC_SLTIU, TCG_TMP0, rl, bl);
|
||||||
|
} else if (rl == al && rl == bl) {
|
||||||
|
tcg_out_opc_sa(s, OPC_SRL, TCG_TMP0, al, 31);
|
||||||
|
tcg_out_opc_reg(s, OPC_ADDU, rl, al, bl);
|
||||||
} else {
|
} else {
|
||||||
tcg_out_opc_reg(s, OPC_ADDU, rl, al, bl);
|
tcg_out_opc_reg(s, OPC_ADDU, rl, al, bl);
|
||||||
tcg_out_opc_reg(s, OPC_SLTU, TCG_TMP0, rl, (rl == bl ? al : bl));
|
tcg_out_opc_reg(s, OPC_SLTU, TCG_TMP0, rl, (rl == bl ? al : bl));
|
||||||
|
|
Loading…
Reference in a new issue