Re: [Mesa-dev] [PATCH] ac: use llvm.amdgcn.fmed3 intrinsic for nir_op_fmed3

2019-03-27 Thread Bas Nieuwenhuizen
r-b

On Mon, Mar 25, 2019 at 1:34 PM Samuel Pitoiset
 wrote:
>
> Signed-off-by: Samuel Pitoiset 
> ---
>  src/amd/common/ac_llvm_build.c  | 27 +++
>  src/amd/common/ac_llvm_build.h  |  4 
>  src/amd/common/ac_nir_to_llvm.c | 13 +
>  3 files changed, 36 insertions(+), 8 deletions(-)
>
> diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c
> index 1123dce2cc8..04d4b377fd1 100644
> --- a/src/amd/common/ac_llvm_build.c
> +++ b/src/amd/common/ac_llvm_build.c
> @@ -2430,6 +2430,33 @@ void ac_build_waitcnt(struct ac_llvm_context *ctx, 
> unsigned simm16)
>ctx->voidt, args, 1, 0);
>  }
>
> +LLVMValueRef ac_build_fmed3(struct ac_llvm_context *ctx, LLVMValueRef src0,
> +   LLVMValueRef src1, LLVMValueRef src2,
> +   unsigned bitsize)
> +{
> +   LLVMTypeRef type;
> +   char *intr;
> +
> +   if (bitsize == 16) {
> +   intr = "llvm.amdgcn.fmed3.f16";
> +   type = ctx->f16;
> +   } else if (bitsize == 32) {
> +   intr = "llvm.amdgcn.fmed3.f32";
> +   type = ctx->f32;
> +   } else {
> +   intr = "llvm.amdgcn.fmed3.f64";
> +   type = ctx->f64;
> +   }
> +
> +   LLVMValueRef params[] = {
> +   src0,
> +   src1,
> +   src2,
> +   };
> +   return ac_build_intrinsic(ctx, intr, type, params, 3,
> + AC_FUNC_ATTR_READNONE);
> +}
> +
>  LLVMValueRef ac_build_fract(struct ac_llvm_context *ctx, LLVMValueRef src0,
> unsigned bitsize)
>  {
> diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h
> index 9151c743bed..14c1c56522b 100644
> --- a/src/amd/common/ac_llvm_build.h
> +++ b/src/amd/common/ac_llvm_build.h
> @@ -549,6 +549,10 @@ void ac_build_waitcnt(struct ac_llvm_context *ctx, 
> unsigned simm16);
>  LLVMValueRef ac_build_fract(struct ac_llvm_context *ctx, LLVMValueRef src0,
>unsigned bitsize);
>
> +LLVMValueRef ac_build_fmed3(struct ac_llvm_context *ctx, LLVMValueRef src0,
> +   LLVMValueRef src1, LLVMValueRef src2,
> +   unsigned bitsize);
> +
>  LLVMValueRef ac_build_isign(struct ac_llvm_context *ctx, LLVMValueRef src0,
> unsigned bitsize);
>
> diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
> index 675623cbfeb..7fd6437049a 100644
> --- a/src/amd/common/ac_nir_to_llvm.c
> +++ b/src/amd/common/ac_nir_to_llvm.c
> @@ -,14 +,11 @@ static void visit_alu(struct ac_nir_context *ctx, 
> const nir_alu_instr *instr)
> result = emit_minmax_int(>ac, LLVMIntSGT, result, 
> src[2]);
> break;
> case nir_op_fmed3: {
> -   LLVMValueRef tmp1 = emit_intrin_2f_param(>ac, 
> "llvm.minnum",
> -   ac_to_float_type(>ac, 
> def_type), src[0], src[1]);
> -   LLVMValueRef tmp2 = emit_intrin_2f_param(>ac, 
> "llvm.maxnum",
> -   ac_to_float_type(>ac, 
> def_type), src[0], src[1]);
> -   tmp2 = emit_intrin_2f_param(>ac, "llvm.minnum",
> -   ac_to_float_type(>ac, 
> def_type), tmp2, src[2]);
> -   result = emit_intrin_2f_param(>ac, "llvm.maxnum",
> -   ac_to_float_type(>ac, 
> def_type), tmp1, tmp2);
> +   src[0] = ac_to_float(>ac, src[0]);
> +   src[1] = ac_to_float(>ac, src[1]);
> +   src[2] = ac_to_float(>ac, src[2]);
> +   result = ac_build_fmed3(>ac, src[0], src[1], src[2],
> +   instr->dest.dest.ssa.bit_size);
> break;
> }
> case nir_op_imed3: {
> --
> 2.21.0
>
> ___
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

[Mesa-dev] [PATCH] ac: use llvm.amdgcn.fmed3 intrinsic for nir_op_fmed3

2019-03-25 Thread Samuel Pitoiset
Signed-off-by: Samuel Pitoiset 
---
 src/amd/common/ac_llvm_build.c  | 27 +++
 src/amd/common/ac_llvm_build.h  |  4 
 src/amd/common/ac_nir_to_llvm.c | 13 +
 3 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c
index 1123dce2cc8..04d4b377fd1 100644
--- a/src/amd/common/ac_llvm_build.c
+++ b/src/amd/common/ac_llvm_build.c
@@ -2430,6 +2430,33 @@ void ac_build_waitcnt(struct ac_llvm_context *ctx, 
unsigned simm16)
   ctx->voidt, args, 1, 0);
 }
 
