╭ fmax.zig ─────────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭ find file ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ ╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │ │ │http│ ssh │ │ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
.. aarch64_outline_atomics.zig absv.zig absvdi2.zig absvdi2_test.zig absvsi2.zig absvsi2_test.zig absvti2.zig absvti2_test.zig addf3.zig addf3_test.zig addvdi3.zig addvsi3.zig arm.zig atomics.zig aulldiv.zig aullrem.zig bitreverse.zig bitreversedi2_test.zig bitreversesi2_test.zig bitreverseti2_test.zig bswap.zig bswapdi2_test.zig bswapsi2_test.zig bswapti2_test.zig clear_cache.zig clzdi2_test.zig clzsi2_test.zig clzti2_test.zig cmp.zig cmpdi2_test.zig cmpsi2_test.zig cmpti2_test.zig comparedf2_test.zig comparef.zig comparesf2_test.zig cos.zig count0bits.zig ctzdi2_test.zig ctzsi2_test.zig ctzti2_test.zig divc3.zig divc3_test.zig divdf3.zig divdf3_test.zig divmodei4.zig divsf3.zig divsf3_test.zig divtf3.zig divtf3_test.zig divti3_test.zig divxf3.zig divxf3_test.zig emutls.zig exp.zig exp2.zig exp_f128.zig extendf.zig extendf_test.zig fabs.zig ffsdi2_test.zig ffssi2_test.zig ffsti2_test.zig float_from_int.zig float_from_int_test.zig floor_ceil.zig fma.zig ╭─────────────────────────────────╮ │fmax.zig │ ╰─────────────────────────────────╯ fmin.zig fmod.zig fmodq_test.zig fmodx_test.zig hexagon.zig int.zig int_from_float.zig int_from_float_test.zig limb64.zig log.zig log10.zig log2.zig log_f128.zig memcpy.zig memmove.zig modti3_test.zig mulXi3.zig mulXi3_test.zig mulc3.zig mulc3_test.zig mulf3.zig mulf3_test.zig mulo.zig mulodi4_test.zig mulosi4_test.zig muloti4_test.zig mulvsi3.zig negdi2_test.zig negsi2_test.zig negti2_test.zig negv.zig negvdi2_test.zig negvsi2_test.zig negvti2_test.zig os_version_check.zig parity.zig paritydi2_test.zig paritysi2_test.zig parityti2_test.zig popcount.zig popcountdi2_test.zig popcountsi2_test.zig popcountti2_test.zig powiXf2.zig powiXf2_test.zig rem_pio2.zig rem_pio2_large.zig rem_pio2f.zig rem_pio2l.zig round.zig shift.zig shift_test.zig sin.zig sincos.zig sqrt.zig ssp.zig stack_probe.zig subvdi3.zig subvsi3.zig tan.zig trig.zig trunc.zig truncf.zig truncf_test.zig ucmpdi2_test.zig ucmpsi2_test.zig ucmpti2_test.zig udivmod.zig udivmoddi4_test.zig udivmodei4.zig udivmodsi4_test.zig udivmodti4_test.zig
1 const std = @import("std"); 2 const builtin = @import("builtin"); 3 const math = std.math; 4 const arch = builtin.cpu.arch; 5 const compiler_rt = @import("../compiler_rt.zig"); 6 const symbol = compiler_rt.symbol; 7 8 comptime { 9 symbol(&__fmaxh, "__fmaxh"); 10 symbol(&fmaxf, "fmaxf"); 11 symbol(&fmax, "fmax"); 12 symbol(&__fmaxx, "__fmaxx"); 13 symbol(&fmaxq, "fmaxf128"); 14 symbol(&fmaxl, "fmaxl"); 15 } 16 17 fn __fmaxh(x: compiler_rt.f16.Abi, y: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { 18 return compiler_rt.f16.toAbi(fmax_f16(compiler_rt.f16.fromAbi(x), compiler_rt.f16.fromAbi(y))); 19 } 20 pub fn fmax_f16(x: f16, y: f16) f16 { 21 return generic_fmax(f16, x, y); 22 } 23 24 fn fmaxf(x: compiler_rt.f32.Abi, y: compiler_rt.f32.Abi) callconv(.c) compiler_rt.f32.Abi { 25 return compiler_rt.f32.toAbi(fmax_f32(compiler_rt.f32.fromAbi(x), compiler_rt.f32.fromAbi(y))); 26 } 27 pub fn fmax_f32(x: f32, y: f32) f32 { 28 return generic_fmax(f32, x, y); 29 } 30 31 fn fmax(x: compiler_rt.f64.Abi, y: compiler_rt.f64.Abi) callconv(.c) compiler_rt.f64.Abi { 32 return compiler_rt.f64.toAbi(fmax_f64(compiler_rt.f64.fromAbi(x), compiler_rt.f64.fromAbi(y))); 33 } 34 pub fn fmax_f64(x: f64, y: f64) f64 { 35 return generic_fmax(f64, x, y); 36 } 37 38 fn __fmaxx(x: compiler_rt.f80.Abi, y: compiler_rt.f80.Abi) callconv(.c) compiler_rt.f80.Abi { 39 return compiler_rt.f80.toAbi(fmax_f80(compiler_rt.f80.fromAbi(x), compiler_rt.f80.fromAbi(y))); 40 } 41 pub fn fmax_f80(x: f80, y: f80) f80 { 42 return generic_fmax(f80, x, y); 43 } 44 45 fn fmaxq(x: compiler_rt.f128.Abi, y: compiler_rt.f128.Abi) callconv(.c) compiler_rt.f128.Abi { 46 return compiler_rt.f128.toAbi(fmax_f128(compiler_rt.f128.fromAbi(x), compiler_rt.f128.fromAbi(y))); 47 } 48 pub fn fmax_f128(x: f128, y: f128) f128 { 49 return generic_fmax(f128, x, y); 50 } 51 52 pub fn fmaxl(x: c_longdouble, y: c_longdouble) callconv(.c) c_longdouble { 53 switch (@typeInfo(c_longdouble).float.bits) { 54 64 => return fmax_f64(x, y), 55 80 => return fmax_f80(x, y), 56 128 => return fmax_f128(x, y), 57 else => comptime unreachable, 58 } 59 } 60 61 inline fn generic_fmax(comptime T: type, x: T, y: T) T { 62 if (math.isNan(x)) 63 return y; 64 if (math.isNan(y)) 65 return x; 66 if (math.signbit(x) != math.signbit(y)) 67 return if (math.signbit(x)) y else x; 68 return if (x < y) y else x; 69 } 70 71 test "generic_fmax" { 72 inline for ([_]type{ f32, f64, c_longdouble, f80, f128 }) |T| { 73 const nan_val = math.nan(T); 74 const Int = @Int(.unsigned, @bitSizeOf(T)); 75 76 try std.testing.expect(math.isNan(generic_fmax(T, nan_val, nan_val))); 77 try std.testing.expectEqual(@as(T, 1.0), generic_fmax(T, nan_val, 1.0)); 78 try std.testing.expectEqual(@as(T, 1.0), generic_fmax(T, 1.0, nan_val)); 79 80 try std.testing.expectEqual(@as(T, 10.0), generic_fmax(T, 1.0, 10.0)); 81 try std.testing.expectEqual(@as(T, 1.0), generic_fmax(T, 1.0, -1.0)); 82 83 try std.testing.expectEqual(@as(Int, @bitCast(@as(T, 0.0))), @as(Int, @bitCast(generic_fmax(T, 0.0, -0.0)))); 84 try std.testing.expectEqual(@as(Int, @bitCast(@as(T, 0.0))), @as(Int, @bitCast(generic_fmax(T, -0.0, 0.0)))); 85 } 86 } 87