Commit 38bc628b08e5d43024cb407cd0605a068fcc5536

Authored by blueswir1
1 parent 0cf767d6

Convert addx, subx, next_insn and mov_pc_npc to TCG


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4009 c046a42c-6fe2-441c-8c8c-71466251a162
target-sparc/op.c
... ... @@ -215,11 +215,6 @@ void OPPROTO op_add_T1_T0_cc(void)
215 215 FORCE_RET();
216 216 }
217 217  
218   -void OPPROTO op_addx_T1_T0(void)
219   -{
220   - T0 += T1 + FLAG_SET(PSR_CARRY);
221   -}
222   -
223 218 void OPPROTO op_addx_T1_T0_cc(void)
224 219 {
225 220 target_ulong src1;
... ... @@ -413,11 +408,6 @@ void OPPROTO op_sub_T1_T0_cc(void)
413 408 FORCE_RET();
414 409 }
415 410  
416   -void OPPROTO op_subx_T1_T0(void)
417   -{
418   - T0 -= T1 + FLAG_SET(PSR_CARRY);
419   -}
420   -
421 411 void OPPROTO op_subx_T1_T0_cc(void)
422 412 {
423 413 target_ulong src1;
... ... @@ -1184,17 +1174,6 @@ void OPPROTO op_eval_brgez(void)
1184 1174 }
1185 1175 #endif
1186 1176  
1187   -void OPPROTO op_mov_pc_npc(void)
1188   -{
1189   - env->pc = env->npc;
1190   -}
1191   -
1192   -void OPPROTO op_next_insn(void)
1193   -{
1194   - env->pc = env->npc;
1195   - env->npc = env->npc + 4;
1196   -}
1197   -
1198 1177 void OPPROTO op_jmp_label(void)
1199 1178 {
1200 1179 GOTO_LABEL_PARAM(1);
... ...
target-sparc/translate.c
... ... @@ -412,16 +412,26 @@ static inline void gen_mov_pc_npc(DisasContext * dc)
412 412 {
413 413 if (dc->npc == JUMP_PC) {
414 414 gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1]);
415   - gen_op_mov_pc_npc();
  415 + tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, npc));
  416 + tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, pc));
416 417 dc->pc = DYNAMIC_PC;
417 418 } else if (dc->npc == DYNAMIC_PC) {
418   - gen_op_mov_pc_npc();
  419 + tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, npc));
  420 + tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, pc));
419 421 dc->pc = DYNAMIC_PC;
420 422 } else {
421 423 dc->pc = dc->npc;
422 424 }
423 425 }
424 426  
  427 +static inline void gen_op_next_insn(void)
  428 +{
  429 + tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, npc));
  430 + tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, pc));
  431 + tcg_gen_addi_tl(cpu_tmp0, cpu_tmp0, 4);
  432 + tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, npc));
  433 +}
  434 +
425 435 static GenOpFunc * const gen_cond[2][16] = {
426 436 {
427 437 gen_op_eval_bn,
... ... @@ -991,6 +1001,13 @@ static inline void gen_ldstub_asi(int insn)
991 1001 }
992 1002 #endif
993 1003  
  1004 +static inline void gen_mov_reg_C(TCGv reg)
  1005 +{
  1006 + tcg_gen_ld_i32(reg, cpu_env, offsetof(CPUSPARCState, psr));
  1007 + tcg_gen_shri_i32(reg, reg, 20);
  1008 + tcg_gen_andi_i32(reg, reg, 0x1);
  1009 +}
  1010 +
994 1011 /* before an instruction, dc->pc must be static */
995 1012 static void disas_sparc_insn(DisasContext * dc)
996 1013 {
... ... @@ -2111,8 +2128,11 @@ static void disas_sparc_insn(DisasContext * dc)
2111 2128 case 0x8:
2112 2129 if (xop & 0x10)
2113 2130 gen_op_addx_T1_T0_cc();
2114   - else
2115   - gen_op_addx_T1_T0();
  2131 + else {
  2132 + gen_mov_reg_C(cpu_tmp0);
  2133 + tcg_gen_add_tl(cpu_T[1], cpu_T[1], cpu_tmp0);
  2134 + tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  2135 + }
2116 2136 break;
2117 2137 #ifdef TARGET_SPARC64
2118 2138 case 0x9: /* V9 mulx */
... ... @@ -2132,8 +2152,11 @@ static void disas_sparc_insn(DisasContext * dc)
2132 2152 case 0xc:
2133 2153 if (xop & 0x10)
2134 2154 gen_op_subx_T1_T0_cc();
2135   - else
2136   - gen_op_subx_T1_T0();
  2155 + else {
  2156 + gen_mov_reg_C(cpu_tmp0);
  2157 + tcg_gen_add_tl(cpu_T[1], cpu_T[1], cpu_tmp0);
  2158 + tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  2159 + }
2137 2160 break;
2138 2161 #ifdef TARGET_SPARC64
2139 2162 case 0xd: /* V9 udivx */
... ...