[Mesa-dev] [PATCH 1/2] ac: add ac_build_fmin/fmax helpers
Samuel Pitoiset
samuel.pitoiset at gmail.com
Thu Jan 4 09:18:51 UTC 2018
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
On 01/04/2018 01:55 AM, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
> 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 96ad715..7100e52 100644
> --- a/src/amd/common/ac_llvm_build.c
> +++ b/src/amd/common/ac_llvm_build.c
> @@ -1198,44 +1198,48 @@ ac_build_umsb(struct ac_llvm_context *ctx,
> msb = LLVMBuildSub(ctx->builder, LLVMConstInt(ctx->i32, 31, false),
> msb, "");
>
> /* check for zero */
> return LLVMBuildSelect(ctx->builder,
> LLVMBuildICmp(ctx->builder, LLVMIntEQ, arg,
> LLVMConstInt(ctx->i32, 0, 0), ""),
> 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)
> {
> LLVMValueRef cmp = LLVMBuildICmp(ctx->builder, LLVMIntULE, a, b, "");
> return LLVMBuildSelect(ctx->builder, cmp, a, b, "");
> }
>
> 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] = {
> value,
> LLVMConstReal(ctx->f32, 0),
> LLVMConstReal(ctx->f32, 1),
> };
>
> return ac_build_intrinsic(ctx, "llvm.AMDGPU.clamp.", ctx->f32, args, 3,
> AC_FUNC_ATTR_READNONE |
> diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h
> index 3e0285b..0deb5b5 100644
> --- a/src/amd/common/ac_llvm_build.h
> +++ b/src/amd/common/ac_llvm_build.h
> @@ -234,21 +234,24 @@ void ac_build_sendmsg(struct ac_llvm_context *ctx,
> uint32_t msg,
> LLVMValueRef wave_id);
>
> LLVMValueRef ac_build_imsb(struct ac_llvm_context *ctx,
> LLVMValueRef arg,
> LLVMTypeRef dst_type);
>
> 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);
>
> struct ac_export_args {
> LLVMValueRef out[4];
> unsigned target;
> unsigned enabled_channels;
> bool compr;
> bool done;
> bool valid_mask;
>
More information about the mesa-dev
mailing list