[Mesa-dev] [PATCH 2/3] radeon/llvm: Add helpers for loading and storing data from arrays.

Tom Stellard thomas.stellard at amd.com
Wed May 25 12:35:43 UTC 2016


---
 .../drivers/radeon/radeon_setup_tgsi_llvm.c        | 51 +++++++++++++++++-----
 1 file changed, 41 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
index 759c674..93bc307 100644
--- a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
+++ b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
@@ -159,6 +159,43 @@ emit_array_fetch(
 	return result;
 }
 
+static LLVMValueRef
+load_value_from_array(
+	struct lp_build_tgsi_context *bld_base,
+	unsigned file,
+	enum tgsi_opcode_type type,
+	unsigned swizzle,
+	unsigned reg_index,
+	const struct tgsi_ind_register *reg_indirect)
+{
+	struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base);
+	LLVMBuilderRef builder = bld_base->base.gallivm->builder;
+	struct tgsi_declaration_range range = get_array_range(bld_base, file, reg_indirect);
+
+	return LLVMBuildExtractElement(builder,
+			emit_array_fetch(bld_base, file, type, range, swizzle),
+			emit_array_index(bld, reg_indirect, reg_index - range.First), "");
+
+}
+
+static LLVMValueRef store_value_to_array(
+	struct lp_build_tgsi_context *bld_base,
+	LLVMValueRef value,
+	unsigned file,
+	unsigned chan_index,
+	unsigned reg_index,
+	const struct tgsi_ind_register *reg_indirect)
+{
+	struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base);
+	LLVMBuilderRef builder = bld_base->base.gallivm->builder;
+	struct tgsi_declaration_range range = get_array_range(bld_base, file, reg_indirect);
+
+	return LLVMBuildInsertElement(builder,
+				emit_array_fetch(bld_base, file, TGSI_TYPE_FLOAT, range, chan_index),
+				value,  emit_array_index(bld, reg_indirect, reg_index - range.First), "");
+	return NULL;
+}
+
 LLVMValueRef radeon_llvm_emit_fetch(struct lp_build_tgsi_context *bld_base,
 				    const struct tgsi_full_src_register *reg,
 				    enum tgsi_opcode_type type,
@@ -180,12 +217,8 @@ LLVMValueRef radeon_llvm_emit_fetch(struct lp_build_tgsi_context *bld_base,
 	}
 
 	if (reg->Register.Indirect) {
-		struct tgsi_declaration_range range = get_array_range(bld_base,
-			reg->Register.File, &reg->Indirect);
-		return LLVMBuildExtractElement(builder,
-			emit_array_fetch(bld_base, reg->Register.File, type, range, swizzle),
-			emit_array_index(bld, &reg->Indirect, reg->Register.Index - range.First),
-			"");
+		return load_value_from_array(bld_base, reg->Register.File, type,
+				swizzle, reg->Register.Index, &reg->Indirect);
 	}
 
 	switch(reg->Register.File) {
@@ -429,10 +462,8 @@ void radeon_llvm_emit_store(
 				reg->Register.File, &reg->Indirect);
 
         		unsigned i, size = range.Last - range.First + 1;
-			LLVMValueRef array = LLVMBuildInsertElement(builder,
-				emit_array_fetch(bld_base, reg->Register.File, TGSI_TYPE_FLOAT, range, chan_index),
-				value,  emit_array_index(bld, &reg->Indirect, reg->Register.Index - range.First), "");
-
+			LLVMValueRef array = store_value_to_array(bld_base, value, reg->Register.File, chan_index,
+			                                          reg->Register.Index, &reg->Indirect);
         		for (i = 0; i < size; ++i) {
 				switch(reg->Register.File) {
 				case TGSI_FILE_OUTPUT:
-- 
2.0.4



More information about the mesa-dev mailing list