diff options
author | Nicolai Hähnle <[email protected]> | 2016-08-08 22:43:09 +0200 |
---|---|---|
committer | Nicolai Hähnle <[email protected]> | 2016-08-17 12:11:23 +0200 |
commit | b76aabffa287805f3705e3b07e3f310b37cbbe71 (patch) | |
tree | 87271abb623a3f1cb9ebef9218ed7bc3aafbc2a2 /src/gallium/drivers | |
parent | fa84296a5a7c707e87299c921acde3bd1533833f (diff) |
gallium/radeon: extract common lookup code into get_temp_array function
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c | 73 |
1 files 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 e4bfa74537f..994c7da0627 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 |