Commit ded3ab80dd384715dff3741e4ac8a015933cb180

Authored by pbrook
1 parent 908f52b0

Sparc64 insn fixes (Blue Swirl).


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1993 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 36 additions and 11 deletions
target-sparc/translate.c
@@ -1123,7 +1123,11 @@ static void disas_sparc_insn(DisasContext * dc) @@ -1123,7 +1123,11 @@ static void disas_sparc_insn(DisasContext * dc)
1123 gen_movl_T0_reg(rd); 1123 gen_movl_T0_reg(rd);
1124 break; 1124 break;
1125 case 0x5: /* V9 rdpc */ 1125 case 0x5: /* V9 rdpc */
1126 - gen_op_movl_T0_im(dc->pc); 1126 + if (dc->pc == (uint32_t)dc->pc) {
  1127 + gen_op_movl_T0_im(dc->pc);
  1128 + } else {
  1129 + gen_op_movq_T0_im64(dc->pc >> 32, dc->pc);
  1130 + }
1127 gen_movl_T0_reg(rd); 1131 gen_movl_T0_reg(rd);
1128 break; 1132 break;
1129 case 0x6: /* V9 rdfprs */ 1133 case 0x6: /* V9 rdfprs */
@@ -1765,6 +1769,11 @@ static void disas_sparc_insn(DisasContext * dc) @@ -1765,6 +1769,11 @@ static void disas_sparc_insn(DisasContext * dc)
1765 else 1769 else
1766 gen_op_addx_T1_T0(); 1770 gen_op_addx_T1_T0();
1767 break; 1771 break;
  1772 +#ifdef TARGET_SPARC64
  1773 + case 0x9: /* V9 mulx */
  1774 + gen_op_mulx_T1_T0();
  1775 + break;
  1776 +#endif
1768 case 0xa: 1777 case 0xa:
1769 gen_op_umul_T1_T0(); 1778 gen_op_umul_T1_T0();
1770 if (xop & 0x10) 1779 if (xop & 0x10)
@@ -1781,6 +1790,11 @@ static void disas_sparc_insn(DisasContext * dc) @@ -1781,6 +1790,11 @@ static void disas_sparc_insn(DisasContext * dc)
1781 else 1790 else
1782 gen_op_subx_T1_T0(); 1791 gen_op_subx_T1_T0();
1783 break; 1792 break;
  1793 +#ifdef TARGET_SPARC64
  1794 + case 0xd: /* V9 udivx */
  1795 + gen_op_udivx_T1_T0();
  1796 + break;
  1797 +#endif
