diff --git a/src/check_type.cpp b/src/check_type.cpp index 672dee338..e4f3cbf0e 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1848,6 +1848,50 @@ Array systemv_distribute_struct_fields(Type *t, i32 level=0) { Entity *f = ts->fields[field_index]; Type *bt = core_type(f->type); switch (bt->kind) { + case Type_Basic: + switch (bt->Basic.kind){ + case Basic_complex64: + array_add(&distributed, t_f32); + array_add(&distributed, t_f32); + break; + case Basic_complex128: + array_add(&distributed, t_f64); + array_add(&distributed, t_f64); + break; + case Basic_quaternion128: + array_add(&distributed, t_f32); + array_add(&distributed, t_f32); + array_add(&distributed, t_f32); + array_add(&distributed, t_f32); + break; + case Basic_quaternion256: + array_add(&distributed, t_f64); + array_add(&distributed, t_f64); + array_add(&distributed, t_f64); + array_add(&distributed, t_f64); + break; + case Basic_string: + array_add(&distributed, t_u8_ptr); + array_add(&distributed, t_int); + break; + case Basic_any: + GB_ASSERT(type_size_of(t_uintptr) == type_size_of(t_typeid)); + array_add(&distributed, t_rawptr); + array_add(&distributed, t_uintptr); + break; + + case Basic_u128: + case Basic_i128: + if (build_context.ODIN_OS == "windows") { + array_add(&distributed, alloc_type_simd_vector(2, t_u64)); + } else { + array_add(&distributed, bt); + } + default: + goto DEFAULT; + } + break; + case Type_Struct: if (bt->Struct.is_raw_union) { goto DEFAULT; @@ -1877,6 +1921,10 @@ Array systemv_distribute_struct_fields(Type *t, i32 level=0) { break; case Type_Slice: + array_add(&distributed, t_rawptr); + array_add(&distributed, t_int); + break; + case Type_DynamicArray: case Type_Map: case Type_Union: