gallium/radeon: extract common lookup code into get_temp_array function
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 8 Aug 2016 20:43:09 +0000 (22:43 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 17 Aug 2016 10:11:23 +0000 (12:11 +0200)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c

index e4bfa74537fef9d6f4da511ec4094d201886d8de..994c7da0627bb4f2f6a5e421b93e196fd16343c8 100644 (file)
@@ -111,58 +111,65 @@ static LLVMValueRef emit_swizzle(struct lp_build_tgsi_context *bld_base,
                                      LLVMConstVector(swizzles, 4), "");
 }
 
+/**
+ * Return the description of the array covering the given temporary register
+ * index.
+ */
+static const struct radeon_llvm_array *
+get_temp_array(struct lp_build_tgsi_context *bld_base,
+              unsigned reg_index,
+              const struct tgsi_ind_register *reg)
+{
+       struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+       unsigned num_arrays = ctx->soa.bld_base.info->array_max[TGSI_FILE_TEMPORARY];
+       unsigned i;
+
+       if (reg && reg->ArrayID > 0 && reg->ArrayID <= num_arrays)
+               return &ctx->arrays[reg->ArrayID - 1];
+
+       for (i = 0; i < num_arrays; i++) {
+               const struct radeon_llvm_array *array = &ctx->arrays[i];
+
+               if (reg_index >= array->range.First && reg_index <= array->range.Last)
+                       return array;
+       }
+
+       return NULL;
+}
+
 static struct tgsi_declaration_range
 get_array_range(struct lp_build_tgsi_context *bld_base,
                unsigned File, unsigned reg_index,
                const struct tgsi_ind_register *reg)
 {
-       struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+       struct tgsi_declaration_range range;
 
-       if (!reg) {
-               unsigned i;
-               unsigned num_arrays = bld_base->info->array_max[TGSI_FILE_TEMPORARY];
-               for (i = 0; i < num_arrays; i++) {
-                       const struct tgsi_declaration_range *range =
-                                               &ctx->arrays[i].range;
-
-                       if (reg_index >= range->First && reg_index <= range->Last) {
-                               return ctx->arrays[i].range;
-                       }
-               }
+       if (File == TGSI_FILE_TEMPORARY) {
+               const struct radeon_llvm_array *array =
+                       get_temp_array(bld_base, reg_index, reg);
+               if (array)
+                       return array->range;
        }
 
-       if (File != TGSI_FILE_TEMPORARY || !reg || reg->ArrayID == 0 ||
-           reg->ArrayID > bld_base->info->array_max[TGSI_FILE_TEMPORARY]) {
-               struct tgsi_declaration_range range;
-               range.First = 0;
-               range.Last = bld_base->info->file_max[File];
-               return range;
-       }
-
-       return ctx->arrays[reg->ArrayID - 1].range;
+       range.First = 0;
+       range.Last = bld_base->info->file_max[File];
+       return range;
 }
 
 static LLVMValueRef get_alloca_for_array(struct lp_build_tgsi_context *bld_base,
                                         unsigned file,
                                         unsigned index)
 {
-       unsigned i;
-       unsigned num_arrays;
-       struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+       const struct radeon_llvm_array *array;
 
        if (file != TGSI_FILE_TEMPORARY)
                return NULL;
 
-       num_arrays = bld_base->info->array_max[TGSI_FILE_TEMPORARY];
-       for (i = 0; i < num_arrays; i++) {
-               const struct tgsi_declaration_range *range =
-                                               &ctx->arrays[i].range;
+       array = get_temp_array(bld_base, index, NULL);
+       if (!array)
+               return NULL;
 
-               if (index >= range->First && index <= range->Last) {
-                       return ctx->arrays[i].alloca;
-               }
-       }
-       return NULL;
+       return array->alloca;
 }
 
 static LLVMValueRef