Commit e6bb7d7efd76a8aeed5300e72481646e4d2b4d7e
1 parent
27848470
Fix mov[tf].ps handling for MIPS, by Richard Sandiford.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4563 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
10 additions
and
6 deletions
target-mips/op.c
| @@ -1632,10 +1632,11 @@ FLOAT_OP(movf, s) | @@ -1632,10 +1632,11 @@ FLOAT_OP(movf, s) | ||
| 1632 | } | 1632 | } |
| 1633 | FLOAT_OP(movf, ps) | 1633 | FLOAT_OP(movf, ps) |
| 1634 | { | 1634 | { |
| 1635 | - if (!(env->fpu->fcr31 & PARAM1)) { | 1635 | + unsigned int mask = GET_FP_COND (env->fpu) >> PARAM1; |
| 1636 | + if (!(mask & 1)) | ||
| 1636 | WT2 = WT0; | 1637 | WT2 = WT0; |
| 1638 | + if (!(mask & 2)) | ||
| 1637 | WTH2 = WTH0; | 1639 | WTH2 = WTH0; |
| 1638 | - } | ||
| 1639 | DEBUG_FPU_STATE(); | 1640 | DEBUG_FPU_STATE(); |
| 1640 | FORCE_RET(); | 1641 | FORCE_RET(); |
| 1641 | } | 1642 | } |
| @@ -1655,10 +1656,11 @@ FLOAT_OP(movt, s) | @@ -1655,10 +1656,11 @@ FLOAT_OP(movt, s) | ||
| 1655 | } | 1656 | } |
| 1656 | FLOAT_OP(movt, ps) | 1657 | FLOAT_OP(movt, ps) |
| 1657 | { | 1658 | { |
| 1658 | - if (env->fpu->fcr31 & PARAM1) { | 1659 | + unsigned int mask = GET_FP_COND (env->fpu) >> PARAM1; |
| 1660 | + if (mask & 1) | ||
| 1659 | WT2 = WT0; | 1661 | WT2 = WT0; |
| 1662 | + if (mask & 2) | ||
| 1660 | WTH2 = WTH0; | 1663 | WTH2 = WTH0; |
| 1661 | - } | ||
| 1662 | DEBUG_FPU_STATE(); | 1664 | DEBUG_FPU_STATE(); |
| 1663 | FORCE_RET(); | 1665 | FORCE_RET(); |
| 1664 | } | 1666 | } |
target-mips/translate.c
| @@ -5594,7 +5594,6 @@ static void glue(gen_movcf_, fmt) (DisasContext *ctx, int cc, int tf) \ | @@ -5594,7 +5594,6 @@ static void glue(gen_movcf_, fmt) (DisasContext *ctx, int cc, int tf) \ | ||
| 5594 | } | 5594 | } |
| 5595 | GEN_MOVCF(d); | 5595 | GEN_MOVCF(d); |
| 5596 | GEN_MOVCF(s); | 5596 | GEN_MOVCF(s); |
| 5597 | -GEN_MOVCF(ps); | ||
| 5598 | #undef GEN_MOVCF | 5597 | #undef GEN_MOVCF |
| 5599 | 5598 | ||
| 5600 | static void gen_farith (DisasContext *ctx, uint32_t op1, | 5599 | static void gen_farith (DisasContext *ctx, uint32_t op1, |
| @@ -6213,7 +6212,10 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, | @@ -6213,7 +6212,10 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, | ||
| 6213 | GEN_LOAD_FREG_FTN(WTH0, fs); | 6212 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 6214 | GEN_LOAD_FREG_FTN(WT2, fd); | 6213 | GEN_LOAD_FREG_FTN(WT2, fd); |
| 6215 | GEN_LOAD_FREG_FTN(WTH2, fd); | 6214 | GEN_LOAD_FREG_FTN(WTH2, fd); |
| 6216 | - gen_movcf_ps(ctx, (ft >> 2) & 0x7, ft & 0x1); | 6215 | + if (ft & 0x1) |
| 6216 | + gen_op_float_movt_ps ((ft >> 2) & 0x7); | ||
| 6217 | + else | ||
| 6218 | + gen_op_float_movf_ps ((ft >> 2) & 0x7); | ||
| 6217 | GEN_STORE_FTN_FREG(fd, WT2); | 6219 | GEN_STORE_FTN_FREG(fd, WT2); |
| 6218 | GEN_STORE_FTN_FREG(fd, WTH2); | 6220 | GEN_STORE_FTN_FREG(fd, WTH2); |
| 6219 | opn = "movcf.ps"; | 6221 | opn = "movcf.ps"; |