mir_pack_mod(midgard_instruction *ins, unsigned i, bool scalar)
{
bool integer = midgard_is_integer_op(ins->op);
- unsigned base_size = (8 << ins->alu.reg_mode);
+ unsigned base_size = max_bitsize_for_alu(ins);
unsigned sz = nir_alu_type_get_type_size(ins->src_types[i]);
bool half = (sz == (base_size >> 1));
* override to the lower or upper half, shifting the effective mask in
* the latter, so AAAA.... becomes AAAA */
- unsigned inst_size = 8 << ins->alu.reg_mode;
+ unsigned inst_size = max_bitsize_for_alu(ins);
signed upper_shift = mir_upper_override(ins, inst_size);
if (upper_shift >= 0) {
ins->alu.dest_override = midgard_dest_override_none;
}
- if (ins->alu.reg_mode == midgard_reg_mode_32)
+ if (inst_size == 32)
ins->alu.mask = expand_writemask(effective, 2);
- else if (ins->alu.reg_mode == midgard_reg_mode_64)
+ else if (inst_size == 64)
ins->alu.mask = expand_writemask(effective, 1);
else
ins->alu.mask = effective;
{
bool channeled = GET_CHANNEL_COUNT(alu_opcode_props[ins->op].props);
- midgard_reg_mode mode = ins->alu.reg_mode;
- unsigned base_size = (8 << mode);
+ unsigned base_size = max_bitsize_for_alu(ins);
for (unsigned i = 0; i < 2; ++i) {
if (ins->has_inline_constant && (i == 1))
assert((sz == base_size) || half);
unsigned swizzle = mir_pack_swizzle(ins->mask, ins->swizzle[i],
- ins->src_types[i], ins->alu.reg_mode,
+ ins->src_types[i], reg_mode_for_bitsize(base_size),
channeled, &rep_lo, &rep_hi);
midgard_vector_alu_src pack = {
}
}
+static midgard_vector_alu
+vector_alu_from_instr(midgard_instruction *ins)
+{
+ midgard_vector_alu alu = ins->alu;
+ alu.op = ins->op;
+ alu.reg_mode = reg_mode_for_bitsize(max_bitsize_for_alu(ins));
+ return alu;
+}
+
static void
emit_alu_bundle(compiler_context *ctx,
midgard_bundle *bundle,
mir_pack_mask_alu(ins);
mir_pack_vector_srcs(ins);
size = sizeof(midgard_vector_alu);
- source_alu = ins->alu;
- source_alu.op = ins->op;
+ source_alu = vector_alu_from_instr(ins);
source = &source_alu;
} else if (ins->unit == ALU_ENAB_BR_COMPACT) {
size = sizeof(midgard_branch_cond);
source = &ins->branch_extended;
} else {
size = sizeof(midgard_scalar_alu);
- source_alu = ins->alu;
- source_alu.op = ins->op;
+ source_alu = vector_alu_from_instr(ins);
scalarized = vector_to_scalar_alu(source_alu, ins);
source = &scalarized;
}