Fixed conditional move tcg bug (tcg_gen_movcond), which generated an ALWAYS / NEVER condition despite QEMU no supporting those conditions in the tcg_out part (#1054)
This commit is contained in:
@ -2195,7 +2195,12 @@ static inline void tcg_gen_movcond_i32(TCGContext *s, TCGCond cond, TCGv_i32 ret
|
||||
TCGv_i32 c1, TCGv_i32 c2,
|
||||
TCGv_i32 v1, TCGv_i32 v2)
|
||||
{
|
||||
if (TCG_TARGET_HAS_movcond_i32) {
|
||||
if (cond == TCG_COND_ALWAYS) {
|
||||
tcg_gen_mov_i32(s, ret, v1);
|
||||
} else if (cond == TCG_COND_NEVER) {
|
||||
tcg_gen_mov_i32(s, ret, v2);
|
||||
}
|
||||
else if (TCG_TARGET_HAS_movcond_i32) {
|
||||
tcg_gen_op6i_i32(s, INDEX_op_movcond_i32, ret, c1, c2, v1, v2, cond);
|
||||
} else {
|
||||
TCGv_i32 t0 = tcg_temp_new_i32(s);
|
||||
@ -2214,6 +2219,12 @@ static inline void tcg_gen_movcond_i64(TCGContext *s, TCGCond cond, TCGv_i64 ret
|
||||
TCGv_i64 c1, TCGv_i64 c2,
|
||||
TCGv_i64 v1, TCGv_i64 v2)
|
||||
{
|
||||
if (cond == TCG_COND_ALWAYS) {
|
||||
tcg_gen_mov_i64(s, ret, v1);
|
||||
} else if (cond == TCG_COND_NEVER) {
|
||||
tcg_gen_mov_i64(s, ret, v2);
|
||||
}
|
||||
else {
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
TCGv_i32 t0 = tcg_temp_new_i32(s);
|
||||
TCGv_i32 t1 = tcg_temp_new_i32(s);
|
||||
@ -2240,7 +2251,7 @@ static inline void tcg_gen_movcond_i64(TCGContext *s, TCGCond cond, TCGv_i64 ret
|
||||
}
|
||||
tcg_temp_free_i32(s, t0);
|
||||
tcg_temp_free_i32(s, t1);
|
||||
#else
|
||||
#else
|
||||
if (TCG_TARGET_HAS_movcond_i64) {
|
||||
tcg_gen_op6i_i64(s, INDEX_op_movcond_i64, ret, c1, c2, v1, v2, cond);
|
||||
} else {
|
||||
@ -2255,6 +2266,7 @@ static inline void tcg_gen_movcond_i64(TCGContext *s, TCGCond cond, TCGv_i64 ret
|
||||
tcg_temp_free_i64(s, t1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static inline void tcg_gen_add2_i32(TCGContext *s, TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 al,
|
||||
|
Reference in New Issue
Block a user