ac/nir: implement nir_op_{b2i,i2b}
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Sat, 24 Jun 2017 18:39:39 +0000 (20:39 +0200)
committerDave Airlie <airlied@redhat.com>
Tue, 27 Jun 2017 00:28:30 +0000 (10:28 +1000)
Booleans in NIR are ~0 for true, b2i returns 0/1.

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/amd/common/ac_nir_to_llvm.c

index 00efd8780a494995e8b486c50389a341ff07de53..8c781f2a79ee62cc3335f547251af1d6b225af59 100644 (file)
@@ -1287,6 +1287,20 @@ static LLVMValueRef emit_b2f(struct nir_to_llvm_context *ctx,
        return LLVMBuildAnd(ctx->builder, src0, LLVMBuildBitCast(ctx->builder, LLVMConstReal(ctx->f32, 1.0), ctx->i32, ""), "");
 }
 
+static LLVMValueRef emit_b2i(struct ac_llvm_context *ctx,
+                            LLVMValueRef src0)
+{
+       return LLVMBuildAnd(ctx->builder, src0, ctx->i32_1, "");
+}
+
+static LLVMValueRef emit_i2b(struct ac_llvm_context *ctx,
+                            LLVMValueRef src0)
+{
+       return LLVMBuildSExt(ctx->builder,
+                            LLVMBuildICmp(ctx->builder, LLVMIntNE, src0, ctx->i32_0, ""),
+                            ctx->i32, "");
+}
+
 static LLVMValueRef emit_f2f16(struct nir_to_llvm_context *ctx,
                               LLVMValueRef src0)
 {
@@ -1808,6 +1822,12 @@ static void visit_alu(struct nir_to_llvm_context *ctx, const nir_alu_instr *inst
        case nir_op_b2f:
                result = emit_b2f(ctx, src[0]);
                break;
+       case nir_op_b2i:
+               result = emit_b2i(&ctx->ac, src[0]);
+               break;
+       case nir_op_i2b:
+               result = emit_i2b(&ctx->ac, src[0]);
+               break;
        case nir_op_fquantize2f16:
                result = emit_f2f16(ctx, src[0]);
                break;