ac/nir: make ac_build_isign work on all bit sizes

v2: don't use ac_get_zero(), ac_get_one() and ac_int_of_size()

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
This commit is contained in:
Rhys Perry 2018-12-06 14:27:01 +00:00
parent bbbfdef683
commit 6790b3a8db

View file

@ -2078,30 +2078,11 @@ LLVMValueRef ac_build_fract(struct ac_llvm_context *ctx, LLVMValueRef src0,
LLVMValueRef ac_build_isign(struct ac_llvm_context *ctx, LLVMValueRef src0,
unsigned bitsize)
{
LLVMValueRef cmp, val, zero, one;
LLVMTypeRef type;
switch (bitsize) {
case 64:
type = ctx->i64;
zero = ctx->i64_0;
one = ctx->i64_1;
break;
case 32:
type = ctx->i32;
zero = ctx->i32_0;
one = ctx->i32_1;
break;
case 16:
type = ctx->i16;
zero = ctx->i16_0;
one = ctx->i16_1;
break;
default:
unreachable(!"invalid bitsize");
break;
}
LLVMTypeRef type = LLVMIntTypeInContext(ctx->context, bitsize);
LLVMValueRef zero = LLVMConstInt(type, 0, false);
LLVMValueRef one = LLVMConstInt(type, 1, false);
LLVMValueRef cmp, val;
cmp = LLVMBuildICmp(ctx->builder, LLVMIntSGT, src0, zero, "");
val = LLVMBuildSelect(ctx->builder, cmp, one, src0, "");
cmp = LLVMBuildICmp(ctx->builder, LLVMIntSGE, val, zero, "");