microblaze: Improve src

Microblaze carry is mirrored in MSR[31], pick it directly from
there. Also, no need to mask cpu_R[dc->ra] when calling
write_carry.

15% improvement in linux-user src loops.

Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
This commit is contained in:
Edgar E. Iglesias 2013-10-24 19:18:28 +02:00
parent bb3cb951ef
commit 09b9f113ad

View File

@ -750,7 +750,7 @@ static void dec_barrel(DisasContext *dc)
static void dec_bit(DisasContext *dc) static void dec_bit(DisasContext *dc)
{ {
TCGv t0, t1; TCGv t0;
unsigned int op; unsigned int op;
int mem_index = cpu_mmu_index(dc->env); int mem_index = cpu_mmu_index(dc->env);
@ -761,19 +761,12 @@ static void dec_bit(DisasContext *dc)
t0 = tcg_temp_new(); t0 = tcg_temp_new();
LOG_DIS("src r%d r%d\n", dc->rd, dc->ra); LOG_DIS("src r%d r%d\n", dc->rd, dc->ra);
tcg_gen_andi_tl(t0, cpu_R[dc->ra], 1); tcg_gen_andi_tl(t0, cpu_SR[SR_MSR], MSR_CC);
write_carry(dc, cpu_R[dc->ra]);
if (dc->rd) { if (dc->rd) {
t1 = tcg_temp_new();
read_carry(dc, t1);
tcg_gen_shli_tl(t1, t1, 31);
tcg_gen_shri_tl(cpu_R[dc->rd], cpu_R[dc->ra], 1); tcg_gen_shri_tl(cpu_R[dc->rd], cpu_R[dc->ra], 1);
tcg_gen_or_tl(cpu_R[dc->rd], cpu_R[dc->rd], t1); tcg_gen_or_tl(cpu_R[dc->rd], cpu_R[dc->rd], t0);
tcg_temp_free(t1);
} }
/* Update carry. */
write_carry(dc, t0);
tcg_temp_free(t0); tcg_temp_free(t0);
break; break;