Mesa (master): ac: add support for trinary_minmax instructions

Bas Nieuwenhuizen bnieuwenhuizen at kemper.freedesktop.org
Wed Mar 28 23:32:23 UTC 2018


Module: Mesa
Branch: master
Commit: d00fb7ce54ddedb611ab6085346cd25b0ee8a58e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d00fb7ce54ddedb611ab6085346cd25b0ee8a58e

Author: Daniel Schürmann <daniel.schuermann at campus.tu-berlin.de>
Date:   Thu Mar  8 22:45:04 2018 +0100

ac: add support for trinary_minmax instructions

v2: Add missing break (Bas)

Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>

---

 src/amd/common/ac_nir_to_llvm.c | 54 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 2da73a7bfb..7efbe4b31a 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -963,6 +963,60 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
 		break;
 	}
 
+	case nir_op_fmin3:
+		result = emit_intrin_2f_param(&ctx->ac, "llvm.minnum",
+						ac_to_float_type(&ctx->ac, def_type), src[0], src[1]);
+		result = emit_intrin_2f_param(&ctx->ac, "llvm.minnum",
+						ac_to_float_type(&ctx->ac, def_type), result, src[2]);
+		break;
+	case nir_op_umin3:
+		result = emit_minmax_int(&ctx->ac, LLVMIntULT, src[0], src[1]);
+		result = emit_minmax_int(&ctx->ac, LLVMIntULT, result, src[2]);
+		break;
+	case nir_op_imin3:
+		result = emit_minmax_int(&ctx->ac, LLVMIntSLT, src[0], src[1]);
+		result = emit_minmax_int(&ctx->ac, LLVMIntSLT, result, src[2]);
+		break;
+	case nir_op_fmax3:
+		result = emit_intrin_2f_param(&ctx->ac, "llvm.maxnum",
+						ac_to_float_type(&ctx->ac, def_type), src[0], src[1]);
+		result = emit_intrin_2f_param(&ctx->ac, "llvm.maxnum",
+						ac_to_float_type(&ctx->ac, def_type), result, src[2]);
+		break;
+	case nir_op_umax3:
+		result = emit_minmax_int(&ctx->ac, LLVMIntUGT, src[0], src[1]);
+		result = emit_minmax_int(&ctx->ac, LLVMIntUGT, result, src[2]);
+		break;
+	case nir_op_imax3:
+		result = emit_minmax_int(&ctx->ac, LLVMIntSGT, src[0], src[1]);
+		result = emit_minmax_int(&ctx->ac, LLVMIntSGT, result, src[2]);
+		break;
+	case nir_op_fmed3: {
+		LLVMValueRef tmp1 = emit_intrin_2f_param(&ctx->ac, "llvm.minnum",
+						ac_to_float_type(&ctx->ac, def_type), src[0], src[1]);
+		LLVMValueRef tmp2 = emit_intrin_2f_param(&ctx->ac, "llvm.maxnum",
+						ac_to_float_type(&ctx->ac, def_type), src[0], src[1]);
+		tmp2 = emit_intrin_2f_param(&ctx->ac, "llvm.minnum",
+						ac_to_float_type(&ctx->ac, def_type), tmp2, src[2]);
+		result = emit_intrin_2f_param(&ctx->ac, "llvm.maxnum",
+						ac_to_float_type(&ctx->ac, def_type), tmp1, tmp2);
+		break;
+	}
+	case nir_op_imed3: {
+		LLVMValueRef tmp1 = emit_minmax_int(&ctx->ac, LLVMIntSLT, src[0], src[1]);
+		LLVMValueRef tmp2 = emit_minmax_int(&ctx->ac, LLVMIntSGT, src[0], src[1]);
+		tmp2 = emit_minmax_int(&ctx->ac, LLVMIntSLT, tmp2, src[2]);
+		result = emit_minmax_int(&ctx->ac, LLVMIntSGT, tmp1, tmp2);
+		break;
+	}
+	case nir_op_umed3: {
+		LLVMValueRef tmp1 = emit_minmax_int(&ctx->ac, LLVMIntULT, src[0], src[1]);
+		LLVMValueRef tmp2 = emit_minmax_int(&ctx->ac, LLVMIntUGT, src[0], src[1]);
+		tmp2 = emit_minmax_int(&ctx->ac, LLVMIntULT, tmp2, src[2]);
+		result = emit_minmax_int(&ctx->ac, LLVMIntUGT, tmp1, tmp2);
+		break;
+	}
+
 	default:
 		fprintf(stderr, "Unknown NIR alu instr: ");
 		nir_print_instr(&instr->instr, stderr);




More information about the mesa-commit mailing list