i965/fs: Add some minimal backend-IR dumping.
authorEric Anholt <eric@anholt.net>
Tue, 30 Oct 2012 22:35:44 +0000 (15:35 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 28 Nov 2012 19:26:33 +0000 (11:26 -0800)
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_fs.h

index f19f2752e7ae8650a67e507eacae1f5d8601209c..cc5a790dc9cf1c48237c8c1559e537295bc0c728 100644 (file)
@@ -1935,6 +1935,95 @@ fs_visitor::remove_duplicate_mrf_writes()
    return progress;
 }
 
+void
+fs_visitor::dump_instruction(fs_inst *inst)
+{
+   if (inst->opcode < ARRAY_SIZE(opcode_descs) &&
+       opcode_descs[inst->opcode].name) {
+      printf("%s", opcode_descs[inst->opcode].name);
+   } else {
+      printf("op%d", inst->opcode);
+   }
+   if (inst->saturate)
+      printf(".sat");
+   printf(" ");
+
+   switch (inst->dst.file) {
+   case GRF:
+      printf("vgrf%d", inst->dst.reg);
+      if (inst->dst.reg_offset)
+         printf("+%d", inst->dst.reg_offset);
+      break;
+   case MRF:
+      printf("m%d", inst->dst.reg);
+      break;
+   case BAD_FILE:
+      printf("(null)");
+      break;
+   case UNIFORM:
+      printf("***u%d***", inst->dst.reg);
+      break;
+   default:
+      printf("???");
+      break;
+   }
+   printf(", ");
+
+   for (int i = 0; i < 3; i++) {
+      if (inst->src[i].negate)
+         printf("-");
+      if (inst->src[i].abs)
+         printf("|");
+      switch (inst->src[i].file) {
+      case GRF:
+         printf("vgrf%d", inst->src[i].reg);
+         if (inst->src[i].reg_offset)
+            printf("+%d", inst->src[i].reg_offset);
+         break;
+      case MRF:
+         printf("***m%d***", inst->src[i].reg);
+         break;
+      case UNIFORM:
+         printf("u%d", inst->src[i].reg);
+         if (inst->src[i].reg_offset)
+            printf(".%d", inst->src[i].reg_offset);
+         break;
+      case BAD_FILE:
+         printf("(null)");
+         break;
+      default:
+         printf("???");
+         break;
+      }
+      if (inst->src[i].abs)
+         printf("|");
+
+      if (i < 3)
+         printf(", ");
+   }
+
+   printf(" ");
+
+   if (inst->force_uncompressed)
+      printf("1sthalf ");
+
+   if (inst->force_sechalf)
+      printf("2ndhalf ");
+
+   printf("\n");
+}
+
+void
+fs_visitor::dump_instructions()
+{
+   int ip = 0;
+   foreach_list(node, &this->instructions) {
+      fs_inst *inst = (fs_inst *)node;
+      printf("%d: ", ip++);
+      dump_instruction(inst);
+   }
+}
+
 /**
  * Possibly returns an instruction that set up @param reg.
  *
index 489b9700523adcbc911955176e0c74973f1ea70c..a0ed743486bfc4f6751659dd390a47202138d61f 100644 (file)
@@ -365,6 +365,9 @@ public:
    void setup_builtin_uniform_values(ir_variable *ir);
    int implied_mrf_writes(fs_inst *inst);
 
+   void dump_instructions();
+   void dump_instruction(fs_inst *inst);
+
    const struct gl_fragment_program *fp;
    struct brw_wm_compile *c;