Commit 30898801ad8c70708ead392b243ca8bcd28ca722
1 parent
20c4c97c
Switch MIPS clo/clz and the condition tests to TCG.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4507 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
80 additions
and
74 deletions
target-mips/helper.h
target-mips/op.c
| ... | ... | @@ -167,51 +167,6 @@ |
| 167 | 167 | #undef MEMSUFFIX |
| 168 | 168 | #endif |
| 169 | 169 | |
| 170 | -/* Logical */ | |
| 171 | -void op_clo (void) | |
| 172 | -{ | |
| 173 | - T0 = clo32(T0); | |
| 174 | - FORCE_RET(); | |
| 175 | -} | |
| 176 | - | |
| 177 | -void op_clz (void) | |
| 178 | -{ | |
| 179 | - T0 = clz32(T0); | |
| 180 | - FORCE_RET(); | |
| 181 | -} | |
| 182 | - | |
| 183 | -#if defined(TARGET_MIPS64) | |
| 184 | - | |
| 185 | -#if TARGET_LONG_BITS > HOST_LONG_BITS | |
| 186 | -/* Those might call libgcc functions. */ | |
| 187 | -void op_dclo (void) | |
| 188 | -{ | |
| 189 | - CALL_FROM_TB0(do_dclo); | |
| 190 | - FORCE_RET(); | |
| 191 | -} | |
| 192 | - | |
| 193 | -void op_dclz (void) | |
| 194 | -{ | |
| 195 | - CALL_FROM_TB0(do_dclz); | |
| 196 | - FORCE_RET(); | |
| 197 | -} | |
| 198 | - | |
| 199 | -#else /* TARGET_LONG_BITS > HOST_LONG_BITS */ | |
| 200 | - | |
| 201 | -void op_dclo (void) | |
| 202 | -{ | |
| 203 | - T0 = clo64(T0); | |
| 204 | - FORCE_RET(); | |
| 205 | -} | |
| 206 | - | |
| 207 | -void op_dclz (void) | |
| 208 | -{ | |
| 209 | - T0 = clz64(T0); | |
| 210 | - FORCE_RET(); | |
| 211 | -} | |
| 212 | -#endif /* TARGET_LONG_BITS > HOST_LONG_BITS */ | |
| 213 | -#endif /* TARGET_MIPS64 */ | |
| 214 | - | |
| 215 | 170 | /* 64 bits arithmetic */ |
| 216 | 171 | #if TARGET_LONG_BITS > HOST_LONG_BITS |
| 217 | 172 | void op_mult (void) |
| ... | ... | @@ -524,29 +479,6 @@ void op_movt (void) |
| 524 | 479 | FORCE_RET(); |
| 525 | 480 | } |
| 526 | 481 | |
| 527 | -/* Tests */ | |
| 528 | -#define OP_COND(name, cond) \ | |
| 529 | -void glue(op_, name) (void) \ | |
| 530 | -{ \ | |
| 531 | - if (cond) { \ | |
| 532 | - T0 = 1; \ | |
| 533 | - } else { \ | |
| 534 | - T0 = 0; \ | |
| 535 | - } \ | |
| 536 | - FORCE_RET(); \ | |
| 537 | -} | |
| 538 | - | |
| 539 | -OP_COND(eq, T0 == T1); | |
| 540 | -OP_COND(ne, T0 != T1); | |
| 541 | -OP_COND(ge, (target_long)T0 >= (target_long)T1); | |
| 542 | -OP_COND(geu, T0 >= T1); | |
| 543 | -OP_COND(lt, (target_long)T0 < (target_long)T1); | |
| 544 | -OP_COND(ltu, T0 < T1); | |
| 545 | -OP_COND(gez, (target_long)T0 >= 0); | |
| 546 | -OP_COND(gtz, (target_long)T0 > 0); | |
| 547 | -OP_COND(lez, (target_long)T0 <= 0); | |
| 548 | -OP_COND(ltz, (target_long)T0 < 0); | |
| 549 | - | |
| 550 | 482 | /* Branches */ |
| 551 | 483 | /* Branch to register */ |
| 552 | 484 | void op_save_breg_target (void) | ... | ... |
target-mips/op_helper.c
| ... | ... | @@ -71,6 +71,16 @@ void do_restore_state (void *pc_ptr) |
| 71 | 71 | } |
| 72 | 72 | } |
| 73 | 73 | |
| 74 | +void do_clo (void) | |
| 75 | +{ | |
| 76 | + T0 = clo32(T0); | |
| 77 | +} | |
| 78 | + | |
| 79 | +void do_clz (void) | |
| 80 | +{ | |
| 81 | + T0 = clz32(T0); | |
| 82 | +} | |
| 83 | + | |
| 74 | 84 | #if defined(TARGET_MIPS64) |
| 75 | 85 | #if TARGET_LONG_BITS > HOST_LONG_BITS |
| 76 | 86 | /* Those might call libgcc functions. */ | ... | ... |
target-mips/translate.c
| ... | ... | @@ -655,6 +655,65 @@ FOP_CONDS(abs, s) |
| 655 | 655 | FOP_CONDS(, ps) |
| 656 | 656 | FOP_CONDS(abs, ps) |
| 657 | 657 | |
| 658 | +/* Tests */ | |
| 659 | +#define OP_COND(name, cond) \ | |
| 660 | +void glue(gen_op_, name) (void) \ | |
| 661 | +{ \ | |
| 662 | + int l1 = gen_new_label(); \ | |
| 663 | + int l2 = gen_new_label(); \ | |
| 664 | + \ | |
| 665 | + tcg_gen_brcond_tl(cond, cpu_T[0], cpu_T[1], l1); \ | |
| 666 | + gen_op_set_T0(0); \ | |
| 667 | + tcg_gen_br(l2); \ | |
| 668 | + gen_set_label(l1); \ | |
| 669 | + gen_op_set_T0(1); \ | |
| 670 | + gen_set_label(l2); \ | |
| 671 | +} | |
| 672 | +OP_COND(eq, TCG_COND_EQ); | |
| 673 | +OP_COND(ne, TCG_COND_NE); | |
| 674 | +OP_COND(ge, TCG_COND_GE); | |
| 675 | +OP_COND(geu, TCG_COND_GEU); | |
| 676 | +OP_COND(lt, TCG_COND_LT); | |
| 677 | +OP_COND(ltu, TCG_COND_LTU); | |
| 678 | +#undef OP_COND | |
| 679 | + | |
| 680 | +#define OP_CONDI(name, cond) \ | |
| 681 | +void glue(gen_op_, name) (target_ulong val) \ | |
| 682 | +{ \ | |
| 683 | + int l1 = gen_new_label(); \ | |
| 684 | + int l2 = gen_new_label(); \ | |
| 685 | + \ | |
| 686 | + tcg_gen_brcond_tl(cond, cpu_T[0], tcg_const_tl(val), l1); \ | |
| 687 | + gen_op_set_T0(0); \ | |
| 688 | + tcg_gen_br(l2); \ | |
| 689 | + gen_set_label(l1); \ | |
| 690 | + gen_op_set_T0(1); \ | |
| 691 | + gen_set_label(l2); \ | |
| 692 | +} | |
| 693 | +OP_CONDI(lti, TCG_COND_LT); | |
| 694 | +OP_CONDI(ltiu, TCG_COND_LTU); | |
| 695 | +#undef OP_CONDI | |
| 696 | + | |
| 697 | +#define OP_CONDZ(name, cond) \ | |
| 698 | +void glue(gen_op_, name) (void) \ | |
| 699 | +{ \ | |
| 700 | + int l1 = gen_new_label(); \ | |
| 701 | + int l2 = gen_new_label(); \ | |
| 702 | + \ | |
| 703 | + tcg_gen_brcond_tl(cond, cpu_T[0], tcg_const_tl(0), l1); \ | |
| 704 | + gen_op_set_T0(0); \ | |
| 705 | + tcg_gen_br(l2); \ | |
| 706 | + gen_set_label(l1); \ | |
| 707 | + gen_op_set_T0(1); \ | |
| 708 | + gen_set_label(l2); \ | |
| 709 | +} | |
| 710 | +OP_CONDZ(gez, TCG_COND_GE); | |
| 711 | +OP_CONDZ(gtz, TCG_COND_GT); | |
| 712 | +OP_CONDZ(lez, TCG_COND_LE); | |
| 713 | +OP_CONDZ(ltz, TCG_COND_LT); | |
| 714 | +#undef OP_CONDZ | |
| 715 | + | |
| 716 | + | |
| 658 | 717 | typedef struct DisasContext { |
| 659 | 718 | struct TranslationBlock *tb; |
| 660 | 719 | target_ulong pc, saved_pc; |
| ... | ... | @@ -1375,11 +1434,11 @@ static void gen_arith_imm (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1375 | 1434 | break; |
| 1376 | 1435 | #endif |
| 1377 | 1436 | case OPC_SLTI: |
| 1378 | - gen_op_lt(); | |
| 1437 | + gen_op_lti(uimm); | |
| 1379 | 1438 | opn = "slti"; |
| 1380 | 1439 | break; |
| 1381 | 1440 | case OPC_SLTIU: |
| 1382 | - gen_op_ltu(); | |
| 1441 | + gen_op_ltiu(uimm); | |
| 1383 | 1442 | opn = "sltiu"; |
| 1384 | 1443 | break; |
| 1385 | 1444 | case OPC_ANDI: |
| ... | ... | @@ -2160,20 +2219,20 @@ static void gen_cl (DisasContext *ctx, uint32_t opc, |
| 2160 | 2219 | GEN_LOAD_REG_T0(rs); |
| 2161 | 2220 | switch (opc) { |
| 2162 | 2221 | case OPC_CLO: |
| 2163 | - gen_op_clo(); | |
| 2222 | + tcg_gen_helper_0_0(do_clo); | |
| 2164 | 2223 | opn = "clo"; |
| 2165 | 2224 | break; |
| 2166 | 2225 | case OPC_CLZ: |
| 2167 | - gen_op_clz(); | |
| 2226 | + tcg_gen_helper_0_0(do_clz); | |
| 2168 | 2227 | opn = "clz"; |
| 2169 | 2228 | break; |
| 2170 | 2229 | #if defined(TARGET_MIPS64) |
| 2171 | 2230 | case OPC_DCLO: |
| 2172 | - gen_op_dclo(); | |
| 2231 | + tcg_gen_helper_0_0(do_dclo); | |
| 2173 | 2232 | opn = "dclo"; |
| 2174 | 2233 | break; |
| 2175 | 2234 | case OPC_DCLZ: |
| 2176 | - gen_op_dclz(); | |
| 2235 | + tcg_gen_helper_0_0(do_dclz); | |
| 2177 | 2236 | opn = "dclz"; |
| 2178 | 2237 | break; |
| 2179 | 2238 | #endif | ... | ... |