From: Marek Olšák <[email protected]>

---
 src/amd/common/ac_llvm_build.c           |  3 +--
 src/amd/common/ac_nir_to_llvm.c          |  7 ++-----
 src/gallium/drivers/radeonsi/si_shader.c | 17 +++++------------
 3 files changed, 8 insertions(+), 19 deletions(-)

diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c
index 6d5bfb1a1be..c741a1ab62d 100644
--- a/src/amd/common/ac_llvm_build.c
+++ b/src/amd/common/ac_llvm_build.c
@@ -755,22 +755,21 @@ ac_prepare_cube_coords(struct ac_llvm_context *ctx,
 
        /* Shift the texture coordinate. This must be applied after the
         * derivative calculation.
         */
        for (int i = 0; i < 2; ++i)
                coords[i] = LLVMBuildFAdd(builder, coords[i], 
LLVMConstReal(ctx->f32, 1.5), "");
 
        if (is_array) {
                /* for cube arrays coord.z = coord.w(array_index) * 8 + face */
                /* coords_arg.w component - array_index for cube arrays */
-               LLVMValueRef tmp = LLVMBuildFMul(ctx->builder, coords_arg[3], 
LLVMConstReal(ctx->f32, 8.0), "");
-               coords[2] = LLVMBuildFAdd(ctx->builder, tmp, coords[2], "");
+               coords[2] = ac_build_fmad(ctx, coords_arg[3], 
LLVMConstReal(ctx->f32, 8.0), coords[2]);
        }
 
        memcpy(coords_arg, coords, sizeof(coords));
 }
 
 
 LLVMValueRef
 ac_build_fs_interp(struct ac_llvm_context *ctx,
                   LLVMValueRef llvm_chan,
                   LLVMValueRef attr_number,
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 1584fef7ab7..537ac33c044 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -2846,25 +2846,22 @@ static LLVMValueRef visit_interp(struct ac_nir_context 
*ctx,
                                                                      ddxy_out, 
ix_ll, "");
                        LLVMValueRef ddy_el = 
LLVMBuildExtractElement(ctx->ac.builder,
                                                                      ddxy_out, 
iy_ll, "");
                        LLVMValueRef interp_el = 
LLVMBuildExtractElement(ctx->ac.builder,
                                                                         
interp_param, ix_ll, "");
                        LLVMValueRef temp1, temp2;
 
                        interp_el = LLVMBuildBitCast(ctx->ac.builder, interp_el,
                                                     ctx->ac.f32, "");
 
-                       temp1 = LLVMBuildFMul(ctx->ac.builder, ddx_el, src_c0, 
"");
-                       temp1 = LLVMBuildFAdd(ctx->ac.builder, temp1, 
interp_el, "");
-
-                       temp2 = LLVMBuildFMul(ctx->ac.builder, ddy_el, src_c1, 
"");
-                       temp2 = LLVMBuildFAdd(ctx->ac.builder, temp2, temp1, 
"");
+                       temp1 = ac_build_fmad(&ctx->ac, ddx_el, src_c0, 
interp_el);
+                       temp2 = ac_build_fmad(&ctx->ac, ddy_el, src_c1, temp1);
 
                        ij_out[i] = LLVMBuildBitCast(ctx->ac.builder,
                                                     temp2, ctx->ac.i32, "");
                }
                interp_param = ac_build_gather_values(&ctx->ac, ij_out, 2);
 
        }
 
        for (chan = 0; chan < 4; chan++) {
                LLVMValueRef llvm_chan = LLVMConstInt(ctx->ac.i32, chan, false);
diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 24ee45f578a..66fe5fad218 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -2652,24 +2652,22 @@ static void si_llvm_emit_clipvertex(struct 
si_shader_context *ctx,
                args->out[3] = LLVMConstReal(ctx->f32, 0.0f);
 
                /* Compute dot products of position and user clip plane vectors 
*/
                for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) {
                        for (const_chan = 0; const_chan < TGSI_NUM_CHANNELS; 
const_chan++) {
                                LLVMValueRef addr =
                                        LLVMConstInt(ctx->i32, ((reg_index * 4 
+ chan) * 4 +
                                                                const_chan) * 
4, 0);
                                base_elt = buffer_load_const(ctx, 
const_resource,
                                                             addr);
-                               args->out[chan] =
-                                       LLVMBuildFAdd(ctx->ac.builder, 
args->out[chan],
-                                                     
LLVMBuildFMul(ctx->ac.builder, base_elt,
-                                                                   
out_elts[const_chan], ""), "");
+                               args->out[chan] = ac_build_fmad(&ctx->ac, 
base_elt,
+                                                               
out_elts[const_chan], args->out[chan]);
                        }
                }
 
                args->enabled_channels = 0xf;
                args->valid_mask = 0;
                args->done = 0;
                args->target = V_008DFC_SQ_EXP_POS + 2 + reg_index;
                args->compr = 0;
        }
 }
@@ -4107,31 +4105,26 @@ static void build_interp_intrinsic(const struct 
lp_build_tgsi_action *action,
                 */
                for (i = 0; i < 2; i++) {
                        LLVMValueRef ix_ll = LLVMConstInt(ctx->i32, i, 0);
                        LLVMValueRef iy_ll = LLVMConstInt(ctx->i32, i + 2, 0);
                        LLVMValueRef ddx_el = 
LLVMBuildExtractElement(ctx->ac.builder,
                                                                      ddxy_out, 
ix_ll, "");
                        LLVMValueRef ddy_el = 
LLVMBuildExtractElement(ctx->ac.builder,
                                                                      ddxy_out, 
iy_ll, "");
                        LLVMValueRef interp_el = 
LLVMBuildExtractElement(ctx->ac.builder,
                                                                         
interp_param, ix_ll, "");
-                       LLVMValueRef temp1, temp2;
+                       LLVMValueRef temp;
 
                        interp_el = ac_to_float(&ctx->ac, interp_el);
 
-                       temp1 = LLVMBuildFMul(ctx->ac.builder, ddx_el, 
offset_x, "");
-
-                       temp1 = LLVMBuildFAdd(ctx->ac.builder, temp1, 
interp_el, "");
-
-                       temp2 = LLVMBuildFMul(ctx->ac.builder, ddy_el, 
offset_y, "");
-
-                       ij_out[i] = LLVMBuildFAdd(ctx->ac.builder, temp2, 
temp1, "");
+                       temp = ac_build_fmad(&ctx->ac, ddx_el, offset_x, 
interp_el);
+                       ij_out[i] = ac_build_fmad(&ctx->ac, ddy_el, offset_y, 
temp);
                }
                interp_param = ac_build_gather_values(&ctx->ac, ij_out, 2);
        }
 
        if (interp_param)
                interp_param = ac_to_float(&ctx->ac, interp_param);
 
        for (chan = 0; chan < 4; chan++) {
                LLVMValueRef gather = LLVMGetUndef(LLVMVectorType(ctx->f32, 
input_array_size));
                unsigned schan = 
tgsi_util_get_full_src_register_swizzle(&inst->Src[0], chan);
-- 
2.17.1

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to