| ... | ... | @@ -1231,8 +1231,8 @@ fn analyzeBodyInner( |
| 1231 | 1231 | .ref => try sema.zirRef(block, inst), |
| 1232 | 1232 | .deref => try sema.zirDeref(block, inst), |
| 1233 | 1233 | .ref_deref => try sema.zirRefDeref(block, inst), |
| 1234 | | .shr => try sema.zirShr(block, inst, .shr), |
| 1235 | | .shr_exact => try sema.zirShr(block, inst, .shr_exact), |
| 1234 | .shr => try sema.zirShr(block, inst, false), |
| 1235 | .shr_exact => try sema.zirShr(block, inst, true), |
| 1236 | 1236 | .slice_end => try sema.zirSliceEnd(block, inst), |
| 1237 | 1237 | .slice_sentinel => try sema.zirSliceSentinel(block, inst), |
| 1238 | 1238 | .slice_start => try sema.zirSliceStart(block, inst), |
| ... | ... | @@ -13176,7 +13176,7 @@ fn zirShr( |
| 13176 | 13176 | sema: *Sema, |
| 13177 | 13177 | block: *Block, |
| 13178 | 13178 | inst: Zir.Inst.Index, |
| 13179 | | air_tag: Air.Inst.Tag, |
| 13179 | exact: bool, |
| 13180 | 13180 | ) CompileError!Air.Inst.Ref { |
| 13181 | 13181 | const pt = sema.pt; |
| 13182 | 13182 | const zcu = pt.zcu; |
| ... | ... | @@ -13188,16 +13188,15 @@ fn zirShr( |
| 13188 | 13188 | const rhs_ty = sema.typeOf(rhs); |
| 13189 | 13189 | |
| 13190 | 13190 | const src = block.nodeOffset(inst_data.src_node); |
| 13191 | | const lhs_src = switch (air_tag) { |
| 13192 | | .shr => block.src(.{ .node_offset_bin_lhs = inst_data.src_node }), |
| 13193 | | .shr_exact => block.builtinCallArgSrc(inst_data.src_node, 0), |
| 13194 | | else => unreachable, |
| 13195 | | }; |
| 13196 | | const rhs_src = switch (air_tag) { |
| 13197 | | .shr => block.src(.{ .node_offset_bin_rhs = inst_data.src_node }), |
| 13198 | | .shr_exact => block.builtinCallArgSrc(inst_data.src_node, 1), |
| 13199 | | else => unreachable, |
| 13200 | | }; |
| 13191 | const lhs_src = if (exact) |
| 13192 | block.builtinCallArgSrc(inst_data.src_node, 0) |
| 13193 | else |
| 13194 | block.src(.{ .node_offset_bin_lhs = inst_data.src_node }); |
| 13195 | |
| 13196 | const rhs_src = if (exact) |
| 13197 | block.builtinCallArgSrc(inst_data.src_node, 1) |
| 13198 | else |
| 13199 | block.src(.{ .node_offset_bin_rhs = inst_data.src_node }); |
| 13201 | 13200 | |
| 13202 | 13201 | try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src); |
| 13203 | 13202 | const scalar_ty = lhs_ty.scalarType(zcu); |
| ... | ... | @@ -13208,11 +13207,7 @@ fn zirShr( |
| 13208 | 13207 | const runtime_src = rs: { |
| 13209 | 13208 | if (maybe_rhs_val) |rhs_val| { |
| 13210 | 13209 | if (maybe_lhs_val) |lhs_val| { |
| 13211 | | return .fromValue(try arith.shr(sema, block, lhs_ty, rhs_ty, lhs_val, rhs_val, src, lhs_src, rhs_src, switch (air_tag) { |
| 13212 | | .shr => .shr, |
| 13213 | | .shr_exact => .shr_exact, |
| 13214 | | else => unreachable, |
| 13215 | | })); |
| 13210 | return .fromValue(try arith.shr(sema, block, lhs_ty, rhs_ty, lhs_val, rhs_val, src, lhs_src, rhs_src, if (exact) .shr_exact else .shr)); |
| 13216 | 13211 | } |
| 13217 | 13212 | if (rhs_val.isUndef(zcu)) { |
| 13218 | 13213 | return sema.failWithUseOfUndef(block, rhs_src, null); |
| ... | ... | @@ -13269,8 +13264,10 @@ fn zirShr( |
| 13269 | 13264 | break :rs rhs_src; |
| 13270 | 13265 | }; |
| 13271 | 13266 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| 13272 | | const result = try block.addBinOp(air_tag, lhs, rhs); |
| 13273 | | if (block.wantSafety()) { |
| 13267 | |
| 13268 | const safety = block.wantSafety(); |
| 13269 | const result = try block.addBinOp(if (!exact or safety) .shr else .shr_exact, lhs, rhs); |
| 13270 | if (safety) { |
| 13274 | 13271 | const bit_count = scalar_ty.intInfo(zcu).bits; |
| 13275 | 13272 | if (!std.math.isPowerOfTwo(bit_count)) { |
| 13276 | 13273 | const bit_count_val = try pt.intValue(rhs_ty.scalarType(zcu), bit_count); |
| ... | ... | @@ -13286,7 +13283,7 @@ fn zirShr( |
| 13286 | 13283 | try sema.addSafetyCheck(block, src, ok, .shift_rhs_too_big); |
| 13287 | 13284 | } |
| 13288 | 13285 | |
| 13289 | | if (air_tag == .shr_exact) { |
| 13286 | if (exact) { |
| 13290 | 13287 | const back = try block.addBinOp(.shl, result, rhs); |
| 13291 | 13288 | |
| 13292 | 13289 | const ok = if (rhs_ty.zigTypeTag(zcu) == .vector) ok: { |