diff options
author | José Fonseca <[email protected]> | 2010-05-09 22:31:18 +0100 |
---|---|---|
committer | José Fonseca <[email protected]> | 2010-05-12 20:40:31 +0100 |
commit | a09e46c72461183c879d8472b44fe740ecc79b9f (patch) | |
tree | fd3d9e01ba34dcd26173bc801fb2e9574ce80c51 | |
parent | 648c9d52477e410da374dbc97e3d68f599b2771f (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.
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_swizzle.c | 18 |
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 6a3c8f3f3a4..f095a39cf52 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; } |