| ... | ... | @@ -14805,6 +14805,7 @@ fn analyzeShuffle( |
| 14805 | 14805 | fn zirSelect(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| 14806 | 14806 | const inst_data = sema.code.instructions.items(.data)[inst].pl_node; |
| 14807 | 14807 | const extra = sema.code.extraData(Zir.Inst.Select, inst_data.payload_index).data; |
| 14808 | const target = sema.mod.getTarget(); |
| 14808 | 14809 | |
| 14809 | 14810 | const elem_ty_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node }; |
| 14810 | 14811 | const pred_src: LazySrcLoc = .{ .node_offset_builtin_call_arg1 = inst_data.src_node }; |
| ... | ... | @@ -14813,35 +14814,21 @@ fn zirSelect(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 14813 | 14814 | |
| 14814 | 14815 | const elem_ty = try sema.resolveType(block, elem_ty_src, extra.elem_type); |
| 14815 | 14816 | try sema.checkVectorElemType(block, elem_ty_src, elem_ty); |
| 14816 | | const pred = sema.resolveInst(extra.pred); |
| 14817 | | const a = sema.resolveInst(extra.a); |
| 14818 | | const b = sema.resolveInst(extra.b); |
| 14819 | | const target = sema.mod.getTarget(); |
| 14820 | | |
| 14821 | | const pred_ty = sema.typeOf(pred); |
| 14822 | | switch (try pred_ty.zigTypeTagOrPoison()) { |
| 14823 | | .Vector => { |
| 14824 | | const scalar_ty = pred_ty.childType(); |
| 14825 | | if (!scalar_ty.eql(Type.bool, target)) { |
| 14826 | | const bool_vec_ty = try Type.vector(sema.arena, pred_ty.vectorLen(), Type.bool); |
| 14827 | | return sema.fail(block, pred_src, "Expected '{}', found '{}'", .{ bool_vec_ty.fmt(target), pred_ty.fmt(target) }); |
| 14828 | | } |
| 14829 | | }, |
| 14830 | | else => return sema.fail(block, pred_src, "Expected vector type, found '{}'", .{pred_ty.fmt(target)}), |
| 14831 | | } |
| 14817 | const pred_uncoerced = sema.resolveInst(extra.pred); |
| 14818 | const pred_ty = sema.typeOf(pred_uncoerced); |
| 14832 | 14819 | |
| 14833 | | const vec_len = pred_ty.vectorLen(); |
| 14834 | | const vec_ty = try Type.vector(sema.arena, vec_len, elem_ty); |
| 14820 | const vec_len_u64 = switch (try pred_ty.zigTypeTagOrPoison()) { |
| 14821 | .Vector, .Array => pred_ty.arrayLen(), |
| 14822 | else => return sema.fail(block, pred_src, "expected vector or array, found '{}'", .{pred_ty.fmt(target)}), |
| 14823 | }; |
| 14824 | const vec_len = try sema.usizeCast(block, pred_src, vec_len_u64); |
| 14835 | 14825 | |
| 14836 | | const a_ty = sema.typeOf(a); |
| 14837 | | if (!a_ty.eql(vec_ty, target)) { |
| 14838 | | return sema.fail(block, a_src, "Expected '{}', found '{}'", .{ vec_ty.fmt(target), a_ty.fmt(target) }); |
| 14839 | | } |
| 14826 | const bool_vec_ty = try Type.vector(sema.arena, vec_len, Type.bool); |
| 14827 | const pred = try sema.coerce(block, bool_vec_ty, pred_uncoerced, pred_src); |
| 14840 | 14828 | |
| 14841 | | const b_ty = sema.typeOf(b); |
| 14842 | | if (!b_ty.eql(vec_ty, target)) { |
| 14843 | | return sema.fail(block, b_src, "Expected '{}', found '{}'", .{ vec_ty.fmt(target), b_ty.fmt(target) }); |
| 14844 | | } |
| 14829 | const vec_ty = try Type.vector(sema.arena, vec_len, elem_ty); |
| 14830 | const a = try sema.coerce(block, vec_ty, sema.resolveInst(extra.a), a_src); |
| 14831 | const b = try sema.coerce(block, vec_ty, sema.resolveInst(extra.b), b_src); |
| 14845 | 14832 | |
| 14846 | 14833 | const maybe_pred = try sema.resolveMaybeUndefVal(block, pred_src, pred); |
| 14847 | 14834 | const maybe_a = try sema.resolveMaybeUndefVal(block, a_src, a); |