Commit 84774e8ea3259d05036678e29936013d6c7eeff7
1 parent
e30b4678
Fix modulus result from MIPS DDIV & avoid overflowing division,
by Richard Sandiford. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4619 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
14 additions
and
9 deletions
target-mips/translate.c
... | ... | @@ -1964,20 +1964,25 @@ static void gen_muldiv (DisasContext *ctx, uint32_t opc, |
1964 | 1964 | tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_T[1], 0, l1); |
1965 | 1965 | { |
1966 | 1966 | int l2 = gen_new_label(); |
1967 | - int l3 = gen_new_label(); | |
1968 | 1967 | |
1969 | 1968 | tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 1ULL << 63, l2); |
1970 | 1969 | tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[1], -1ULL, l2); |
1971 | - tcg_gen_div_i64(cpu_T[0], cpu_T[0], cpu_T[1]); | |
1972 | - tcg_gen_movi_tl(cpu_T[1], 0); | |
1973 | - tcg_gen_br(l3); | |
1970 | + { | |
1971 | + tcg_gen_movi_tl(cpu_T[1], 0); | |
1972 | + gen_store_LO(cpu_T[0], 0); | |
1973 | + gen_store_HI(cpu_T[1], 0); | |
1974 | + tcg_gen_br(l1); | |
1975 | + } | |
1974 | 1976 | gen_set_label(l2); |
1975 | - tcg_gen_div_i64(cpu_T[0], cpu_T[0], cpu_T[1]); | |
1976 | - tcg_gen_rem_i64(cpu_T[1], cpu_T[0], cpu_T[1]); | |
1977 | - gen_set_label(l3); | |
1977 | + { | |
1978 | + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I64); | |
1979 | + TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_I64); | |
1978 | 1980 | |
1979 | - gen_store_LO(cpu_T[0], 0); | |
1980 | - gen_store_HI(cpu_T[1], 0); | |
1981 | + tcg_gen_div_i64(r_tmp1, cpu_T[0], cpu_T[1]); | |
1982 | + tcg_gen_rem_i64(r_tmp2, cpu_T[0], cpu_T[1]); | |
1983 | + gen_store_LO(r_tmp1, 0); | |
1984 | + gen_store_HI(r_tmp2, 0); | |
1985 | + } | |
1981 | 1986 | } |
1982 | 1987 | gen_set_label(l1); |
1983 | 1988 | } | ... | ... |