diff options
| author | gingerBill <bill@gingerbill.org> | 2023-04-20 11:27:14 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2023-04-20 11:27:14 +0100 |
| commit | 9d23a392a6eae6dcb62847249dc69c4def7423c0 (patch) | |
| tree | cff7f3aa1854bf435322af21fff8cd39069c9455 /src/llvm_backend_proc.cpp | |
| parent | 6726df4d58b2538014b1e9487eddd8de26bc89fa (diff) | |
| parent | 57214c63cbe39d7985ed2cea7a81ec20c31ddcc6 (diff) | |
Merge branch 'master' of https://github.com/odin-lang/Odin
Diffstat (limited to 'src/llvm_backend_proc.cpp')
| -rw-r--r-- | src/llvm_backend_proc.cpp | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 93c480e7f..ddf058668 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2058,7 +2058,7 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu i64 al = exact_value_to_i64(type_and_value_of_expr(ce->args[1]).value); lbValue res = {}; - res.type = t_u8_ptr; + res.type = alloc_type_multi_pointer(t_u8); res.value = LLVMBuildArrayAlloca(p->builder, lb_type(p->module, t_u8), sz.value, ""); LLVMSetAlignment(res.value, cast(unsigned)al); return res; @@ -2379,9 +2379,15 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu { lbValue dst = lb_build_expr(p, ce->args[0]); lbValue src = lb_build_expr(p, ce->args[1]); - src = lb_address_from_load_or_generate_local(p, src); Type *t = type_deref(dst.type); - lb_mem_copy_non_overlapping(p, dst, src, lb_const_int(p->module, t_int, type_size_of(t)), false); + + if (is_type_simd_vector(t)) { + LLVMValueRef store = LLVMBuildStore(p->builder, src.value, dst.value); + LLVMSetAlignment(store, 1); + } else { + src = lb_address_from_load_or_generate_local(p, src); + lb_mem_copy_non_overlapping(p, dst, src, lb_const_int(p->module, t_int, type_size_of(t)), false); + } return {}; } @@ -2389,9 +2395,17 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu { lbValue src = lb_build_expr(p, ce->args[0]); Type *t = type_deref(src.type); - lbAddr dst = lb_add_local_generated(p, t, false); - lb_mem_copy_non_overlapping(p, dst.addr, src, lb_const_int(p->module, t_int, type_size_of(t)), false); - return lb_addr_load(p, dst); + if (is_type_simd_vector(t)) { + lbValue res = {}; + res.type = t; + res.value = LLVMBuildLoad2(p->builder, lb_type(p->module, t), src.value, ""); + LLVMSetAlignment(res.value, 1); + return res; + } else { + lbAddr dst = lb_add_local_generated(p, t, false); + lb_mem_copy_non_overlapping(p, dst.addr, src, lb_const_int(p->module, t_int, type_size_of(t)), false); + return lb_addr_load(p, dst); + } } case BuiltinProc_atomic_add: |