Mesa (master): gallivm: Refactor lp_build_broadcast(_scalar) to share code.
Jose Fonseca
jrfonseca at kemper.freedesktop.org
Thu Jun 28 19:22:53 UTC 2012
Module: Mesa
Branch: master
Commit: 638779e44555b3c3789638a95693357cf59f5595
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=638779e44555b3c3789638a95693357cf59f5595
Author: José Fonseca <jfonseca at vmware.com>
Date: Thu Jun 28 18:07:10 2012 +0100
gallivm: Refactor lp_build_broadcast(_scalar) to share code.
Doesn't really change the generated assembly, but produces more compact IR,
and of course, makes code more consistent.
Reviewed-by: Brian Paul <brianp at vmware.com>
---
src/gallium/auxiliary/gallivm/lp_bld_swizzle.c | 64 ++++++++++-------------
1 files changed, 28 insertions(+), 36 deletions(-)
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_swizzle.c b/src/gallium/auxiliary/gallivm/lp_bld_swizzle.c
index 7169360..5d44068 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_swizzle.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_swizzle.c
@@ -47,14 +47,34 @@ lp_build_broadcast(struct gallivm_state *gallivm,
LLVMTypeRef vec_type,
LLVMValueRef scalar)
{
- const unsigned n = LLVMGetVectorSize(vec_type);
LLVMValueRef res;
- unsigned i;
- res = LLVMGetUndef(vec_type);
- for(i = 0; i < n; ++i) {
- LLVMValueRef index = lp_build_const_int32(gallivm, i);
- res = LLVMBuildInsertElement(gallivm->builder, res, scalar, index, "");
+ if (LLVMGetTypeKind(vec_type) != LLVMVectorTypeKind) {
+ /* scalar */
+ assert(vec_type == LLVMTypeOf(scalar));
+ res = scalar;
+ } else {
+ LLVMBuilderRef builder = gallivm->builder;
+ const unsigned length = LLVMGetVectorSize(vec_type);
+ LLVMValueRef undef = LLVMGetUndef(vec_type);
+ LLVMTypeRef i32_type = LLVMInt32TypeInContext(gallivm->context);
+
+ assert(LLVMGetElementType(vec_type) == LLVMTypeOf(scalar));
+
+ if (HAVE_LLVM >= 0x207) {
+ /* The shuffle vector is always made of int32 elements */
+ LLVMTypeRef i32_vec_type = LLVMVectorType(i32_type, length);
+ res = LLVMBuildInsertElement(builder, undef, scalar, LLVMConstNull(i32_type), "");
+ res = LLVMBuildShuffleVector(builder, res, undef, LLVMConstNull(i32_vec_type), "");
+ } else {
+ /* XXX: The above path provokes a bug in LLVM 2.6 */
+ unsigned i;
+ res = undef;
+ for(i = 0; i < length; ++i) {
+ LLVMValueRef index = lp_build_const_int32(gallivm, i);
+ res = LLVMBuildInsertElement(builder, res, scalar, index, "");
+ }
+ }
}
return res;
@@ -68,37 +88,9 @@ LLVMValueRef
lp_build_broadcast_scalar(struct lp_build_context *bld,
LLVMValueRef scalar)
{
- LLVMBuilderRef builder = bld->gallivm->builder;
- const struct lp_type type = bld->type;
-
- assert(lp_check_elem_type(type, LLVMTypeOf(scalar)));
-
- if (type.length == 1) {
- return scalar;
- }
- else {
- LLVMValueRef res;
+ assert(lp_check_elem_type(bld->type, LLVMTypeOf(scalar)));
-#if HAVE_LLVM >= 0x207
- /* The shuffle vector is always made of int32 elements */
- struct lp_type i32_vec_type = lp_type_int_vec(32);
- i32_vec_type.length = type.length;
-
- res = LLVMBuildInsertElement(builder, bld->undef, scalar,
- lp_build_const_int32(bld->gallivm, 0), "");
- res = LLVMBuildShuffleVector(builder, res, bld->undef,
- lp_build_const_int_vec(bld->gallivm, i32_vec_type, 0), "");
-#else
- /* XXX: The above path provokes a bug in LLVM 2.6 */
- unsigned i;
- res = bld->undef;
- for(i = 0; i < type.length; ++i) {
- LLVMValueRef index = lp_build_const_int32(bld->gallivm, i);
- res = LLVMBuildInsertElement(builder, res, scalar, index, "");
- }
-#endif
- return res;
- }
+ return lp_build_broadcast(bld->gallivm, bld->vec_type, scalar);
}
More information about the mesa-commit
mailing list