1784 case 0xe: 1798 case 0xe:
1785 gen_op_udiv_T1_T0(); 1799 gen_op_udiv_T1_T0();
1786 if (xop & 0x10) 1800 if (xop & 0x10)
@@ -1797,16 +1811,6 @@ static void disas_sparc_insn(DisasContext * dc) @@ -1797,16 +1811,6 @@ static void disas_sparc_insn(DisasContext * dc)
1797 gen_movl_T0_reg(rd); 1811 gen_movl_T0_reg(rd);
1798 } else { 1812 } else {
1799 switch (xop) { 1813 switch (xop) {
1800 -#ifdef TARGET_SPARC64  
1801 - case 0x9: /* V9 mulx */  
1802 - gen_op_mulx_T1_T0();  
1803 - gen_movl_T0_reg(rd);  
1804 - break;  
1805 - case 0xd: /* V9 udivx */  
1806 - gen_op_udivx_T1_T0();  
1807 - gen_movl_T0_reg(rd);  
1808 - break;  
1809 -#endif  
1810 case 0x20: /* taddcc */ 1814 case 0x20: /* taddcc */
1811 case 0x21: /* tsubcc */ 1815 case 0x21: /* tsubcc */
1812 case 0x22: /* taddcctv */ 1816 case 0x22: /* taddcctv */
@@ -1942,6 +1946,11 @@ static void disas_sparc_insn(DisasContext * dc) @@ -1942,6 +1946,11 @@ static void disas_sparc_insn(DisasContext * dc)
1942 break; 1946 break;
1943 case 6: // pstate 1947 case 6: // pstate
1944 gen_op_wrpstate(); 1948 gen_op_wrpstate();
  1949 + save_state(dc);
  1950 + gen_op_next_insn();
  1951 + gen_op_movl_T0_0();
  1952 + gen_op_exit_tb();
  1953 + dc->is_br = 1;
1945 break; 1954 break;
1946 case 7: // tl 1955 case 7: // tl
1947 gen_op_movl_env_T0(offsetof(CPUSPARCState, tl)); 1956 gen_op_movl_env_T0(offsetof(CPUSPARCState, tl));
@@ -2121,7 +2130,15 @@ static void disas_sparc_insn(DisasContext * dc) @@ -2121,7 +2130,15 @@ static void disas_sparc_insn(DisasContext * dc)
2121 case 0x38: /* jmpl */ 2130 case 0x38: /* jmpl */
2122 { 2131 {
2123 if (rd != 0) { 2132 if (rd != 0) {
  2133 +#ifdef TARGET_SPARC64
  2134 + if (dc->pc == (uint32_t)dc->pc) {
  2135 + gen_op_movl_T1_im(dc->pc);
  2136 + } else {
  2137 + gen_op_movq_T1_im64(dc->pc >> 32, dc->pc);
  2138 + }
  2139 +#else
2124 gen_op_movl_T1_im(dc->pc); 2140 gen_op_movl_T1_im(dc->pc);
  2141 +#endif
2125 gen_movl_T1_reg(rd); 2142 gen_movl_T1_reg(rd);
2126 } 2143 }
2127 gen_mov_pc_npc(dc); 2144 gen_mov_pc_npc(dc);
@@ -2721,11 +2738,19 @@ void cpu_dump_state(CPUState *env, FILE *f, @@ -2721,11 +2738,19 @@ void cpu_dump_state(CPUState *env, FILE *f,
2721 if ((i & 3) == 3) 2738 if ((i & 3) == 3)
2722 cpu_fprintf(f, "\n"); 2739 cpu_fprintf(f, "\n");
2723 } 2740 }
  2741 +#ifdef TARGET_SPARC64
  2742 + cpu_fprintf(f, "pstate: 0x%08x ccr: 0x%02x asi: 0x%02x tl: %d\n",
  2743 + env->pstate, GET_CCR(env), env->asi, env->tl);
  2744 + cpu_fprintf(f, "cansave: %d canrestore: %d otherwin: %d wstate %d cleanwin %d cwp %d\n",
  2745 + env->cansave, env->canrestore, env->otherwin, env->wstate,
  2746 + env->cleanwin, NWINDOWS - 1 - env->cwp);
  2747 +#else
2724 cpu_fprintf(f, "psr: 0x%08x -> %c%c%c%c %c%c%c wim: 0x%08x\n", GET_PSR(env), 2748 cpu_fprintf(f, "psr: 0x%08x -> %c%c%c%c %c%c%c wim: 0x%08x\n", GET_PSR(env),
2725 GET_FLAG(PSR_ZERO, 'Z'), GET_FLAG(PSR_OVF, 'V'), 2749 GET_FLAG(PSR_ZERO, 'Z'), GET_FLAG(PSR_OVF, 'V'),
2726 GET_FLAG(PSR_NEG, 'N'), GET_FLAG(PSR_CARRY, 'C'), 2750 GET_FLAG(PSR_NEG, 'N'), GET_FLAG(PSR_CARRY, 'C'),
2727 env->psrs?'S':'-', env->psrps?'P':'-', 2751 env->psrs?'S':'-', env->psrps?'P':'-',
2728 env->psret?'E':'-', env->wim); 2752 env->psret?'E':'-', env->wim);
  2753 +#endif
2729 cpu_fprintf(f, "fsr: 0x%08x\n", GET_FSR32(env)); 2754 cpu_fprintf(f, "fsr: 0x%08x\n", GET_FSR32(env));
2730 } 2755 }
2731 2756