#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)
{
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
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) {
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;
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);
}
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);
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
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);
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);
}