From 1ad4a4eeb3fe83ce3ce7336250d725bf0a28de7b Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Thu, 4 Apr 2013 15:06:14 -0700 Subject: gallivm: fix breakc we break when the mask values are 0 not, 1, plus it's bit comparison not a floating point comparison. This fixes both. Signed-off-by: Zack Rusin Reviewed-by: Jose Fonseca Reviewed-by: Roland Scheidegger --- src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 26 +++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) (limited to 'src/gallium/auxiliary') diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c index d8c419b7ac6..1e062e94e93 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c @@ -217,15 +217,14 @@ static void lp_exec_break_condition(struct lp_exec_mask *mask, LLVMValueRef cond) { LLVMBuilderRef builder = mask->bld->gallivm->builder; - LLVMValueRef exec_mask = LLVMBuildNot(builder, + LLVMValueRef cond_mask = LLVMBuildAnd(builder, mask->exec_mask, - "break"); - - exec_mask = LLVMBuildAnd(builder, exec_mask, cond, ""); + cond, "cond_mask"); + cond_mask = LLVMBuildNot(builder, cond, "break_cond"); mask->break_mask = LLVMBuildAnd(builder, mask->break_mask, - exec_mask, "break_full"); + cond_mask, "breakc_full"); lp_exec_mask_update(mask); } @@ -287,14 +286,14 @@ static void lp_exec_endloop(struct gallivm_state *gallivm, builder, LLVMIntNE, LLVMBuildBitCast(builder, mask->exec_mask, reg_type, ""), - LLVMConstNull(reg_type), ""); + LLVMConstNull(reg_type), "i1cond"); /* i2cond = (looplimiter > 0) */ i2cond = LLVMBuildICmp( builder, LLVMIntSGT, limiter, - LLVMConstNull(int_type), ""); + LLVMConstNull(int_type), "i2cond"); /* if( i1cond && i2cond ) */ icond = LLVMBuildAnd(builder, i1cond, i2cond, ""); @@ -2298,13 +2297,16 @@ breakc_emit( struct lp_build_tgsi_context * bld_base, struct lp_build_emit_data * emit_data) { - LLVMValueRef tmp; struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); + LLVMBuilderRef builder = bld_base->base.gallivm->builder; + struct lp_build_context *uint_bld = &bld_base->uint_bld; + LLVMValueRef unsigned_cond = + LLVMBuildBitCast(builder, emit_data->args[0], uint_bld->vec_type, ""); + LLVMValueRef cond = lp_build_cmp(uint_bld, PIPE_FUNC_NOTEQUAL, + unsigned_cond, + uint_bld->zero); - tmp = lp_build_cmp(&bld_base->base, PIPE_FUNC_NOTEQUAL, - emit_data->args[0], bld->bld_base.base.zero); - - lp_exec_break_condition(&bld->exec_mask, tmp); + lp_exec_break_condition(&bld->exec_mask, cond); } static void -- cgit v1.2.3