static void validate_alu_src(nir_alu_instr *instr, unsigned index, validate_state *state) { nir_alu_src *src = &instr->src[index]; unsigned num_components; unsigned src_bit_size; if (src->src.is_ssa) { src_bit_size = src->src.ssa->bit_size; num_components = src->src.ssa->num_components; } else { src_bit_size = src->src.reg.reg->bit_size; if (src->src.reg.reg->is_packed) num_components = 4; /* can't check anything */ else num_components = src->src.reg.reg->num_components; } for (unsigned i = 0; i < 4; i++) { validate_assert(state, src->swizzle[i] < 4); if (nir_alu_instr_channel_used(instr, index, i)) validate_assert(state, src->swizzle[i] < num_components); } nir_alu_type src_type = nir_op_infos[instr->op].input_types[index]; /* 8-bit float isn't a thing */ if (nir_alu_type_get_base_type(src_type) == nir_type_float) validate_assert(state, src_bit_size == 16 || src_bit_size == 32 || src_bit_size == 64); if (nir_alu_type_get_type_size(src_type)) { /* This source has an explicit bit size */ validate_assert(state, nir_alu_type_get_type_size(src_type) == src_bit_size); } else { if (!nir_alu_type_get_type_size(nir_op_infos[instr->op].output_type)) { unsigned dest_bit_size = instr->dest.dest.is_ssa ? instr->dest.dest.ssa.bit_size : instr->dest.dest.reg.reg->bit_size; validate_assert(state, dest_bit_size == src_bit_size); } } validate_src(&src->src, state); }
static void validate_alu_src(nir_alu_instr *instr, unsigned index, validate_state *state) { nir_alu_src *src = &instr->src[index]; unsigned num_components; if (src->src.is_ssa) num_components = src->src.ssa->num_components; else { if (src->src.reg.reg->is_packed) num_components = 4; /* can't check anything */ else num_components = src->src.reg.reg->num_components; } for (unsigned i = 0; i < 4; i++) { assert(src->swizzle[i] < 4); if (nir_alu_instr_channel_used(instr, index, i)) assert(src->swizzle[i] < num_components); } validate_src(&src->src, state); }