Commit 9143e59842952d89533937dba9043b7b36b76a82

Authored by blueswir1
1 parent a4d17f19

Fix stdfq op (Aurelien Jarno)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2604 c046a42c-6fe2-441c-8c8c-71466251a162
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);