From 28abf5d33b90cbd5a8c7bb681c0f22ff3e3513f9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 8 Jun 2021 21:20:33 +0100 Subject: [PATCH] Correct minimum dependency for `complex32` --- core/runtime/internal.odin | 6 ++++++ src/check_expr.cpp | 9 +++++++++ src/llvm_backend.cpp | 32 ++++++++++++++++++++++---------- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/core/runtime/internal.odin b/core/runtime/internal.odin index 13191e07c..cf55fdddd 100644 --- a/core/runtime/internal.odin +++ b/core/runtime/internal.odin @@ -300,6 +300,9 @@ cstring_to_string :: proc "contextless" (s: cstring) -> string { } +complex32_eq :: #force_inline proc "contextless" (a, b: complex32) -> bool { return real(a) == real(b) && imag(a) == imag(b); } +complex32_ne :: #force_inline proc "contextless" (a, b: complex32) -> bool { return real(a) != real(b) || imag(a) != imag(b); } + complex64_eq :: #force_inline proc "contextless" (a, b: complex64) -> bool { return real(a) == real(b) && imag(a) == imag(b); } complex64_ne :: #force_inline proc "contextless" (a, b: complex64) -> bool { return real(a) != real(b) || imag(a) != imag(b); } @@ -307,6 +310,9 @@ complex128_eq :: #force_inline proc "contextless" (a, b: complex128) -> bool { r complex128_ne :: #force_inline proc "contextless" (a, b: complex128) -> bool { return real(a) != real(b) || imag(a) != imag(b); } +quaternion64_eq :: #force_inline proc "contextless" (a, b: quaternion64) -> bool { return real(a) == real(b) && imag(a) == imag(b) && jmag(a) == jmag(b) && kmag(a) == kmag(b); } +quaternion64_ne :: #force_inline proc "contextless" (a, b: quaternion64) -> bool { return real(a) != real(b) || imag(a) != imag(b) || jmag(a) != jmag(b) || kmag(a) != kmag(b); } + quaternion128_eq :: #force_inline proc "contextless" (a, b: quaternion128) -> bool { return real(a) == real(b) && imag(a) == imag(b) && jmag(a) == jmag(b) && kmag(a) == kmag(b); } quaternion128_ne :: #force_inline proc "contextless" (a, b: quaternion128) -> bool { return real(a) != real(b) || imag(a) != imag(b) || jmag(a) != jmag(b) || kmag(a) != kmag(b); } diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 8abb39ff7..fefb5a9ef 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1904,6 +1904,10 @@ void add_comparison_procedures_for_fields(CheckerContext *c, Type *t) { switch (t->kind) { case Type_Basic: switch (t->Basic.kind) { + case Basic_complex32: + add_package_dependency(c, "runtime", "complex32_eq"); + add_package_dependency(c, "runtime", "complex32_ne"); + break; case Basic_complex64: add_package_dependency(c, "runtime", "complex64_eq"); add_package_dependency(c, "runtime", "complex64_ne"); @@ -1912,6 +1916,10 @@ void add_comparison_procedures_for_fields(CheckerContext *c, Type *t) { add_package_dependency(c, "runtime", "complex128_eq"); add_package_dependency(c, "runtime", "complex128_ne"); break; + case Basic_quaternion64: + add_package_dependency(c, "runtime", "quaternion64_eq"); + add_package_dependency(c, "runtime", "quaternion64_ne"); + break; case Basic_quaternion128: add_package_dependency(c, "runtime", "quaternion128_eq"); add_package_dependency(c, "runtime", "quaternion128_ne"); @@ -2854,6 +2862,7 @@ void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Type *type_hint if (op.kind == Token_Quo || op.kind == Token_QuoEq) { Type *bt = base_type(x->type); if (bt->kind == Type_Basic) switch (bt->Basic.kind) { + case Basic_complex32: add_package_dependency(c, "runtime", "quo_complex32"); break; case Basic_complex64: add_package_dependency(c, "runtime", "quo_complex64"); break; case Basic_complex128: add_package_dependency(c, "runtime", "quo_complex128"); break; case Basic_quaternion64: add_package_dependency(c, "runtime", "quo_quaternion64"); break; diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index ce4605de7..3b7841411 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -7040,11 +7040,11 @@ lbValue lb_emit_arith_array(lbProcedure *p, TokenKind op, lbValue lhs, lbValue r #if 1 #if 1 unsigned n = cast(unsigned)count; - auto dst_ptrs = array_make(temporary_allocator(), count); + auto dst_ptrs = slice_make(temporary_allocator(), count); - auto a_loads = array_make(temporary_allocator(), count); - auto b_loads = array_make(temporary_allocator(), count); - auto c_ops = array_make(temporary_allocator(), count); + auto a_loads = slice_make(temporary_allocator(), count); + auto b_loads = slice_make(temporary_allocator(), count); + auto c_ops = slice_make(temporary_allocator(), count); for (unsigned i = 0; i < n; i++) { a_loads[i].value = LLVMBuildExtractValue(p->builder, lhs.value, i, ""); @@ -7069,13 +7069,13 @@ lbValue lb_emit_arith_array(lbProcedure *p, TokenKind op, lbValue lhs, lbValue r lbValue x = lb_address_from_load_or_generate_local(p, lhs); lbValue y = lb_address_from_load_or_generate_local(p, rhs); - auto a_ptrs = array_make(temporary_allocator(), count); - auto b_ptrs = array_make(temporary_allocator(), count); - auto dst_ptrs = array_make(temporary_allocator(), count); + auto a_ptrs = slice_make(temporary_allocator(), count); + auto b_ptrs = slice_make(temporary_allocator(), count); + auto dst_ptrs = slice_make(temporary_allocator(), count); - auto a_loads = array_make(temporary_allocator(), count); - auto b_loads = array_make(temporary_allocator(), count); - auto c_ops = array_make(temporary_allocator(), count); + auto a_loads = slice_make(temporary_allocator(), count); + auto b_loads = slice_make(temporary_allocator(), count); + auto c_ops = slice_make(temporary_allocator(), count); for (i64 i = 0; i < count; i++) { a_ptrs[i] = lb_emit_array_epi(p, x, i); @@ -11439,6 +11439,12 @@ lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue ri char const *runtime_procedure = ""; i64 sz = 8*type_size_of(a); switch (sz) { + case 32: + switch (op_kind) { + case Token_CmpEq: runtime_procedure = "complex32_eq"; break; + case Token_NotEq: runtime_procedure = "complex32_ne"; break; + } + break; case 64: switch (op_kind) { case Token_CmpEq: runtime_procedure = "complex64_eq"; break; @@ -11464,6 +11470,12 @@ lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue ri char const *runtime_procedure = ""; i64 sz = 8*type_size_of(a); switch (sz) { + case 64: + switch (op_kind) { + case Token_CmpEq: runtime_procedure = "quaternion64_eq"; break; + case Token_NotEq: runtime_procedure = "quaternion64_ne"; break; + } + break; case 128: switch (op_kind) { case Token_CmpEq: runtime_procedure = "quaternion128_eq"; break;