tcg-ppc: Cleanup tcg_out_qemu_ld/st_slow_path

Coding style fixes.  Use TCGReg enumeration values instead of raw
numbers.  Don't needlessly pull the whole TCGLabelQemuLdst struct
into local variables.  Less conditional compilation.

No functional changes.

Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
Richard Henderson 2013-08-29 10:07:24 -07:00
parent 4b2b114d8c
commit 1d10cf9886

View File

@ -836,132 +836,101 @@ static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc)
} }
#if defined(CONFIG_SOFTMMU) #if defined(CONFIG_SOFTMMU)
static void tcg_out_qemu_ld_slow_path (TCGContext *s, TCGLabelQemuLdst *label) static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l)
{ {
int s_bits; TCGReg ir, datalo, datahi;
int ir;
int opc = label->opc;
int mem_index = label->mem_index;
int data_reg = label->datalo_reg;
int data_reg2 = label->datahi_reg;
int addr_reg = label->addrlo_reg;
uint8_t *raddr = label->raddr;
uint8_t **label_ptr = &label->label_ptr[0];
s_bits = opc & 3; reloc_pc14 (l->label_ptr[0], (uintptr_t)s->code_ptr);
/* resolve label address */ ir = TCG_REG_R4;
reloc_pc14 (label_ptr[0], (tcg_target_long) s->code_ptr); if (TARGET_LONG_BITS == 32) {
tcg_out_mov(s, TCG_TYPE_I32, ir++, l->addrlo_reg);
/* slow path */ } else {
ir = 4;
#if TARGET_LONG_BITS == 32
tcg_out_mov (s, TCG_TYPE_I32, ir++, addr_reg);
#else
#ifdef TCG_TARGET_CALL_ALIGN_ARGS #ifdef TCG_TARGET_CALL_ALIGN_ARGS
ir |= 1; ir |= 1;
#endif #endif
tcg_out_mov (s, TCG_TYPE_I32, ir++, label->addrhi_reg); tcg_out_mov(s, TCG_TYPE_I32, ir++, l->addrhi_reg);
tcg_out_mov (s, TCG_TYPE_I32, ir++, addr_reg); tcg_out_mov(s, TCG_TYPE_I32, ir++, l->addrlo_reg);
#endif }
tcg_out_movi (s, TCG_TYPE_I32, ir++, mem_index); tcg_out_movi(s, TCG_TYPE_I32, ir++, l->mem_index);
tcg_out_movi (s, TCG_TYPE_I32, ir, (tcg_target_long) raddr); tcg_out_movi(s, TCG_TYPE_PTR, ir, (uintptr_t)l->raddr);
tcg_out_b (s, LK, (tcg_target_long) ld_trampolines[s_bits]); tcg_out_b(s, LK, (uintptr_t)ld_trampolines[l->opc & 3]);
switch (opc) {
datalo = l->datalo_reg;
switch (l->opc) {
case 0|4: case 0|4:
tcg_out32 (s, EXTSB | RA (data_reg) | RS (3)); tcg_out32(s, EXTSB | RA(datalo) | RS(TCG_REG_R3));
break; break;
case 1|4: case 1|4:
tcg_out32 (s, EXTSH | RA (data_reg) | RS (3)); tcg_out32(s, EXTSH | RA(datalo) | RS(TCG_REG_R3));
break; break;
case 0: case 0:
case 1: case 1:
case 2: case 2:
if (data_reg != 3) tcg_out_mov(s, TCG_TYPE_I32, datalo, TCG_REG_R3);
tcg_out_mov (s, TCG_TYPE_I32, data_reg, 3);
break; break;
case 3: case 3:
if (data_reg == 3) { datahi = l->datahi_reg;
if (data_reg2 == 4) { if (datalo != TCG_REG_R3) {
tcg_out_mov (s, TCG_TYPE_I32, 0, 4); tcg_out_mov(s, TCG_TYPE_I32, datalo, TCG_REG_R4);
tcg_out_mov (s, TCG_TYPE_I32, 4, 3); tcg_out_mov(s, TCG_TYPE_I32, datahi, TCG_REG_R3);
tcg_out_mov (s, TCG_TYPE_I32, 3, 0); } else if (datahi != TCG_REG_R4) {
} tcg_out_mov(s, TCG_TYPE_I32, datahi, TCG_REG_R3);
else { tcg_out_mov(s, TCG_TYPE_I32, datalo, TCG_REG_R4);
tcg_out_mov (s, TCG_TYPE_I32, data_reg2, 3); } else {
tcg_out_mov (s, TCG_TYPE_I32, 3, 4); tcg_out_mov(s, TCG_TYPE_I32, TCG_REG_R0, TCG_REG_R4);
} tcg_out_mov(s, TCG_TYPE_I32, datahi, TCG_REG_R3);
} tcg_out_mov(s, TCG_TYPE_I32, datalo, TCG_REG_R0);
else {
if (data_reg != 4) tcg_out_mov (s, TCG_TYPE_I32, data_reg, 4);
if (data_reg2 != 3) tcg_out_mov (s, TCG_TYPE_I32, data_reg2, 3);
} }
break; break;
} }
/* Jump to the code corresponding to next IR of qemu_st */ tcg_out_b (s, 0, (uintptr_t)l->raddr);
tcg_out_b (s, 0, (tcg_target_long) raddr);
} }
static void tcg_out_qemu_st_slow_path (TCGContext *s, TCGLabelQemuLdst *label) static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l)
{ {
int ir; TCGReg ir, datalo;
int opc = label->opc;
int mem_index = label->mem_index;
int data_reg = label->datalo_reg;
int data_reg2 = label->datahi_reg;
int addr_reg = label->addrlo_reg;
uint8_t *raddr = label->raddr;
uint8_t **label_ptr = &label->label_ptr[0];
/* resolve label address */ reloc_pc14 (l->label_ptr[0], (tcg_target_long) s->code_ptr);
reloc_pc14 (label_ptr[0], (tcg_target_long) s->code_ptr);
/* slow path */ ir = TCG_REG_R4;
ir = 4; if (TARGET_LONG_BITS == 32) {
#if TARGET_LONG_BITS == 32 tcg_out_mov (s, TCG_TYPE_I32, ir++, l->addrlo_reg);
tcg_out_mov (s, TCG_TYPE_I32, ir++, addr_reg); } else {
#else
#ifdef TCG_TARGET_CALL_ALIGN_ARGS #ifdef TCG_TARGET_CALL_ALIGN_ARGS
ir |= 1; ir |= 1;
#endif
tcg_out_mov (s, TCG_TYPE_I32, ir++, label->addrhi_reg);
tcg_out_mov (s, TCG_TYPE_I32, ir++, addr_reg);
#endif #endif
tcg_out_mov (s, TCG_TYPE_I32, ir++, l->addrhi_reg);
tcg_out_mov (s, TCG_TYPE_I32, ir++, l->addrlo_reg);
}
switch (opc) { datalo = l->datalo_reg;
switch (l->opc) {
case 0: case 0:
tcg_out32 (s, (RLWINM tcg_out32(s, (RLWINM | RA (ir) | RS (datalo)
| RA (ir) | SH (0) | MB (24) | ME (31)));
| RS (data_reg)
| SH (0)
| MB (24)
| ME (31)));
break; break;
case 1: case 1:
tcg_out32 (s, (RLWINM tcg_out32(s, (RLWINM | RA (ir) | RS (datalo)
| RA (ir) | SH (0) | MB (16) | ME (31)));
| RS (data_reg)
| SH (0)
| MB (16)
| ME (31)));
break; break;
case 2: case 2:
tcg_out_mov (s, TCG_TYPE_I32, ir, data_reg); tcg_out_mov(s, TCG_TYPE_I32, ir, datalo);
break; break;
case 3: case 3:
#ifdef TCG_TARGET_CALL_ALIGN_ARGS #ifdef TCG_TARGET_CALL_ALIGN_ARGS
ir |= 1; ir |= 1;
#endif #endif
tcg_out_mov (s, TCG_TYPE_I32, ir++, data_reg2); tcg_out_mov(s, TCG_TYPE_I32, ir++, l->datahi_reg);
tcg_out_mov (s, TCG_TYPE_I32, ir, data_reg); tcg_out_mov(s, TCG_TYPE_I32, ir, datalo);
break; break;
} }
ir++; ir++;
tcg_out_movi (s, TCG_TYPE_I32, ir++, mem_index); tcg_out_movi(s, TCG_TYPE_I32, ir++, l->mem_index);
tcg_out_movi (s, TCG_TYPE_I32, ir, (tcg_target_long) raddr); tcg_out_movi(s, TCG_TYPE_PTR, ir, (uintptr_t)l->raddr);
tcg_out32 (s, MTSPR | RS (ir) | LR); tcg_out32(s, MTSPR | RS(ir) | LR);
tcg_out_b (s, 0, (tcg_target_long) st_trampolines[opc]); tcg_out_b(s, 0, (uintptr_t)st_trampolines[l->opc]);
} }
void tcg_out_tb_finalize(TCGContext *s) void tcg_out_tb_finalize(TCGContext *s)