| ... | ... | @@ -9617,7 +9617,7 @@ fn analyzeArithmetic( |
| 9617 | 9617 | if (lhs_val.isUndef()) { |
| 9618 | 9618 | if (lhs_scalar_ty.isSignedInt() and rhs_scalar_ty.isSignedInt()) { |
| 9619 | 9619 | if (maybe_rhs_val) |rhs_val| { |
| 9620 | | if (rhs_val.compare(.neq, Value.negative_one, rhs_ty, target)) { |
| 9620 | if (rhs_val.compare(.neq, Value.negative_one, resolved_type, target)) { |
| 9621 | 9621 | return sema.addConstUndef(resolved_type); |
| 9622 | 9622 | } |
| 9623 | 9623 | } |
| ... | ... | @@ -9692,7 +9692,7 @@ fn analyzeArithmetic( |
| 9692 | 9692 | if (lhs_val.isUndef()) { |
| 9693 | 9693 | if (lhs_scalar_ty.isSignedInt() and rhs_scalar_ty.isSignedInt()) { |
| 9694 | 9694 | if (maybe_rhs_val) |rhs_val| { |
| 9695 | | if (rhs_val.compare(.neq, Value.negative_one, rhs_ty, target)) { |
| 9695 | if (rhs_val.compare(.neq, Value.negative_one, resolved_type, target)) { |
| 9696 | 9696 | return sema.addConstUndef(resolved_type); |
| 9697 | 9697 | } |
| 9698 | 9698 | } |
| ... | ... | @@ -9755,7 +9755,7 @@ fn analyzeArithmetic( |
| 9755 | 9755 | if (lhs_val.isUndef()) { |
| 9756 | 9756 | if (lhs_scalar_ty.isSignedInt() and rhs_scalar_ty.isSignedInt()) { |
| 9757 | 9757 | if (maybe_rhs_val) |rhs_val| { |
| 9758 | | if (rhs_val.compare(.neq, Value.negative_one, rhs_ty, target)) { |
| 9758 | if (rhs_val.compare(.neq, Value.negative_one, resolved_type, target)) { |
| 9759 | 9759 | return sema.addConstUndef(resolved_type); |
| 9760 | 9760 | } |
| 9761 | 9761 | } |
| ... | ... | @@ -9845,7 +9845,7 @@ fn analyzeArithmetic( |
| 9845 | 9845 | if (lhs_val.compareWithZero(.eq)) { |
| 9846 | 9846 | return sema.addConstant(resolved_type, Value.zero); |
| 9847 | 9847 | } |
| 9848 | | if (lhs_val.compare(.eq, Value.one, lhs_ty, target)) { |
| 9848 | if (lhs_val.compare(.eq, Value.one, resolved_type, target)) { |
| 9849 | 9849 | return casted_rhs; |
| 9850 | 9850 | } |
| 9851 | 9851 | } |
| ... | ... | @@ -9861,7 +9861,7 @@ fn analyzeArithmetic( |
| 9861 | 9861 | if (rhs_val.compareWithZero(.eq)) { |
| 9862 | 9862 | return sema.addConstant(resolved_type, Value.zero); |
| 9863 | 9863 | } |
| 9864 | | if (rhs_val.compare(.eq, Value.one, rhs_ty, target)) { |
| 9864 | if (rhs_val.compare(.eq, Value.one, resolved_type, target)) { |
| 9865 | 9865 | return casted_lhs; |
| 9866 | 9866 | } |
| 9867 | 9867 | if (maybe_lhs_val) |lhs_val| { |
| ... | ... | @@ -9896,7 +9896,7 @@ fn analyzeArithmetic( |
| 9896 | 9896 | if (lhs_val.compareWithZero(.eq)) { |
| 9897 | 9897 | return sema.addConstant(resolved_type, Value.zero); |
| 9898 | 9898 | } |
| 9899 | | if (lhs_val.compare(.eq, Value.one, lhs_ty, target)) { |
| 9899 | if (lhs_val.compare(.eq, Value.one, resolved_type, target)) { |
| 9900 | 9900 | return casted_rhs; |
| 9901 | 9901 | } |
| 9902 | 9902 | } |
| ... | ... | @@ -9908,7 +9908,7 @@ fn analyzeArithmetic( |
| 9908 | 9908 | if (rhs_val.compareWithZero(.eq)) { |
| 9909 | 9909 | return sema.addConstant(resolved_type, Value.zero); |
| 9910 | 9910 | } |
| 9911 | | if (rhs_val.compare(.eq, Value.one, rhs_ty, target)) { |
| 9911 | if (rhs_val.compare(.eq, Value.one, resolved_type, target)) { |
| 9912 | 9912 | return casted_lhs; |
| 9913 | 9913 | } |
| 9914 | 9914 | if (maybe_lhs_val) |lhs_val| { |
| ... | ... | @@ -9932,7 +9932,7 @@ fn analyzeArithmetic( |
| 9932 | 9932 | if (lhs_val.compareWithZero(.eq)) { |
| 9933 | 9933 | return sema.addConstant(resolved_type, Value.zero); |
| 9934 | 9934 | } |
| 9935 | | if (lhs_val.compare(.eq, Value.one, lhs_ty, target)) { |
| 9935 | if (lhs_val.compare(.eq, Value.one, resolved_type, target)) { |
| 9936 | 9936 | return casted_rhs; |
| 9937 | 9937 | } |
| 9938 | 9938 | } |
| ... | ... | @@ -9944,7 +9944,7 @@ fn analyzeArithmetic( |
| 9944 | 9944 | if (rhs_val.compareWithZero(.eq)) { |
| 9945 | 9945 | return sema.addConstant(resolved_type, Value.zero); |
| 9946 | 9946 | } |
| 9947 | | if (rhs_val.compare(.eq, Value.one, rhs_ty, target)) { |
| 9947 | if (rhs_val.compare(.eq, Value.one, resolved_type, target)) { |
| 9948 | 9948 | return casted_lhs; |
| 9949 | 9949 | } |
| 9950 | 9950 | if (maybe_lhs_val) |lhs_val| { |
| ... | ... | @@ -14521,9 +14521,20 @@ fn checkVectorizableBinaryOperands( |
| 14521 | 14521 | ) CompileError!void { |
| 14522 | 14522 | const lhs_zig_ty_tag = try lhs_ty.zigTypeTagOrPoison(); |
| 14523 | 14523 | const rhs_zig_ty_tag = try rhs_ty.zigTypeTagOrPoison(); |
| 14524 | | if (lhs_zig_ty_tag == .Vector and rhs_zig_ty_tag == .Vector) { |
| 14525 | | const lhs_len = lhs_ty.vectorLen(); |
| 14526 | | const rhs_len = rhs_ty.vectorLen(); |
| 14524 | if (lhs_zig_ty_tag != .Vector and rhs_zig_ty_tag != .Vector) return; |
| 14525 | |
| 14526 | const lhs_is_vector = switch (lhs_zig_ty_tag) { |
| 14527 | .Vector, .Array => true, |
| 14528 | else => false, |
| 14529 | }; |
| 14530 | const rhs_is_vector = switch (rhs_zig_ty_tag) { |
| 14531 | .Vector, .Array => true, |
| 14532 | else => false, |
| 14533 | }; |
| 14534 | |
| 14535 | if (lhs_is_vector and rhs_is_vector) { |
| 14536 | const lhs_len = lhs_ty.arrayLen(); |
| 14537 | const rhs_len = rhs_ty.arrayLen(); |
| 14527 | 14538 | if (lhs_len != rhs_len) { |
| 14528 | 14539 | const msg = msg: { |
| 14529 | 14540 | const msg = try sema.errMsg(block, src, "vector length mismatch", .{}); |
| ... | ... | @@ -14534,14 +14545,14 @@ fn checkVectorizableBinaryOperands( |
| 14534 | 14545 | }; |
| 14535 | 14546 | return sema.failWithOwnedErrorMsg(block, msg); |
| 14536 | 14547 | } |
| 14537 | | } else if (lhs_zig_ty_tag == .Vector or rhs_zig_ty_tag == .Vector) { |
| 14548 | } else { |
| 14538 | 14549 | const target = sema.mod.getTarget(); |
| 14539 | 14550 | const msg = msg: { |
| 14540 | 14551 | const msg = try sema.errMsg(block, src, "mixed scalar and vector operands: {} and {}", .{ |
| 14541 | 14552 | lhs_ty.fmt(target), rhs_ty.fmt(target), |
| 14542 | 14553 | }); |
| 14543 | 14554 | errdefer msg.destroy(sema.gpa); |
| 14544 | | if (lhs_zig_ty_tag == .Vector) { |
| 14555 | if (lhs_is_vector) { |
| 14545 | 14556 | try sema.errNote(block, lhs_src, msg, "vector here", .{}); |
| 14546 | 14557 | try sema.errNote(block, rhs_src, msg, "scalar here", .{}); |
| 14547 | 14558 | } else { |
| ... | ... | @@ -21017,6 +21028,18 @@ fn resolvePeerTypes( |
| 21017 | 21028 | chosen_i = candidate_i + 1; |
| 21018 | 21029 | continue; |
| 21019 | 21030 | }, |
| 21031 | .Vector => switch (chosen_ty_tag) { |
| 21032 | .Array => { |
| 21033 | chosen = candidate; |
| 21034 | chosen_i = candidate_i + 1; |
| 21035 | continue; |
| 21036 | }, |
| 21037 | else => {}, |
| 21038 | }, |
| 21039 | .Array => switch (chosen_ty_tag) { |
| 21040 | .Vector => continue, |
| 21041 | else => {}, |
| 21042 | }, |
| 21020 | 21043 | else => {}, |
| 21021 | 21044 | } |
| 21022 | 21045 | |