| ... | ... | @@ -20927,7 +20927,7 @@ fn zirRoundCast( |
| 20927 | 20927 | |
| 20928 | 20928 | if (sema.resolveValue(operand)) |operand_val| { |
| 20929 | 20929 | const result_val = try sema.intFromFloat(block, operand_src, operand_val, operand_ty, dest_ty, mode); |
| 20930 | | return Air.internedToRef(result_val.toIntern()); |
| 20930 | return .fromValue(result_val); |
| 20931 | 20931 | } else if (dest_scalar_ty.zigTypeTag(zcu) == .comptime_int) { |
| 20932 | 20932 | return sema.failWithNeededComptime(block, operand_src, .{ .simple = .casted_to_comptime_int }); |
| 20933 | 20933 | } |
| ... | ... | @@ -20948,32 +20948,23 @@ fn zirRoundCast( |
| 20948 | 20948 | } |
| 20949 | 20949 | |
| 20950 | 20950 | const safe = block.wantSafety(); |
| 20951 | | const optimized = block.float_mode == .optimized; |
| 20952 | 20951 | |
| 20953 | 20952 | if (safe) { |
| 20954 | 20953 | try sema.preparePanicId(src, .integer_part_out_of_bounds); |
| 20955 | 20954 | } |
| 20956 | 20955 | |
| 20957 | | if (mode == .truncate) { |
| 20958 | | const air_tag: Air.Inst.Tag = if (safe) |
| 20959 | | if (optimized) .int_from_float_optimized_safe else .int_from_float_safe |
| 20960 | | else if (optimized) .int_from_float_optimized else .int_from_float; |
| 20961 | | return block.addTyOp(air_tag, dest_ty, operand); |
| 20962 | | } else { |
| 20963 | | const op_tag: Air.Inst.Tag = switch (mode) { |
| 20964 | | .round => .round, |
| 20965 | | .floor => .floor, |
| 20966 | | .ceil => .ceil, |
| 20967 | | .truncate, .exact => unreachable, |
| 20968 | | }; |
| 20969 | | const rounded_op = try block.addUnOp(op_tag, operand); |
| 20970 | | |
| 20971 | | const air_tag: Air.Inst.Tag = if (safe) |
| 20972 | | if (optimized) .int_from_float_optimized_safe else .int_from_float_safe |
| 20973 | | else if (optimized) .int_from_float_optimized else .int_from_float; |
| 20974 | | |
| 20975 | | return block.addTyOp(air_tag, dest_ty, rounded_op); |
| 20976 | | } |
| 20956 | const uncasted_result: Air.Inst.Ref = switch (mode) { |
| 20957 | .truncate => operand, |
| 20958 | .round => try block.addUnOp(.round, operand), |
| 20959 | .floor => try block.addUnOp(.floor, operand), |
| 20960 | .ceil => try block.addUnOp(.ceil, operand), |
| 20961 | .exact => unreachable, |
| 20962 | }; |
| 20963 | const air_cast_tag: Air.Inst.Tag = switch (block.float_mode) { |
| 20964 | .optimized => if (safe) .int_from_float_optimized_safe else .int_from_float_safe, |
| 20965 | .strict => if (safe) .int_from_float_safe else .int_from_float, |
| 20966 | }; |
| 20967 | return block.addTyOp(air_cast_tag, dest_ty, uncasted_result); |
| 20977 | 20968 | } |
| 20978 | 20969 | |
| 20979 | 20970 | fn zirFloatFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |