aboutsummaryrefslogtreecommitdiff
path: root/src/types.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/types.cpp
parent4c655865e5d9af83a98c137609b01972f4e51beb (diff)
Very basic matrix support in backend
Diffstat (limited to 'src/types.cpp')
-rw-r--r--src/types.cpp31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/types.cpp b/src/types.cpp
index 0313ade60..fd9b20c91 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -1257,6 +1257,22 @@ i64 matrix_type_stride(Type *t) {
return stride;
}
+i64 matrix_type_stride_in_elems(Type *t) {
+ t = base_type(t);
+ GB_ASSERT(t->kind == Type_Matrix);
+ i64 stride = matrix_type_stride(t);
+ return stride/gb_max(1, type_size_of(t->Matrix.elem));
+}
+
+
+i64 matrix_type_total_elems(Type *t) {
+ t = base_type(t);
+ GB_ASSERT(t->kind == Type_Matrix);
+ i64 size = type_size_of(t);
+ i64 elem_size = type_size_of(t->Matrix.elem);
+ return size/gb_max(elem_size, 1);
+}
+
bool is_type_dynamic_array(Type *t) {
t = base_type(t);
return t->kind == Type_DynamicArray;
@@ -3174,17 +3190,17 @@ i64 type_align_of_internal(Type *t, TypePath *path) {
case Type_Matrix: {
Type *elem = t->Matrix.elem;
- i64 row_count = t->Matrix.row_count;
- // i64 column_count = t->Matrix.column_count;
+ i64 row_count = gb_max(t->Matrix.row_count, 1);
+
bool pop = type_path_push(path, elem);
if (path->failure) {
return FAILURE_ALIGNMENT;
}
+ // elem align is used here rather than size as it make a little more sense
i64 elem_align = type_align_of_internal(elem, path);
if (pop) type_path_pop(path);
- i64 align = gb_clamp(elem_align * row_count, elem_align, build_context.max_align);
-
+ i64 align = gb_min(next_pow2(elem_align * row_count), build_context.max_align);
return align;
}
@@ -3935,6 +3951,13 @@ gbString write_type_to_string(gbString str, Type *type) {
str = gb_string_append_fmt(str, ") ");
str = write_type_to_string(str, type->RelativeSlice.slice_type);
break;
+
+ case Type_Matrix:
+ str = gb_string_appendc(str, gb_bprintf("[%d", cast(int)type->Matrix.row_count));
+ str = gb_string_appendc(str, "; ");
+ str = gb_string_appendc(str, gb_bprintf("%d]", cast(int)type->Matrix.column_count));
+ str = write_type_to_string(str, type->Matrix.elem);
+ break;
}
return str;