aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_utility.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-10-20 12:39:38 +0100
committergingerBill <bill@gingerbill.org>2021-10-20 12:39:38 +0100
commit0fd525d7789d2a0786b28677c5dd4cbd263f4537 (patch)
tree094ffc5afbd43675652450d8c2f428b0ae82c849 /src/llvm_backend_utility.cpp
parent07bf64ae5243d3e2f38da9cf9da81ef7a99a6f44 (diff)
Make `lb_emit_matrix_mul_vector` use SIMD if possible
Diffstat (limited to 'src/llvm_backend_utility.cpp')
-rw-r--r--src/llvm_backend_utility.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp
index fb9264661..56637e907 100644
--- a/src/llvm_backend_utility.cpp
+++ b/src/llvm_backend_utility.cpp
@@ -1512,4 +1512,36 @@ lbValue lb_emit_mul_add(lbProcedure *p, lbValue a, lbValue b, lbValue c, Type *t
lbValue y = lb_emit_arith(p, Token_Add, x, c, t);
return y;
}
+}
+
+LLVMValueRef llvm_mask_iota(lbModule *m, unsigned start, unsigned count) {
+ auto iota = slice_make<LLVMValueRef>(temporary_allocator(), count);
+ for (unsigned i = 0; i < count; i++) {
+ iota[i] = lb_const_int(m, t_u32, start+i).value;
+ }
+ return LLVMConstVector(iota.data, count);
+}
+
+LLVMValueRef llvm_mask_zero(lbModule *m, unsigned count) {
+ return LLVMConstNull(LLVMVectorType(lb_type(m, t_u32), count));
+}
+
+LLVMValueRef llvm_splat(lbProcedure *p, LLVMValueRef value, unsigned count) {
+ GB_ASSERT(count > 0);
+ if (LLVMIsConstant(value)) {
+ LLVMValueRef single = LLVMConstVector(&value, 1);
+ if (count == 1) {
+ return single;
+ }
+ LLVMValueRef mask = llvm_mask_zero(p->module, count);
+ return LLVMConstShuffleVector(single, LLVMGetUndef(LLVMTypeOf(single)), mask);
+ }
+
+ LLVMTypeRef single_type = LLVMVectorType(LLVMTypeOf(value), 1);
+ LLVMValueRef single = LLVMBuildBitCast(p->builder, value, single_type, "");
+ if (count == 1) {
+ return single;
+ }
+ LLVMValueRef mask = llvm_mask_zero(p->module, count);
+ return LLVMBuildShuffleVector(p->builder, single, LLVMGetUndef(LLVMTypeOf(single)), mask, "");
} \ No newline at end of file