Commit 9143e59842952d89533937dba9043b7b36b76a82
1 parent
a4d17f19
Fix stdfq op (Aurelien Jarno)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2604 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
16 additions
and
2 deletions
target-sparc/cpu.h
| @@ -127,6 +127,7 @@ | @@ -127,6 +127,7 @@ | ||
| 127 | #define FSR_FTT_MASK (FSR_FTT2 | FSR_FTT1 | FSR_FTT0) | 127 | #define FSR_FTT_MASK (FSR_FTT2 | FSR_FTT1 | FSR_FTT0) |
| 128 | #define FSR_FTT_IEEE_EXCP (1 << 14) | 128 | #define FSR_FTT_IEEE_EXCP (1 << 14) |
| 129 | #define FSR_FTT_UNIMPFPOP (3 << 14) | 129 | #define FSR_FTT_UNIMPFPOP (3 << 14) |
| 130 | +#define FSR_FTT_SEQ_ERROR (4 << 14) | ||
| 130 | #define FSR_FTT_INVAL_FPR (6 << 14) | 131 | #define FSR_FTT_INVAL_FPR (6 << 14) |
| 131 | 132 | ||
| 132 | #define FSR_FCC1 (1<<11) | 133 | #define FSR_FCC1 (1<<11) |
| @@ -239,7 +240,7 @@ typedef struct CPUSPARCState { | @@ -239,7 +240,7 @@ typedef struct CPUSPARCState { | ||
| 239 | #else | 240 | #else |
| 240 | #define GET_FSR32(env) (env->fsr) | 241 | #define GET_FSR32(env) (env->fsr) |
| 241 | #define PUT_FSR32(env, val) do { uint32_t _tmp = val; \ | 242 | #define PUT_FSR32(env, val) do { uint32_t _tmp = val; \ |
| 242 | - env->fsr = (_tmp & 0xcfc1ffff) | (env->fsr & 0x000e0000); \ | 243 | + env->fsr = (_tmp & 0xcfc1dfff) | (env->fsr & 0x000e0000); \ |
| 243 | } while (0) | 244 | } while (0) |
| 244 | #endif | 245 | #endif |
| 245 | 246 |
target-sparc/translate.c
| @@ -2602,8 +2602,14 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2602,8 +2602,14 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2602 | gen_op_stfsr(); | 2602 | gen_op_stfsr(); |
| 2603 | gen_op_ldst(stf); | 2603 | gen_op_ldst(stf); |
| 2604 | break; | 2604 | break; |
| 2605 | +#if !defined(CONFIG_USER_ONLY) | ||
| 2605 | case 0x26: /* stdfq */ | 2606 | case 0x26: /* stdfq */ |
| 2606 | - goto nfpu_insn; | 2607 | + if (!supervisor(dc)) |
| 2608 | + goto priv_insn; | ||
| 2609 | + if (gen_trap_ifnofpu(dc)) | ||
| 2610 | + goto jmp_insn; | ||
| 2611 | + goto nfq_insn; | ||
| 2612 | +#endif | ||
| 2607 | case 0x27: | 2613 | case 0x27: |
| 2608 | gen_op_load_fpr_DT0(DFPREG(rd)); | 2614 | gen_op_load_fpr_DT0(DFPREG(rd)); |
| 2609 | gen_op_ldst(stdf); | 2615 | gen_op_ldst(stdf); |
| @@ -2675,6 +2681,13 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2675,6 +2681,13 @@ static void disas_sparc_insn(DisasContext * dc) | ||
| 2675 | gen_op_fpexception_im(FSR_FTT_UNIMPFPOP); | 2681 | gen_op_fpexception_im(FSR_FTT_UNIMPFPOP); |
| 2676 | dc->is_br = 1; | 2682 | dc->is_br = 1; |
| 2677 | return; | 2683 | return; |
| 2684 | +#if !defined(CONFIG_USER_ONLY) | ||
| 2685 | + nfq_insn: | ||
| 2686 | + save_state(dc); | ||
| 2687 | + gen_op_fpexception_im(FSR_FTT_SEQ_ERROR); | ||
| 2688 | + dc->is_br = 1; | ||
| 2689 | + return; | ||
| 2690 | +#endif | ||
| 2678 | #ifndef TARGET_SPARC64 | 2691 | #ifndef TARGET_SPARC64 |
| 2679 | ncp_insn: | 2692 | ncp_insn: |
| 2680 | save_state(dc); | 2693 | save_state(dc); |