---
 src/amd/common/ac_llvm_build.c  | 22 ++++++++++++++++++++++
 src/amd/common/ac_llvm_build.h  |  4 ++++
 src/amd/common/ac_nir_to_llvm.c | 34 ++++++----------------------------
 3 files changed, 32 insertions(+), 28 deletions(-)

diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c
index 5640a23b8a..b2bf1bf7b5 100644
--- a/src/amd/common/ac_llvm_build.c
+++ b/src/amd/common/ac_llvm_build.c
@@ -363,20 +363,42 @@ ac_build_vote_eq(struct ac_llvm_context *ctx, 
LLVMValueRef value)
        LLVMValueRef vote_set = ac_build_ballot(ctx, value);
 
        LLVMValueRef all = LLVMBuildICmp(ctx->builder, LLVMIntEQ,
                                         vote_set, active_set, "");
        LLVMValueRef none = LLVMBuildICmp(ctx->builder, LLVMIntEQ,
                                          vote_set,
                                          LLVMConstInt(ctx->i64, 0, 0), "");
        return LLVMBuildOr(ctx->builder, all, none, "");
 }
 
+LLVMValueRef
+ac_build_varying_gather_values(struct ac_llvm_context *ctx, LLVMValueRef 
*values,
+                              unsigned value_count, unsigned component)
+{
+       LLVMValueRef vec = NULL;
+
+       if (value_count == 1) {
+               return values[component];
+       } else if (!value_count)
+               unreachable("value_count is 0");
+
+       for (unsigned i = component; i < value_count + component; i++) {
+               LLVMValueRef value = values[i];
+
+               if (!i)
+                       vec = LLVMGetUndef( LLVMVectorType(LLVMTypeOf(value), 
value_count));
+               LLVMValueRef index = LLVMConstInt(ctx->i32, i - component, 
false);
+               vec = LLVMBuildInsertElement(ctx->builder, vec, value, index, 
"");
+       }
+       return vec;
+}
+
 LLVMValueRef
 ac_build_gather_values_extended(struct ac_llvm_context *ctx,
                                LLVMValueRef *values,
                                unsigned value_count,
                                unsigned value_stride,
                                bool load,
                                bool always_vector)
 {
        LLVMBuilderRef builder = ctx->builder;
        LLVMValueRef vec = NULL;
diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h
index 1f51937c9e..655dc1dcc8 100644
--- a/src/amd/common/ac_llvm_build.h
+++ b/src/amd/common/ac_llvm_build.h
@@ -105,20 +105,24 @@ void ac_build_optimization_barrier(struct ac_llvm_context 
*ctx,
                                   LLVMValueRef *pvgpr);
 
 LLVMValueRef ac_build_ballot(struct ac_llvm_context *ctx, LLVMValueRef value);
 
 LLVMValueRef ac_build_vote_all(struct ac_llvm_context *ctx, LLVMValueRef 
value);
 
 LLVMValueRef ac_build_vote_any(struct ac_llvm_context *ctx, LLVMValueRef 
value);
 
 LLVMValueRef ac_build_vote_eq(struct ac_llvm_context *ctx, LLVMValueRef value);
 
+LLVMValueRef
+ac_build_varying_gather_values(struct ac_llvm_context *ctx, LLVMValueRef 
*values,
+                              unsigned value_count, unsigned component);
+
 LLVMValueRef
 ac_build_gather_values_extended(struct ac_llvm_context *ctx,
                                LLVMValueRef *values,
                                unsigned value_count,
                                unsigned value_stride,
                                bool load,
                                bool always_vector);
 LLVMValueRef
 ac_build_gather_values(struct ac_llvm_context *ctx,
                       LLVMValueRef *values,
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index a38db0c9b7..2c30652288 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -2694,42 +2694,20 @@ get_dw_address(struct nir_to_llvm_context *ctx,
 
        dw_addr = LLVMBuildAdd(ctx->builder, dw_addr,
                               LLVMConstInt(ctx->ac.i32, param * 4, false), "");
 
        if (const_index && compact_const_index)
                dw_addr = LLVMBuildAdd(ctx->builder, dw_addr,
                                       LLVMConstInt(ctx->ac.i32, const_index, 
false), "");
        return dw_addr;
 }
 
-static LLVMValueRef
-build_varying_gather_values(struct ac_llvm_context *ctx, LLVMValueRef *values,
-                           unsigned value_count, unsigned component)
-{
-       LLVMValueRef vec = NULL;
-
-       if (value_count == 1) {
-               return values[component];
-       } else if (!value_count)
-               unreachable("value_count is 0");
-
-       for (unsigned i = component; i < value_count + component; i++) {
-               LLVMValueRef value = values[i];
-
-               if (!i)
-                       vec = LLVMGetUndef( LLVMVectorType(LLVMTypeOf(value), 
value_count));
-               LLVMValueRef index = LLVMConstInt(ctx->i32, i - component, 
false);
-               vec = LLVMBuildInsertElement(ctx->builder, vec, value, index, 
"");
-       }
-       return vec;
-}
-
 static LLVMValueRef
 load_tcs_input(struct nir_to_llvm_context *ctx,
               nir_intrinsic_instr *instr)
 {
        LLVMValueRef dw_addr, stride;
        unsigned const_index;
        LLVMValueRef vertex_index;
        LLVMValueRef indir_index;
        unsigned param;
        LLVMValueRef value[4], result;
@@ -2744,21 +2722,21 @@ load_tcs_input(struct nir_to_llvm_context *ctx,
        dw_addr = get_tcs_in_current_patch_offset(ctx);
        dw_addr = get_dw_address(ctx, dw_addr, param, const_index, is_compact, 
vertex_index, stride,
                                 indir_index);
 
        unsigned comp = instr->variables[0]->var->data.location_frac;
        for (unsigned i = 0; i < instr->num_components + comp; i++) {
                value[i] = ac_lds_load(&ctx->ac, dw_addr);
                dw_addr = LLVMBuildAdd(ctx->builder, dw_addr,
                                       ctx->ac.i32_1, "");
        }
-       result = build_varying_gather_values(&ctx->ac, value, 
instr->num_components, comp);
+       result = ac_build_varying_gather_values(&ctx->ac, value, 
instr->num_components, comp);
        result = LLVMBuildBitCast(ctx->builder, result, get_def_type(ctx->nir, 
&instr->dest.ssa), "");
        return result;
 }
 
 static LLVMValueRef
 load_tcs_output(struct nir_to_llvm_context *ctx,
               nir_intrinsic_instr *instr)
 {
        LLVMValueRef dw_addr;
        LLVMValueRef stride = NULL;
@@ -2783,21 +2761,21 @@ load_tcs_output(struct nir_to_llvm_context *ctx,
 
        dw_addr = get_dw_address(ctx, dw_addr, param, const_index, is_compact, 
vertex_index, stride,
                                 indir_index);
 
        unsigned comp = instr->variables[0]->var->data.location_frac;
        for (unsigned i = comp; i < instr->num_components + comp; i++) {
                value[i] = ac_lds_load(&ctx->ac, dw_addr);
                dw_addr = LLVMBuildAdd(ctx->builder, dw_addr,
                                       ctx->ac.i32_1, "");
        }
-       result = build_varying_gather_values(&ctx->ac, value, 
instr->num_components, comp);
+       result = ac_build_varying_gather_values(&ctx->ac, value, 
instr->num_components, comp);
        result = LLVMBuildBitCast(ctx->builder, result, get_def_type(ctx->nir, 
&instr->dest.ssa), "");
        return result;
 }
 
 static void
 store_tcs_output(struct nir_to_llvm_context *ctx,
                 nir_intrinsic_instr *instr,
                 LLVMValueRef src,
                 unsigned writemask)
 {
@@ -2940,21 +2918,21 @@ load_gs_input(struct nir_to_llvm_context *ctx,
                        args[6] = ctx->ac.i32_1; /* GLC */
                        args[7] = ctx->ac.i32_0; /* SLC */
                        args[8] = ctx->ac.i32_0; /* TFE */
 
                        value[i] = ac_build_intrinsic(&ctx->ac, 
"llvm.SI.buffer.load.dword.i32.i32",
                                                      ctx->ac.i32, args, 9,
                                                      AC_FUNC_ATTR_READONLY |
                                                      AC_FUNC_ATTR_LEGACY);
                }
        }
-       result = build_varying_gather_values(&ctx->ac, value, 
instr->num_components, comp);
+       result = ac_build_varying_gather_values(&ctx->ac, value, 
instr->num_components, comp);
 
        return result;
 }
 
 static LLVMValueRef
 build_gep_for_deref(struct ac_nir_context *ctx,
                    nir_deref_var *deref)
 {
        struct hash_entry *entry = _mesa_hash_table_search(ctx->vars, 
deref->var);
        assert(entry->data);
@@ -3081,21 +3059,21 @@ static LLVMValueRef visit_load_var(struct 
ac_nir_context *ctx,
                        } else {
                                values[chan] = LLVMBuildLoad(ctx->ac.builder,
                                                     ctx->outputs[idx + chan + 
const_index * 4],
                                                     "");
                        }
                }
                break;
        default:
                unreachable("unhandle variable mode");
        }
-       ret = build_varying_gather_values(&ctx->ac, values, ve, comp);
+       ret = ac_build_varying_gather_values(&ctx->ac, values, ve, comp);
        return LLVMBuildBitCast(ctx->ac.builder, ret, get_def_type(ctx, 
&instr->dest.ssa), "");
 }
 
 static void
 visit_store_var(struct ac_nir_context *ctx,
                nir_intrinsic_instr *instr)
 {
        LLVMValueRef temp_ptr, value;
        int idx = instr->variables[0]->var->data.driver_location;
        unsigned comp = instr->variables[0]->var->data.location_frac;
@@ -3943,22 +3921,22 @@ static LLVMValueRef visit_interp(struct 
nir_to_llvm_context *ctx,
                        result[chan] = ac_build_fs_interp(&ctx->ac,
                                                          llvm_chan, 
attr_number,
                                                          ctx->prim_mask, i, j);
                } else {
                        result[chan] = ac_build_fs_interp_mov(&ctx->ac,
                                                              
LLVMConstInt(ctx->ac.i32, 2, false),
                                                              llvm_chan, 
attr_number,
                                                              ctx->prim_mask);
                }
        }
-       return build_varying_gather_values(&ctx->ac, result, 
instr->num_components,
-                                          
instr->variables[0]->var->data.location_frac);
+       return ac_build_varying_gather_values(&ctx->ac, result, 
instr->num_components,
+                                             
instr->variables[0]->var->data.location_frac);
 }
 
 static void
 visit_emit_vertex(struct ac_shader_abi *abi, unsigned stream, LLVMValueRef 
*addrs)
 {
        LLVMValueRef gs_next_vertex;
        LLVMValueRef can_emit;
        int idx;
        struct nir_to_llvm_context *ctx = nir_to_llvm_context_from_abi(abi);
 
-- 
2.14.3

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

Reply via email to