diff options
| author | gingerBill <bill@gingerbill.org> | 2021-08-09 19:37:58 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-08-09 19:37:58 +0100 |
| commit | 01f431b01fea18b0844d0475839c68426e95fd2c (patch) | |
| tree | 7420e056934a923083249fa4863b168877b9855f /src/llvm_backend_proc.cpp | |
| parent | aebfa4b28e5d92e493010593f4177f53249aa6b2 (diff) | |
Unify semantics of the built-in `swizzle` procedure with the selector expression semantics e.g. `.xyz`
Diffstat (limited to 'src/llvm_backend_proc.cpp')
| -rw-r--r-- | src/llvm_backend_proc.cpp | 26 |
1 files changed, 2 insertions, 24 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 955cf03b1..99f824c35 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1018,32 +1018,10 @@ lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValue const &tv, res.type = tv.type; res.value = LLVMBuildShuffleVector(p->builder, v1, v2, mask, ""); return res; - - } - - lbAddr addr = lb_build_addr(p, ce->args[0]); - if (index_count == 0) { - return lb_addr_load(p, addr); } - lbValue src = lb_addr_get_ptr(p, addr); - // TODO(bill): Should this be zeroed or not? - lbAddr dst = lb_add_local_generated(p, tv.type, true); - lbValue dst_ptr = lb_addr_get_ptr(p, dst); - - for (i32 i = 1; i < ce->args.count; i++) { - TypeAndValue tv = type_and_value_of_expr(ce->args[i]); - GB_ASSERT(is_type_integer(tv.type)); - GB_ASSERT(tv.value.kind == ExactValue_Integer); - i32 src_index = cast(i32)big_int_to_i64(&tv.value.value_integer); - i32 dst_index = i-1; - - lbValue src_elem = lb_emit_array_epi(p, src, src_index); - lbValue dst_elem = lb_emit_array_epi(p, dst_ptr, dst_index); - - lb_emit_store(p, dst_elem, lb_emit_load(p, src_elem)); - } - return lb_addr_load(p, dst); + lbAddr addr = lb_build_array_swizzle_addr(p, ce, tv); + return lb_addr_load(p, addr); } case BuiltinProc_complex: { |