diff options
author | Jose Fonseca <jfonseca@vmware.com> | 2010-03-10 17:22:30 -0500 |
---|---|---|
committer | Zack Rusin <zackr@vmware.com> | 2010-03-10 17:22:30 -0500 |
commit | d42229707ad4be9be5a8e122354be7102d6ec348 (patch) | |
tree | 0a2d6c09e65f3be1a1961b5efc0eb09dfe011bd1 /src | |
parent | ac33e7752d22f03db84e6a4c822b3a3f41d05f77 (diff) |
gallivm: simplify conditional branching
Instead of testing each component individually, we can test the entire
vector at once.
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 29 |
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 aa57289395..b3a0fe7d9b 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"); |