From 967bd9d140504f091bfe2c311ea30d247d51a2d9 Mon Sep 17 00:00:00 2001 From: Nicolai Hähnle Date: Mon, 8 Aug 2016 22:43:09 +0200 Subject: gallium/radeon: extract common lookup code into get_temp_array function --- .../drivers/radeon/radeon_setup_tgsi_llvm.c | 73 ++++++++++++---------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c index e4bfa74537..994c7da062 100644 --- a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c +++ b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c @@ -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 -- cgit v1.2.3