From: Christoph Bumiller Date: Sat, 24 Jul 2010 19:17:21 +0000 (+0200) Subject: nv50: don't produce MOV immediate to output reg in store opt X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=commitdiff_plain;h=1d1bb206122b719d6959eceddd511a0294816a9a nv50: don't produce MOV immediate to output reg in store opt --- diff --git a/src/gallium/drivers/nv50/nv50_pc_emit.c b/src/gallium/drivers/nv50/nv50_pc_emit.c index b917d232320..51304670a1e 100644 --- a/src/gallium/drivers/nv50/nv50_pc_emit.c +++ b/src/gallium/drivers/nv50/nv50_pc_emit.c @@ -539,26 +539,26 @@ emit_mov(struct nv_pc *pc, struct nv_instruction *i) pc->emit[1] |= DREG(i->def[0])->id << 4; } else if (SFILE(i, 0) == NV_FILE_IMM) { - if (i->opcode == NV_OP_LDA) + if (i->opcode == NV_OP_LDA) { emit_ld(pc, i); - else { + } else { pc->emit[0] = 0x10008001; pc->emit[1] = 0x00000003; - emit_form_IMM(pc, i, 0); + emit_form_IMM(pc, i, 0); } } else { pc->emit[0] = 0x10000000; pc->emit[0] |= DREG(i->def[0])->id << 2; pc->emit[0] |= SREG(i->src[0])->id << 9; - if (!i->is_long) + if (!i->is_long) { pc->emit[0] |= 0x8000; - else { + } else { pc->emit[0] |= 0x00000001; pc->emit[1] = 0x0403c000; - set_pred(pc, i); + set_pred(pc, i); } } diff --git a/src/gallium/drivers/nv50/nv50_pc_optimize.c b/src/gallium/drivers/nv50/nv50_pc_optimize.c index 0811420e425..f81384f00db 100644 --- a/src/gallium/drivers/nv50/nv50_pc_optimize.c +++ b/src/gallium/drivers/nv50/nv50_pc_optimize.c @@ -266,11 +266,10 @@ nv_pass_fold_stores(struct nv_pass *ctx, struct nv_basic_block *b) int j; for (sti = b->entry; sti; sti = sti->next) { - if (!sti->def[0]) + if (!sti->def[0] || sti->def[0]->reg.file != NV_FILE_OUT) continue; - if (sti->def[0]->reg.file != NV_FILE_OUT) - continue; + /* only handling MOV to $oX here */ if (sti->opcode != NV_OP_MOV && sti->opcode != NV_OP_STA) continue; @@ -282,8 +281,13 @@ nv_pass_fold_stores(struct nv_pass *ctx, struct nv_basic_block *b) if (nvi->def[0]->refc > 1) continue; + /* cannot MOV immediate to $oX */ + if (nvi->src[0]->value->reg.file == NV_FILE_IMM) + continue; + nvi->def[0] = sti->def[0]; - nvi->fixed = 1; + sti->def[0] = NULL; + nvi->fixed = sti->fixed; sti->fixed = 0; } DESCEND_ARBITRARY(j, nv_pass_fold_stores);