freedreno/ir3: set array precision on creation
authorRob Clark <robdclark@chromium.org>
Thu, 16 Jul 2020 22:13:53 +0000 (15:13 -0700)
committerRob Clark <robdclark@chromium.org>
Sat, 18 Jul 2020 16:14:13 +0000 (09:14 -0700)
Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5957>

src/freedreno/ir3/ir3_context.c
src/freedreno/ir3/ir3_context.h

index 522c6f69aca976abd4f329d95bf6fd8d3d775f4f..4fe616158009cb9d0972f111da8ea9ad11f9db0a 100644 (file)
@@ -227,7 +227,7 @@ ir3_get_src(struct ir3_context *ctx, nir_src *src)
                for (unsigned i = 0; i < num_components; i++) {
                        unsigned n = src->reg.base_offset * reg->num_components + i;
                        compile_assert(ctx, n < arr->length);
-                       value[i] = ir3_create_array_load(ctx, arr, n, addr, reg->bit_size);
+                       value[i] = ir3_create_array_load(ctx, arr, n, addr);
                }
 
                return value;
@@ -553,6 +553,10 @@ ir3_declare_array(struct ir3_context *ctx, nir_register *reg)
        arr->length = reg->num_components * MAX2(1, reg->num_array_elems);
        compile_assert(ctx, arr->length > 0);
        arr->r = reg;
+       arr->half = reg->bit_size <= 16;
+       // HACK one-bit bools still end up as 32b:
+       if (reg->bit_size == 1)
+               arr->half = false;
        list_addtail(&arr->node, &ctx->ir->array_list);
 }
 
@@ -570,7 +574,7 @@ ir3_get_array(struct ir3_context *ctx, nir_register *reg)
 /* relative (indirect) if address!=NULL */
 struct ir3_instruction *
 ir3_create_array_load(struct ir3_context *ctx, struct ir3_array *arr, int n,
-               struct ir3_instruction *address, unsigned bitsize)
+               struct ir3_instruction *address)
 {
        struct ir3_block *block = ctx->block;
        struct ir3_instruction *mov;
@@ -578,11 +582,10 @@ ir3_create_array_load(struct ir3_context *ctx, struct ir3_array *arr, int n,
        unsigned flags = 0;
 
        mov = ir3_instr_create(block, OPC_MOV);
-       if (bitsize == 16) {
+       if (arr->half) {
                mov->cat1.src_type = TYPE_U16;
                mov->cat1.dst_type = TYPE_U16;
                flags |= IR3_REG_HALF;
-               arr->half = true;
        } else {
                mov->cat1.src_type = TYPE_U32;
                mov->cat1.dst_type = TYPE_U32;
index 6ddf2402fdca287e940b11be1ca6137ae3c11868..30caf9d7b852a764d06ef10dfaf224817dc10156 100644 (file)
@@ -202,8 +202,7 @@ struct ir3_instruction * ir3_get_predicate(struct ir3_context *ctx,
 void ir3_declare_array(struct ir3_context *ctx, nir_register *reg);
 struct ir3_array * ir3_get_array(struct ir3_context *ctx, nir_register *reg);
 struct ir3_instruction *ir3_create_array_load(struct ir3_context *ctx,
-               struct ir3_array *arr, int n, struct ir3_instruction *address,
-               unsigned bitsize);
+               struct ir3_array *arr, int n, struct ir3_instruction *address);
 void ir3_create_array_store(struct ir3_context *ctx, struct ir3_array *arr, int n,
                struct ir3_instruction *src, struct ir3_instruction *address);