From 4a8b24d67659ad6c70b655c3f65fbe0b9727451e Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Fri, 3 Jul 2026 00:21:42 +0200 Subject: [PATCH] fixing release fast OpFMod --- src/opcodes.zig | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/opcodes.zig b/src/opcodes.zig index 90eeaeb..dd14b7b 100644 --- a/src/opcodes.zig +++ b/src/opcodes.zig @@ -2865,6 +2865,11 @@ fn opTranspose(_: std.mem.Allocator, _: SpvWord, rt: *Runtime) RuntimeError!void fn MathEngine(comptime T: PrimitiveType, comptime Op: MathOp, comptime IsAtomic: bool) type { return struct { + fn floatMod(comptime FloatT: type, lhs: FloatT, rhs: FloatT) FloatT { + @setFloatMode(.strict); + return lhs - rhs * @floor(lhs / rhs); + } + fn operation(comptime TT: type, op1: TT, op2: TT) RuntimeError!TT { const is_int = @typeInfo(TT) == .int or (@typeInfo(TT) == .vector and @typeInfo(std.meta.Child(TT)) == .int); const op2_is_zero = if (@typeInfo(TT) == .vector) std.simd.countElementsWithValue(op2, 0) != 0 else op2 == 0; @@ -2882,7 +2887,7 @@ fn MathEngine(comptime T: PrimitiveType, comptime Op: MathOp, comptime IsAtomic: 0 else switch (Op) { .Div => if (comptime is_int) @divTrunc(op1[i], op2[i]) else op1[i] / op2[i], - .Mod => @mod(op1[i], op2[i]), + .Mod => if (comptime is_int) @mod(op1[i], op2[i]) else floatMod(@TypeOf(op1[i]), op1[i], op2[i]), .Rem => @rem(op1[i], op2[i]), else => unreachable, }; @@ -2909,7 +2914,7 @@ fn MathEngine(comptime T: PrimitiveType, comptime Op: MathOp, comptime IsAtomic: } break :blk if (comptime is_int) @divTrunc(op1, op2) else op1 / op2; }, - .Mod => if (op2_is_zero) zero else @mod(op1, op2), + .Mod => if (op2_is_zero) zero else if (comptime is_int) @mod(op1, op2) else floatMod(TT, op1, op2), .Rem => if (op2_is_zero) zero else @rem(op1, op2), else => return RuntimeError.InvalidSpirV, };