diff options
Diffstat (limited to 'target-sparc/translate.c')
-rw-r--r-- | target-sparc/translate.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/target-sparc/translate.c b/target-sparc/translate.c index 34a3357f97..0d71da3b86 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -943,6 +943,21 @@ static GenOpFunc * const gen_fcmpd[4] = { gen_op_fcmpd_fcc2, gen_op_fcmpd_fcc3, }; + +static GenOpFunc * const gen_fcmpes[4] = { + gen_op_fcmpes, + gen_op_fcmpes_fcc1, + gen_op_fcmpes_fcc2, + gen_op_fcmpes_fcc3, +}; + +static GenOpFunc * const gen_fcmped[4] = { + gen_op_fcmped, + gen_op_fcmped_fcc1, + gen_op_fcmped_fcc2, + gen_op_fcmped_fcc3, +}; + #endif static int gen_trap_ifnofpu(DisasContext * dc) @@ -1289,6 +1304,7 @@ static void disas_sparc_insn(DisasContext * dc) } else if (xop == 0x34) { /* FPU Operations */ if (gen_trap_ifnofpu(dc)) goto jmp_insn; + gen_op_clear_ieee_excp_and_FTT(); rs1 = GET_FIELD(insn, 13, 17); rs2 = GET_FIELD(insn, 27, 31); xop = GET_FIELD(insn, 18, 26); @@ -1476,6 +1492,7 @@ static void disas_sparc_insn(DisasContext * dc) #endif if (gen_trap_ifnofpu(dc)) goto jmp_insn; + gen_op_clear_ieee_excp_and_FTT(); rs1 = GET_FIELD(insn, 13, 17); rs2 = GET_FIELD(insn, 27, 31); xop = GET_FIELD(insn, 18, 26); @@ -1653,18 +1670,18 @@ static void disas_sparc_insn(DisasContext * dc) gen_op_load_fpr_FT0(rs1); gen_op_load_fpr_FT1(rs2); #ifdef TARGET_SPARC64 - gen_fcmps[rd & 3](); + gen_fcmpes[rd & 3](); #else - gen_op_fcmps(); /* XXX should trap if qNaN or sNaN */ + gen_op_fcmpes(); #endif break; case 0x56: /* fcmped, V9 %fcc */ gen_op_load_fpr_DT0(DFPREG(rs1)); gen_op_load_fpr_DT1(DFPREG(rs2)); #ifdef TARGET_SPARC64 - gen_fcmpd[rd & 3](); + gen_fcmped[rd & 3](); #else - gen_op_fcmpd(); /* XXX should trap if qNaN or sNaN */ + gen_op_fcmped(); #endif break; case 0x57: /* fcmpeq */ |