[Mesa-dev] [PATCH 20/23] i965/fs: Loop over instruction lists and generate code.

Matt Turner mattst88 at gmail.com
Mon May 19 11:55:46 PDT 2014


Small code reduction. Will let us move the program header code into a
common place in generate_assembly().
---
 src/mesa/drivers/dri/i965/brw_fs_generator.cpp  | 56 ++++++++++---------------
 src/mesa/drivers/dri/i965/gen8_fs_generator.cpp | 46 +++++++++-----------
 2 files changed, 42 insertions(+), 60 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
index 914fb29..bae39c1 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
@@ -1825,45 +1825,35 @@ fs_generator::generate_assembly(exec_list *simd8_instructions,
    assert(simd8_instructions || simd16_instructions);
 
    const struct gl_program *prog = fp ? &fp->Base : NULL;
+   exec_list *instructions[] = { simd8_instructions, simd16_instructions };
 
-   if (simd8_instructions) {
-      struct annotation *annotation;
-      int num_annotations;
+   for (unsigned i = 0; i < ARRAY_SIZE(instructions); i++) {
+      if (instructions[i]) {
+         if (i == 1) {
+            /* align to 64 byte boundary. */
+            while (p->next_insn_offset % 64) {
+               brw_NOP(p);
+            }
 
-      dispatch_width = 8;
-      generate_code(simd8_instructions, &num_annotations, &annotation);
-      brw_compact_instructions(p, 0, num_annotations, annotation);
+            /* Save off the start of this SIMD16 program */
+            prog_data->prog_offset_16 = p->next_insn_offset;
 
-      if (unlikely(debug_flag)) {
-         dump_assembly(p->store, num_annotations, annotation, brw, prog,
-                       brw_disassemble);
-         ralloc_free(annotation);
-      }
-   }
-
-   if (simd16_instructions) {
-      /* align to 64 byte boundary. */
-      while (p->next_insn_offset % 64) {
-         brw_NOP(p);
-      }
-
-      /* Save off the start of this SIMD16 program */
-      prog_data->prog_offset_16 = p->next_insn_offset;
-
-      brw_set_compression_control(p, BRW_COMPRESSION_COMPRESSED);
+            brw_set_compression_control(p, BRW_COMPRESSION_COMPRESSED);
+         }
 
-      struct annotation *annotation;
-      int num_annotations;
+         struct annotation *annotation;
+         int num_annotations;
 
-      dispatch_width = 16;
-      generate_code(simd16_instructions, &num_annotations, &annotation);
-      brw_compact_instructions(p, prog_data->prog_offset_16,
-                               num_annotations, annotation);
+         dispatch_width = (i + 1) * 8;
+         generate_code(instructions[i], &num_annotations, &annotation);
+         brw_compact_instructions(p, prog_data->prog_offset_16,
+                                  num_annotations, annotation);
 
-      if (unlikely(debug_flag)) {
-         dump_assembly(p->store, num_annotations, annotation, brw, prog,
-                       brw_disassemble);
-         ralloc_free(annotation);
+         if (unlikely(debug_flag)) {
+            dump_assembly(p->store, num_annotations, annotation, brw, prog,
+                          brw_disassemble);
+            ralloc_free(annotation);
+         }
       }
    }
 
diff --git a/src/mesa/drivers/dri/i965/gen8_fs_generator.cpp b/src/mesa/drivers/dri/i965/gen8_fs_generator.cpp
index 272f668..f498cd5 100644
--- a/src/mesa/drivers/dri/i965/gen8_fs_generator.cpp
+++ b/src/mesa/drivers/dri/i965/gen8_fs_generator.cpp
@@ -1314,38 +1314,30 @@ gen8_fs_generator::generate_assembly(exec_list *simd8_instructions,
 {
    assert(simd8_instructions || simd16_instructions);
 
-   if (simd8_instructions) {
-      struct annotation *annotation;
-      int num_annotations;
+   exec_list *instructions[] = { simd8_instructions, simd16_instructions };
 
-      dispatch_width = 8;
-      generate_code(simd8_instructions, &num_annotations, &annotation);
+   for (unsigned i = 0; i < ARRAY_SIZE(instructions); i++) {
+      if (instructions[i]) {
+         if (i == 1) {
+            /* Align to a 64-byte boundary. */
+            while (next_inst_offset % 64)
+               NOP();
 
-      if (unlikely(INTEL_DEBUG & DEBUG_WM)) {
-         dump_assembly(store, num_annotations, annotation, brw, prog,
-                       gen8_disassemble);
-         ralloc_free(annotation);
-      }
-   }
-
-   if (simd16_instructions) {
-      /* Align to a 64-byte boundary. */
-      while (next_inst_offset % 64)
-         NOP();
-
-      /* Save off the start of this SIMD16 program */
-      prog_data->prog_offset_16 = next_inst_offset;
+            /* Save off the start of this SIMD16 program */
+            prog_data->prog_offset_16 = next_inst_offset;
+         }
 
-      struct annotation *annotation;
-      int num_annotations;
+         struct annotation *annotation;
+         int num_annotations;
 
-      dispatch_width = 16;
-      generate_code(simd16_instructions, &num_annotations, &annotation);
+         dispatch_width = (i + 1) * 8;
+         generate_code(instructions[i], &num_annotations, &annotation);
 
-      if (unlikely(INTEL_DEBUG & DEBUG_WM)) {
-         dump_assembly(store, num_annotations, annotation, brw, prog,
-                       gen8_disassemble);
-         ralloc_free(annotation);
+         if (unlikely(INTEL_DEBUG & DEBUG_WM)) {
+            dump_assembly(store, num_annotations, annotation, brw, prog,
+                          gen8_disassemble);
+            ralloc_free(annotation);
+         }
       }
    }
 
-- 
1.8.3.2



More information about the mesa-dev mailing list