+LLVMValueRef ac_build_fmed3(struct ac_llvm_context *ctx, LLVMValueRef src0,
+   LLVMValueRef src1, LLVMValueRef src2,
+   unsigned bitsize)
+{
+   LLVMTypeRef type;
+   char *intr;
+
+   if (bitsize == 16) {
+   intr = "llvm.amdgcn.fmed3.f16";
+   type = ctx->f16;
+   } else if (bitsize == 32) {
+   intr = "llvm.amdgcn.fmed3.f32";
+   type = ctx->f32;
+   } else {
+   intr = "llvm.amdgcn.fmed3.f64";
+   type = ctx->f64;
+   }
+
+   LLVMValueRef params[] = {
+   src0,
+   src1,
+   src2,
+   };
+   return ac_build_intrinsic(ctx, intr, type, params, 3,
+ AC_FUNC_ATTR_READNONE);
+}
+
 LLVMValueRef ac_build_fract(struct ac_llvm_context *ctx, LLVMValueRef src0,
unsigned bitsize)
 {
diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h
index 9151c743bed..14c1c56522b 100644
--- a/src/amd/common/ac_llvm_build.h
+++ b/src/amd/common/ac_llvm_build.h
@@ -549,6 +549,10 @@ void ac_build_waitcnt(struct ac_llvm_context *ctx, 
unsigned simm16);
 LLVMValueRef ac_build_fract(struct ac_llvm_context *ctx, LLVMValueRef src0,
   unsigned bitsize);
 
+LLVMValueRef ac_build_fmed3(struct ac_llvm_context *ctx, LLVMValueRef src0,
+   LLVMValueRef src1, LLVMValueRef src2,
+   unsigned bitsize);
+
 LLVMValueRef ac_build_isign(struct ac_llvm_context *ctx, LLVMValueRef src0,
unsigned bitsize);
 
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 675623cbfeb..7fd6437049a 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -,14 +,11 @@ static void visit_alu(struct ac_nir_context *ctx, const 
nir_alu_instr *instr)
result = emit_minmax_int(>ac, LLVMIntSGT, result, src[2]);
break;
case nir_op_fmed3: {
-   LLVMValueRef tmp1 = emit_intrin_2f_param(>ac, 
"llvm.minnum",
-   ac_to_float_type(>ac, 
def_type), src[0], src[1]);
-   LLVMValueRef tmp2 = emit_intrin_2f_param(>ac, 
"llvm.maxnum",
-   ac_to_float_type(>ac, 
def_type), src[0], src[1]);
-   tmp2 = emit_intrin_2f_param(>ac, "llvm.minnum",
-   ac_to_float_type(>ac, 
def_type), tmp2, src[2]);
-   result = emit_intrin_2f_param(>ac, "llvm.maxnum",
-   ac_to_float_type(>ac, 
def_type), tmp1, tmp2);
+   src[0] = ac_to_float(>ac, src[0]);
+   src[1] = ac_to_float(>ac, src[1]);
+   src[2] = ac_to_float(>ac, src[2]);
+   result = ac_build_fmed3(>ac, src[0], src[1], src[2],
+   instr->dest.dest.ssa.bit_size);
break;
}
case nir_op_imed3: {
-- 
2.21.0

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