From 0e73d879e3a35f7491c1239f894bbb2d1c9b2529 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 2 Jun 2020 19:30:56 -0400 Subject: [PATCH] pan/bi: Handle vectorized load_const In preparation for 16-bit vectors. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/panfrost/bifrost/bifrost_compile.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index 96ceb78cf07..31958426331 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -466,20 +466,29 @@ static void emit_load_const(bi_context *ctx, nir_load_const_instr *instr) { /* Make sure we've been lowered */ - assert(instr->def.num_components == 1); + assert(instr->def.num_components <= (32 / instr->def.bit_size)); + + /* Accumulate all the channels of the constant, as if we did an + * implicit SEL over them */ + uint32_t acc = 0; + + for (unsigned i = 0; i < instr->def.num_components; ++i) { + unsigned v = nir_const_value_as_uint(instr->value[i], instr->def.bit_size); + acc |= (v << (i * instr->def.bit_size)); + } bi_instruction move = { .type = BI_MOV, .dest = pan_ssa_index(&instr->def), - .dest_type = instr->def.bit_size | nir_type_uint, + .dest_type = nir_type_uint32, .src = { BIR_INDEX_CONSTANT }, .src_types = { - instr->def.bit_size | nir_type_uint, + nir_type_uint32, }, .constant = { - .u64 = nir_const_value_as_uint(instr->value[0], instr->def.bit_size) + .u32 = acc } };