i965: Fix dump_prog_cache to handle compacted instructions.
[mesa.git] / src / mesa / drivers / dri / i965 / gen8_generator.cpp
index ca38af61072abd32cdcbb5f7438d8113c5bf4bcc..774df183ff53cb2d84ef5736818e2a26d2fd41ea 100644 (file)
@@ -87,6 +87,7 @@ gen8_generator::next_inst(unsigned opcode)
    gen8_set_exec_size(inst, default_state.exec_size);
    gen8_set_access_mode(inst, default_state.access_mode);
    gen8_set_mask_control(inst, default_state.mask_control);
+   gen8_set_qtr_control(inst, default_state.qtr_control);
    gen8_set_cond_modifier(inst, default_state.conditional_mod);
    gen8_set_pred_control(inst, default_state.predicate);
    gen8_set_pred_inv(inst, default_state.predicate_inverse);
@@ -421,6 +422,7 @@ gen8_generator::IF(unsigned predicate)
 {
    gen8_instruction *inst = next_inst(BRW_OPCODE_IF);
    gen8_set_dst(brw, inst, vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_D)));
+   gen8_set_src0(brw, inst, brw_imm_d(0));
    gen8_set_exec_size(inst, default_state.exec_size);
    gen8_set_pred_control(inst, predicate);
    gen8_set_mask_control(inst, BRW_MASK_ENABLE);
@@ -434,6 +436,7 @@ gen8_generator::ELSE()
 {
    gen8_instruction *inst = next_inst(BRW_OPCODE_ELSE);
    gen8_set_dst(brw, inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
+   gen8_set_src0(brw, inst, brw_imm_d(0));
    gen8_set_mask_control(inst, BRW_MASK_ENABLE);
    push_if_stack(inst);
    return inst;
@@ -455,6 +458,7 @@ gen8_generator::ENDIF()
 
    gen8_instruction *endif_inst = next_inst(BRW_OPCODE_ENDIF);
    gen8_set_mask_control(endif_inst, BRW_MASK_ENABLE);
+   gen8_set_src0(brw, endif_inst, brw_imm_d(0));
    patch_IF_ELSE(if_inst, else_inst, endif_inst);
 
    return endif_inst;
@@ -576,8 +580,7 @@ gen8_generator::BREAK()
 {
    gen8_instruction *inst = next_inst(BRW_OPCODE_BREAK);
    gen8_set_dst(brw, inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
-   gen8_set_src0(brw, inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
-   gen8_set_src1(brw, inst, brw_imm_d(0));
+   gen8_set_src0(brw, inst, brw_imm_d(0));
    gen8_set_exec_size(inst, default_state.exec_size);
    return inst;
 }
@@ -587,8 +590,7 @@ gen8_generator::CONTINUE()
 {
    gen8_instruction *inst = next_inst(BRW_OPCODE_CONTINUE);
    gen8_set_dst(brw, inst, brw_ip_reg());
-   gen8_set_src0(brw, inst, brw_ip_reg());
-   gen8_set_src1(brw, inst, brw_imm_d(0));
+   gen8_set_src0(brw, inst, brw_imm_d(0));
    gen8_set_exec_size(inst, default_state.exec_size);
    return inst;
 }
@@ -600,8 +602,7 @@ gen8_generator::WHILE()
    gen8_instruction *while_inst = next_inst(BRW_OPCODE_WHILE);
 
    gen8_set_dst(brw, while_inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
-   gen8_set_src0(brw, while_inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
-   gen8_set_src1(brw, while_inst, brw_imm_ud(0));
+   gen8_set_src0(brw, while_inst, brw_imm_d(0));
    gen8_set_jip(while_inst, 16 * (do_inst - while_inst));
    gen8_set_exec_size(while_inst, default_state.exec_size);
 
@@ -613,29 +614,30 @@ gen8_generator::HALT()
 {
    gen8_instruction *inst = next_inst(BRW_OPCODE_HALT);
    gen8_set_dst(brw, inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
-   gen8_set_src0(brw, inst, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
+   gen8_set_src0(brw, inst, brw_imm_d(0));
    gen8_set_exec_size(inst, default_state.exec_size);
    gen8_set_mask_control(inst, BRW_MASK_DISABLE);
    return inst;
 }
 
-void
-gen8_generator::disassemble(FILE *out, int start, int end)
+extern "C" void
+gen8_dump_compile(struct brw_context *brw, void *assembly,
+                  int start,int end, FILE *out)
 {
    bool dump_hex = false;
 
    for (int offset = start; offset < end; offset += 16) {
-      gen8_instruction *inst = &store[offset / 16];
-      printf("0x%08x: ", offset);
+      gen8_instruction *inst = &((gen8_instruction *)assembly)[offset / 16];
+      fprintf(stderr, "0x%08x: ", offset);
 
       if (dump_hex) {
-         printf("0x%08x 0x%08x 0x%08x 0x%08x ",
-                ((uint32_t *) inst)[3],
-                ((uint32_t *) inst)[2],
-                ((uint32_t *) inst)[1],
-                ((uint32_t *) inst)[0]);
+         fprintf(stderr, "0x%08x 0x%08x 0x%08x 0x%08x ",
+                 ((uint32_t *) inst)[3],
+                 ((uint32_t *) inst)[2],
+                 ((uint32_t *) inst)[1],
+                 ((uint32_t *) inst)[0]);
       }
 
-      gen8_disassemble(stdout, inst, brw->gen);
+      gen8_disassemble(stderr, inst, brw->gen);
    }
 }