diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/amd/common/ac_llvm_build.c | 32 | ||||
-rw-r--r-- | 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); |