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.
This commit is contained in:
José Fonseca 2010-05-09 22:31:18 +01:00
parent 648c9d5247
commit a09e46c724
1 changed files with 10 additions and 8 deletions

View File

@ -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;
}