From 86c2a6b9fe885efa0366b262a226643184ca4ba4 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 14 Apr 2020 18:29:36 -0400 Subject: [PATCH] pan/bi: Fix bi_get_immediate with multiple imms Signed-off-by: Alyssa Rosenzweig Part-of: --- src/panfrost/bifrost/bi_pack.c | 8 ++++---- src/panfrost/bifrost/bi_print.c | 2 +- src/panfrost/bifrost/bir.c | 15 ++++++++++++--- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/panfrost/bifrost/bi_pack.c b/src/panfrost/bifrost/bi_pack.c index 09fefd8..6f07672 100644 --- a/src/panfrost/bifrost/bi_pack.c +++ b/src/panfrost/bifrost/bi_pack.c @@ -162,7 +162,7 @@ bi_assign_uniform_constant_single( if (ins->src[s] & BIR_INDEX_CONSTANT) { bool hi = false; bool b64 = nir_alu_type_get_type_size(ins->src_types[s]) > 32; - uint64_t cons = bi_get_immediate(ins, ins->src[s]); + uint64_t cons = bi_get_immediate(ins, s); unsigned idx = bi_lookup_constant(clause, cons, &hi, b64); unsigned f = bi_constant_field(idx) | (cons & 0xF); @@ -944,7 +944,7 @@ bi_pack_add_ld_vary(bi_clause *clause, bi_instruction *ins, struct bi_registers if (ins->src[0] & BIR_INDEX_CONSTANT) { /* Direct uses address field directly */ - packed_addr = bi_get_immediate(ins, ins->src[0]); + packed_addr = bi_get_immediate(ins, 0); assert(packed_addr < 0b1000); } else { /* Indirect gets an extra source */ @@ -1051,7 +1051,7 @@ bi_pack_add_ld_var_addr(bi_clause *clause, bi_instruction *ins, struct bi_regist struct bifrost_ld_var_addr pack = { .src0 = bi_get_src(ins, regs, 1, false), .src1 = bi_get_src(ins, regs, 2, false), - .location = bi_get_immediate(ins, ins->src[0]), + .location = bi_get_immediate(ins, 0), .type = bi_pack_ldst_type(ins->src_types[3]), .op = BIFROST_ADD_OP_LD_VAR_ADDR }; @@ -1066,7 +1066,7 @@ bi_pack_add_ld_attr(bi_clause *clause, bi_instruction *ins, struct bi_registers struct bifrost_ld_attr pack = { .src0 = bi_get_src(ins, regs, 1, false), .src1 = bi_get_src(ins, regs, 2, false), - .location = bi_get_immediate(ins, ins->src[0]), + .location = bi_get_immediate(ins, 0), .channels = MALI_POSITIVE(bi_load32_components(ins)), .type = bi_pack_ldst_type(ins->dest_type), .op = BIFROST_ADD_OP_LD_ATTR diff --git a/src/panfrost/bifrost/bi_print.c b/src/panfrost/bifrost/bi_print.c index c80e469..5f718e9 100644 --- a/src/panfrost/bifrost/bi_print.c +++ b/src/panfrost/bifrost/bi_print.c @@ -185,7 +185,7 @@ bi_print_index(FILE *fp, bi_instruction *ins, unsigned index, unsigned s) if (index & BIR_INDEX_UNIFORM) fprintf(fp, "u%u", index & ~BIR_INDEX_UNIFORM); else if (index & BIR_INDEX_CONSTANT) - fprintf(fp, "#0x%" PRIx64, bi_get_immediate(ins, index)); + fprintf(fp, "#0x%" PRIx64, bi_get_immediate(ins, s)); else if (index & BIR_INDEX_ZERO) fprintf(fp, "#0"); else diff --git a/src/panfrost/bifrost/bir.c b/src/panfrost/bifrost/bir.c index b42db85..8d0aaca 100644 --- a/src/panfrost/bifrost/bir.c +++ b/src/panfrost/bifrost/bir.c @@ -140,9 +140,18 @@ bi_bytemask_of_read_components(bi_instruction *ins, unsigned node) uint64_t bi_get_immediate(bi_instruction *ins, unsigned index) { - assert(index & BIR_INDEX_CONSTANT); - unsigned shift = index & ~BIR_INDEX_CONSTANT; - return ins->constant.u64 >> shift; + unsigned v = ins->src[index]; + assert(v & BIR_INDEX_CONSTANT); + unsigned shift = v & ~BIR_INDEX_CONSTANT; + uint64_t shifted = ins->constant.u64 >> shift; + + /* Mask off the accessed part */ + unsigned sz = nir_alu_type_get_type_size(ins->src_types[index]); + + if (sz == 64) + return shifted; + else + return shifted & ((1ull << sz) - 1); } bool -- 2.7.4