Commit 38bc628b08e5d43024cb407cd0605a068fcc5536
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
Showing
2 changed files
with
29 additions
and
27 deletions
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 */ | ... | ... |