summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2019-09-05 15:43:38 +1000
committerDave Airlie <[email protected]>2019-11-28 14:48:38 +1000
commit18ed09d4492f02275235dea6b210a6164871ab17 (patch)
treef5f50e2adde55a31d79480429d20df74fe801442 /src/gallium
parent9461f2b5df2f243896748d65d375ed12e1befe04 (diff)
gallivm: add selection for non-32 bit types
Reviewed-by: Roland Scheidegger <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_logic.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_logic.c b/src/gallium/auxiliary/gallivm/lp_bld_logic.c
index 8f551bb387a..315977ae745 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_logic.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_logic.c
@@ -257,6 +257,7 @@ lp_build_select_bitwise(struct lp_build_context *bld,
LLVMBuilderRef builder = bld->gallivm->builder;
struct lp_type type = bld->type;
LLVMValueRef res;
+ LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->gallivm, type);
assert(lp_check_value(type, a));
assert(lp_check_value(type, b));
@@ -266,11 +267,12 @@ lp_build_select_bitwise(struct lp_build_context *bld,
}
if(type.floating) {
- LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->gallivm, type);
a = LLVMBuildBitCast(builder, a, int_vec_type, "");
b = LLVMBuildBitCast(builder, b, int_vec_type, "");
}
+ if (type.width > 32)
+ mask = LLVMBuildSExt(builder, mask, int_vec_type, "");
a = LLVMBuildAnd(builder, a, mask, "");
/* This often gets translated to PANDN, but sometimes the NOT is
@@ -359,6 +361,11 @@ lp_build_select(struct lp_build_context *bld,
LLVMTypeRef arg_type;
LLVMValueRef args[3];
+ LLVMTypeRef mask_type = LLVMGetElementType(LLVMTypeOf(mask));
+ if (LLVMGetIntTypeWidth(mask_type) != type.width) {
+ LLVMTypeRef int_vec_type = LLVMVectorType(LLVMIntTypeInContext(lc, type.width), type.length);
+ mask = LLVMBuildSExt(builder, mask, int_vec_type, "");
+ }
/*
* There's only float blend in AVX but can just cast i32/i64
* to float.