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