From: Marek Olšák <marek.ol...@amd.com>

---
 src/gallium/drivers/radeonsi/si_shader.c      | 54 ++++++-------------
 .../drivers/radeonsi/si_shader_tgsi_mem.c     | 18 +++----
 .../drivers/radeonsi/si_shader_tgsi_setup.c   | 14 ++---
 3 files changed, 29 insertions(+), 57 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 29523474735..24ee45f578a 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -371,38 +371,32 @@ get_tcs_in_current_patch_offset(struct si_shader_context 
*ctx)
        return LLVMBuildMul(ctx->ac.builder, patch_stride, rel_patch_id, "");
 }
 
 static LLVMValueRef
 get_tcs_out_current_patch_offset(struct si_shader_context *ctx)
 {
        LLVMValueRef patch0_offset = get_tcs_out_patch0_offset(ctx);
        LLVMValueRef patch_stride = get_tcs_out_patch_stride(ctx);
        LLVMValueRef rel_patch_id = get_rel_patch_id(ctx);
 
-       return LLVMBuildAdd(ctx->ac.builder, patch0_offset,
-                           LLVMBuildMul(ctx->ac.builder, patch_stride,
-                                        rel_patch_id, ""),
-                           "");
+       return ac_build_imad(&ctx->ac, patch_stride, rel_patch_id, 
patch0_offset);
 }
 
 static LLVMValueRef
 get_tcs_out_current_patch_data_offset(struct si_shader_context *ctx)
 {
        LLVMValueRef patch0_patch_data_offset =
                get_tcs_out_patch0_patch_data_offset(ctx);
        LLVMValueRef patch_stride = get_tcs_out_patch_stride(ctx);
        LLVMValueRef rel_patch_id = get_rel_patch_id(ctx);
 
-       return LLVMBuildAdd(ctx->ac.builder, patch0_patch_data_offset,
-                           LLVMBuildMul(ctx->ac.builder, patch_stride,
-                                        rel_patch_id, ""),
-                           "");
+       return ac_build_imad(&ctx->ac, patch_stride, rel_patch_id, 
patch0_patch_data_offset);
 }
 
 static LLVMValueRef get_num_tcs_out_vertices(struct si_shader_context *ctx)
 {
        unsigned tcs_out_vertices =
                ctx->shader->selector ?
                
ctx->shader->selector->info.properties[TGSI_PROPERTY_TCS_VERTICES_OUT] : 0;
 
        /* If !tcs_out_vertices, it's either the fixed-func TCS or the TCS 
epilog. */
        if (ctx->type == PIPE_SHADER_TESS_CTRL && tcs_out_vertices)
@@ -808,26 +802,22 @@ LLVMValueRef si_get_indirect_index(struct 
si_shader_context *ctx,
                /* Set the second index to 0 for constants. */
                if (ind->File == TGSI_FILE_CONSTANT)
                        src.Register.Dimension = 1;
 
                result = 
ctx->bld_base.emit_fetch_funcs[ind->File](&ctx->bld_base, &src,
                                                                   
TGSI_TYPE_SIGNED,
                                                                   
ind->Swizzle);
                result = ac_to_integer(&ctx->ac, result);
        }
 
-       if (addr_mul != 1)
-               result = LLVMBuildMul(ctx->ac.builder, result,
-                                     LLVMConstInt(ctx->i32, addr_mul, 0), "");
-       result = LLVMBuildAdd(ctx->ac.builder, result,
-                             LLVMConstInt(ctx->i32, rel_index, 0), "");
-       return result;
+       return ac_build_imad(&ctx->ac, result, LLVMConstInt(ctx->i32, addr_mul, 
0),
+                            LLVMConstInt(ctx->i32, rel_index, 0));
 }
 
 /**
  * Like si_get_indirect_index, but restricts the return value to a (possibly
  * undefined) value inside [0..num).
  */
 LLVMValueRef si_get_bounded_indirect_index(struct si_shader_context *ctx,
                                           const struct tgsi_ind_register *ind,
                                           int rel_index, unsigned num)
 {
@@ -840,29 +830,27 @@ static LLVMValueRef 
get_dw_address_from_generic_indices(struct si_shader_context
                                                        LLVMValueRef 
vertex_dw_stride,
                                                        LLVMValueRef base_addr,
                                                        LLVMValueRef 
vertex_index,
                                                        LLVMValueRef 
param_index,
                                                        unsigned input_index,
                                                        ubyte *name,
                                                        ubyte *index,
                                                        bool is_patch)
 {
        if (vertex_dw_stride) {
-               base_addr = LLVMBuildAdd(ctx->ac.builder, base_addr,
-                                        LLVMBuildMul(ctx->ac.builder, 
vertex_index,
-                                                     vertex_dw_stride, ""), 
"");
+               base_addr = ac_build_imad(&ctx->ac, vertex_index,
+                                         vertex_dw_stride, base_addr);
        }
 
        if (param_index) {
-               base_addr = LLVMBuildAdd(ctx->ac.builder, base_addr,
-                                        LLVMBuildMul(ctx->ac.builder, 
param_index,
-                                                     LLVMConstInt(ctx->i32, 4, 
0), ""), "");
+               base_addr = ac_build_imad(&ctx->ac, param_index,
+                                         LLVMConstInt(ctx->i32, 4, 0), 
base_addr);
        }
 
        int param = is_patch ?
                si_shader_io_get_unique_index_patch(name[input_index],
                                                    index[input_index]) :
                si_shader_io_get_unique_index(name[input_index],
                                              index[input_index], false);
 
        /* Add the base address of the element. */
        return LLVMBuildAdd(ctx->ac.builder, base_addr,
@@ -968,36 +956,29 @@ static LLVMValueRef get_tcs_tes_buffer_address(struct 
si_shader_context *ctx,
        LLVMValueRef base_addr, vertices_per_patch, num_patches, total_vertices;
        LLVMValueRef param_stride, constant16;
 
        vertices_per_patch = get_num_tcs_out_vertices(ctx);
        num_patches = si_unpack_param(ctx, ctx->param_tcs_offchip_layout, 0, 6);
        total_vertices = LLVMBuildMul(ctx->ac.builder, vertices_per_patch,
                                      num_patches, "");
 
        constant16 = LLVMConstInt(ctx->i32, 16, 0);
        if (vertex_index) {
-               base_addr = LLVMBuildMul(ctx->ac.builder, rel_patch_id,
-                                        vertices_per_patch, "");
-
-               base_addr = LLVMBuildAdd(ctx->ac.builder, base_addr,
-                                        vertex_index, "");
-
+               base_addr = ac_build_imad(&ctx->ac, rel_patch_id,
+                                         vertices_per_patch, vertex_index);
                param_stride = total_vertices;
        } else {
                base_addr = rel_patch_id;
                param_stride = num_patches;
        }
 
-       base_addr = LLVMBuildAdd(ctx->ac.builder, base_addr,
-                                LLVMBuildMul(ctx->ac.builder, param_index,
-                                             param_stride, ""), "");
-
+       base_addr = ac_build_imad(&ctx->ac, param_index, param_stride, 
base_addr);
        base_addr = LLVMBuildMul(ctx->ac.builder, base_addr, constant16, "");
 
        if (!vertex_index) {
                LLVMValueRef patch_data_offset =
                           si_unpack_param(ctx, ctx->param_tcs_offchip_layout, 
12, 20);
 
                base_addr = LLVMBuildAdd(ctx->ac.builder, base_addr,
                                         patch_data_offset, "");
        }
        return base_addr;
@@ -2816,23 +2797,23 @@ static void si_llvm_emit_streamout(struct 
si_shader_context *ctx,
 
                        LLVMValueRef offset = LLVMConstInt(ctx->i32,
                                                           SI_VS_STREAMOUT_BUF0 
+ i, 0);
 
                        so_buffers[i] = ac_build_load_to_sgpr(&ctx->ac, 
buf_ptr, offset);
 
                        LLVMValueRef so_offset = LLVMGetParam(ctx->main_fn,
                                                              
ctx->param_streamout_offset[i]);
                        so_offset = LLVMBuildMul(builder, so_offset, 
LLVMConstInt(ctx->i32, 4, 0), "");
 
-                       so_write_offset[i] = LLVMBuildMul(builder, 
so_write_index,
-                                                         
LLVMConstInt(ctx->i32, so->stride[i]*4, 0), "");
-                       so_write_offset[i] = LLVMBuildAdd(builder, 
so_write_offset[i], so_offset, "");
+                       so_write_offset[i] = ac_build_imad(&ctx->ac, 
so_write_index,
+                                                          
LLVMConstInt(ctx->i32, so->stride[i]*4, 0),
+                                                          so_offset);
                }
 
                /* Write streamout data. */
                for (i = 0; i < so->num_outputs; i++) {
                        unsigned reg = so->output[i].register_index;
 
                        if (reg >= noutput)
                                continue;
 
                        if (stream != so->output[i].stream)
@@ -3051,32 +3032,31 @@ static void si_llvm_export_vs(struct si_shader_context 
*ctx,
 }
 
 /**
  * Forward all outputs from the vertex shader to the TES. This is only used
  * for the fixed function TCS.
  */
 static void si_copy_tcs_inputs(struct lp_build_tgsi_context *bld_base)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
        LLVMValueRef invocation_id, buffer, buffer_offset;
-       LLVMValueRef lds_vertex_stride, lds_vertex_offset, lds_base;
+       LLVMValueRef lds_vertex_stride, lds_base;
        uint64_t inputs;
 
        invocation_id = unpack_llvm_param(ctx, ctx->abi.tcs_rel_ids, 8, 5);
        buffer = get_tess_ring_descriptor(ctx, TESS_OFFCHIP_RING_TCS);
        buffer_offset = LLVMGetParam(ctx->main_fn, 
ctx->param_tcs_offchip_offset);
 
        lds_vertex_stride = get_tcs_in_vertex_dw_stride(ctx);
-       lds_vertex_offset = LLVMBuildMul(ctx->ac.builder, invocation_id,
-                                        lds_vertex_stride, "");
        lds_base = get_tcs_in_current_patch_offset(ctx);
-       lds_base = LLVMBuildAdd(ctx->ac.builder, lds_base, lds_vertex_offset, 
"");
+       lds_base = ac_build_imad(&ctx->ac, invocation_id, lds_vertex_stride,
+                                lds_base);
 
        inputs = ctx->shader->key.mono.u.ff_tcs_inputs_to_copy;
        while (inputs) {
                unsigned i = u_bit_scan64(&inputs);
 
                LLVMValueRef lds_ptr = LLVMBuildAdd(ctx->ac.builder, lds_base,
                                            LLVMConstInt(ctx->i32, 4 * i, 0),
                                             "");
 
                LLVMValueRef buffer_addr = get_tcs_tes_buffer_address(ctx,
diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c 
b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
index 72faf755ade..54a0413e464 100644
--- a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
+++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
@@ -175,24 +175,22 @@ static LLVMValueRef force_dcc_off(struct 
si_shader_context *ctx,
 }
 
 LLVMValueRef si_load_image_desc(struct si_shader_context *ctx,
                                LLVMValueRef list, LLVMValueRef index,
                                enum ac_descriptor_type desc_type, bool dcc_off)
 {
        LLVMBuilderRef builder = ctx->ac.builder;
        LLVMValueRef rsrc;
 
        if (desc_type == AC_DESC_BUFFER) {
-               index = LLVMBuildMul(builder, index,
-                                    LLVMConstInt(ctx->i32, 2, 0), "");
-               index = LLVMBuildAdd(builder, index,
-                                    ctx->i32_1, "");
+               index = ac_build_imad(&ctx->ac, index, LLVMConstInt(ctx->i32, 
2, 0),
+                                     ctx->i32_1);
                list = LLVMBuildPointerCast(builder, list,
                                            
ac_array_in_const32_addr_space(ctx->v4i32), "");
        } else {
                assert(desc_type == AC_DESC_IMAGE);
        }
 
        rsrc = ac_build_load_to_sgpr(&ctx->ac, list, index);
        if (desc_type == AC_DESC_IMAGE && dcc_off)
                rsrc = force_dcc_off(ctx, rsrc);
        return rsrc;
@@ -981,34 +979,34 @@ LLVMValueRef si_load_sampler_desc(struct 
si_shader_context *ctx,
 {
        LLVMBuilderRef builder = ctx->ac.builder;
 
        switch (type) {
        case AC_DESC_IMAGE:
                /* The image is at [0:7]. */
                index = LLVMBuildMul(builder, index, LLVMConstInt(ctx->i32, 2, 
0), "");
                break;
        case AC_DESC_BUFFER:
                /* The buffer is in [4:7]. */
-               index = LLVMBuildMul(builder, index, LLVMConstInt(ctx->i32, 4, 
0), "");
-               index = LLVMBuildAdd(builder, index, ctx->i32_1, "");
+               index = ac_build_imad(&ctx->ac, index, LLVMConstInt(ctx->i32, 
4, 0),
+                                     ctx->i32_1);
                list = LLVMBuildPointerCast(builder, list,
                                            
ac_array_in_const32_addr_space(ctx->v4i32), "");
                break;
        case AC_DESC_FMASK:
                /* The FMASK is at [8:15]. */
-               index = LLVMBuildMul(builder, index, LLVMConstInt(ctx->i32, 2, 
0), "");
-               index = LLVMBuildAdd(builder, index, ctx->i32_1, "");
+               index = ac_build_imad(&ctx->ac, index, LLVMConstInt(ctx->i32, 
2, 0),
+                                     ctx->i32_1);
                break;
        case AC_DESC_SAMPLER:
                /* The sampler state is at [12:15]. */
-               index = LLVMBuildMul(builder, index, LLVMConstInt(ctx->i32, 4, 
0), "");
-               index = LLVMBuildAdd(builder, index, LLVMConstInt(ctx->i32, 3, 
0), "");
+               index = ac_build_imad(&ctx->ac, index, LLVMConstInt(ctx->i32, 
4, 0),
+                                     LLVMConstInt(ctx->i32, 3, 0));
                list = LLVMBuildPointerCast(builder, list,
                                            
ac_array_in_const32_addr_space(ctx->v4i32), "");
                break;
        }
 
        return ac_build_load_to_sgpr(&ctx->ac, list, index);
 }
 
 /* Disable anisotropic filtering if BASE_LEVEL == LAST_LEVEL.
  *
diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c 
b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
index 975696d07ad..1f37b0ba37d 100644
--- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
+++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
@@ -245,21 +245,20 @@ get_array_range(struct lp_build_tgsi_context *bld_base,
  */
 static LLVMValueRef
 get_pointer_into_array(struct si_shader_context *ctx,
                       unsigned file,
                       unsigned swizzle,
                       unsigned reg_index,
                       const struct tgsi_ind_register *reg_indirect)
 {
        unsigned array_id;
        struct tgsi_array_info *array;
-       LLVMBuilderRef builder = ctx->ac.builder;
        LLVMValueRef idxs[2];
        LLVMValueRef index;
        LLVMValueRef alloca;
 
        if (file != TGSI_FILE_TEMPORARY)
                return NULL;
 
        array_id = get_temp_array_id(&ctx->bld_base, reg_index, reg_indirect);
        if (!array_id)
                return NULL;
@@ -283,29 +282,24 @@ get_pointer_into_array(struct si_shader_context *ctx,
         * TODO It should be possible to avoid the additional instructions
         * if LLVM is changed so that it guarantuees:
         * 1. the scratch space descriptor isolates the current wave (this
         *    could even save the scratch offset SGPR at the cost of an
         *    additional SALU instruction)
         * 2. the memory for allocas must be allocated at the _end_ of the
         *    scratch space (after spilled registers)
         */
        index = si_llvm_bound_index(ctx, index, array->range.Last - 
array->range.First + 1);
 
-       index = LLVMBuildMul(
-               builder, index,
-               LLVMConstInt(ctx->i32, util_bitcount(array->writemask), 0),
-               "");
-       index = LLVMBuildAdd(
-               builder, index,
-               LLVMConstInt(ctx->i32,
-                            util_bitcount(array->writemask & ((1 << swizzle) - 
1)), 0),
-               "");
+       index = ac_build_imad(&ctx->ac, index,
+                             LLVMConstInt(ctx->i32, 
util_bitcount(array->writemask), 0),
+                             LLVMConstInt(ctx->i32,
+                                          util_bitcount(array->writemask & ((1 
<< swizzle) - 1)), 0));
        idxs[0] = ctx->i32_0;
        idxs[1] = index;
        return LLVMBuildGEP(ctx->ac.builder, alloca, idxs, 2, "");
 }
 
 LLVMValueRef
 si_llvm_emit_fetch_64bit(struct lp_build_tgsi_context *bld_base,
                         LLVMTypeRef type,
                         LLVMValueRef ptr,
                         LLVMValueRef ptr2)
-- 
2.17.1

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

Reply via email to