/* If the op supports it */
enum midgard_roundmode roundmode;
- /* Special fields for an ALU instruction */
- midgard_reg_info registers;
-
/* For textures: should helpers execute this instruction (instead of
* just helping with derivatives)? Should helpers terminate after? */
bool helper_terminate;
union {
midgard_load_store_word load_store;
- midgard_vector_alu alu;
midgard_texture_word texture;
midgard_branch_extended branch_extended;
uint16_t br_compact;
}
static void
-mir_pack_mask_alu(midgard_instruction *ins)
+mir_pack_mask_alu(midgard_instruction *ins, midgard_vector_alu *alu)
{
unsigned effective = ins->mask;
if (upper_shift >= 0) {
effective >>= upper_shift;
- ins->alu.dest_override = upper_shift ?
+ alu->dest_override = upper_shift ?
midgard_dest_override_upper :
midgard_dest_override_lower;
} else {
- ins->alu.dest_override = midgard_dest_override_none;
+ alu->dest_override = midgard_dest_override_none;
}
if (inst_size == 32)
- ins->alu.mask = expand_writemask(effective, 2);
+ alu->mask = expand_writemask(effective, 2);
else if (inst_size == 64)
- ins->alu.mask = expand_writemask(effective, 1);
+ alu->mask = expand_writemask(effective, 1);
else
- ins->alu.mask = effective;
+ alu->mask = effective;
}
static unsigned
static midgard_vector_alu
vector_alu_from_instr(midgard_instruction *ins)
{
- midgard_vector_alu alu = ins->alu;
- alu.op = ins->op;
- alu.outmod = ins->outmod;
- alu.reg_mode = reg_mode_for_bitsize(max_bitsize_for_alu(ins));
+ midgard_vector_alu alu = {
+ .op = ins->op,
+ .outmod = ins->outmod,
+ .reg_mode = reg_mode_for_bitsize(max_bitsize_for_alu(ins))
+ };
if (ins->has_inline_constant) {
/* Encode inline 16-bit constant. See disassembler for
}
if (ins->unit & UNITS_ANY_VECTOR) {
- mir_pack_mask_alu(ins);
source_alu = vector_alu_from_instr(ins);
+ mir_pack_mask_alu(ins, &source_alu);
mir_pack_vector_srcs(ins, &source_alu);
size = sizeof(midgard_vector_alu);
source = &source_alu;
static void
mir_print_embedded_constant(midgard_instruction *ins, unsigned src_idx)
{
- midgard_vector_alu_src src;
-
assert(src_idx <= 1);
- if (src_idx == 0)
- src = vector_alu_from_unsigned(ins->alu.src1);
- else
- src = vector_alu_from_unsigned(ins->alu.src2);
+ unsigned base_size = max_bitsize_for_alu(ins);
+ unsigned sz = nir_alu_type_get_type_size(ins->src_types[src_idx]);
+ bool half = (sz == (base_size >> 1));
+ unsigned mod = mir_pack_mod(ins, src_idx, false);
unsigned *swizzle = ins->swizzle[src_idx];
midgard_reg_mode reg_mode = reg_mode_for_bitsize(max_bitsize_for_alu(ins));
unsigned comp_mask = effective_writemask(ins->op, ins->mask);
mir_print_constant_component(stdout, &ins->constants,
swizzle[comp], reg_mode,
- src.half, src.mod, ins->op);
+ half, mod, ins->op);
}
if (num_comp > 1)