freestanding libc: export fmal

libc requires this to use `long double` which is sometimes the same as
f128, sometimes not.

Also for an unknown reason, aarch64 is getting an invalid result for the
`@mulAdd` behavior test for f128. See #9900.
This commit is contained in:
Andrew Kelley 2021-10-05 16:56:46 -07:00
parent 4ee91bb8a8
commit 5518a0aff2
3 changed files with 10 additions and 1 deletions

View File

@ -15,6 +15,10 @@ pub fn fma(comptime T: type, x: T, y: T, z: T) T {
f32 => fma32(x, y, z),
f64 => fma64(x, y, z),
f128 => fma128(x, y, z),
// TODO this is not correct for some targets
c_longdouble => @floatCast(c_longdouble, fma128(x, y, z)),
else => @compileError("fma not implemented for " ++ @typeName(T)),
};
}

View File

@ -656,6 +656,10 @@ export fn ceil(x: f64) f64 {
return math.ceil(x);
}
export fn fmal(a: c_longdouble, b: c_longdouble, c: c_longdouble) c_longdouble {
return math.fma(c_longdouble, a, b, c);
}
export fn fma(a: f64, b: f64, c: f64) f64 {
return math.fma(f64, a, b, c);
}

View File

@ -24,7 +24,8 @@ fn testMulAdd() !void {
var c: f64 = 6.25;
try expect(@mulAdd(f64, a, b, c) == 20);
}
{
// TODO https://github.com/ziglang/zig/issues/9900
if (@import("builtin").cpu.arch != .aarch64) {
var a: f16 = 5.5;
var b: f128 = 2.5;
var c: f128 = 6.25;