bool brw_validate_instructions(const struct brw_codegen *p, int start_offset, struct annotation_info *annotation) { const struct brw_device_info *devinfo = p->devinfo; const void *store = p->store + start_offset / 16; bool valid = true; for (int src_offset = 0; src_offset < p->next_insn_offset - start_offset; src_offset += sizeof(brw_inst)) { struct string error_msg = { .str = NULL, .len = 0 }; const brw_inst *inst = store + src_offset; switch (num_sources_from_inst(devinfo, inst)) { case 3: /* Nothing to test. 3-src instructions can only have GRF sources, and * there's no bit to control the file. */ break; case 2: ERROR_IF(src1_is_null(devinfo, inst), "src1 is null"); /* fallthrough */ case 1: ERROR_IF(src0_is_null(devinfo, inst), "src0 is null"); break; case 0: default: break; } ERROR_IF(is_unsupported_inst(devinfo, inst), "Instruction not supported on this Gen"); if (brw_inst_opcode(devinfo, inst) == BRW_OPCODE_SEND) { ERROR_IF(brw_inst_src0_address_mode(devinfo, inst) != BRW_ADDRESS_DIRECT, "send must use direct addressing"); if (devinfo->gen >= 7) { ERROR_IF(!src0_is_grf(devinfo, inst), "send from non-GRF"); ERROR_IF(brw_inst_eot(devinfo, inst) && brw_inst_src0_da_reg_nr(devinfo, inst) < 112, "send with EOT must use g112-g127"); } } if (error_msg.str && annotation) { annotation_insert_error(annotation, src_offset, error_msg.str); } free(error_msg.str); } return valid; }
bool brw_validate_instructions(const struct brw_codegen *p, int start_offset, struct annotation_info *annotation) { const struct brw_device_info *devinfo = p->devinfo; const void *store = p->store + start_offset / 16; bool valid = true; for (int src_offset = 0; src_offset < p->next_insn_offset - start_offset; src_offset += sizeof(brw_inst)) { struct string error_msg = { .str = NULL, .len = 0 }; const brw_inst *inst = store + src_offset; switch (num_sources_from_inst(devinfo, inst)) { case 3: /* Nothing to test. 3-src instructions can only have GRF sources, and * there's no bit to control the file. */ break; case 2: ERROR_IF(src1_is_null(devinfo, inst), "src1 is null"); /* fallthrough */ case 1: ERROR_IF(src0_is_null(devinfo, inst), "src0 is null"); break; case 0: default: break; } ERROR_IF(is_unsupported_inst(devinfo, inst), "Instruction not supported on this Gen"); if (error_msg.str && annotation) { annotation_insert_error(annotation, src_offset, error_msg.str); } free(error_msg.str); } return valid; }