Mesa (nv50-compiler): nv50: don' t produce MOV immediate to output reg in store opt

Christoph Bumiller chrisbmr at kemper.freedesktop.org
Sat Jul 24 19:20:19 UTC 2010


Module: Mesa
Branch: nv50-compiler
Commit: 1d1bb206122b719d6959eceddd511a0294816a9a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1d1bb206122b719d6959eceddd511a0294816a9a

Author: Christoph Bumiller <e0425955 at student.tuwien.ac.at>
Date:   Sat Jul 24 21:17:21 2010 +0200

nv50: don't produce MOV immediate to output reg in store opt

---

 src/gallium/drivers/nv50/nv50_pc_emit.c     |   12 ++++++------
 src/gallium/drivers/nv50/nv50_pc_optimize.c |   12 ++++++++----
 2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/nv50/nv50_pc_emit.c b/src/gallium/drivers/nv50/nv50_pc_emit.c
index b917d23..5130467 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 0811420..f81384f 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);




More information about the mesa-commit mailing list