summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/gallivm
diff options
context:
space:
mode:
authorJose Fonseca <[email protected]>2010-03-10 17:22:30 -0500
committerZack Rusin <[email protected]>2010-03-10 17:22:30 -0500
commitd42229707ad4be9be5a8e122354be7102d6ec348 (patch)
tree0a2d6c09e65f3be1a1961b5efc0eb09dfe011bd1 /src/gallium/auxiliary/gallivm
parentac33e7752d22f03db84e6a4c822b3a3f41d05f77 (diff)
gallivm: simplify conditional branching
Instead of testing each component individually, we can test the entire vector at once.
Diffstat (limited to 'src/gallium/auxiliary/gallivm')
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c29
1 files changed, 8 insertions, 21 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
index aa57289395e..b3a0fe7d9be 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
@@ -276,27 +276,14 @@ static void lp_exec_continue(struct lp_exec_mask *mask)
static void lp_exec_endloop(struct lp_exec_mask *mask)
{
LLVMBasicBlockRef endloop;
- LLVMValueRef i1cond;
-
- { /* convert our soa vector into i1 */
- int i;
- LLVMValueRef packed = 0;
- for (i = 0; i < mask->bld->type.length; ++i) {
- LLVMValueRef component = LLVMBuildExtractElement(
- mask->bld->builder,
- mask->break_mask,
- LLVMConstInt(LLVMInt32Type(), i, 0), "");
- if (packed)
- packed = LLVMBuildOr(mask->bld->builder,
- packed, component, "");
- else
- packed = component;
- }
- i1cond = LLVMBuildICmp(mask->bld->builder, LLVMIntNE,
- packed,
- LLVMConstNull(LLVMTypeOf(packed)),
- "");
- }
+ LLVMTypeRef reg_type = LLVMIntType(mask->bld->type.width*
+ mask->bld->type.length);
+ /* i1cond = (mask == 0) */
+ LLVMValueRef i1cond = LLVMBuildICmp(
+ mask->bld->builder,
+ LLVMIntNE,
+ LLVMBuildBitCast(mask->bld->builder, mask->break_mask, reg_type, ""),
+ LLVMConstNull(reg_type), "");
endloop = lp_build_insert_new_block(mask->bld->builder, "endloop");