ac: Introduce ac_build_expand()
authorConnor Abbott <cwabbott0@gmail.com>
Thu, 18 Oct 2018 13:30:11 +0000 (15:30 +0200)
committerConnor Abbott <cwabbott0@gmail.com>
Mon, 22 Oct 2018 07:44:51 +0000 (09:44 +0200)
And implement ac_bulid_expand_to_vec4() on top of it.

Fixes: 7e7ee82698247d8f93fe37775b99f4838b0247dd ("ac: add support for 16bit buffer loads")
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/common/ac_llvm_build.c
src/amd/common/ac_llvm_build.h

index 2d78ca1b52aed7836b410e8a45a93b02f331d8f4..c54a50dcd86a2ee79f240831087bd952a292145a 100644 (file)
@@ -523,39 +523,51 @@ ac_build_gather_values(struct ac_llvm_context *ctx,
        return ac_build_gather_values_extended(ctx, values, value_count, 1, false, false);
 }
 
-/* Expand a scalar or vector to <4 x type> by filling the remaining channels
- * with undef. Extract at most num_channels components from the input.
+/* Expand a scalar or vector to <dst_channels x type> by filling the remaining
+ * channels with undef. Extract at most src_channels components from the input.
  */
-LLVMValueRef ac_build_expand_to_vec4(struct ac_llvm_context *ctx,
-                                    LLVMValueRef value,
-                                    unsigned num_channels)
+LLVMValueRef ac_build_expand(struct ac_llvm_context *ctx,
+                            LLVMValueRef value,
+                            unsigned src_channels,
+                            unsigned dst_channels)
 {
        LLVMTypeRef elemtype;
-       LLVMValueRef chan[4];
+       LLVMValueRef chan[dst_channels];
 
        if (LLVMGetTypeKind(LLVMTypeOf(value)) == LLVMVectorTypeKind) {
                unsigned vec_size = LLVMGetVectorSize(LLVMTypeOf(value));
-               num_channels = MIN2(num_channels, vec_size);
 
-               if (num_channels >= 4)
+               if (src_channels == dst_channels && vec_size == dst_channels)
                        return value;
 
-               for (unsigned i = 0; i < num_channels; i++)
+               src_channels = MIN2(src_channels, vec_size);
+
+               for (unsigned i = 0; i < src_channels; i++)
                        chan[i] = ac_llvm_extract_elem(ctx, value, i);
 
                elemtype = LLVMGetElementType(LLVMTypeOf(value));
        } else {
-               if (num_channels) {
-                       assert(num_channels == 1);
+               if (src_channels) {
+                       assert(src_channels == 1);
                        chan[0] = value;
                }
                elemtype = LLVMTypeOf(value);
        }
 
-       while (num_channels < 4)
-               chan[num_channels++] = LLVMGetUndef(elemtype);
+       for (unsigned i = src_channels; i < dst_channels; i++)
+               chan[i] = LLVMGetUndef(elemtype);
+
+       return ac_build_gather_values(ctx, chan, dst_channels);
+}
 
-       return ac_build_gather_values(ctx, chan, 4);
+/* Expand a scalar or vector to <4 x type> by filling the remaining channels
+ * with undef. Extract at most num_channels components from the input.
+ */
+LLVMValueRef ac_build_expand_to_vec4(struct ac_llvm_context *ctx,
+                                    LLVMValueRef value,
+                                    unsigned num_channels)
+{
+       return ac_build_expand(ctx, value, num_channels, 4);
 }
 
 LLVMValueRef ac_build_round(struct ac_llvm_context *ctx, LLVMValueRef value)
index f68efbc49ff5c81c53b78cee1fe218dfe1f38591..1275e4fb6986e29fba1f437e57fc647025d88ccf 100644 (file)
@@ -172,6 +172,9 @@ LLVMValueRef
 ac_build_gather_values(struct ac_llvm_context *ctx,
                       LLVMValueRef *values,
                       unsigned value_count);
+LLVMValueRef ac_build_expand(struct ac_llvm_context *ctx,
+                            LLVMValueRef value,
+                            unsigned src_channels, unsigned dst_channels);
 LLVMValueRef ac_build_expand_to_vec4(struct ac_llvm_context *ctx,
                                     LLVMValueRef value,
                                     unsigned num_channels);