Browse Source

Correct minimum dependency for `complex32`

gingerBill 4 years ago
parent
commit
28abf5d33b
3 changed files with 37 additions and 10 deletions
  1. 6 0
      core/runtime/internal.odin
  2. 9 0
      src/check_expr.cpp
  3. 22 10
      src/llvm_backend.cpp

+ 6 - 0
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_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); }
 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); }
 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_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); }
 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); }
 
 

+ 9 - 0
src/check_expr.cpp

@@ -1904,6 +1904,10 @@ void add_comparison_procedures_for_fields(CheckerContext *c, Type *t) {
 	switch (t->kind) {
 	switch (t->kind) {
 	case Type_Basic:
 	case Type_Basic:
 		switch (t->Basic.kind) {
 		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:
 		case Basic_complex64:
 			add_package_dependency(c, "runtime", "complex64_eq");
 			add_package_dependency(c, "runtime", "complex64_eq");
 			add_package_dependency(c, "runtime", "complex64_ne");
 			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_eq");
 			add_package_dependency(c, "runtime", "complex128_ne");
 			add_package_dependency(c, "runtime", "complex128_ne");
 			break;
 			break;
+		case Basic_quaternion64:
+			add_package_dependency(c, "runtime", "quaternion64_eq");
+			add_package_dependency(c, "runtime", "quaternion64_ne");
+			break;
 		case Basic_quaternion128:
 		case Basic_quaternion128:
 			add_package_dependency(c, "runtime", "quaternion128_eq");
 			add_package_dependency(c, "runtime", "quaternion128_eq");
 			add_package_dependency(c, "runtime", "quaternion128_ne");
 			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) {
 	if (op.kind == Token_Quo || op.kind == Token_QuoEq) {
 		Type *bt = base_type(x->type);
 		Type *bt = base_type(x->type);
 		if (bt->kind == Type_Basic) switch (bt->Basic.kind) {
 		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_complex64:     add_package_dependency(c, "runtime", "quo_complex64");     break;
 		case Basic_complex128:    add_package_dependency(c, "runtime", "quo_complex128");    break;
 		case Basic_complex128:    add_package_dependency(c, "runtime", "quo_complex128");    break;
 		case Basic_quaternion64:  add_package_dependency(c, "runtime", "quo_quaternion64");  break;
 		case Basic_quaternion64:  add_package_dependency(c, "runtime", "quo_quaternion64");  break;

+ 22 - 10
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
 		#if 1
 		#if 1
 		unsigned n = cast(unsigned)count;
 		unsigned n = cast(unsigned)count;
-		auto dst_ptrs = array_make<lbValue>(temporary_allocator(), count);
+		auto dst_ptrs = slice_make<lbValue>(temporary_allocator(), count);
 
 
-		auto a_loads = array_make<lbValue>(temporary_allocator(), count);
-		auto b_loads = array_make<lbValue>(temporary_allocator(), count);
-		auto c_ops = array_make<lbValue>(temporary_allocator(), count);
+		auto a_loads = slice_make<lbValue>(temporary_allocator(), count);
+		auto b_loads = slice_make<lbValue>(temporary_allocator(), count);
+		auto c_ops = slice_make<lbValue>(temporary_allocator(), count);
 
 
 		for (unsigned i = 0; i < n; i++) {
 		for (unsigned i = 0; i < n; i++) {
 			a_loads[i].value = LLVMBuildExtractValue(p->builder, lhs.value, 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 x = lb_address_from_load_or_generate_local(p, lhs);
 		lbValue y = lb_address_from_load_or_generate_local(p, rhs);
 		lbValue y = lb_address_from_load_or_generate_local(p, rhs);
 
 
-		auto a_ptrs = array_make<lbValue>(temporary_allocator(), count);
-		auto b_ptrs = array_make<lbValue>(temporary_allocator(), count);
-		auto dst_ptrs = array_make<lbValue>(temporary_allocator(), count);
+		auto a_ptrs = slice_make<lbValue>(temporary_allocator(), count);
+		auto b_ptrs = slice_make<lbValue>(temporary_allocator(), count);
+		auto dst_ptrs = slice_make<lbValue>(temporary_allocator(), count);
 
 
-		auto a_loads = array_make<lbValue>(temporary_allocator(), count);
-		auto b_loads = array_make<lbValue>(temporary_allocator(), count);
-		auto c_ops = array_make<lbValue>(temporary_allocator(), count);
+		auto a_loads = slice_make<lbValue>(temporary_allocator(), count);
+		auto b_loads = slice_make<lbValue>(temporary_allocator(), count);
+		auto c_ops = slice_make<lbValue>(temporary_allocator(), count);
 
 
 		for (i64 i = 0; i < count; i++) {
 		for (i64 i = 0; i < count; i++) {
 			a_ptrs[i] = lb_emit_array_epi(p, x, 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 = "";
 		char const *runtime_procedure = "";
 		i64 sz = 8*type_size_of(a);
 		i64 sz = 8*type_size_of(a);
 		switch (sz) {
 		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:
 		case 64:
 			switch (op_kind) {
 			switch (op_kind) {
 			case Token_CmpEq: runtime_procedure = "complex64_eq"; break;
 			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 = "";
 		char const *runtime_procedure = "";
 		i64 sz = 8*type_size_of(a);
 		i64 sz = 8*type_size_of(a);
 		switch (sz) {
 		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:
 		case 128:
 			switch (op_kind) {
 			switch (op_kind) {
 			case Token_CmpEq: runtime_procedure = "quaternion128_eq"; break;
 			case Token_CmpEq: runtime_procedure = "quaternion128_eq"; break;