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

---
 src/gallium/drivers/radeonsi/si_shader.c | 82 ++++++++++++++------------------
 1 file changed, 35 insertions(+), 47 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 7d92425..67ab16b 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -343,56 +343,60 @@ get_tcs_out_current_patch_data_offset(struct 
si_shader_context *ctx)
                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(gallivm->builder, patch0_patch_data_offset,
                            LLVMBuildMul(gallivm->builder, patch_stride,
                                         rel_patch_id, ""),
                            "");
 }
 
+static LLVMValueRef build_gep0(struct si_shader_context *ctx,
+                              LLVMValueRef base_ptr, LLVMValueRef index)
+{
+       LLVMValueRef indices[2] = {
+               LLVMConstInt(ctx->i32, 0, 0),
+               index,
+       };
+       return LLVMBuildGEP(ctx->radeon_bld.gallivm.builder, base_ptr,
+                           indices, 2, "");
+}
+
 static void build_indexed_store(struct si_shader_context *ctx,
                                LLVMValueRef base_ptr, LLVMValueRef index,
                                LLVMValueRef value)
 {
        struct lp_build_tgsi_context *bld_base = &ctx->radeon_bld.soa.bld_base;
        struct gallivm_state *gallivm = bld_base->base.gallivm;
-       LLVMValueRef indices[2], pointer;
-
-       indices[0] = bld_base->uint_bld.zero;
-       indices[1] = index;
 
-       pointer = LLVMBuildGEP(gallivm->builder, base_ptr, indices, 2, "");
-       LLVMBuildStore(gallivm->builder, value, pointer);
+       LLVMBuildStore(gallivm->builder, value,
+                      build_gep0(ctx, base_ptr, index));
 }
 
 /**
  * Build an LLVM bytecode indexed load using LLVMBuildGEP + LLVMBuildLoad.
  * It's equivalent to doing a load from &base_ptr[index].
  *
  * \param base_ptr  Where the array starts.
  * \param index     The element index into the array.
  * \param uniform   Whether the base_ptr and index can be assumed to be
  *                  dynamically uniform
  */
 static LLVMValueRef build_indexed_load(struct si_shader_context *ctx,
                                       LLVMValueRef base_ptr, LLVMValueRef 
index,
                                       bool uniform)
 {
        struct lp_build_tgsi_context *bld_base = &ctx->radeon_bld.soa.bld_base;
        struct gallivm_state *gallivm = bld_base->base.gallivm;
-       LLVMValueRef indices[2], pointer;
-
-       indices[0] = bld_base->uint_bld.zero;
-       indices[1] = index;
+       LLVMValueRef pointer;
 
-       pointer = LLVMBuildGEP(gallivm->builder, base_ptr, indices, 2, "");
+       pointer = build_gep0(ctx, base_ptr, index);
        if (uniform)
                LLVMSetMetadata(pointer, ctx->uniform_md_kind, ctx->empty_md);
        return LLVMBuildLoad(gallivm->builder, pointer, "");
 }
 
 /**
  * Do a load from &base_ptr[index], but also add a flag that it's loading
  * a constant from a dynamically uniform index.
  */
 static LLVMValueRef build_indexed_load_const(
@@ -4996,54 +5000,47 @@ static void si_llvm_emit_txqs(
 
 static void si_llvm_emit_ddxy(
        const struct lp_build_tgsi_action *action,
        struct lp_build_tgsi_context *bld_base,
        struct lp_build_emit_data *emit_data)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
        struct gallivm_state *gallivm = bld_base->base.gallivm;
        const struct tgsi_full_instruction *inst = emit_data->inst;
        unsigned opcode = inst->Instruction.Opcode;
-       LLVMValueRef indices[2];
-       LLVMValueRef store_ptr, load_ptr0, load_ptr1;
+       LLVMValueRef store_ptr, load_ptr0, load_ptr1, thread_id;
        LLVMValueRef tl, trbl, result[4];
        LLVMValueRef tl_tid, trbl_tid;
        unsigned swizzle[4];
        unsigned c;
        int idx;
        unsigned mask;
 
-       indices[0] = bld_base->uint_bld.zero;
-       indices[1] = get_thread_id(ctx);
-       store_ptr = LLVMBuildGEP(gallivm->builder, ctx->lds,
-                                indices, 2, "");
+       thread_id = get_thread_id(ctx);;
+       store_ptr = build_gep0(ctx, ctx->lds, thread_id);
 
        if (opcode == TGSI_OPCODE_DDX_FINE)
                mask = TID_MASK_LEFT;
        else if (opcode == TGSI_OPCODE_DDY_FINE)
                mask = TID_MASK_TOP;
        else
                mask = TID_MASK_TOP_LEFT;
 
-       tl_tid = LLVMBuildAnd(gallivm->builder, indices[1],
+       tl_tid = LLVMBuildAnd(gallivm->builder, thread_id,
                                lp_build_const_int32(gallivm, mask), "");
-       indices[1] = tl_tid;
-       load_ptr0 = LLVMBuildGEP(gallivm->builder, ctx->lds,
-                                indices, 2, "");
+       load_ptr0 = build_gep0(ctx, ctx->lds, tl_tid);
 
        /* for DDX we want to next X pixel, DDY next Y pixel. */
        idx = (opcode == TGSI_OPCODE_DDX || opcode == TGSI_OPCODE_DDX_FINE) ? 1 
: 2;
-       trbl_tid = LLVMBuildAdd(gallivm->builder, indices[1],
+       trbl_tid = LLVMBuildAdd(gallivm->builder, tl_tid,
                                  lp_build_const_int32(gallivm, idx), "");
-       indices[1] = trbl_tid;
-       load_ptr1 = LLVMBuildGEP(gallivm->builder, ctx->lds,
-                                indices, 2, "");
+       load_ptr1 = build_gep0(ctx, ctx->lds, trbl_tid);
 
        for (c = 0; c < 4; ++c) {
                unsigned i;
                LLVMValueRef val;
                LLVMValueRef args[2];
 
                swizzle[c] = 
tgsi_util_get_full_src_register_swizzle(&inst->Src[0], c);
                for (i = 0; i < c; ++i) {
                        if (swizzle[i] == swizzle[c]) {
                                result[c] = result[i];
@@ -5088,53 +5085,44 @@ static void si_llvm_emit_ddxy(
  * this takes an I,J coordinate pair,
  * and works out the X and Y derivatives.
  * it returns DDX(I), DDX(J), DDY(I), DDY(J).
  */
 static LLVMValueRef si_llvm_emit_ddxy_interp(
        struct lp_build_tgsi_context *bld_base,
        LLVMValueRef interp_ij)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
        struct gallivm_state *gallivm = bld_base->base.gallivm;
-       LLVMValueRef indices[2];
        LLVMValueRef store_ptr, load_ptr_x, load_ptr_y, load_ptr_ddx, 
load_ptr_ddy, temp, temp2;
-       LLVMValueRef tl, tr, bl, result[4];
+       LLVMValueRef tl, tr, bl, result[4], thread_id;
        unsigned c;
 
-       indices[0] = bld_base->uint_bld.zero;
-       indices[1] = get_thread_id(ctx);
-       store_ptr = LLVMBuildGEP(gallivm->builder, ctx->lds,
-                                indices, 2, "");
+       thread_id = get_thread_id(ctx);
+       store_ptr = build_gep0(ctx, ctx->lds, thread_id);
 
-       temp = LLVMBuildAnd(gallivm->builder, indices[1],
+       temp = LLVMBuildAnd(gallivm->builder, thread_id,
                            lp_build_const_int32(gallivm, TID_MASK_LEFT), "");
 
-       temp2 = LLVMBuildAnd(gallivm->builder, indices[1],
+       temp2 = LLVMBuildAnd(gallivm->builder, thread_id,
                             lp_build_const_int32(gallivm, TID_MASK_TOP), "");
 
-       indices[1] = temp;
-       load_ptr_x = LLVMBuildGEP(gallivm->builder, ctx->lds,
-                                 indices, 2, "");
+       load_ptr_x = build_gep0(ctx, ctx->lds, temp);
 
-       indices[1] = temp2;
-       load_ptr_y = LLVMBuildGEP(gallivm->builder, ctx->lds,
-                                 indices, 2, "");
+       load_ptr_y = build_gep0(ctx, ctx->lds, temp2);
 
-       indices[1] = LLVMBuildAdd(gallivm->builder, temp,
-                                 lp_build_const_int32(gallivm, 1), "");
-       load_ptr_ddx = LLVMBuildGEP(gallivm->builder, ctx->lds,
-                                  indices, 2, "");
+       load_ptr_ddx = build_gep0(ctx, ctx->lds,
+                                 LLVMBuildAdd(gallivm->builder, temp,
+                                              lp_build_const_int32(gallivm, 
1), ""));
 
-       indices[1] = LLVMBuildAdd(gallivm->builder, temp2,
-                                 lp_build_const_int32(gallivm, 2), "");
-       load_ptr_ddy = LLVMBuildGEP(gallivm->builder, ctx->lds,
-                                  indices, 2, "");
+       load_ptr_ddy = build_gep0(ctx, ctx->lds,
+                                 LLVMBuildAdd(gallivm->builder, temp2,
+                                              lp_build_const_int32(gallivm, 
2), ""));
 
        for (c = 0; c < 2; ++c) {
                LLVMValueRef store_val;
                LLVMValueRef c_ll = lp_build_const_int32(gallivm, c);
 
                store_val = LLVMBuildExtractElement(gallivm->builder,
                                                    interp_ij, c_ll, "");
                LLVMBuildStore(gallivm->builder,
                               store_val,
                               store_ptr);
-- 
2.7.4

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

Reply via email to