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(...@@ -20927,7 +20927,7 @@ fn zirRoundCast(
2092720927
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 }
2094920949
20950 const safe = block.wantSafety();20950 const safe = block.wantSafety();
20951 const optimized = block.float_mode == .optimized;
2095220951
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 }
2095620955
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_safe20958 .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}
2097820969
20979fn zirFloatFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {20970fn zirFloatFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {