diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index a6a5f9f4d7e..608f9af9657 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -1458,7 +1458,9 @@ bi_emit_load_const(bi_builder *b, nir_load_const_instr *instr) 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); + uint32_t v = nir_const_value_as_uint(instr->value[i], instr->def.bit_size); + + v = bi_extend_constant(v, instr->def.bit_size); acc |= (v << (i * instr->def.bit_size)); } diff --git a/src/panfrost/bifrost/compiler.h b/src/panfrost/bifrost/compiler.h index 19a3959e5eb..5e767f3d2a7 100644 --- a/src/panfrost/bifrost/compiler.h +++ b/src/panfrost/bifrost/compiler.h @@ -739,6 +739,19 @@ bi_temp_reg(bi_context *ctx) return bi_get_index(ctx->reg_alloc++, true, 0); } +/* NIR booleans are 1-bit (0/1). For now, backend IR booleans are N-bit + * (0/~0) where N depends on the context. This requires us to sign-extend + * when converting constants from NIR to the backend IR. + */ +static inline uint32_t +bi_extend_constant(uint32_t constant, unsigned bit_size) +{ + if (bit_size == 1 && constant != 0) + return ~0; + else + return constant; +} + /* Inline constants automatically, will be lowered out by bi_lower_fau where a * constant is not allowed. load_const_to_scalar gaurantees that this makes * sense */ @@ -746,11 +759,13 @@ bi_temp_reg(bi_context *ctx) static inline bi_index bi_src_index(nir_src *src) { - if (nir_src_is_const(*src) && nir_src_bit_size(*src) <= 32) - return bi_imm_u32(nir_src_as_uint(*src)); - else if (src->is_ssa) + if (nir_src_is_const(*src) && nir_src_bit_size(*src) <= 32) { + uint32_t v = nir_src_as_uint(*src); + + return bi_imm_u32(bi_extend_constant(v, nir_src_bit_size(*src))); + } else if (src->is_ssa) { return bi_get_index(src->ssa->index, false, 0); - else { + } else { assert(!src->reg.indirect); return bi_get_index(src->reg.reg->index, true, 0); }