Commit 1ba74fb8f14389282e1b86579a46a38b5710e193
1 parent
92e90443
target-mips: optimize gen_compute_branch()
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6936 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
48 additions
and
51 deletions
target-mips/cpu.h
... | ... | @@ -443,7 +443,7 @@ struct CPUMIPSState { |
443 | 443 | #define MIPS_HFLAG_BL 0x0C00 /* Likely branch */ |
444 | 444 | #define MIPS_HFLAG_BR 0x1000 /* branch to register (can't link TB) */ |
445 | 445 | target_ulong btarget; /* Jump / branch target */ |
446 | - int bcond; /* Branch condition (if needed) */ | |
446 | + target_ulong bcond; /* Branch condition (if needed) */ | |
447 | 447 | |
448 | 448 | int SYNCI_Step; /* Address step size for SYNCI */ |
449 | 449 | int CCRes; /* Cycle count resolution/divisor */ |
... | ... |
target-mips/machine.c
... | ... | @@ -91,7 +91,8 @@ void cpu_save(QEMUFile *f, void *opaque) |
91 | 91 | qemu_put_sbe32s(f, &env->error_code); |
92 | 92 | qemu_put_be32s(f, &env->hflags); |
93 | 93 | qemu_put_betls(f, &env->btarget); |
94 | - qemu_put_sbe32s(f, &env->bcond); | |
94 | + i = env->bcond; | |
95 | + qemu_put_sbe32s(f, &i); | |
95 | 96 | |
96 | 97 | /* Save remaining CP1 registers */ |
97 | 98 | qemu_put_sbe32s(f, &env->CP0_Index); |
... | ... | @@ -240,7 +241,8 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) |
240 | 241 | qemu_get_sbe32s(f, &env->error_code); |
241 | 242 | qemu_get_be32s(f, &env->hflags); |
242 | 243 | qemu_get_betls(f, &env->btarget); |
243 | - qemu_get_sbe32s(f, &env->bcond); | |
244 | + qemu_get_sbe32s(f, &i); | |
245 | + env->bcond = i; | |
244 | 246 | |
245 | 247 | /* Load remaining CP1 registers */ |
246 | 248 | qemu_get_sbe32s(f, &env->CP0_Index); |
... | ... |
target-mips/translate.c
... | ... | @@ -430,7 +430,7 @@ static TCGv_ptr cpu_env; |
430 | 430 | static TCGv cpu_gpr[32], cpu_PC; |
431 | 431 | static TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC], cpu_ACX[MIPS_DSP_ACC]; |
432 | 432 | static TCGv cpu_dspctrl, btarget; |
433 | -static TCGv_i32 bcond; | |
433 | +static TCGv bcond; | |
434 | 434 | static TCGv_i32 fpu_fpr32[32], fpu_fpr32h[32]; |
435 | 435 | static TCGv_i32 fpu_fcr0, fpu_fcr31; |
436 | 436 | |
... | ... | @@ -2167,7 +2167,7 @@ static void gen_trap (DisasContext *ctx, uint32_t opc, |
2167 | 2167 | { |
2168 | 2168 | int cond; |
2169 | 2169 | TCGv t0 = tcg_temp_local_new(); |
2170 | - TCGv t1 = tcg_temp_local_new(); | |
2170 | + TCGv t1 = tcg_temp_new(); | |
2171 | 2171 | |
2172 | 2172 | cond = 0; |
2173 | 2173 | /* Load needed operands */ |
... | ... | @@ -2290,8 +2290,8 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
2290 | 2290 | target_ulong btgt = -1; |
2291 | 2291 | int blink = 0; |
2292 | 2292 | int bcond_compute = 0; |
2293 | - TCGv t0 = tcg_temp_local_new(); | |
2294 | - TCGv t1 = tcg_temp_local_new(); | |
2293 | + TCGv t0 = tcg_temp_new(); | |
2294 | + TCGv t1 = tcg_temp_new(); | |
2295 | 2295 | |
2296 | 2296 | if (ctx->hflags & MIPS_HFLAG_BMASK) { |
2297 | 2297 | #ifdef MIPS_DEBUG_DISAS |
... | ... | @@ -2383,13 +2383,11 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
2383 | 2383 | MIPS_DEBUG("bnever (NOP)"); |
2384 | 2384 | goto out; |
2385 | 2385 | case OPC_BLTZAL: /* 0 < 0 */ |
2386 | - tcg_gen_movi_tl(t0, ctx->pc + 8); | |
2387 | - gen_store_gpr(t0, 31); | |
2386 | + tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 8); | |
2388 | 2387 | MIPS_DEBUG("bnever and link"); |
2389 | 2388 | goto out; |
2390 | 2389 | case OPC_BLTZALL: /* 0 < 0 likely */ |
2391 | - tcg_gen_movi_tl(t0, ctx->pc + 8); | |
2392 | - gen_store_gpr(t0, 31); | |
2390 | + tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 8); | |
2393 | 2391 | /* Skip the instruction in the delay slot */ |
2394 | 2392 | MIPS_DEBUG("bnever, link and skip"); |
2395 | 2393 | ctx->pc += 4; |
... | ... | @@ -2427,82 +2425,80 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
2427 | 2425 | } else { |
2428 | 2426 | switch (opc) { |
2429 | 2427 | case OPC_BEQ: |
2430 | - gen_op_eq(t0, t0, t1); | |
2428 | + gen_op_eq(bcond, t0, t1); | |
2431 | 2429 | MIPS_DEBUG("beq %s, %s, " TARGET_FMT_lx, |
2432 | 2430 | regnames[rs], regnames[rt], btgt); |
2433 | 2431 | goto not_likely; |
2434 | 2432 | case OPC_BEQL: |
2435 | - gen_op_eq(t0, t0, t1); | |
2433 | + gen_op_eq(bcond, t0, t1); | |
2436 | 2434 | MIPS_DEBUG("beql %s, %s, " TARGET_FMT_lx, |
2437 | 2435 | regnames[rs], regnames[rt], btgt); |
2438 | 2436 | goto likely; |
2439 | 2437 | case OPC_BNE: |
2440 | - gen_op_ne(t0, t0, t1); | |
2438 | + gen_op_ne(bcond, t0, t1); | |
2441 | 2439 | MIPS_DEBUG("bne %s, %s, " TARGET_FMT_lx, |
2442 | 2440 | regnames[rs], regnames[rt], btgt); |
2443 | 2441 | goto not_likely; |
2444 | 2442 | case OPC_BNEL: |
2445 | - gen_op_ne(t0, t0, t1); | |
2443 | + gen_op_ne(bcond, t0, t1); | |
2446 | 2444 | MIPS_DEBUG("bnel %s, %s, " TARGET_FMT_lx, |
2447 | 2445 | regnames[rs], regnames[rt], btgt); |
2448 | 2446 | goto likely; |
2449 | 2447 | case OPC_BGEZ: |
2450 | - gen_op_gez(t0, t0); | |
2448 | + gen_op_gez(bcond, t0); | |
2451 | 2449 | MIPS_DEBUG("bgez %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2452 | 2450 | goto not_likely; |
2453 | 2451 | case OPC_BGEZL: |
2454 | - gen_op_gez(t0, t0); | |
2452 | + gen_op_gez(bcond, t0); | |
2455 | 2453 | MIPS_DEBUG("bgezl %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2456 | 2454 | goto likely; |
2457 | 2455 | case OPC_BGEZAL: |
2458 | - gen_op_gez(t0, t0); | |
2456 | + gen_op_gez(bcond, t0); | |
2459 | 2457 | MIPS_DEBUG("bgezal %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2460 | 2458 | blink = 31; |
2461 | 2459 | goto not_likely; |
2462 | 2460 | case OPC_BGEZALL: |
2463 | - gen_op_gez(t0, t0); | |
2461 | + gen_op_gez(bcond, t0); | |
2464 | 2462 | blink = 31; |
2465 | 2463 | MIPS_DEBUG("bgezall %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2466 | 2464 | goto likely; |
2467 | 2465 | case OPC_BGTZ: |
2468 | - gen_op_gtz(t0, t0); | |
2466 | + gen_op_gtz(bcond, t0); | |
2469 | 2467 | MIPS_DEBUG("bgtz %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2470 | 2468 | goto not_likely; |
2471 | 2469 | case OPC_BGTZL: |
2472 | - gen_op_gtz(t0, t0); | |
2470 | + gen_op_gtz(bcond, t0); | |
2473 | 2471 | MIPS_DEBUG("bgtzl %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2474 | 2472 | goto likely; |
2475 | 2473 | case OPC_BLEZ: |
2476 | - gen_op_lez(t0, t0); | |
2474 | + gen_op_lez(bcond, t0); | |
2477 | 2475 | MIPS_DEBUG("blez %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2478 | 2476 | goto not_likely; |
2479 | 2477 | case OPC_BLEZL: |
2480 | - gen_op_lez(t0, t0); | |
2478 | + gen_op_lez(bcond, t0); | |
2481 | 2479 | MIPS_DEBUG("blezl %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2482 | 2480 | goto likely; |
2483 | 2481 | case OPC_BLTZ: |
2484 | - gen_op_ltz(t0, t0); | |
2482 | + gen_op_ltz(bcond, t0); | |
2485 | 2483 | MIPS_DEBUG("bltz %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2486 | 2484 | goto not_likely; |
2487 | 2485 | case OPC_BLTZL: |
2488 | - gen_op_ltz(t0, t0); | |
2486 | + gen_op_ltz(bcond, t0); | |
2489 | 2487 | MIPS_DEBUG("bltzl %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2490 | 2488 | goto likely; |
2491 | 2489 | case OPC_BLTZAL: |
2492 | - gen_op_ltz(t0, t0); | |
2490 | + gen_op_ltz(bcond, t0); | |
2493 | 2491 | blink = 31; |
2494 | 2492 | MIPS_DEBUG("bltzal %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2495 | 2493 | not_likely: |
2496 | 2494 | ctx->hflags |= MIPS_HFLAG_BC; |
2497 | - tcg_gen_trunc_tl_i32(bcond, t0); | |
2498 | 2495 | break; |
2499 | 2496 | case OPC_BLTZALL: |
2500 | - gen_op_ltz(t0, t0); | |
2497 | + gen_op_ltz(bcond, t0); | |
2501 | 2498 | blink = 31; |
2502 | 2499 | MIPS_DEBUG("bltzall %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2503 | 2500 | likely: |
2504 | 2501 | ctx->hflags |= MIPS_HFLAG_BL; |
2505 | - tcg_gen_trunc_tl_i32(bcond, t0); | |
2506 | 2502 | break; |
2507 | 2503 | default: |
2508 | 2504 | MIPS_INVAL("conditional branch/jump"); |
... | ... | @@ -2515,8 +2511,7 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
2515 | 2511 | |
2516 | 2512 | ctx->btarget = btgt; |
2517 | 2513 | if (blink > 0) { |
2518 | - tcg_gen_movi_tl(t0, ctx->pc + 8); | |
2519 | - gen_store_gpr(t0, blink); | |
2514 | + tcg_gen_movi_tl(cpu_gpr[blink], ctx->pc + 8); | |
2520 | 2515 | } |
2521 | 2516 | |
2522 | 2517 | out: |
... | ... | @@ -5537,10 +5532,10 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, |
5537 | 5532 | get_fp_cond(t0); |
5538 | 5533 | tcg_gen_andi_i32(t0, t0, 0x1 << cc); |
5539 | 5534 | tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, l1); |
5540 | - tcg_gen_movi_i32(bcond, 0); | |
5535 | + tcg_gen_movi_tl(bcond, 0); | |
5541 | 5536 | tcg_gen_br(l2); |
5542 | 5537 | gen_set_label(l1); |
5543 | - tcg_gen_movi_i32(bcond, 1); | |
5538 | + tcg_gen_movi_tl(bcond, 1); | |
5544 | 5539 | gen_set_label(l2); |
5545 | 5540 | } |
5546 | 5541 | opn = "bc1f"; |
... | ... | @@ -5553,10 +5548,10 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, |
5553 | 5548 | get_fp_cond(t0); |
5554 | 5549 | tcg_gen_andi_i32(t0, t0, 0x1 << cc); |
5555 | 5550 | tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, l1); |
5556 | - tcg_gen_movi_i32(bcond, 0); | |
5551 | + tcg_gen_movi_tl(bcond, 0); | |
5557 | 5552 | tcg_gen_br(l2); |
5558 | 5553 | gen_set_label(l1); |
5559 | - tcg_gen_movi_i32(bcond, 1); | |
5554 | + tcg_gen_movi_tl(bcond, 1); | |
5560 | 5555 | gen_set_label(l2); |
5561 | 5556 | } |
5562 | 5557 | opn = "bc1fl"; |
... | ... | @@ -5569,10 +5564,10 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, |
5569 | 5564 | get_fp_cond(t0); |
5570 | 5565 | tcg_gen_andi_i32(t0, t0, 0x1 << cc); |
5571 | 5566 | tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l1); |
5572 | - tcg_gen_movi_i32(bcond, 0); | |
5567 | + tcg_gen_movi_tl(bcond, 0); | |
5573 | 5568 | tcg_gen_br(l2); |
5574 | 5569 | gen_set_label(l1); |
5575 | - tcg_gen_movi_i32(bcond, 1); | |
5570 | + tcg_gen_movi_tl(bcond, 1); | |
5576 | 5571 | gen_set_label(l2); |
5577 | 5572 | } |
5578 | 5573 | opn = "bc1t"; |
... | ... | @@ -5585,10 +5580,10 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, |
5585 | 5580 | get_fp_cond(t0); |
5586 | 5581 | tcg_gen_andi_i32(t0, t0, 0x1 << cc); |
5587 | 5582 | tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l1); |
5588 | - tcg_gen_movi_i32(bcond, 0); | |
5583 | + tcg_gen_movi_tl(bcond, 0); | |
5589 | 5584 | tcg_gen_br(l2); |
5590 | 5585 | gen_set_label(l1); |
5591 | - tcg_gen_movi_i32(bcond, 1); | |
5586 | + tcg_gen_movi_tl(bcond, 1); | |
5592 | 5587 | gen_set_label(l2); |
5593 | 5588 | } |
5594 | 5589 | opn = "bc1tl"; |
... | ... | @@ -5603,10 +5598,10 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, |
5603 | 5598 | get_fp_cond(t0); |
5604 | 5599 | tcg_gen_andi_i32(t0, t0, 0x3 << cc); |
5605 | 5600 | tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, l1); |
5606 | - tcg_gen_movi_i32(bcond, 0); | |
5601 | + tcg_gen_movi_tl(bcond, 0); | |
5607 | 5602 | tcg_gen_br(l2); |
5608 | 5603 | gen_set_label(l1); |
5609 | - tcg_gen_movi_i32(bcond, 1); | |
5604 | + tcg_gen_movi_tl(bcond, 1); | |
5610 | 5605 | gen_set_label(l2); |
5611 | 5606 | } |
5612 | 5607 | opn = "bc1any2f"; |
... | ... | @@ -5619,10 +5614,10 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, |
5619 | 5614 | get_fp_cond(t0); |
5620 | 5615 | tcg_gen_andi_i32(t0, t0, 0x3 << cc); |
5621 | 5616 | tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l1); |
5622 | - tcg_gen_movi_i32(bcond, 0); | |
5617 | + tcg_gen_movi_tl(bcond, 0); | |
5623 | 5618 | tcg_gen_br(l2); |
5624 | 5619 | gen_set_label(l1); |
5625 | - tcg_gen_movi_i32(bcond, 1); | |
5620 | + tcg_gen_movi_tl(bcond, 1); | |
5626 | 5621 | gen_set_label(l2); |
5627 | 5622 | } |
5628 | 5623 | opn = "bc1any2t"; |
... | ... | @@ -5635,10 +5630,10 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, |
5635 | 5630 | get_fp_cond(t0); |
5636 | 5631 | tcg_gen_andi_i32(t0, t0, 0xf << cc); |
5637 | 5632 | tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, l1); |
5638 | - tcg_gen_movi_i32(bcond, 0); | |
5633 | + tcg_gen_movi_tl(bcond, 0); | |
5639 | 5634 | tcg_gen_br(l2); |
5640 | 5635 | gen_set_label(l1); |
5641 | - tcg_gen_movi_i32(bcond, 1); | |
5636 | + tcg_gen_movi_tl(bcond, 1); | |
5642 | 5637 | gen_set_label(l2); |
5643 | 5638 | } |
5644 | 5639 | opn = "bc1any4f"; |
... | ... | @@ -5651,10 +5646,10 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, |
5651 | 5646 | get_fp_cond(t0); |
5652 | 5647 | tcg_gen_andi_i32(t0, t0, 0xf << cc); |
5653 | 5648 | tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l1); |
5654 | - tcg_gen_movi_i32(bcond, 0); | |
5649 | + tcg_gen_movi_tl(bcond, 0); | |
5655 | 5650 | tcg_gen_br(l2); |
5656 | 5651 | gen_set_label(l1); |
5657 | - tcg_gen_movi_i32(bcond, 1); | |
5652 | + tcg_gen_movi_tl(bcond, 1); | |
5658 | 5653 | gen_set_label(l2); |
5659 | 5654 | } |
5660 | 5655 | opn = "bc1any4t"; |
... | ... | @@ -7585,7 +7580,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
7585 | 7580 | int l1 = gen_new_label(); |
7586 | 7581 | |
7587 | 7582 | MIPS_DEBUG("blikely condition (" TARGET_FMT_lx ")", ctx->pc + 4); |
7588 | - tcg_gen_brcondi_i32(TCG_COND_NE, bcond, 0, l1); | |
7583 | + tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1); | |
7589 | 7584 | { |
7590 | 7585 | TCGv_i32 r_tmp = tcg_temp_new_i32(); |
7591 | 7586 | |
... | ... | @@ -8147,7 +8142,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
8147 | 8142 | { |
8148 | 8143 | int l1 = gen_new_label(); |
8149 | 8144 | |
8150 | - tcg_gen_brcondi_i32(TCG_COND_NE, bcond, 0, l1); | |
8145 | + tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1); | |
8151 | 8146 | gen_goto_tb(ctx, 1, ctx->pc + 4); |
8152 | 8147 | gen_set_label(l1); |
8153 | 8148 | gen_goto_tb(ctx, 0, ctx->btarget); |
... | ... | @@ -8440,8 +8435,8 @@ static void mips_tcg_init(void) |
8440 | 8435 | cpu_dspctrl = tcg_global_mem_new(TCG_AREG0, |
8441 | 8436 | offsetof(CPUState, active_tc.DSPControl), |
8442 | 8437 | "DSPControl"); |
8443 | - bcond = tcg_global_mem_new_i32(TCG_AREG0, | |
8444 | - offsetof(CPUState, bcond), "bcond"); | |
8438 | + bcond = tcg_global_mem_new(TCG_AREG0, | |
8439 | + offsetof(CPUState, bcond), "bcond"); | |
8445 | 8440 | btarget = tcg_global_mem_new(TCG_AREG0, |
8446 | 8441 | offsetof(CPUState, btarget), "btarget"); |
8447 | 8442 | for (i = 0; i < 32; i++) |
... | ... |