From 3d417121937f78e405ebb33dc6bbd0373689bd73 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Tue, 8 Dec 2020 19:25:51 -0500 Subject: [PATCH] ac/llvm: handle no_(un)signed_wrap NIR flags MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Timur Kristóf Reviewed-by: Connor Abbott Part-of: --- src/amd/llvm/ac_nir_to_llvm.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index 4d5714f..8551b90 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -605,13 +605,23 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr) } break; case nir_op_ineg: - result = LLVMBuildNeg(ctx->ac.builder, src[0], ""); + if (instr->no_unsigned_wrap) + result = LLVMBuildNUWNeg(ctx->ac.builder, src[0], ""); + else if (instr->no_signed_wrap) + result = LLVMBuildNSWNeg(ctx->ac.builder, src[0], ""); + else + result = LLVMBuildNeg(ctx->ac.builder, src[0], ""); break; case nir_op_inot: result = LLVMBuildNot(ctx->ac.builder, src[0], ""); break; case nir_op_iadd: - result = LLVMBuildAdd(ctx->ac.builder, src[0], src[1], ""); + if (instr->no_unsigned_wrap) + result = LLVMBuildNUWAdd(ctx->ac.builder, src[0], src[1], ""); + else if (instr->no_signed_wrap) + result = LLVMBuildNSWAdd(ctx->ac.builder, src[0], src[1], ""); + else + result = LLVMBuildAdd(ctx->ac.builder, src[0], src[1], ""); break; case nir_op_fadd: src[0] = ac_to_float(&ctx->ac, src[0]); @@ -624,10 +634,20 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr) result = LLVMBuildFSub(ctx->ac.builder, src[0], src[1], ""); break; case nir_op_isub: - result = LLVMBuildSub(ctx->ac.builder, src[0], src[1], ""); + if (instr->no_unsigned_wrap) + result = LLVMBuildNUWSub(ctx->ac.builder, src[0], src[1], ""); + else if (instr->no_signed_wrap) + result = LLVMBuildNSWSub(ctx->ac.builder, src[0], src[1], ""); + else + result = LLVMBuildSub(ctx->ac.builder, src[0], src[1], ""); break; case nir_op_imul: - result = LLVMBuildMul(ctx->ac.builder, src[0], src[1], ""); + if (instr->no_unsigned_wrap) + result = LLVMBuildNUWMul(ctx->ac.builder, src[0], src[1], ""); + else if (instr->no_signed_wrap) + result = LLVMBuildNSWMul(ctx->ac.builder, src[0], src[1], ""); + else + result = LLVMBuildMul(ctx->ac.builder, src[0], src[1], ""); break; case nir_op_imod: result = LLVMBuildSRem(ctx->ac.builder, src[0], src[1], ""); -- 2.7.4