On Thu, Nov 29, 2012 at 09:32:07PM +0100, Vincent Lejeune wrote:
> ---
>  src/gallium/drivers/r600/r600_llvm.c               | 23 
> ++++++++++++++++++++++
>  .../drivers/radeon/radeon_setup_tgsi_llvm.c        | 10 ++++++----
>  2 files changed, 29 insertions(+), 4 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/r600_llvm.c 
> b/src/gallium/drivers/r600/r600_llvm.c
> index 8f1ed26..350527b 100644
> --- a/src/gallium/drivers/r600/r600_llvm.c
> +++ b/src/gallium/drivers/r600/r600_llvm.c
> @@ -387,6 +387,27 @@ static void dp_fetch_args(
>       emit_data->dst_type = base->elem_type;
>  }
>  
> +static void llvm_fmul(
> +             const struct lp_build_tgsi_action * action,
> +             struct lp_build_tgsi_context * bld_base,
> +             struct lp_build_emit_data * emit_data)
> +{
> +     LLVMBuilderRef builder = bld_base->base.gallivm->builder;
> +     emit_data->output[emit_data->chan] = LLVMBuildFMul(builder,
> +             emit_data->args[0], emit_data->args[1], "");
> +}
> +
> +static void llvm_fmad(
> +             const struct lp_build_tgsi_action * action,
> +             struct lp_build_tgsi_context * bld_base,
> +             struct lp_build_emit_data * emit_data)
> +{
> +     LLVMBuilderRef builder = bld_base->base.gallivm->builder;
> +     emit_data->output[emit_data->chan] = LLVMBuildFAdd(builder,
> +             LLVMBuildFMul(builder, emit_data->args[0], emit_data->args[1], 
> ""),
> +             emit_data->args[2], "");
> +}
> +
>  static struct lp_build_tgsi_action dot_action = {
>       .fetch_args = dp_fetch_args,
>       .emit = build_tgsi_intrinsic_nomem,
> @@ -428,6 +449,8 @@ LLVMModuleRef r600_tgsi_llvm(
>       bld_base->op_actions[TGSI_OPCODE_TXQ].emit = llvm_emit_tex;
>       bld_base->op_actions[TGSI_OPCODE_TXP].emit = llvm_emit_tex;
>       bld_base->op_actions[TGSI_OPCODE_CMP].emit = emit_cndlt;
> +     bld_base->op_actions[TGSI_OPCODE_MUL].emit = llvm_fmul;
> +     bld_base->op_actions[TGSI_OPCODE_MAD].emit = llvm_fmad;
>  

In auxiliary/gallivm/lp_bld_tgsi_action.c, there are already default
implementations of these opcodes and they are the same as the ones
you've added.  So, all we need to do here is not overide the emit function
of these two opcodes.

>       lp_build_tgsi_llvm(bld_base, tokens);
>  
> diff --git a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c 
> b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
> index 5e3d6c2..cbcebbc 100644
> --- a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
> +++ b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
> @@ -547,12 +547,14 @@ static void emit_prepare_cube_coords(
>       mad_args[2] = LLVMConstReal(type, 1.5);
>  
>       mad_args[0] = coords[0];
> -     coords[0] = build_intrinsic(builder, "llvm.AMDIL.mad.",
> -                     type, mad_args, 3, LLVMReadNoneAttribute);
> +     coords[0] = LLVMBuildFAdd(builder,
> +                     LLVMBuildFMul(builder, mad_args[0], mad_args[1], ""),
> +                     mad_args[2], "");
> 

I would prefer we use:

lp_build_emit_llvm_ternary(bld_base, TGSI_OPCODE_MAD,
                           mad_args[0], mad_args[1], mad_args[2]);

 
>       mad_args[0] = coords[1];
> -     coords[1] = build_intrinsic(builder, "llvm.AMDIL.mad.",
> -                     type, mad_args, 3, LLVMReadNoneAttribute);
> +     coords[1] = LLVMBuildFAdd(builder,
> +                     LLVMBuildFMul(builder, mad_args[0], mad_args[1], ""),
> +                     mad_args[2], "");

You can use the helper function here too.

>  
>       /* apply yxwy swizzle to cooords */
>       coords[2] = coords[3];
> -- 
> 1.8.0
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to