summaryrefslogtreecommitdiff
path: root/src/gallium/auxiliary
diff options
context:
space:
mode:
authorJosé Fonseca <jfonseca@vmware.com>2010-05-09 22:31:18 +0100
committerJosé Fonseca <jfonseca@vmware.com>2010-05-12 20:40:31 +0100
commita09e46c72461183c879d8472b44fe740ecc79b9f (patch)
treefd3d9e01ba34dcd26173bc801fb2e9574ce80c51 /src/gallium/auxiliary
parent648c9d52477e410da374dbc97e3d68f599b2771f (diff)
gallivm: Use a more compact approach for lp_build_broadcast_scalar().
It produces exactly the same machine code, but it cuts 5% of the number of instructions generated for a typical shader. Also, preserve the scalar when length is 1.
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_swizzle.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_swizzle.c b/src/gallium/auxiliary/gallivm/lp_bld_swizzle.c
index 6a3c8f3f3a..f095a39cf5 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_swizzle.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_swizzle.c
@@ -68,18 +68,20 @@ lp_build_broadcast_scalar(struct lp_build_context *bld,
LLVMValueRef scalar)
{
const struct lp_type type = bld->type;
- LLVMValueRef res;
- unsigned i;
assert(lp_check_elem_type(type, LLVMTypeOf(scalar)));
- res = bld->undef;
- for(i = 0; i < type.length; ++i) {
- LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), i, 0);
- res = LLVMBuildInsertElement(bld->builder, res, scalar, index, "");
+ if (type.length == 1) {
+ return scalar;
+ }
+ else {
+ LLVMValueRef res;
+ res = LLVMBuildInsertElement(bld->builder, bld->undef, scalar,
+ LLVMConstInt(LLVMInt32Type(), 0, 0), "");
+ res = LLVMBuildShuffleVector(bld->builder, res, bld->undef,
+ lp_build_const_int_vec(type, 0), "");
+ return res;
}
-
- return res;
}