ilo: fix JIP/UIP on Gen8
authorChia-I Wu <olvaffe@gmail.com>
Fri, 13 Feb 2015 22:28:12 +0000 (06:28 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Fri, 13 Feb 2015 22:52:36 +0000 (06:52 +0800)
UIP is in DW2 and JIP is in DW3 on Gen8.  Also, the units are in bytes.

src/gallium/drivers/ilo/shader/toy_compiler_asm.c
src/gallium/drivers/ilo/shader/toy_legalize.c

index 0977d60c2c42765a492423302eb4bd222016198d..1f465a3b13b3a12bc5d31138edfddfc94e593e8e 100644 (file)
@@ -444,8 +444,12 @@ translate_src_gen6(const struct codegen *cg, int idx)
    /* special treatment may be needed if any of the operand is immediate */
    if (cg->src[0].file == GEN6_FILE_IMM) {
       assert(!cg->src[0].absolute && !cg->src[0].negate);
-      /* only the last src operand can be an immediate */
-      assert(src_is_null(cg, 1));
+
+      /* only the last src operand can be an immediate unless it is Gen8+ */
+      assert(ilo_dev_gen(cg->dev) >= ILO_GEN(8) || src_is_null(cg, 1));
+
+      if (!src_is_null(cg, 1))
+         return cg->src[idx].origin;
 
       if (idx == 0) {
          if (ilo_dev_gen(cg->dev) >= ILO_GEN(8)) {
index f1bacbdc1b18d24e0be8d031fccd36b48ce31754..4e573caadf42b1d99a75b6ef317bfc6161a6dd31 100644 (file)
@@ -335,7 +335,9 @@ patch_while_jip(struct toy_compiler *tc, struct toy_inst *inst)
       dist--;
    }
 
-   if (ilo_dev_gen(tc->dev) >= ILO_GEN(7))
+   if (ilo_dev_gen(tc->dev) >= ILO_GEN(8))
+      inst->src[1] = tsrc_imm_d(dist * 16);
+   else if (ilo_dev_gen(tc->dev) >= ILO_GEN(7))
       inst->src[1] = tsrc_imm_w(dist * 2);
    else
       inst->dst = tdst_imm_w(dist * 2);
@@ -388,13 +390,16 @@ patch_if_else_jip(struct toy_compiler *tc, struct toy_inst *inst)
       dist++;
    }
 
-   if (ilo_dev_gen(tc->dev) >= ILO_GEN(7)) {
+   if (ilo_dev_gen(tc->dev) >= ILO_GEN(8)) {
+      inst->dst.type = TOY_TYPE_D;
+      inst->src[0] = tsrc_imm_d(uip * 8);
+      inst->src[1] = tsrc_imm_d(jip * 8);
+   } else if (ilo_dev_gen(tc->dev) >= ILO_GEN(7)) {
       /* what should the type be? */
       inst->dst.type = TOY_TYPE_D;
       inst->src[0].type = TOY_TYPE_D;
       inst->src[1] = tsrc_imm_d(uip << 16 | jip);
-   }
-   else {
+   } else {
       inst->dst = tdst_imm_w(jip);
    }
 }
@@ -431,7 +436,9 @@ patch_endif_jip(struct toy_compiler *tc, struct toy_inst *inst)
    if (!found)
       dist = 1;
 
-   if (ilo_dev_gen(tc->dev) >= ILO_GEN(7))
+   if (ilo_dev_gen(tc->dev) >= ILO_GEN(8))
+      inst->src[1] = tsrc_imm_d(dist * 16);
+   else if (ilo_dev_gen(tc->dev) >= ILO_GEN(7))
       inst->src[1] = tsrc_imm_w(dist * 2);
    else
       inst->dst = tdst_imm_w(dist * 2);
@@ -495,8 +502,13 @@ patch_break_continue_jip(struct toy_compiler *tc, struct toy_inst *inst)
 
    /* should the type be D or W? */
    inst->dst.type = TOY_TYPE_D;
-   inst->src[0].type = TOY_TYPE_D;
-   inst->src[1] = tsrc_imm_d(uip << 16 | jip);
+   if (ilo_dev_gen(tc->dev) >= ILO_GEN(8)) {
+      inst->src[0] = tsrc_imm_d(uip * 8);
+      inst->src[1] = tsrc_imm_d(jip * 8);
+   } else {
+      inst->src[0].type = TOY_TYPE_D;
+      inst->src[1] = tsrc_imm_d(uip << 16 | jip);
+   }
 }
 
 /**