mirror of
https://github.com/Ed94/Odin.git
synced 2026-07-21 23:12:03 -07:00
Use memmove if possible when emitting store over a certain size
This commit is contained in:
@@ -852,6 +852,12 @@ bool lb_is_type_proc_recursive(Type *t) {
|
||||
void lb_emit_store(lbProcedure *p, lbValue ptr, lbValue value) {
|
||||
GB_ASSERT(value.value != nullptr);
|
||||
Type *a = type_deref(ptr.type);
|
||||
|
||||
if (LLVMIsNull(value.value)) {
|
||||
LLVMTypeRef src_t = LLVMGetElementType(LLVMTypeOf(ptr.value));
|
||||
LLVMBuildStore(p->builder, LLVMConstNull(src_t), ptr.value);
|
||||
return;
|
||||
}
|
||||
if (is_type_boolean(a)) {
|
||||
// NOTE(bill): There are multiple sized booleans, thus force a conversion (if necessarily)
|
||||
value = lb_emit_conv(p, value, a);
|
||||
@@ -861,6 +867,20 @@ void lb_emit_store(lbProcedure *p, lbValue ptr, lbValue value) {
|
||||
GB_ASSERT_MSG(are_types_identical(ca, core_type(value.type)), "%s != %s", type_to_string(a), type_to_string(value.type));
|
||||
}
|
||||
|
||||
enum {MAX_STORE_SIZE = 32};
|
||||
|
||||
if (LLVMIsALoadInst(value.value) && lb_sizeof(LLVMTypeOf(value.value)) > 32) {
|
||||
LLVMValueRef dst_ptr = ptr.value;
|
||||
LLVMValueRef src_ptr = LLVMGetOperand(value.value, 0);
|
||||
src_ptr = LLVMBuildPointerCast(p->builder, src_ptr, LLVMTypeOf(dst_ptr), "");
|
||||
|
||||
LLVMBuildMemMove(p->builder,
|
||||
dst_ptr, 1,
|
||||
src_ptr, 1,
|
||||
LLVMConstInt(LLVMInt64TypeInContext(p->module->ctx), lb_sizeof(LLVMTypeOf(value.value)), false));
|
||||
return;
|
||||
}
|
||||
|
||||
if (lb_is_type_proc_recursive(a)) {
|
||||
// NOTE(bill, 2020-11-11): Because of certain LLVM rules, a procedure value may be
|
||||
// stored as regular pointer with no procedure information
|
||||
|
||||
Reference in New Issue
Block a user