i965: Pass in start_offset to brw_compact_instructions().
authorMatt Turner <mattst88@gmail.com>
Thu, 15 May 2014 23:56:13 +0000 (16:56 -0700)
committerMatt Turner <mattst88@gmail.com>
Sun, 25 May 2014 06:03:22 +0000 (23:03 -0700)
Let's us avoid recompacting the SIMD8 instructions when we compact the
SIMD16 program.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_blorp_clear.cpp
src/mesa/drivers/dri/i965/brw_clip.c
src/mesa/drivers/dri/i965/brw_eu.h
src/mesa/drivers/dri/i965/brw_eu_compact.c
src/mesa/drivers/dri/i965/brw_fs_generator.cpp
src/mesa/drivers/dri/i965/brw_gs.c
src/mesa/drivers/dri/i965/brw_sf.c
src/mesa/drivers/dri/i965/brw_vec4_generator.cpp

index 28c01c440bdc300e1bb19385e2d39c1ceff4b7ed..4b2c6672e0aad572d619700825648021700aca57 100644 (file)
@@ -490,7 +490,7 @@ brw_blorp_const_color_program::compile(struct brw_context *brw,
       fprintf(stderr, "\n");
    }
 
-   brw_compact_instructions(&func);
+   brw_compact_instructions(&func, 0);
    return brw_get_program(&func, program_size);
 }
 
index 11f0b6938f59179b8a40c37f2e842e15d267f8e3..57c49f0235d02764ac1740bc5d9a53bd429b2c4a 100644 (file)
@@ -110,7 +110,7 @@ static void compile_clip_prog( struct brw_context *brw,
       return;
    }
 
-   brw_compact_instructions(&c.func);
+   brw_compact_instructions(&c.func, 0);
 
    /* get the program
     */
index 51d5214ae89bf513e84948f764e4bdf92bc0b413..65008a0513b47672d039a38b4652b05f1a8b7057 100644 (file)
@@ -410,7 +410,7 @@ uint32_t brw_swap_cmod(uint32_t cmod);
 
 /* brw_eu_compact.c */
 void brw_init_compaction_tables(struct brw_context *brw);
-void brw_compact_instructions(struct brw_compile *p);
+void brw_compact_instructions(struct brw_compile *p, int start_offset);
 void brw_uncompact_instruction(struct brw_context *brw,
                               struct brw_instruction *dst,
                               struct brw_compact_instruction *src);
index c85bc89ea3d083ddba52c05e346e390cac0f61b6..c3a2ec31c748a805ef8356070fae577fbab38015 100644 (file)
@@ -661,18 +661,18 @@ brw_init_compaction_tables(struct brw_context *brw)
 }
 
 void
-brw_compact_instructions(struct brw_compile *p)
+brw_compact_instructions(struct brw_compile *p, int start_offset)
 {
    struct brw_context *brw = p->brw;
-   void *store = p->store;
+   void *store = p->store + start_offset / 16;
    /* For an instruction at byte offset 8*i before compaction, this is the number
     * of compacted instructions that preceded it.
     */
-   int compacted_counts[p->next_insn_offset / 8];
+   int compacted_counts[(p->next_insn_offset - start_offset) / 8];
    /* For an instruction at byte offset 8*i after compaction, this is the
     * 8-byte offset it was at before compaction.
     */
-   int old_ip[p->next_insn_offset / 8];
+   int old_ip[(p->next_insn_offset - start_offset) / 8];
 
    if (brw->gen < 6)
       return;
@@ -680,7 +680,7 @@ brw_compact_instructions(struct brw_compile *p)
    int src_offset;
    int offset = 0;
    int compacted_count = 0;
-   for (src_offset = 0; src_offset < p->nr_insn * 16;) {
+   for (src_offset = 0; src_offset < p->next_insn_offset - start_offset;) {
       struct brw_instruction *src = store + src_offset;
       void *dst = store + offset;
 
@@ -734,8 +734,8 @@ brw_compact_instructions(struct brw_compile *p)
    }
 
    /* Fix up control flow offsets. */
-   p->next_insn_offset = offset;
-   for (offset = 0; offset < p->next_insn_offset;) {
+   p->next_insn_offset = start_offset + offset;
+   for (offset = 0; offset < p->next_insn_offset - start_offset;) {
       struct brw_instruction *insn = store + offset;
       int this_old_ip = old_ip[offset / 8];
       int this_compacted_count = compacted_counts[this_old_ip];
@@ -786,10 +786,10 @@ brw_compact_instructions(struct brw_compile *p)
 
    if (0) {
       fprintf(stderr, "dumping compacted program\n");
-      brw_disassemble(brw, p->store, 0, p->next_insn_offset, stderr);
+      brw_disassemble(brw, store, 0, p->next_insn_offset - start_offset, stderr);
 
       int cmp = 0;
-      for (offset = 0; offset < p->next_insn_offset;) {
+      for (offset = 0; offset < p->next_insn_offset - start_offset;) {
          struct brw_instruction *insn = store + offset;
 
          if (insn->header.cmpt_control) {
index c61cc5cccad9d8cf4a3cfe9da12d3625af2d31f6..9518e728ab753b5dd82959f9a38e9f08e0f94c32 100644 (file)
@@ -1852,7 +1852,7 @@ fs_generator::generate_assembly(exec_list *simd8_instructions,
    if (simd8_instructions) {
       dispatch_width = 8;
       generate_code(simd8_instructions, dump_file);
-      brw_compact_instructions(p);
+      brw_compact_instructions(p, 0);
    }
 
    if (simd16_instructions) {
@@ -1868,7 +1868,7 @@ fs_generator::generate_assembly(exec_list *simd8_instructions,
 
       dispatch_width = 16;
       generate_code(simd16_instructions, dump_file);
-      brw_compact_instructions(p);
+      brw_compact_instructions(p, prog_data->prog_offset_16);
    }
 
    return brw_get_program(p, assembly_size);
index ec1e14a3594e9772ad15224b9330b612c1863a5e..18b09560c2c55481bae1656b2fa7380b0b7912e7 100644 (file)
@@ -128,7 +128,7 @@ static void compile_ff_gs_prog(struct brw_context *brw,
       }
    }
 
-   brw_compact_instructions(&c.func);
+   brw_compact_instructions(&c.func, 0);
 
    /* get the program
     */
index 152d258cc2f072a517bf2cc646c6e1c18e925331..e11de264f2eebf2a8a4ef16ad2f1547419677342 100644 (file)
@@ -109,7 +109,7 @@ static void compile_sf_prog( struct brw_context *brw,
       return;
    }
 
-   brw_compact_instructions(&c.func);
+   brw_compact_instructions(&c.func, 0);
 
    /* get the program
     */
index 4e0fe52ae2c67bf14cc4f40065fb7c217191a915..e4bc6823ec9fe81cc7a58db4610a5a5c267992bb 100644 (file)
@@ -1363,7 +1363,7 @@ vec4_generator::generate_assembly(exec_list *instructions,
 {
    brw_set_access_mode(p, BRW_ALIGN_16);
    generate_code(instructions);
-   brw_compact_instructions(p);
+   brw_compact_instructions(p, 0);
    return brw_get_program(p, assembly_size);
 }