Temp get_ssa_temp(struct isel_context *ctx, nir_ssa_def *def)
{
- assert(ctx->allocated[def->index].id());
- return ctx->allocated[def->index];
+ uint32_t id = ctx->first_temp_id + def->index;
+ return Temp(id, ctx->program->temp_rc[id]);
}
Temp emit_mbcnt(isel_context *ctx, Temp dst, Operand mask = Operand(), Operand base = Operand(0u))
aco_opcode v_op = instr->src[0].src.ssa->bit_size == 64 ? v64_op : instr->src[0].src.ssa->bit_size == 32 ? v32_op : v16_op;
bool use_valu = s_op == aco_opcode::num_opcodes ||
nir_dest_is_divergent(instr->dest.dest) ||
- ctx->allocated[instr->src[0].src.ssa->index].type() == RegType::vgpr ||
- ctx->allocated[instr->src[1].src.ssa->index].type() == RegType::vgpr;
+ get_ssa_temp(ctx, instr->src[0].src.ssa).type() == RegType::vgpr ||
+ get_ssa_temp(ctx, instr->src[1].src.ssa).type() == RegType::vgpr;
aco_opcode op = use_valu ? v_op : s_op;
assert(op != aco_opcode::num_opcodes);
assert(dst.regClass() == ctx->program->lane_mask);
nir_print_shader(shader, stderr);
}
- std::unique_ptr<Temp[]> allocated{new Temp[impl->ssa_alloc]()};
+ ctx->first_temp_id = ctx->program->peekAllocationId();
+ ctx->program->allocateRange(impl->ssa_alloc);
+ RegClass *regclasses = ctx->program->temp_rc.data() + ctx->first_temp_id;
unsigned spi_ps_inputs = 0;
/* fallthrough */
default:
for (unsigned i = 0; i < nir_op_infos[alu_instr->op].num_inputs; i++) {
- if (allocated[alu_instr->src[i].src.ssa->index].type() == RegType::vgpr)
+ if (regclasses[alu_instr->src[i].src.ssa->index].type() == RegType::vgpr)
type = RegType::vgpr;
}
break;
}
RegClass rc = get_reg_class(ctx, type, alu_instr->dest.dest.ssa.num_components, alu_instr->dest.dest.ssa.bit_size);
- allocated[alu_instr->dest.dest.ssa.index] = Temp(0, rc);
+ regclasses[alu_instr->dest.dest.ssa.index] = rc;
break;
}
case nir_instr_type_load_const: {
unsigned num_components = nir_instr_as_load_const(instr)->def.num_components;
unsigned bit_size = nir_instr_as_load_const(instr)->def.bit_size;
RegClass rc = get_reg_class(ctx, RegType::sgpr, num_components, bit_size);
- allocated[nir_instr_as_load_const(instr)->def.index] = Temp(0, rc);
+ regclasses[nir_instr_as_load_const(instr)->def.index] = rc;
break;
}
case nir_instr_type_intrinsic: {
break;
default:
for (unsigned i = 0; i < nir_intrinsic_infos[intrinsic->intrinsic].num_srcs; i++) {
- if (allocated[intrinsic->src[i].ssa->index].type() == RegType::vgpr)
+ if (regclasses[intrinsic->src[i].ssa->index].type() == RegType::vgpr)
type = RegType::vgpr;
}
break;
}
RegClass rc = get_reg_class(ctx, type, intrinsic->dest.ssa.num_components, intrinsic->dest.ssa.bit_size);
- allocated[intrinsic->dest.ssa.index] = Temp(0, rc);
+ regclasses[intrinsic->dest.ssa.index] = rc;
switch(intrinsic->intrinsic) {
case nir_intrinsic_load_barycentric_sample:
RegClass rc = get_reg_class(ctx, type, tex->dest.ssa.num_components,
tex->dest.ssa.bit_size);
- allocated[tex->dest.ssa.index] = Temp(0, rc);
+ regclasses[tex->dest.ssa.index] = rc;
break;
}
case nir_instr_type_parallel_copy: {
nir_foreach_parallel_copy_entry(entry, nir_instr_as_parallel_copy(instr)) {
- allocated[entry->dest.ssa.index] = allocated[entry->src.ssa->index];
+ regclasses[entry->dest.ssa.index] = regclasses[entry->src.ssa->index];
}
break;
}
unsigned num_components = nir_instr_as_ssa_undef(instr)->def.num_components;
unsigned bit_size = nir_instr_as_ssa_undef(instr)->def.bit_size;
RegClass rc = get_reg_class(ctx, RegType::sgpr, num_components, bit_size);
- allocated[nir_instr_as_ssa_undef(instr)->def.index] = Temp(0, rc);
+ regclasses[nir_instr_as_ssa_undef(instr)->def.index] = rc;
break;
}
case nir_instr_type_phi: {
assert(size == 1 && "multiple components not yet supported on boolean phis.");
type = RegType::sgpr;
size *= lane_mask_size;
- allocated[phi->dest.ssa.index] = Temp(0, RegClass(type, size));
+ regclasses[phi->dest.ssa.index] = RegClass(type, size);
break;
}
} else {
type = RegType::sgpr;
nir_foreach_phi_src (src, phi) {
- if (allocated[src->src.ssa->index].type() == RegType::vgpr)
+ if (regclasses[src->src.ssa->index].type() == RegType::vgpr)
type = RegType::vgpr;
- if (allocated[src->src.ssa->index].type() == RegType::none)
+ if (regclasses[src->src.ssa->index].type() == RegType::none)
done = false;
}
}
RegClass rc = get_reg_class(ctx, type, phi->dest.ssa.num_components, phi->dest.ssa.bit_size);
- if (rc != allocated[phi->dest.ssa.index].regClass()) {
+ if (rc != regclasses[phi->dest.ssa.index]) {
done = false;
} else {
nir_foreach_phi_src(src, phi)
- assert(allocated[src->src.ssa->index].size() == rc.size());
+ assert(regclasses[src->src.ssa->index].size() == rc.size());
}
- allocated[phi->dest.ssa.index] = Temp(0, rc);
+ regclasses[phi->dest.ssa.index] = rc;
break;
}
default:
ctx->program->config->spi_ps_input_ena = spi_ps_inputs;
ctx->program->config->spi_ps_input_addr = spi_ps_inputs;
- for (unsigned i = 0; i < impl->ssa_alloc; i++)
- allocated[i] = ctx->program->allocateTmp(allocated[i].regClass());
-
- ctx->allocated.reset(allocated.release());
ctx->cf_info.nir_to_aco.reset(nir_to_aco.release());
/* align and copy constant data */