aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Fonseca <[email protected]>2010-09-03 10:53:39 +0100
committerJosé Fonseca <[email protected]>2010-09-11 13:27:22 +0100
commit775edbfaa1ab0077fd60e1e5283081279763d0d8 (patch)
treeee4ec1d48fd36d5f60170d154e70a2af840fedfa
parent93158622e26df1227f6eca8d619b5521f4cb1368 (diff)
gallivm: Add some utility functions to set/get array elements too.
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_struct.c46
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_struct.h24
2 files changed, 70 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_struct.c b/src/gallium/auxiliary/gallivm/lp_bld_struct.c
index 3998ac374fe..c25b2f6493c 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_struct.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_struct.c
@@ -70,3 +70,49 @@ lp_build_struct_get(LLVMBuilderRef builder,
lp_build_name(res, "%s.%s", LLVMGetValueName(ptr), name);
return res;
}
+
+
+LLVMValueRef
+lp_build_array_get_ptr(LLVMBuilderRef builder,
+ LLVMValueRef ptr,
+ LLVMValueRef index)
+{
+ LLVMValueRef indices[2];
+ LLVMValueRef element_ptr;
+ indices[0] = LLVMConstInt(LLVMInt32Type(), 0, 0);
+ indices[1] = index;
+ element_ptr = LLVMBuildGEP(builder, ptr, indices, Elements(indices), "");
+#ifdef DEBUG
+ lp_build_name(element_ptr, "&%s[%s]",
+ LLVMGetValueName(ptr), LLVMGetValueName(index));
+#endif
+ return element_ptr;
+}
+
+
+LLVMValueRef
+lp_build_array_get(LLVMBuilderRef builder,
+ LLVMValueRef ptr,
+ LLVMValueRef index)
+{
+ LLVMValueRef element_ptr;
+ LLVMValueRef res;
+ element_ptr = lp_build_array_get_ptr(builder, ptr, index);
+ res = LLVMBuildLoad(builder, element_ptr, "");
+#ifdef DEBUG
+ lp_build_name(res, "%s[%s]", LLVMGetValueName(ptr), LLVMGetValueName(index));
+#endif
+ return res;
+}
+
+
+void
+lp_build_array_set(LLVMBuilderRef builder,
+ LLVMValueRef ptr,
+ LLVMValueRef index,
+ LLVMValueRef value)
+{
+ LLVMValueRef element_ptr;
+ element_ptr = lp_build_array_get_ptr(builder, ptr, index);
+ LLVMBuildStore(builder, value, element_ptr);
+}
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_struct.h b/src/gallium/auxiliary/gallivm/lp_bld_struct.h
index 147336edb4b..f8b6dab4bfb 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_struct.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_struct.h
@@ -71,5 +71,29 @@ lp_build_struct_get(LLVMBuilderRef builder,
unsigned member,
const char *name);
+/**
+ * Get value pointer to an array element.
+ */
+LLVMValueRef
+lp_build_array_get_ptr(LLVMBuilderRef builder,
+ LLVMValueRef ptr,
+ LLVMValueRef index);
+
+/**
+ * Get the value of an array element.
+ */
+LLVMValueRef
+lp_build_array_get(LLVMBuilderRef builder,
+ LLVMValueRef ptr,
+ LLVMValueRef index);
+
+/**
+ * Set the value of an array element.
+ */
+void
+lp_build_array_set(LLVMBuilderRef builder,
+ LLVMValueRef ptr,
+ LLVMValueRef index,
+ LLVMValueRef value);
#endif /* !LP_BLD_STRUCT_H */