Module: Mesa Branch: master Commit: d00fb7ce54ddedb611ab6085346cd25b0ee8a58e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d00fb7ce54ddedb611ab6085346cd25b0ee8a58e
Author: Daniel Schürmann <[email protected]> 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 <[email protected]> Reviewed-by: Samuel Pitoiset <[email protected]> --- 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); _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
