From bd5d095de4a3a3de574f6004751718ee944417cc Mon Sep 17 00:00:00 2001 From: Ginger Bill Date: Sun, 23 Oct 2016 14:46:52 +0100 Subject: Separate ssa_struct_gep and ssa_array_gep procedures --- src/codegen/codegen.cpp | 125 ++++++++++++++++++++++++------------------------ 1 file changed, 62 insertions(+), 63 deletions(-) (limited to 'src/codegen/codegen.cpp') diff --git a/src/codegen/codegen.cpp b/src/codegen/codegen.cpp index c06b6d527..b855224b4 100644 --- a/src/codegen/codegen.cpp +++ b/src/codegen/codegen.cpp @@ -301,15 +301,14 @@ void ssa_gen_tree(ssaGen *s) { Type *t_string_slice_ptr = make_type_pointer(a, make_type_slice(a, t_string)); auto get_type_info_ptr = [](ssaProcedure *proc, ssaValue *type_info_data, Type *type) -> ssaValue * { - return ssa_emit_struct_gep(proc, type_info_data, - ssa_type_info_index(proc->module->info, type), - t_type_info_ptr); + return ssa_emit_array_gep(proc, type_info_data, + ssa_type_info_index(proc->module->info, type)); }; isize type_info_member_index = 0; auto type_info_member_offset = [](ssaProcedure *proc, ssaValue *data, isize count, isize *index) -> ssaValue * { - ssaValue *offset = ssa_emit_struct_gep(proc, data, *index, t_type_info_member_ptr); + ssaValue *offset = ssa_emit_array_gep(proc, data, *index); *index += count; return offset; }; @@ -337,8 +336,8 @@ void ssa_gen_tree(ssaGen *s) { ssaValue *gep = get_type_info_ptr(proc, type_info_data, t->Named.base); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, v_zero, t_string_ptr), name); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, v_one32, t_type_info_ptr), gep); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 0), name); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 1), gep); } break; case Type_Basic: @@ -360,15 +359,15 @@ void ssa_gen_tree(ssaGen *s) { b32 is_unsigned = (t->Basic.flags & BasicFlag_Unsigned) != 0; ssaValue *bits = ssa_make_const_int(a, type_size_of(m->sizes, a, t)); ssaValue *is_signed = ssa_make_const_bool(a, !is_unsigned); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, v_zero32, t_int_ptr), bits); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, v_one32, t_bool_ptr), is_signed); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 0), bits); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 1), is_signed); } break; case Basic_f32: case Basic_f64: { tag = ssa_add_local_generated(proc, t_type_info_float); ssaValue *bits = ssa_make_const_int(a, type_size_of(m->sizes, a, t)); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, v_zero32, t_int_ptr), bits); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 0), bits); } break; case Basic_rawptr: @@ -388,46 +387,46 @@ void ssa_gen_tree(ssaGen *s) { case Type_Pointer: { tag = ssa_add_local_generated(proc, t_type_info_pointer); ssaValue *gep = get_type_info_ptr(proc, type_info_data, t->Pointer.elem); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, v_zero32, t_type_info_ptr_ptr), gep); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 0), gep); } break; case Type_Maybe: { tag = ssa_add_local_generated(proc, t_type_info_maybe); ssaValue *gep = get_type_info_ptr(proc, type_info_data, t->Maybe.elem); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, v_zero32, t_type_info_ptr_ptr), gep); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 0), gep); } break; case Type_Array: { tag = ssa_add_local_generated(proc, t_type_info_array); ssaValue *gep = get_type_info_ptr(proc, type_info_data, t->Array.elem); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, v_zero32, t_type_info_ptr_ptr), gep); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 0), gep); isize ez = type_size_of(m->sizes, a, t->Array.elem); - ssaValue *elem_size = ssa_emit_struct_gep(proc, tag, v_one32, t_int_ptr); + ssaValue *elem_size = ssa_emit_struct_gep(proc, tag, 1); ssa_emit_store(proc, elem_size, ssa_make_const_int(a, ez)); - ssaValue *count = ssa_emit_struct_gep(proc, tag, v_two32, t_int_ptr); + ssaValue *count = ssa_emit_struct_gep(proc, tag, 2); ssa_emit_store(proc, count, ssa_make_const_int(a, t->Array.count)); } break; case Type_Slice: { tag = ssa_add_local_generated(proc, t_type_info_slice); ssaValue *gep = get_type_info_ptr(proc, type_info_data, t->Slice.elem); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, v_zero32, t_type_info_ptr_ptr), gep); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 0), gep); isize ez = type_size_of(m->sizes, a, t->Slice.elem); - ssaValue *elem_size = ssa_emit_struct_gep(proc, tag, v_one32, t_int_ptr); + ssaValue *elem_size = ssa_emit_struct_gep(proc, tag, 1); ssa_emit_store(proc, elem_size, ssa_make_const_int(a, ez)); } break; case Type_Vector: { tag = ssa_add_local_generated(proc, t_type_info_vector); ssaValue *gep = get_type_info_ptr(proc, type_info_data, t->Vector.elem); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, v_zero32, t_type_info_ptr_ptr), gep); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 0), gep); isize ez = type_size_of(m->sizes, a, t->Vector.elem); - ssaValue *elem_size = ssa_emit_struct_gep(proc, tag, v_one32, t_int_ptr); + ssaValue *elem_size = ssa_emit_struct_gep(proc, tag, 1); ssa_emit_store(proc, elem_size, ssa_make_const_int(a, ez)); - ssaValue *count = ssa_emit_struct_gep(proc, tag, v_two32, t_int_ptr); + ssaValue *count = ssa_emit_struct_gep(proc, tag, 2); ssa_emit_store(proc, count, ssa_make_const_int(a, t->Vector.count)); } break; @@ -441,10 +440,10 @@ void ssa_gen_tree(ssaGen *s) { ssaValue *ordered = ssa_make_const_bool(a, t->Record.struct_is_ordered); ssaValue *size = ssa_make_const_int(a, type_size_of(m->sizes, a, t)); ssaValue *align = ssa_make_const_int(a, type_align_of(m->sizes, a, t)); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 1, t_int_ptr), size); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 2, t_int_ptr), align); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 3, t_bool_ptr), packed); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 4, t_bool_ptr), ordered); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 1), size); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 2), align); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 3), packed); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 4), ordered); } ssaValue *memory = type_info_member_offset(proc, type_info_member_data, t->Record.field_count, &type_info_member_index); @@ -458,9 +457,9 @@ void ssa_gen_tree(ssaGen *s) { GB_ASSERT(f->kind == Entity_Variable && f->Variable.field); ssaValue *field = ssa_emit_ptr_offset(proc, memory, ssa_make_const_int(a, source_index)); - ssaValue *name = ssa_emit_struct_gep(proc, field, v_zero32, t_string_ptr); - ssaValue *type_info = ssa_emit_struct_gep(proc, field, v_one32, t_type_info_ptr_ptr); - ssaValue *offset = ssa_emit_struct_gep(proc, field, v_two32, t_int_ptr); + ssaValue *name = ssa_emit_struct_gep(proc, field, 0); + ssaValue *type_info = ssa_emit_struct_gep(proc, field, 1); + ssaValue *offset = ssa_emit_struct_gep(proc, field, 2); if (f->token.string.len > 0) { ssa_emit_store(proc, name, ssa_emit_global_string(proc, f->token.string)); @@ -471,12 +470,12 @@ void ssa_gen_tree(ssaGen *s) { Type *slice_type = make_type_slice(a, t_type_info_member); Type *slice_type_ptr = make_type_pointer(a, slice_type); - ssaValue *slice = ssa_emit_struct_gep(proc, tag, v_zero32, slice_type_ptr); + ssaValue *slice = ssa_emit_struct_gep(proc, tag, 0); ssaValue *field_count = ssa_make_const_int(a, t->Record.field_count); - ssaValue *elem = ssa_emit_struct_gep(proc, slice, v_zero32, make_type_pointer(a, t_type_info_member_ptr)); - ssaValue *len = ssa_emit_struct_gep(proc, slice, v_one32, make_type_pointer(a, t_int_ptr)); - ssaValue *cap = ssa_emit_struct_gep(proc, slice, v_two32, make_type_pointer(a, t_int_ptr)); + ssaValue *elem = ssa_emit_struct_gep(proc, slice, 0); + ssaValue *len = ssa_emit_struct_gep(proc, slice, 1); + ssaValue *cap = ssa_emit_struct_gep(proc, slice, 2); ssa_emit_store(proc, elem, memory); ssa_emit_store(proc, len, field_count); @@ -487,8 +486,8 @@ void ssa_gen_tree(ssaGen *s) { { ssaValue *size = ssa_make_const_int(a, type_size_of(m->sizes, a, t)); ssaValue *align = ssa_make_const_int(a, type_align_of(m->sizes, a, t)); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 1, t_int_ptr), size); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 2, t_int_ptr), align); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 1), size); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 2), align); } break; case TypeRecord_RawUnion: { @@ -496,17 +495,17 @@ void ssa_gen_tree(ssaGen *s) { { ssaValue *size = ssa_make_const_int(a, type_size_of(m->sizes, a, t)); ssaValue *align = ssa_make_const_int(a, type_align_of(m->sizes, a, t)); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 1, t_int_ptr), size); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 2, t_int_ptr), align); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 1), size); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 2), align); } ssaValue *memory = type_info_member_offset(proc, type_info_member_data, t->Record.field_count, &type_info_member_index); for (isize i = 0; i < t->Record.field_count; i++) { ssaValue *field = ssa_emit_ptr_offset(proc, memory, ssa_make_const_int(a, i)); - ssaValue *name = ssa_emit_struct_gep(proc, field, v_zero32, t_string_ptr); - ssaValue *type_info = ssa_emit_struct_gep(proc, field, v_one32, t_type_info_ptr_ptr); - ssaValue *offset = ssa_emit_struct_gep(proc, field, v_two32, t_int_ptr); + ssaValue *name = ssa_emit_struct_gep(proc, field, 0); + ssaValue *type_info = ssa_emit_struct_gep(proc, field, 1); + ssaValue *offset = ssa_emit_struct_gep(proc, field, 2); Entity *f = t->Record.fields[i]; ssaValue *tip = get_type_info_ptr(proc, type_info_data, f->type); @@ -520,12 +519,12 @@ void ssa_gen_tree(ssaGen *s) { Type *slice_type = make_type_slice(a, t_type_info_member); Type *slice_type_ptr = make_type_pointer(a, slice_type); - ssaValue *slice = ssa_emit_struct_gep(proc, tag, v_zero32, slice_type_ptr); + ssaValue *slice = ssa_emit_struct_gep(proc, tag, 0); ssaValue *field_count = ssa_make_const_int(a, t->Record.field_count); - ssaValue *elem = ssa_emit_struct_gep(proc, slice, v_zero32, make_type_pointer(a, t_type_info_member_ptr)); - ssaValue *len = ssa_emit_struct_gep(proc, slice, v_one32, make_type_pointer(a, t_int_ptr)); - ssaValue *cap = ssa_emit_struct_gep(proc, slice, v_two32, make_type_pointer(a, t_int_ptr)); + ssaValue *elem = ssa_emit_struct_gep(proc, slice, 0); + ssaValue *len = ssa_emit_struct_gep(proc, slice, 1); + ssaValue *cap = ssa_emit_struct_gep(proc, slice, 2); ssa_emit_store(proc, elem, memory); ssa_emit_store(proc, len, field_count); @@ -537,7 +536,7 @@ void ssa_gen_tree(ssaGen *s) { if (enum_base == NULL) { enum_base = t_int; } - ssaValue *base = ssa_emit_struct_gep(proc, tag, v_zero32, t_type_info_ptr_ptr); + ssaValue *base = ssa_emit_struct_gep(proc, tag, 0); ssa_emit_store(proc, base, get_type_info_ptr(proc, type_info_data, enum_base)); if (t->Record.other_field_count > 0) { @@ -577,8 +576,8 @@ void ssa_gen_tree(ssaGen *s) { } for (isize i = 0; i < count; i++) { - ssaValue *value_gep = ssa_emit_struct_gep(proc, value_array, i, t_i64_ptr); - ssaValue *name_gep = ssa_emit_struct_gep(proc, name_array, i, t_string_ptr); + ssaValue *value_gep = ssa_emit_struct_gep(proc, value_array, i); + ssaValue *name_gep = ssa_emit_struct_gep(proc, name_array, i); ssa_emit_store(proc, value_gep, ssa_make_const_i64(a, fields[i]->Constant.value.value_integer)); ssa_emit_store(proc, name_gep, ssa_emit_global_string(proc, fields[i]->token.string)); @@ -587,18 +586,18 @@ void ssa_gen_tree(ssaGen *s) { ssaValue *v_count = ssa_make_const_int(a, count); - ssaValue *values = ssa_emit_struct_gep(proc, tag, v_one32, t_i64_slice_ptr); - ssaValue *names = ssa_emit_struct_gep(proc, tag, v_two32, t_string_slice_ptr); + ssaValue *values = ssa_emit_struct_gep(proc, tag, 1); + ssaValue *names = ssa_emit_struct_gep(proc, tag, 2); ssaValue *value_slice = ssa_add_local_generated(proc, type_deref(t_i64_slice_ptr)); ssaValue *name_slice = ssa_add_local_generated(proc, type_deref(t_string_slice_ptr)); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, value_slice, v_zero32, t_i64_ptr), ssa_array_elem(proc, value_array)); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, value_slice, v_one32, t_int_ptr), v_count); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, value_slice, v_two32, t_int_ptr), v_count); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, value_slice, 0), ssa_array_elem(proc, value_array)); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, value_slice, 1), v_count); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, value_slice, 2), v_count); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, name_slice, v_zero32, t_string_ptr), ssa_array_elem(proc, name_array)); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, name_slice, v_one32, t_int_ptr), v_count); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, name_slice, v_two32, t_int_ptr), v_count); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, name_slice, 0), ssa_array_elem(proc, name_array)); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, name_slice, 1), v_count); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, name_slice, 2), v_count); ssa_emit_store(proc, values, ssa_emit_load(proc, value_slice)); ssa_emit_store(proc, names, ssa_emit_load(proc, name_slice)); @@ -612,15 +611,15 @@ void ssa_gen_tree(ssaGen *s) { { ssaValue *align = ssa_make_const_int(a, type_align_of(m->sizes, a, t)); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 2, t_int_ptr), align); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 2), align); } ssaValue *memory = type_info_member_offset(proc, type_info_member_data, t->Tuple.variable_count, &type_info_member_index); for (isize i = 0; i < t->Tuple.variable_count; i++) { ssaValue *field = ssa_emit_ptr_offset(proc, memory, ssa_make_const_int(a, i)); - ssaValue *name = ssa_emit_struct_gep(proc, field, v_zero32, t_string_ptr); - ssaValue *type_info = ssa_emit_struct_gep(proc, field, v_one32, t_type_info_ptr_ptr); + ssaValue *name = ssa_emit_struct_gep(proc, field, 0); + ssaValue *type_info = ssa_emit_struct_gep(proc, field, 1); // NOTE(bill): offset is not used for tuples Entity *f = t->Tuple.variables[i]; @@ -634,12 +633,12 @@ void ssa_gen_tree(ssaGen *s) { Type *slice_type = make_type_slice(a, t_type_info_member); Type *slice_type_ptr = make_type_pointer(a, slice_type); - ssaValue *slice = ssa_emit_struct_gep(proc, tag, v_zero32, slice_type_ptr); + ssaValue *slice = ssa_emit_struct_gep(proc, tag, 0); ssaValue *variable_count = ssa_make_const_int(a, t->Tuple.variable_count); - ssaValue *elem = ssa_emit_struct_gep(proc, slice, v_zero32, make_type_pointer(a, t_type_info_member_ptr)); - ssaValue *len = ssa_emit_struct_gep(proc, slice, v_one32, make_type_pointer(a, t_int_ptr)); - ssaValue *cap = ssa_emit_struct_gep(proc, slice, v_two32, make_type_pointer(a, t_int_ptr)); + ssaValue *elem = ssa_emit_struct_gep(proc, slice, 0); + ssaValue *len = ssa_emit_struct_gep(proc, slice, 1); + ssaValue *cap = ssa_emit_struct_gep(proc, slice, 2); ssa_emit_store(proc, elem, memory); ssa_emit_store(proc, len, variable_count); @@ -649,9 +648,9 @@ void ssa_gen_tree(ssaGen *s) { case Type_Proc: { tag = ssa_add_local_generated(proc, t_type_info_procedure); - ssaValue *params = ssa_emit_struct_gep(proc, tag, v_zero32, t_type_info_ptr_ptr); - ssaValue *results = ssa_emit_struct_gep(proc, tag, v_one32, t_type_info_ptr_ptr); - ssaValue *variadic = ssa_emit_struct_gep(proc, tag, v_two32, t_bool_ptr); + ssaValue *params = ssa_emit_struct_gep(proc, tag, 0); + ssaValue *results = ssa_emit_struct_gep(proc, tag, 1); + ssaValue *variadic = ssa_emit_struct_gep(proc, tag, 2); if (t->Proc.params) { ssa_emit_store(proc, params, get_type_info_ptr(proc, type_info_data, t->Proc.params)); @@ -666,7 +665,7 @@ void ssa_gen_tree(ssaGen *s) { } if (tag != NULL) { - ssaValue *gep = ssa_emit_struct_gep(proc, type_info_data, entry_index, t_type_info_ptr); + ssaValue *gep = ssa_emit_array_gep(proc, type_info_data, entry_index); ssaValue *val = ssa_emit_conv(proc, ssa_emit_load(proc, tag), t_type_info); ssa_emit_store(proc, gep, val); } -- cgit v1.2.3