aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_utility.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-10-18 18:16:52 +0100
committergingerBill <bill@gingerbill.org>2021-10-18 18:16:52 +0100
commitba331024af2f5074125442e91dda6c8e63324c8f (patch)
tree86545465efba2d2fb0221c20e83e881efea5c96e /src/llvm_backend_utility.cpp
parent4c655865e5d9af83a98c137609b01972f4e51beb (diff)
Very basic matrix support in backend
Diffstat (limited to 'src/llvm_backend_utility.cpp')
-rw-r--r--src/llvm_backend_utility.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp
index 0531c62bb..1b41be2a3 100644
--- a/src/llvm_backend_utility.cpp
+++ b/src/llvm_backend_utility.cpp
@@ -1221,6 +1221,41 @@ lbValue lb_emit_ptr_offset(lbProcedure *p, lbValue ptr, lbValue index) {
return res;
}
+lbValue lb_emit_matrix_epi(lbProcedure *p, lbValue s, isize row, isize column) {
+ Type *t = s.type;
+ GB_ASSERT(is_type_pointer(t));
+ Type *st = base_type(type_deref(t));
+ GB_ASSERT_MSG(is_type_matrix(st), "%s", type_to_string(st));
+
+ Type *ptr = base_array_type(st);
+
+ isize index = row*column;
+ GB_ASSERT(0 <= index);
+
+ LLVMValueRef indices[2] = {
+ LLVMConstInt(lb_type(p->module, t_int), 0, false),
+ LLVMConstInt(lb_type(p->module, t_int), cast(unsigned)index, false),
+ };
+
+ lbValue res = {};
+ if (lb_is_const(s)) {
+ res.value = LLVMConstGEP(s.value, indices, gb_count_of(indices));
+ } else {
+ res.value = LLVMBuildGEP(p->builder, s.value, indices, gb_count_of(indices), "");
+ }
+ res.type = alloc_type_pointer(ptr);
+ return res;
+}
+
+lbValue lb_emit_matrix_ev(lbProcedure *p, lbValue s, isize row, isize column) {
+ Type *st = base_type(s.type);
+ GB_ASSERT_MSG(is_type_matrix(st), "%s", type_to_string(st));
+
+ lbValue value = lb_address_from_load_or_generate_local(p, s);
+ lbValue ptr = lb_emit_matrix_epi(p, value, row, column);
+ return lb_emit_load(p, ptr);
+}
+
void lb_fill_slice(lbProcedure *p, lbAddr const &slice, lbValue base_elem, lbValue len) {
Type *t = lb_addr_type(slice);