diff options
author | Brian Paul <[email protected]> | 2009-01-05 19:50:54 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2009-01-05 19:51:17 -0700 |
commit | b7257890dc8870d5fdce9d41a22fc89aac5add78 (patch) | |
tree | 5814fb0d9d77e830010f56bf39dbba374790120d /src/gallium/drivers/cell/ppu/cell_gen_fp.c | |
parent | cd5d3fde13e424373feac9098453ed0ca7f6e4eb (diff) |
cell: fix code emit for RSQ/RCP when src arg == dst arg
Fixes moire-like artifacts seen in fslight demo.
Diffstat (limited to 'src/gallium/drivers/cell/ppu/cell_gen_fp.c')
-rw-r--r-- | src/gallium/drivers/cell/ppu/cell_gen_fp.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/gallium/drivers/cell/ppu/cell_gen_fp.c b/src/gallium/drivers/cell/ppu/cell_gen_fp.c index b503bf56af6..8f3deb482e6 100644 --- a/src/gallium/drivers/cell/ppu/cell_gen_fp.c +++ b/src/gallium/drivers/cell/ppu/cell_gen_fp.c @@ -728,7 +728,7 @@ emit_LERP(struct codegen *gen, const struct tgsi_full_instruction *inst) static boolean emit_RCP_RSQ(struct codegen *gen, const struct tgsi_full_instruction *inst) { - int ch, s1_reg[4], d_reg[4]; + int ch, s1_reg[4], d_reg[4], tmp_reg[4]; if (inst->Instruction.Opcode == TGSI_OPCODE_RCP) { spe_comment(gen->f, -4, "RCP:"); @@ -741,21 +741,23 @@ emit_RCP_RSQ(struct codegen *gen, const struct tgsi_full_instruction *inst) FOR_EACH_ENABLED_CHANNEL(inst, ch) { s1_reg[ch] = get_src_reg(gen, ch, &inst->FullSrcRegisters[0]); d_reg[ch] = get_dst_reg(gen, ch, &inst->FullDstRegisters[0]); + tmp_reg[ch] = get_itemp(gen); } FOR_EACH_ENABLED_CHANNEL(inst, ch) { if (inst->Instruction.Opcode == TGSI_OPCODE_RCP) { - /* d = 1/s1 */ - spe_frest(gen->f, d_reg[ch], s1_reg[ch]); + /* tmp = 1/s1 */ + spe_frest(gen->f, tmp_reg[ch], s1_reg[ch]); } else { - /* d = 1/sqrt(s1) */ - spe_frsqest(gen->f, d_reg[ch], s1_reg[ch]); + /* tmp = 1/sqrt(s1) */ + spe_frsqest(gen->f, tmp_reg[ch], s1_reg[ch]); } } FOR_EACH_ENABLED_CHANNEL(inst, ch) { - spe_fi(gen->f, d_reg[ch], s1_reg[ch], d_reg[ch]); + /* d = float_interp(s1, tmp) */ + spe_fi(gen->f, d_reg[ch], s1_reg[ch], tmp_reg[ch]); } FOR_EACH_ENABLED_CHANNEL(inst, ch) { |