From 667aa3671e585fb348a2e05ddf0992c637b40ec4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 1 Mar 2021 17:54:49 +0000 Subject: Fix Addressing for SOA on store; Add intrinsics.type_struct_field_count(T) --- src/llvm_backend.cpp | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'src/llvm_backend.cpp') diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 7237504ce..123a38cac 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -406,22 +406,39 @@ void lb_addr_store(lbProcedure *p, lbAddr addr, lbValue value) { Type *t = type_deref(addr.addr.type); t = base_type(t); GB_ASSERT(t->kind == Type_Struct && t->Struct.soa_kind != StructSoa_None); - value = lb_emit_conv(p, value, t->Struct.soa_elem); + Type *elem_type = t->Struct.soa_elem; + value = lb_emit_conv(p, value, elem_type); + elem_type = base_type(elem_type); lbValue index = addr.soa.index; if (!lb_is_const(index) || t->Struct.soa_kind != StructSoa_Fixed) { Type *t = base_type(type_deref(addr.addr.type)); GB_ASSERT(t->kind == Type_Struct && t->Struct.soa_kind != StructSoa_None); - i64 count = t->Struct.soa_count; - lbValue len = lb_const_int(p->module, t_int, count); + lbValue len = lb_soa_struct_len(p, addr.addr); lb_emit_bounds_check(p, ast_token(addr.soa.index_expr), index, len); } - for_array(i, t->Struct.fields) { + isize field_count = 0; + + switch (elem_type->kind) { + case Type_Struct: + field_count = elem_type->Struct.fields.count; + break; + case Type_Array: + field_count = elem_type->Array.count; + break; + } + for (isize i = 0; i < field_count; i++) { lbValue dst = lb_emit_struct_ep(p, addr.addr, cast(i32)i); - dst = lb_emit_array_ep(p, dst, index); lbValue src = lb_emit_struct_ev(p, value, cast(i32)i); - lb_emit_store(p, dst, src); + if (t->Struct.soa_kind == StructSoa_Fixed) { + dst = lb_emit_array_ep(p, dst, index); + lb_emit_store(p, dst, src); + } else { + lbValue field = lb_emit_load(p, dst); + dst = lb_emit_ptr_offset(p, field, index); + lb_emit_store(p, dst, src); + } } return; } -- cgit v1.2.3