aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/print_llvm.cpp9
-rw-r--r--src/codegen/ssa.cpp68
2 files changed, 49 insertions, 28 deletions
diff --git a/src/codegen/print_llvm.cpp b/src/codegen/print_llvm.cpp
index f584bbe06..0790aa7d8 100644
--- a/src/codegen/print_llvm.cpp
+++ b/src/codegen/print_llvm.cpp
@@ -196,10 +196,13 @@ void ssa_print_type(gbFile *f, BaseTypeSizes s, Type *t) {
}
void ssa_print_exact_value(gbFile *f, ssaModule *m, ExactValue value, Type *type) {
+ type = get_base_type(type);
if (is_type_float(type)) {
value = exact_value_to_float(value);
} else if (is_type_integer(type)) {
value = exact_value_to_integer(value);
+ } else if (is_type_pointer(type)) {
+ value = exact_value_to_integer(value);
}
switch (value.kind) {
@@ -212,7 +215,7 @@ void ssa_print_exact_value(gbFile *f, ssaModule *m, ExactValue value, Type *type
ssa_fprintf(f, "\"");
} break;
case ExactValue_Integer: {
- if (is_type_pointer(get_base_type(type))) {
+ if (is_type_pointer(type)) {
if (value.value_integer == 0) {
ssa_fprintf(f, "null");
} else {
@@ -235,14 +238,14 @@ void ssa_print_exact_value(gbFile *f, ssaModule *m, ExactValue value, Type *type
ssa_fprintf(f, "0x%016llx", u);
} break;
case ExactValue_Pointer:
- if (value.value_float == NULL) {
+ if (value.value_pointer == NULL) {
ssa_fprintf(f, "null");
} else {
GB_PANIC("TODO(bill): ExactValue_Pointer");
}
break;
default:
- GB_PANIC("Invalid ExactValue");
+ GB_PANIC("Invalid ExactValue: %d", value.kind);
break;
}
}
diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp
index 8e83a7e09..271ce3cfb 100644
--- a/src/codegen/ssa.cpp
+++ b/src/codegen/ssa.cpp
@@ -908,7 +908,9 @@ ssaValue *ssa_lvalue_store(ssaProcedure *proc, ssaLvalue lval, ssaValue *value)
if (lval.is_vector) {
// HACK(bill): Fix how lvalues for vectors work
ssaValue *v = ssa_emit_load(proc, lval.address);
- ssaValue *out = ssa_emit(proc, ssa_make_instr_insert_element(proc, v, value, lval.index));
+ Type *elem_type = get_base_type(ssa_value_type(v))->vector.elem;
+ ssaValue *elem = ssa_emit_conv(proc, value, elem_type);
+ ssaValue *out = ssa_emit(proc, ssa_make_instr_insert_element(proc, v, elem, lval.index));
return ssa_emit_store(proc, lval.address, out);
}
return ssa_emit_store(proc, lval.address, value);
@@ -1401,22 +1403,22 @@ ssaValue *ssa_emit_conv(ssaProcedure *proc, ssaValue *value, Type *t) {
return ssa_emit_load(proc, slice);
}
- if (is_type_vector(dst)) {
- Type *dst_elem = dst->vector.elem;
- value = ssa_emit_conv(proc, value, dst_elem);
- ssaValue *v = ssa_add_local_generated(proc, t);
- v = ssa_emit_load(proc, v);
- v = ssa_emit(proc, ssa_make_instr_insert_element(proc, v, value, v_zero32));
- // NOTE(bill): Broadcast lowest value to all values
- isize index_count = dst->vector.count;
- i32 *indices = gb_alloc_array(proc->module->allocator, i32, index_count);
- for (isize i = 0; i < index_count; i++) {
- indices[i] = 0;
- }
+ // if (is_type_vector(dst)) {
+ // Type *dst_elem = dst->vector.elem;
+ // value = ssa_emit_conv(proc, value, dst_elem);
+ // ssaValue *v = ssa_add_local_generated(proc, t);
+ // v = ssa_emit_load(proc, v);
+ // v = ssa_emit(proc, ssa_make_instr_insert_element(proc, v, value, v_zero32));
+ // // NOTE(bill): Broadcast lowest value to all values
+ // isize index_count = dst->vector.count;
+ // i32 *indices = gb_alloc_array(proc->module->allocator, i32, index_count);
+ // for (isize i = 0; i < index_count; i++) {
+ // indices[i] = 0;
+ // }
- v = ssa_emit(proc, ssa_make_instr_shuffle_vector(proc, v, indices, index_count));
- return v;
- }
+ // v = ssa_emit(proc, ssa_make_instr_shuffle_vector(proc, v, indices, index_count));
+ // return v;
+ // }
gb_printf_err("Not Identical %s != %s\n", type_to_string(src_type), type_to_string(t));
@@ -1606,10 +1608,10 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
for (AstNode *elem = cl->elem_list;
elem != NULL;
elem = elem->next, index++) {
- ssaValue *field_expr = ssa_build_expr(proc, elem);
- Type *t = ssa_value_type(field_expr);
+ ssaValue *field_elem = ssa_build_expr(proc, elem);
+ Type *t = ssa_value_type(field_elem);
GB_ASSERT(t->kind != Type_Tuple);
- ssaValue *ev = ssa_emit_conv(proc, field_expr, et);
+ ssaValue *ev = ssa_emit_conv(proc, field_elem, et);
ssaValue *i = ssa_make_value_constant(proc->module->allocator, t_int, make_exact_value_integer(index));
result = ssa_emit(proc, ssa_make_instr_insert_element(proc, result, ev, i));
}
@@ -1619,7 +1621,9 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
for (isize i = 0; i < index_count; i++) {
indices[i] = 0;
}
- return ssa_emit(proc, ssa_make_instr_shuffle_vector(proc, result, indices, index_count));
+ ssaValue *sv = ssa_emit(proc, ssa_make_instr_shuffle_vector(proc, result, indices, index_count));
+ ssa_emit_store(proc, v, sv);
+ return ssa_emit_load(proc, v);
}
return result;
@@ -1761,15 +1765,20 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
AstNode *sptr_node = ce->arg_list;
AstNode *item_node = ce->arg_list->next;
ssaValue *slice = ssa_build_addr(proc, sptr_node).address;
- ssaValue *item_value = ssa_build_expr(proc, item_node);
- Type *item_type = ssa_value_type(item_value);
- ssaValue *item = ssa_add_local_generated(proc, item_type);
- ssa_emit_store(proc, item, item_value);
ssaValue *elem = ssa_slice_elem(proc, slice);
ssaValue *len = ssa_slice_len(proc, slice);
ssaValue *cap = ssa_slice_cap(proc, slice);
+ Type *elem_type = type_deref(get_base_type(ssa_value_type(elem)));
+
+ ssaValue *item_value = ssa_build_expr(proc, item_node);
+ item_value = ssa_emit_conv(proc, item_value, elem_type);
+
+ ssaValue *item = ssa_add_local_generated(proc, elem_type);
+ ssa_emit_store(proc, item, item_value);
+
+
// NOTE(bill): Check if can append is possible
Token lt = {Token_Lt};
ssaValue *cond = ssa_emit_comp(proc, lt, len, cap);
@@ -1781,9 +1790,13 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
// Add new slice item
ssaValue *offset = ssa_emit_ptr_offset(proc, elem, len);
- i64 item_size = type_size_of(proc->module->sizes, proc->module->allocator, item_type);
+ i64 item_size = type_size_of(proc->module->sizes, proc->module->allocator, elem_type);
ssaValue *byte_count = ssa_make_value_constant(proc->module->allocator, t_int,
make_exact_value_integer(item_size));
+ offset = ssa_emit_conv(proc, offset, t_rawptr);
+ item = ssa_emit_ptr_offset(proc, item, v_zero);
+ ssa_value_set_type(item, make_type_pointer(proc->module->allocator, ssa_value_type(item)));
+ item = ssa_emit_conv(proc, item, t_rawptr);
ssa_emit(proc, ssa_make_instr_copy_memory(proc, offset, item, byte_count, 1, false));
// Increment slice length
@@ -1847,6 +1860,11 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
}
}
+ auto *pt = &proc_type_->proc.params->tuple;
+ for (isize i = 0; i < arg_count; i++) {
+ args[i] = ssa_emit_conv(proc, args[i], pt->variables[i]->type);
+ }
+
ssaValue *call = ssa_make_instr_call(proc, value, args, arg_count, type->results);
return ssa_emit(proc, call);
case_end;