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