anv: add no reloc flags on empty and simple bo paths.
[mesa.git] / src / intel / compiler / test_eu_compact.cpp
index 1ef7e5ae7f1966e4fd4ed9ac7a9e70998ef52221..bf87ff844b46d9bedc03e990826910d6f8cedd60 100644 (file)
@@ -26,6 +26,7 @@
 #include <stdbool.h>
 #include "util/ralloc.h"
 #include "brw_eu.h"
+#include "brw_gen_enum.h"
 
 static bool
 test_compact_instruction(struct brw_codegen *p, brw_inst src)
@@ -68,12 +69,17 @@ clear_pad_bits(const struct gen_device_info *devinfo, brw_inst *inst)
 {
    if (brw_inst_opcode(devinfo, inst) != BRW_OPCODE_SEND &&
        brw_inst_opcode(devinfo, inst) != BRW_OPCODE_SENDC &&
-       brw_inst_opcode(devinfo, inst) != BRW_OPCODE_BREAK &&
-       brw_inst_opcode(devinfo, inst) != BRW_OPCODE_CONTINUE &&
        brw_inst_src0_reg_file(devinfo, inst) != BRW_IMMEDIATE_VALUE &&
        brw_inst_src1_reg_file(devinfo, inst) != BRW_IMMEDIATE_VALUE) {
       brw_inst_set_bits(inst, 127, 111, 0);
    }
+
+   if (devinfo->gen == 8 && !devinfo->is_cherryview &&
+       is_3src(devinfo, brw_inst_opcode(devinfo, inst))) {
+      brw_inst_set_bits(inst, 105, 105, 0);
+      brw_inst_set_bits(inst, 84, 84, 0);
+      brw_inst_set_bits(inst, 36, 35, 0);
+   }
 }
 
 static bool
@@ -87,19 +93,45 @@ skip_bit(const struct gen_device_info *devinfo, brw_inst *src, int bit)
    if (bit == 29)
       return true;
 
