gallivm: add selection for non-32 bit types
authorDave Airlie <airlied@redhat.com>
Thu, 5 Sep 2019 05:43:38 +0000 (15:43 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 28 Nov 2019 04:48:38 +0000 (14:48 +1000)
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_logic.c

index 8f551bb387abe15bf4b8723494981182b2b0117b..315977ae7450e619d6d6ff9d2c0ddc200f7adcb2 100644 (file)
@@ -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.