fabs.zig (1913B) - Raw
1 const std = @import("std"); 2 const builtin = @import("builtin"); 3 const arch = builtin.cpu.arch; 4 const common = @import("common.zig"); 5 6 pub const panic = common.panic; 7 8 comptime { 9 @export(&__fabsh, .{ .name = "__fabsh", .linkage = common.linkage, .visibility = common.visibility }); 10 @export(&fabsf, .{ .name = "fabsf", .linkage = common.linkage, .visibility = common.visibility }); 11 @export(&fabs, .{ .name = "fabs", .linkage = common.linkage, .visibility = common.visibility }); 12 @export(&__fabsx, .{ .name = "__fabsx", .linkage = common.linkage, .visibility = common.visibility }); 13 if (common.want_ppc_abi) { 14 @export(&fabsq, .{ .name = "fabsf128", .linkage = common.linkage, .visibility = common.visibility }); 15 } 16 @export(&fabsq, .{ .name = "fabsq", .linkage = common.linkage, .visibility = common.visibility }); 17 @export(&fabsl, .{ .name = "fabsl", .linkage = common.linkage, .visibility = common.visibility }); 18 } 19 20 pub fn __fabsh(a: f16) callconv(.c) f16 { 21 return generic_fabs(a); 22 } 23 24 pub fn fabsf(a: f32) callconv(.c) f32 { 25 return generic_fabs(a); 26 } 27 28 pub fn fabs(a: f64) callconv(.c) f64 { 29 return generic_fabs(a); 30 } 31 32 pub fn __fabsx(a: f80) callconv(.c) f80 { 33 return generic_fabs(a); 34 } 35 36 pub fn fabsq(a: f128) callconv(.c) f128 { 37 return generic_fabs(a); 38 } 39 40 pub fn fabsl(x: c_longdouble) callconv(.c) c_longdouble { 41 switch (@typeInfo(c_longdouble).float.bits) { 42 16 => return __fabsh(x), 43 32 => return fabsf(x), 44 64 => return fabs(x), 45 80 => return __fabsx(x), 46 128 => return fabsq(x), 47 else => @compileError("unreachable"), 48 } 49 } 50 51 inline fn generic_fabs(x: anytype) @TypeOf(x) { 52 const T = @TypeOf(x); 53 const TBits = std.meta.Int(.unsigned, @typeInfo(T).float.bits); 54 const float_bits: TBits = @bitCast(x); 55 const remove_sign = ~@as(TBits, 0) >> 1; 56 return @bitCast(float_bits & remove_sign); 57 }