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

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 9b85069860..e78f4e8dcd 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -2040,6 +2040,59 @@ static void visit_alu(struct ac_nir_context *ctx, const 
nir_alu_instr *instr)
                        in[chan] = ac_llvm_extract_elem(&ctx->ac, src[0], chan);
                result = ac_build_intrinsic(&ctx->ac,  "llvm.amdgcn.cubeid",
                                                ctx->ac.f32, in, 3, 
AC_FUNC_ATTR_READNONE);
+       }
+
+       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;
        }
 
-- 
2.14.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to