authorgravatar for adria.arrufat@gmail.comAdrià Arrufat <adria.arrufat@gmail.com> 2026-03-20 17:02:48+09:00
committergravatar for adria.arrufat@gmail.comAdrià Arrufat <adria.arrufat@gmail.com> 2026-03-20 17:02:51+09:00
log168be7a8d2a07b1079e54afdc7c602f8eca1f5ef
treea828d804b589e1aaa6989756dd722f411b4b959a
parent77be7d36aa9e52a9fa045acf927b1d422c4e344b

Sema: simplify zirRoundCast logic


1 files changed, 13 insertions(+), 22 deletions(-)

src/Sema.zig+13-22
......@@ -20927,7 +20927,7 @@ fn zirRoundCast(
2092720927
2092820928 if (sema.resolveValue(operand)) |operand_val| {
2092920929 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);
2093120931 } else if (dest_scalar_ty.zigTypeTag(zcu) == .comptime_int) {
2093220932 return sema.failWithNeededComptime(block, operand_src, .{ .simple = .casted_to_comptime_int });
2093320933 }
......@@ -20948,32 +20948,23 @@ fn zirRoundCast(
2094820948 }
2094920949
2095020950 const safe = block.wantSafety();
20951 const optimized = block.float_mode == .optimized;
2095220951
2095320952 if (safe) {
2095420953 try sema.preparePanicId(src, .integer_part_out_of_bounds);
2095520954 }
2095620955
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);
2097720968}
2097820969
2097920970fn zirFloatFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {