[Mesa-dev] [PATCH 3/3] ac: add ac_build_fsign()

Timothy Arceri tarceri at itsqueeze.com
Sat Mar 3 02:05:02 UTC 2018


Looks good. For the series:

Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>

On 03/03/18 01:01, Samuel Pitoiset wrote:
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>   src/amd/common/ac_llvm_build.c                    | 23 +++++++++++++++++++
>   src/amd/common/ac_llvm_build.h                    |  3 +++
>   src/amd/common/ac_nir_to_llvm.c                   | 27 ++---------------------
>   src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c | 15 ++++---------
>   4 files changed, 32 insertions(+), 36 deletions(-)
> 
> diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c
> index cab8396f82..8140184b3b 100644
> --- a/src/amd/common/ac_llvm_build.c
> +++ b/src/amd/common/ac_llvm_build.c
> @@ -1731,6 +1731,29 @@ LLVMValueRef ac_build_isign(struct ac_llvm_context *ctx, LLVMValueRef src0,
>   	return val;
>   }
>   
> +LLVMValueRef ac_build_fsign(struct ac_llvm_context *ctx, LLVMValueRef src0,
> +			    unsigned bitsize)
> +{
> +	LLVMValueRef cmp, val, zero, one;
> +	LLVMTypeRef type;
> +
> +	if (bitsize == 32) {
> +		type = ctx->f32;
> +		zero = ctx->f32_0;
> +		one = ctx->f32_1;
> +	} else {
> +		type = ctx->f64;
> +		zero = ctx->f64_0;
> +		one = ctx->f64_1;
> +	}
> +
> +	cmp = LLVMBuildFCmp(ctx->builder, LLVMRealOGT, src0, zero, "");
> +	val = LLVMBuildSelect(ctx->builder, cmp, one, src0, "");
> +	cmp = LLVMBuildFCmp(ctx->builder, LLVMRealOGE, val, zero, "");
> +	val = LLVMBuildSelect(ctx->builder, cmp, val, LLVMConstReal(type, -1.0), "");
> +	return val;
> +}
> +
>   void ac_get_image_intr_name(const char *base_name,
>   			    LLVMTypeRef data_type,
>   			    LLVMTypeRef coords_type,
> diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h
> index 860c25f677..4eee9b32e9 100644
> --- a/src/amd/common/ac_llvm_build.h
> +++ b/src/amd/common/ac_llvm_build.h
> @@ -341,6 +341,9 @@ LLVMValueRef ac_build_fract(struct ac_llvm_context *ctx, LLVMValueRef src0,
>   LLVMValueRef ac_build_isign(struct ac_llvm_context *ctx, LLVMValueRef src0,
>   			    unsigned bitsize);
>   
> +LLVMValueRef ac_build_fsign(struct ac_llvm_context *ctx, LLVMValueRef src0,
> +			    unsigned bitsize);
> +
>   void ac_get_image_intr_name(const char *base_name,
>   			    LLVMTypeRef data_type,
>   			    LLVMTypeRef coords_type,
> diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
> index 676e3f04e0..6aacbbd315 100644
> --- a/src/amd/common/ac_nir_to_llvm.c
> +++ b/src/amd/common/ac_nir_to_llvm.c
> @@ -1338,30 +1338,6 @@ static LLVMValueRef emit_iabs(struct ac_llvm_context *ctx,
>   			       LLVMBuildNeg(ctx->builder, src0, ""));
>   }
>   
> -static LLVMValueRef emit_fsign(struct ac_llvm_context *ctx,
> -			       LLVMValueRef src0,
> -			       unsigned bitsize)
> -{
> -	LLVMValueRef cmp, val, zero, one;
> -	LLVMTypeRef type;
> -
> -	if (bitsize == 32) {
> -		type = ctx->f32;
> -		zero = ctx->f32_0;
> -		one = ctx->f32_1;
> -	} else {
> -		type = ctx->f64;
> -		zero = ctx->f64_0;
> -		one = ctx->f64_1;
> -	}
> -
> -	cmp = LLVMBuildFCmp(ctx->builder, LLVMRealOGT, src0, zero, "");
> -	val = LLVMBuildSelect(ctx->builder, cmp, one, src0, "");
> -	cmp = LLVMBuildFCmp(ctx->builder, LLVMRealOGE, val, zero, "");
> -	val = LLVMBuildSelect(ctx->builder, cmp, val, LLVMConstReal(type, -1.0), "");
> -	return val;
> -}
> -
>   static LLVMValueRef emit_uint_carry(struct ac_llvm_context *ctx,
>   				    const char *intrin,
>   				    LLVMValueRef src0, LLVMValueRef src1)
> @@ -1789,7 +1765,8 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
>   		break;
>   	case nir_op_fsign:
>   		src[0] = ac_to_float(&ctx->ac, src[0]);
> -		result = emit_fsign(&ctx->ac, src[0], instr->dest.dest.ssa.bit_size);
> +		result = ac_build_fsign(&ctx->ac, src[0],
> +					instr->dest.dest.ssa.bit_size);
>   		break;
>   	case nir_op_ffloor:
>   		result = emit_intrin_1f_param(&ctx->ac, "llvm.floor",
> diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
> index 87984934ca..201e4988fa 100644
> --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
> +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
> @@ -348,24 +348,17 @@ static void emit_ssg(const struct lp_build_tgsi_action *action,
>   		     struct lp_build_emit_data *emit_data)
>   {
>   	struct si_shader_context *ctx = si_shader_context(bld_base);
> -	LLVMBuilderRef builder = ctx->ac.builder;
>   
> -	LLVMValueRef cmp, val;
> +	LLVMValueRef  val;
>   
>   	if (emit_data->inst->Instruction.Opcode == TGSI_OPCODE_I64SSG) {
>   		val = ac_build_isign(&ctx->ac, emit_data->args[0], 64);
>   	} else if (emit_data->inst->Instruction.Opcode == TGSI_OPCODE_ISSG) {
>   		val = ac_build_isign(&ctx->ac, emit_data->args[0], 32);
>   	} else if (emit_data->inst->Instruction.Opcode == TGSI_OPCODE_DSSG) {
> -		cmp = LLVMBuildFCmp(builder, LLVMRealOGT, emit_data->args[0], bld_base->dbl_bld.zero, "");
> -		val = LLVMBuildSelect(builder, cmp, bld_base->dbl_bld.one, emit_data->args[0], "");
> -		cmp = LLVMBuildFCmp(builder, LLVMRealOGE, val, bld_base->dbl_bld.zero, "");
> -		val = LLVMBuildSelect(builder, cmp, val, LLVMConstReal(bld_base->dbl_bld.elem_type, -1), "");
> -	} else { // float SSG
> -		cmp = LLVMBuildFCmp(builder, LLVMRealOGT, emit_data->args[0], ctx->ac.f32_0, "");
> -		val = LLVMBuildSelect(builder, cmp, ctx->ac.f32_1, emit_data->args[0], "");
> -		cmp = LLVMBuildFCmp(builder, LLVMRealOGE, val, ctx->ac.f32_0, "");
> -		val = LLVMBuildSelect(builder, cmp, val, LLVMConstReal(ctx->f32, -1), "");
> +		val = ac_build_fsign(&ctx->ac, emit_data->args[0], 64);
> +	} else {
> +		val = ac_build_fsign(&ctx->ac, emit_data->args[0], 32);
>   	}
>   
>   	emit_data->output[emit_data->chan] = val;
> 


More information about the mesa-dev mailing list