diff options
author | Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> | 2020-04-27 10:38:00 -0400 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2020-04-27 14:52:26 +0000 |
commit | 280b65126e8159e62517828eda12ed3789078aff (patch) | |
tree | d7587b51181e0f366bacc74e06e7b485f9f2a8b6 /src | |
parent | 64c33a459fa9a5c8b49a967c0fee75d5f80317d3 (diff) |
pan/bi: Fix RA wrt 16-bit swizzles
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4766>
Diffstat (limited to 'src')
-rw-r--r-- | src/panfrost/bifrost/bi_ra.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/panfrost/bifrost/bi_ra.c b/src/panfrost/bifrost/bi_ra.c index b6da1df7038..0124bf5ebc9 100644 --- a/src/panfrost/bifrost/bi_ra.c +++ b/src/panfrost/bifrost/bi_ra.c @@ -124,8 +124,14 @@ bi_adjust_src_ra(bi_instruction *ins, struct lcra_state *l, unsigned src) /* Use the swizzle as component select */ unsigned components = bi_get_component_count(ins, src); + nir_alu_type T = ins->src_types[src]; + unsigned size = nir_alu_type_get_type_size(T); + + /* TODO: 64-bit? */ + unsigned components_per_word = MAX2(32 / size, 1); + for (unsigned i = 0; i < components; ++i) { - unsigned off = ins->swizzle[src][i] / components; + unsigned off = ins->swizzle[src][i] / components_per_word; /* We can't cross register boundaries in a swizzle */ if (i == 0) @@ -133,7 +139,7 @@ bi_adjust_src_ra(bi_instruction *ins, struct lcra_state *l, unsigned src) else assert(off == offset); - ins->swizzle[src][i] %= components; + ins->swizzle[src][i] %= components_per_word; } } @@ -147,6 +153,7 @@ bi_adjust_dest_ra(bi_instruction *ins, struct lcra_state *l) return; ins->dest = bi_reg_from_index(l, ins->dest, ins->dest_offset); + ins->dest_offset = 0; } static void |