-   /* pad bit */
-   if (bit == 47)
-      return true;
+   if (is_3src(devinfo, brw_inst_opcode(devinfo, src))) {
+      if (devinfo->gen >= 9 || devinfo->is_cherryview) {
+         if (bit == 127)
+            return true;
+      } else {
+         if (bit >= 126 && bit <= 127)
+            return true;
 
-   /* pad bits */
-   if (bit >= 90 && bit <= 95)
-      return true;
+         if (bit == 105)
+            return true;
+
+         if (bit == 84)
+            return true;
+
+         if (bit >= 35 && bit <= 36)
+            return true;
+      }
+   } else {
+      if (bit == 47)
+         return true;
+
+      if (devinfo->gen >= 8) {
+         if (bit == 11)
+            return true;
+
+         if (bit == 95)
+            return true;
+      } else {
+         if (devinfo->gen < 7 && bit == 90)
+            return true;
+
+         if (bit >= 91 && bit <= 95)
+            return true;
+      }
+   }
 
    /* sometimes these are pad bits. */
    if (brw_inst_opcode(devinfo, src) != BRW_OPCODE_SEND &&
        brw_inst_opcode(devinfo, src) != BRW_OPCODE_SENDC &&
-       brw_inst_opcode(devinfo, src) != BRW_OPCODE_BREAK &&
-       brw_inst_opcode(devinfo, src) != BRW_OPCODE_CONTINUE &&
        brw_inst_src0_reg_file(devinfo, src) != BRW_IMMEDIATE_VALUE &&
        brw_inst_src1_reg_file(devinfo, src) != BRW_IMMEDIATE_VALUE &&
        bit >= 121) {
@@ -118,16 +150,19 @@ test_fuzz_compact_instruction(struct brw_codegen *p, brw_inst src)
 
       for (int bit1 = 0; bit1 < 128; bit1++) {
          brw_inst instr = src;
-        uint32_t *bits = (uint32_t *)&instr;
+        uint64_t *bits = instr.data;
 
          if (skip_bit(p->devinfo, &src, bit1))
            continue;
 
-        bits[bit0 / 32] ^= (1 << (bit0 & 31));
-        bits[bit1 / 32] ^= (1 << (bit1 & 31));
+        bits[bit0 / 64] ^= (1ull << (bit0 & 63));
+        bits[bit1 / 64] ^= (1ull << (bit1 & 63));
 
          clear_pad_bits(p->devinfo, &instr);
 
+         if (!brw_validate_instruction(p->devinfo, &instr, 0, NULL))
+            continue;
+
         if (!test_compact_instruction(p, instr)) {
            printf("  twiddled bits for fuzzing %d, %d\n", bit0, bit1);
            return false;
@@ -212,7 +247,7 @@ gen_f0_0_MOV_GRF_GRF(struct brw_codegen *p)
    struct brw_reg g2 = brw_vec8_grf(2, 0);
 
    brw_push_insn_state(p);
-   brw_set_default_predicate_control(p, true);
+   brw_set_default_predicate_control(p, BRW_PREDICATE_NORMAL);
    brw_MOV(p, g0, g2);
    brw_pop_insn_state(p);
 }
@@ -228,7 +263,7 @@ gen_f0_1_MOV_GRF_GRF(struct brw_codegen *p)
    struct brw_reg g2 = brw_vec8_grf(2, 0);
 
    brw_push_insn_state(p);
-   brw_set_default_predicate_control(p, true);
+   brw_set_default_predicate_control(p, BRW_PREDICATE_NORMAL);
    brw_inst *mov = brw_MOV(p, g0, g2);
    brw_inst_set_flag_subreg_nr(p->devinfo, mov, 1);
    brw_pop_insn_state(p);
@@ -236,16 +271,17 @@ gen_f0_1_MOV_GRF_GRF(struct brw_codegen *p)
 
 struct {
    void (*func)(struct brw_codegen *p);
+   int gens;
 } tests[] = {
-   { gen_MOV_GRF_GRF },
-   { gen_ADD_GRF_GRF_GRF },
-   { gen_ADD_GRF_GRF_IMM },
-   { gen_ADD_GRF_GRF_IMM_d },
-   { gen_ADD_MRF_GRF_GRF },
-   { gen_ADD_vec1_GRF_GRF_GRF },
-   { gen_PLN_MRF_GRF_GRF },
-   { gen_f0_0_MOV_GRF_GRF },
-   { gen_f0_1_MOV_GRF_GRF },
+   { gen_MOV_GRF_GRF,          GEN_ALL      },
+   { gen_ADD_GRF_GRF_GRF,      GEN_ALL      },
+   { gen_ADD_GRF_GRF_IMM,      GEN_ALL      },
+   { gen_ADD_GRF_GRF_IMM_d,    GEN_ALL      },
+   { gen_ADD_MRF_GRF_GRF,      GEN_LE(GEN6) },
+   { gen_ADD_vec1_GRF_GRF_GRF, GEN_ALL      },
+   { gen_PLN_MRF_GRF_GRF,      GEN_LE(GEN6) },
+   { gen_f0_0_MOV_GRF_GRF,     GEN_ALL      },
+   { gen_f0_1_MOV_GRF_GRF,     GEN_ALL      },
 };
 
 static bool
@@ -255,7 +291,14 @@ run_tests(const struct gen_device_info *devinfo)
    bool fail = false;
 
    for (unsigned i = 0; i < ARRAY_SIZE(tests); i++) {
+      if ((tests[i].gens & gen_from_devinfo(devinfo)) == 0)
+         continue;
+
       for (int align_16 = 0; align_16 <= 1; align_16++) {
+         /* Align16 support is not present on Gen11+ */
+         if (devinfo->gen >= 11 && align_16)
+            continue;
+
         struct brw_codegen *p = rzalloc(NULL, struct brw_codegen);
         brw_init_codegen(devinfo, p, p);
 
@@ -289,10 +332,9 @@ int
 main(int argc, char **argv)
 {
    struct gen_device_info *devinfo = (struct gen_device_info *)calloc(1, sizeof(*devinfo));
-   devinfo->gen = 6;
    bool fail = false;
 
-   for (devinfo->gen = 6; devinfo->gen <= 7; devinfo->gen++) {
+   for (devinfo->gen = 5; devinfo->gen <= 12; devinfo->gen++) {
       fail |= run_tests(devinfo);
    }