mirror of
https://github.com/ziglang/zig.git
synced 2024-11-27 23:52:31 +00:00
c50f33b111
The Zig LLVM backend emits calls to softfloat methods with the "standard compiler-rt" names. Rather than add complexity to the backend and have to synchronize the naming scheme across all targets, the simplest fix is just to export these symbols under both the "standard" and the platform-specific naming convention.
58 lines
1.6 KiB
Zig
58 lines
1.6 KiB
Zig
const std = @import("std");
|
|
const builtin = @import("builtin");
|
|
const arch = builtin.cpu.arch;
|
|
const common = @import("common.zig");
|
|
|
|
pub const panic = common.panic;
|
|
|
|
comptime {
|
|
@export(__fabsh, .{ .name = "__fabsh", .linkage = common.linkage });
|
|
@export(fabsf, .{ .name = "fabsf", .linkage = common.linkage });
|
|
@export(fabs, .{ .name = "fabs", .linkage = common.linkage });
|
|
@export(__fabsx, .{ .name = "__fabsx", .linkage = common.linkage });
|
|
if (common.want_ppc_abi) {
|
|
@export(fabsq, .{ .name = "fabsf128", .linkage = common.linkage });
|
|
}
|
|
@export(fabsq, .{ .name = "fabsq", .linkage = common.linkage });
|
|
@export(fabsl, .{ .name = "fabsl", .linkage = common.linkage });
|
|
}
|
|
|
|
pub fn __fabsh(a: f16) callconv(.C) f16 {
|
|
return generic_fabs(a);
|
|
}
|
|
|
|
pub fn fabsf(a: f32) callconv(.C) f32 {
|
|
return generic_fabs(a);
|
|
}
|
|
|
|
pub fn fabs(a: f64) callconv(.C) f64 {
|
|
return generic_fabs(a);
|
|
}
|
|
|
|
pub fn __fabsx(a: f80) callconv(.C) f80 {
|
|
return generic_fabs(a);
|
|
}
|
|
|
|
pub fn fabsq(a: f128) callconv(.C) f128 {
|
|
return generic_fabs(a);
|
|
}
|
|
|
|
pub fn fabsl(x: c_longdouble) callconv(.C) c_longdouble {
|
|
switch (@typeInfo(c_longdouble).Float.bits) {
|
|
16 => return __fabsh(x),
|
|
32 => return fabsf(x),
|
|
64 => return fabs(x),
|
|
80 => return __fabsx(x),
|
|
128 => return fabsq(x),
|
|
else => @compileError("unreachable"),
|
|
}
|
|
}
|
|
|
|
inline fn generic_fabs(x: anytype) @TypeOf(x) {
|
|
const T = @TypeOf(x);
|
|
const TBits = std.meta.Int(.unsigned, @typeInfo(T).Float.bits);
|
|
const float_bits = @bitCast(TBits, x);
|
|
const remove_sign = ~@as(TBits, 0) >> 1;
|
|
return @bitCast(T, float_bits & remove_sign);
|
|
}
|