aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/cell/ppu/cell_gen_fp.c
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2009-01-05 19:50:54 -0700
committerBrian Paul <[email protected]>2009-01-05 19:51:17 -0700
commitb7257890dc8870d5fdce9d41a22fc89aac5add78 (patch)
tree5814fb0d9d77e830010f56bf39dbba374790120d /src/gallium/drivers/cell/ppu/cell_gen_fp.c
parentcd5d3fde13e424373feac9098453ed0ca7f6e4eb (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.c14
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) {