Add second_reloc_target in the data structure.
authorHomer Hsing <homer.xing@intel.com>
Fri, 21 Sep 2012 00:39:57 +0000 (08:39 +0800)
committerDamien Lespiau <damien.lespiau@intel.com>
Mon, 4 Mar 2013 15:54:33 +0000 (15:54 +0000)
Since Gen6+, some branching instructions have two relocation targets.

assembler/src/brw_structs.h
assembler/src/gram.y
assembler/src/main.c

index b60f8b7..c01c032 100644 (file)
@@ -1559,7 +1559,9 @@ struct brw_instruction
       GLint id;
       GLfloat fd;
    } bits3;
-   char *reloc_target;
+
+   char *first_reloc_target, *second_reloc_target; // first for JIP, second for UIP
+   GLint first_reloc_offset, second_reloc_offset; // in number of instructions
 };
 
 
index 01a3c0b..3a85b75 100644 (file)
@@ -845,7 +845,7 @@ jumpinstruction: predicate JMPI execsize relativelocation2
                    set_direct_src_operand(&ip_src, &dst, BRW_REGISTER_TYPE_UD);
                    set_instruction_src0(&$$, &ip_src);
                    set_instruction_src1(&$$, &imm);
-                   $$.reloc_target = $4;
+                   $$.first_reloc_target = $4;
                }
 ;
 
@@ -902,7 +902,7 @@ branchloopinstruction:
                  set_direct_src_operand(&ip_src, &dst, BRW_REGISTER_TYPE_UD);
                  set_instruction_src0(&$$, &ip_src);
                  set_instruction_src1(&$$, &imm);
-                 $$.reloc_target = $4;
+                 $$.first_reloc_target = $4;
                }
 ;
 
@@ -962,7 +962,7 @@ elseinstruction: ELSE execsize relativelocation
                  set_direct_src_operand(&ip_src, &dst, BRW_REGISTER_TYPE_UD);
                  set_instruction_src0(&$$, &ip_src);
                  set_instruction_src1(&$$, &imm);
-                 $$.reloc_target = $3;
+                 $$.first_reloc_target = $3;
                }
 ;
 
index f534112..cd54ff3 100644 (file)
@@ -340,13 +340,13 @@ int main(int argc, char **argv)
        for (entry = compiled_program.first;
                entry != NULL; entry = entry->next) {
            if (!entry->islabel) {
-               if (entry->instruction.reloc_target) {
+               if (entry->instruction.first_reloc_target) {
                        entry1 = entry;
                        int found = 0;
                        do {
                        if (entry1->islabel && 
                                strcmp(entry1->string, 
-                                   entry->instruction.reloc_target) == 0) {
+                                   entry->instruction.first_reloc_target) == 0) {
                            int offset = 
                                entry1->inst_offset - entry->inst_offset;
                            int delta = (entry->instruction.header.opcode == BRW_OPCODE_JMPI ? 1 : 0);
@@ -366,7 +366,7 @@ int main(int argc, char **argv)
                        } while (entry1 != entry);
                    if (found == 0)
                        fprintf(stderr, "can not find label %s\n",
-                               entry->instruction.reloc_target);
+                               entry->instruction.first_reloc_target);
                }
            }
        }