From a140aeb6195553efeab703e7e21b1d553eef205e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Tue, 2 Jan 2018 03:59:43 +0100 Subject: [PATCH] ac: add ac_build_fmin/fmax helpers Reviewed-by: Samuel Pitoiset --- src/amd/common/ac_llvm_build.c | 32 ++++++++++++++++++-------------- src/amd/common/ac_llvm_build.h | 5 ++++- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index 8a3a2abf17b..efc6fa12e56 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -1222,6 +1222,22 @@ ac_build_umsb(struct ac_llvm_context *ctx, LLVMConstInt(ctx->i32, -1, true), msb, ""); } +LLVMValueRef ac_build_fmin(struct ac_llvm_context *ctx, LLVMValueRef a, + LLVMValueRef b) +{ + LLVMValueRef args[2] = {a, b}; + return ac_build_intrinsic(ctx, "llvm.minnum.f32", ctx->f32, args, 2, + AC_FUNC_ATTR_READNONE); +} + +LLVMValueRef ac_build_fmax(struct ac_llvm_context *ctx, LLVMValueRef a, + LLVMValueRef b) +{ + LLVMValueRef args[2] = {a, b}; + return ac_build_intrinsic(ctx, "llvm.maxnum.f32", ctx->f32, args, 2, + AC_FUNC_ATTR_READNONE); +} + LLVMValueRef ac_build_umin(struct ac_llvm_context *ctx, LLVMValueRef a, LLVMValueRef b) { @@ -1232,20 +1248,8 @@ LLVMValueRef ac_build_umin(struct ac_llvm_context *ctx, LLVMValueRef a, LLVMValueRef ac_build_clamp(struct ac_llvm_context *ctx, LLVMValueRef value) { if (HAVE_LLVM >= 0x0500) { - LLVMValueRef max[2] = { - value, - LLVMConstReal(ctx->f32, 0), - }; - LLVMValueRef min[2] = { - LLVMConstReal(ctx->f32, 1), - }; - - min[1] = ac_build_intrinsic(ctx, "llvm.maxnum.f32", - ctx->f32, max, 2, - AC_FUNC_ATTR_READNONE); - return ac_build_intrinsic(ctx, "llvm.minnum.f32", - ctx->f32, min, 2, - AC_FUNC_ATTR_READNONE); + return ac_build_fmin(ctx, ac_build_fmax(ctx, value, ctx->f32_0), + ctx->f32_1); } LLVMValueRef args[3] = { diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h index 3c81e2d43d3..e0fe0a58a46 100644 --- a/src/amd/common/ac_llvm_build.h +++ b/src/amd/common/ac_llvm_build.h @@ -244,7 +244,10 @@ LLVMValueRef ac_build_imsb(struct ac_llvm_context *ctx, LLVMValueRef ac_build_umsb(struct ac_llvm_context *ctx, LLVMValueRef arg, LLVMTypeRef dst_type); - +LLVMValueRef ac_build_fmin(struct ac_llvm_context *ctx, LLVMValueRef a, + LLVMValueRef b); +LLVMValueRef ac_build_fmax(struct ac_llvm_context *ctx, LLVMValueRef a, + LLVMValueRef b); LLVMValueRef ac_build_umin(struct ac_llvm_context *ctx, LLVMValueRef a, LLVMValueRef b); LLVMValueRef ac_build_clamp(struct ac_llvm_context *ctx, LLVMValueRef value); -- 2.30.2