| ... | @@ -7474,7 +7474,10 @@ fn zirShl( | ... | @@ -7474,7 +7474,10 @@ fn zirShl( |
| 7474 | } | 7474 | } |
| 7475 | const val = switch (air_tag) { | 7475 | const val = switch (air_tag) { |
| 7476 | .shl_exact => return sema.fail(block, lhs_src, "TODO implement Sema for comptime shl_exact", .{}), | 7476 | .shl_exact => return sema.fail(block, lhs_src, "TODO implement Sema for comptime shl_exact", .{}), |
| 7477 | .shl_sat => try lhs_val.shlSat(rhs_val, lhs_ty, sema.arena, sema.mod.getTarget()), | 7477 | .shl_sat => if (lhs_ty.zigTypeTag() == .ComptimeInt) |
| | 7478 | try lhs_val.shl(rhs_val, sema.arena) |
| | 7479 | else |
| | 7480 | try lhs_val.shlSat(rhs_val, lhs_ty, sema.arena, sema.mod.getTarget()), |
| 7478 | .shl => try lhs_val.shl(rhs_val, sema.arena), | 7481 | .shl => try lhs_val.shl(rhs_val, sema.arena), |
| 7479 | else => unreachable, | 7482 | else => unreachable, |
| 7480 | }; | 7483 | }; |
| ... | @@ -8189,10 +8192,12 @@ fn analyzeArithmetic( | ... | @@ -8189,10 +8192,12 @@ fn analyzeArithmetic( |
| 8189 | return casted_lhs; | 8192 | return casted_lhs; |
| 8190 | } | 8193 | } |
| 8191 | if (maybe_lhs_val) |lhs_val| { | 8194 | if (maybe_lhs_val) |lhs_val| { |
| 8192 | return sema.addConstant( | 8195 | const val = if (scalar_tag == .ComptimeInt) |
| 8193 | scalar_type, | 8196 | try lhs_val.intAdd(rhs_val, sema.arena) |
| 8194 | try lhs_val.intAddSat(rhs_val, scalar_type, sema.arena, target), | 8197 | else |
| 8195 | ); | 8198 | try lhs_val.intAddSat(rhs_val, scalar_type, sema.arena, target); |
| | 8199 | |
| | 8200 | return sema.addConstant(scalar_type, val); |
| 8196 | } else break :rs .{ .src = lhs_src, .air_tag = .add_sat }; | 8201 | } else break :rs .{ .src = lhs_src, .air_tag = .add_sat }; |
| 8197 | } else break :rs .{ .src = rhs_src, .air_tag = .add_sat }; | 8202 | } else break :rs .{ .src = rhs_src, .air_tag = .add_sat }; |
| 8198 | }, | 8203 | }, |
| ... | @@ -8280,10 +8285,12 @@ fn analyzeArithmetic( | ... | @@ -8280,10 +8285,12 @@ fn analyzeArithmetic( |
| 8280 | return sema.addConstUndef(scalar_type); | 8285 | return sema.addConstUndef(scalar_type); |
| 8281 | } | 8286 | } |
| 8282 | if (maybe_rhs_val) |rhs_val| { | 8287 | if (maybe_rhs_val) |rhs_val| { |
| 8283 | return sema.addConstant( | 8288 | const val = if (scalar_tag == .ComptimeInt) |
| 8284 | scalar_type, | 8289 | try lhs_val.intSub(rhs_val, sema.arena) |
| 8285 | try lhs_val.intSubSat(rhs_val, scalar_type, sema.arena, target), | 8290 | else |
| 8286 | ); | 8291 | try lhs_val.intSubSat(rhs_val, scalar_type, sema.arena, target); |
| | 8292 | |
| | 8293 | return sema.addConstant(scalar_type, val); |
| 8287 | } else break :rs .{ .src = rhs_src, .air_tag = .sub_sat }; | 8294 | } else break :rs .{ .src = rhs_src, .air_tag = .sub_sat }; |
| 8288 | } else break :rs .{ .src = lhs_src, .air_tag = .sub_sat }; | 8295 | } else break :rs .{ .src = lhs_src, .air_tag = .sub_sat }; |
| 8289 | }, | 8296 | }, |
| ... | @@ -8663,10 +8670,13 @@ fn analyzeArithmetic( | ... | @@ -8663,10 +8670,13 @@ fn analyzeArithmetic( |
| 8663 | if (lhs_val.isUndef()) { | 8670 | if (lhs_val.isUndef()) { |
| 8664 | return sema.addConstUndef(scalar_type); | 8671 | return sema.addConstUndef(scalar_type); |
| 8665 | } | 8672 | } |
| 8666 | return sema.addConstant( | 8673 | |
| 8667 | scalar_type, | 8674 | const val = if (scalar_tag == .ComptimeInt) |
| 8668 | try lhs_val.intMulSat(rhs_val, scalar_type, sema.arena, target), | 8675 | try lhs_val.intMul(rhs_val, sema.arena) |
| 8669 | ); | 8676 | else |
| | 8677 | try lhs_val.intMulSat(rhs_val, scalar_type, sema.arena, target); |
| | 8678 | |
| | 8679 | return sema.addConstant(scalar_type, val); |
| 8670 | } else break :rs .{ .src = lhs_src, .air_tag = .mul_sat }; | 8680 | } else break :rs .{ .src = lhs_src, .air_tag = .mul_sat }; |
| 8671 | } else break :rs .{ .src = rhs_src, .air_tag = .mul_sat }; | 8681 | } else break :rs .{ .src = rhs_src, .air_tag = .mul_sat }; |
| 8672 | }, | 8682 | }, |