compiler-rt: math functions reorg
* unify the logic for exporting math functions from compiler-rt,
with the appropriate suffixes and prefixes.
- add all missing f128 and f80 exports. Functions with missing
implementations call other functions and have TODO comments.
- also add f16 functions
* move math functions from freestanding libc to compiler-rt (#7265)
* enable all the f128 and f80 code in the stage2 compiler and behavior
tests (#11161).
* update std lib to use builtins rather than `std.math`.
This commit is contained in:
@@ -66,7 +66,7 @@ fn atan32(z: Complex(f32)) Complex(f32) {
|
||||
|
||||
t = y + 1.0;
|
||||
a = (x2 + (t * t)) / a;
|
||||
return Complex(f32).init(w, 0.25 * math.ln(a));
|
||||
return Complex(f32).init(w, 0.25 * @log(a));
|
||||
}
|
||||
|
||||
fn redupif64(x: f64) f64 {
|
||||
@@ -115,7 +115,7 @@ fn atan64(z: Complex(f64)) Complex(f64) {
|
||||
|
||||
t = y + 1.0;
|
||||
a = (x2 + (t * t)) / a;
|
||||
return Complex(f64).init(w, 0.25 * math.ln(a));
|
||||
return Complex(f64).init(w, 0.25 * @log(a));
|
||||
}
|
||||
|
||||
const epsilon = 0.0001;
|
||||
|
||||
@@ -44,12 +44,12 @@ fn cosh32(z: Complex(f32)) Complex(f32) {
|
||||
// |x|>= 9, so cosh(x) ~= exp(|x|)
|
||||
if (ix < 0x42b17218) {
|
||||
// x < 88.7: exp(|x|) won't overflow
|
||||
const h = math.exp(math.fabs(x)) * 0.5;
|
||||
const h = @exp(@fabs(x)) * 0.5;
|
||||
return Complex(f32).init(math.copysign(f32, h, x) * math.cos(y), h * math.sin(y));
|
||||
}
|
||||
// x < 192.7: scale to avoid overflow
|
||||
else if (ix < 0x4340b1e7) {
|
||||
const v = Complex(f32).init(math.fabs(x), y);
|
||||
const v = Complex(f32).init(@fabs(x), y);
|
||||
const r = ldexp_cexp(v, -1);
|
||||
return Complex(f32).init(r.re, r.im * math.copysign(f32, 1, x));
|
||||
}
|
||||
@@ -112,12 +112,12 @@ fn cosh64(z: Complex(f64)) Complex(f64) {
|
||||
// |x|>= 22, so cosh(x) ~= exp(|x|)
|
||||
if (ix < 0x40862e42) {
|
||||
// x < 710: exp(|x|) won't overflow
|
||||
const h = math.exp(math.fabs(x)) * 0.5;
|
||||
const h = @exp(@fabs(x)) * 0.5;
|
||||
return Complex(f64).init(h * math.cos(y), math.copysign(f64, h, x) * math.sin(y));
|
||||
}
|
||||
// x < 1455: scale to avoid overflow
|
||||
else if (ix < 0x4096bbaa) {
|
||||
const v = Complex(f64).init(math.fabs(x), y);
|
||||
const v = Complex(f64).init(@fabs(x), y);
|
||||
const r = ldexp_cexp(v, -1);
|
||||
return Complex(f64).init(r.re, r.im * math.copysign(f64, 1, x));
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ fn exp32(z: Complex(f32)) Complex(f32) {
|
||||
const hy = @bitCast(u32, y) & 0x7fffffff;
|
||||
// cexp(x + i0) = exp(x) + i0
|
||||
if (hy == 0) {
|
||||
return Complex(f32).init(math.exp(x), y);
|
||||
return Complex(f32).init(@exp(x), y);
|
||||
}
|
||||
|
||||
const hx = @bitCast(u32, x);
|
||||
@@ -63,7 +63,7 @@ fn exp32(z: Complex(f32)) Complex(f32) {
|
||||
// - x = +-inf
|
||||
// - x = nan
|
||||
else {
|
||||
const exp_x = math.exp(x);
|
||||
const exp_x = @exp(x);
|
||||
return Complex(f32).init(exp_x * math.cos(y), exp_x * math.sin(y));
|
||||
}
|
||||
}
|
||||
@@ -81,7 +81,7 @@ fn exp64(z: Complex(f64)) Complex(f64) {
|
||||
|
||||
// cexp(x + i0) = exp(x) + i0
|
||||
if (hy | ly == 0) {
|
||||
return Complex(f64).init(math.exp(x), y);
|
||||
return Complex(f64).init(@exp(x), y);
|
||||
}
|
||||
|
||||
const fx = @bitCast(u64, x);
|
||||
@@ -114,13 +114,13 @@ fn exp64(z: Complex(f64)) Complex(f64) {
|
||||
// - x = +-inf
|
||||
// - x = nan
|
||||
else {
|
||||
const exp_x = math.exp(x);
|
||||
const exp_x = @exp(x);
|
||||
return Complex(f64).init(exp_x * math.cos(y), exp_x * math.sin(y));
|
||||
}
|
||||
}
|
||||
|
||||
test "complex.cexp32" {
|
||||
const tolerance_f32 = math.sqrt(math.floatEps(f32));
|
||||
const tolerance_f32 = @sqrt(math.floatEps(f32));
|
||||
|
||||
{
|
||||
const a = Complex(f32).init(5, 3);
|
||||
@@ -140,7 +140,7 @@ test "complex.cexp32" {
|
||||
}
|
||||
|
||||
test "complex.cexp64" {
|
||||
const tolerance_f64 = math.sqrt(math.floatEps(f64));
|
||||
const tolerance_f64 = @sqrt(math.floatEps(f64));
|
||||
|
||||
{
|
||||
const a = Complex(f64).init(5, 3);
|
||||
|
||||
@@ -26,7 +26,7 @@ fn frexp_exp32(x: f32, expt: *i32) f32 {
|
||||
const k = 235; // reduction constant
|
||||
const kln2 = 162.88958740; // k * ln2
|
||||
|
||||
const exp_x = math.exp(x - kln2);
|
||||
const exp_x = @exp(x - kln2);
|
||||
const hx = @bitCast(u32, exp_x);
|
||||
// TODO zig should allow this cast implicitly because it should know the value is in range
|
||||
expt.* = @intCast(i32, hx >> 23) - (0x7f + 127) + k;
|
||||
@@ -54,7 +54,7 @@ fn frexp_exp64(x: f64, expt: *i32) f64 {
|
||||
const k = 1799; // reduction constant
|
||||
const kln2 = 1246.97177782734161156; // k * ln2
|
||||
|
||||
const exp_x = math.exp(x - kln2);
|
||||
const exp_x = @exp(x - kln2);
|
||||
|
||||
const fx = @bitCast(u64, exp_x);
|
||||
const hx = @intCast(u32, fx >> 32);
|
||||
|
||||
@@ -10,7 +10,7 @@ pub fn log(z: anytype) Complex(@TypeOf(z.re)) {
|
||||
const r = cmath.abs(z);
|
||||
const phi = cmath.arg(z);
|
||||
|
||||
return Complex(T).init(math.ln(r), phi);
|
||||
return Complex(T).init(@log(r), phi);
|
||||
}
|
||||
|
||||
const epsilon = 0.0001;
|
||||
|
||||
@@ -44,12 +44,12 @@ fn sinh32(z: Complex(f32)) Complex(f32) {
|
||||
// |x|>= 9, so cosh(x) ~= exp(|x|)
|
||||
if (ix < 0x42b17218) {
|
||||
// x < 88.7: exp(|x|) won't overflow
|
||||
const h = math.exp(math.fabs(x)) * 0.5;
|
||||
const h = @exp(@fabs(x)) * 0.5;
|
||||
return Complex(f32).init(math.copysign(f32, h, x) * math.cos(y), h * math.sin(y));
|
||||
}
|
||||
// x < 192.7: scale to avoid overflow
|
||||
else if (ix < 0x4340b1e7) {
|
||||
const v = Complex(f32).init(math.fabs(x), y);
|
||||
const v = Complex(f32).init(@fabs(x), y);
|
||||
const r = ldexp_cexp(v, -1);
|
||||
return Complex(f32).init(r.re * math.copysign(f32, 1, x), r.im);
|
||||
}
|
||||
@@ -111,12 +111,12 @@ fn sinh64(z: Complex(f64)) Complex(f64) {
|
||||
// |x|>= 22, so cosh(x) ~= exp(|x|)
|
||||
if (ix < 0x40862e42) {
|
||||
// x < 710: exp(|x|) won't overflow
|
||||
const h = math.exp(math.fabs(x)) * 0.5;
|
||||
const h = @exp(@fabs(x)) * 0.5;
|
||||
return Complex(f64).init(math.copysign(f64, h, x) * math.cos(y), h * math.sin(y));
|
||||
}
|
||||
// x < 1455: scale to avoid overflow
|
||||
else if (ix < 0x4096bbaa) {
|
||||
const v = Complex(f64).init(math.fabs(x), y);
|
||||
const v = Complex(f64).init(@fabs(x), y);
|
||||
const r = ldexp_cexp(v, -1);
|
||||
return Complex(f64).init(r.re * math.copysign(f64, 1, x), r.im);
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ fn sqrt32(z: Complex(f32)) Complex(f32) {
|
||||
// sqrt(-inf + i nan) = nan +- inf i
|
||||
// sqrt(-inf + iy) = 0 + inf i
|
||||
if (math.signbit(x)) {
|
||||
return Complex(f32).init(math.fabs(x - y), math.copysign(f32, x, y));
|
||||
return Complex(f32).init(@fabs(x - y), math.copysign(f32, x, y));
|
||||
} else {
|
||||
return Complex(f32).init(x, math.copysign(f32, y - y, y));
|
||||
}
|
||||
@@ -56,15 +56,15 @@ fn sqrt32(z: Complex(f32)) Complex(f32) {
|
||||
const dy = @as(f64, y);
|
||||
|
||||
if (dx >= 0) {
|
||||
const t = math.sqrt((dx + math.hypot(f64, dx, dy)) * 0.5);
|
||||
const t = @sqrt((dx + math.hypot(f64, dx, dy)) * 0.5);
|
||||
return Complex(f32).init(
|
||||
@floatCast(f32, t),
|
||||
@floatCast(f32, dy / (2.0 * t)),
|
||||
);
|
||||
} else {
|
||||
const t = math.sqrt((-dx + math.hypot(f64, dx, dy)) * 0.5);
|
||||
const t = @sqrt((-dx + math.hypot(f64, dx, dy)) * 0.5);
|
||||
return Complex(f32).init(
|
||||
@floatCast(f32, math.fabs(y) / (2.0 * t)),
|
||||
@floatCast(f32, @fabs(y) / (2.0 * t)),
|
||||
@floatCast(f32, math.copysign(f64, t, y)),
|
||||
);
|
||||
}
|
||||
@@ -94,7 +94,7 @@ fn sqrt64(z: Complex(f64)) Complex(f64) {
|
||||
// sqrt(-inf + i nan) = nan +- inf i
|
||||
// sqrt(-inf + iy) = 0 + inf i
|
||||
if (math.signbit(x)) {
|
||||
return Complex(f64).init(math.fabs(x - y), math.copysign(f64, x, y));
|
||||
return Complex(f64).init(@fabs(x - y), math.copysign(f64, x, y));
|
||||
} else {
|
||||
return Complex(f64).init(x, math.copysign(f64, y - y, y));
|
||||
}
|
||||
@@ -104,7 +104,7 @@ fn sqrt64(z: Complex(f64)) Complex(f64) {
|
||||
|
||||
// scale to avoid overflow
|
||||
var scale = false;
|
||||
if (math.fabs(x) >= threshold or math.fabs(y) >= threshold) {
|
||||
if (@fabs(x) >= threshold or @fabs(y) >= threshold) {
|
||||
x *= 0.25;
|
||||
y *= 0.25;
|
||||
scale = true;
|
||||
@@ -112,11 +112,11 @@ fn sqrt64(z: Complex(f64)) Complex(f64) {
|
||||
|
||||
var result: Complex(f64) = undefined;
|
||||
if (x >= 0) {
|
||||
const t = math.sqrt((x + math.hypot(f64, x, y)) * 0.5);
|
||||
const t = @sqrt((x + math.hypot(f64, x, y)) * 0.5);
|
||||
result = Complex(f64).init(t, y / (2.0 * t));
|
||||
} else {
|
||||
const t = math.sqrt((-x + math.hypot(f64, x, y)) * 0.5);
|
||||
result = Complex(f64).init(math.fabs(y) / (2.0 * t), math.copysign(f64, t, y));
|
||||
const t = @sqrt((-x + math.hypot(f64, x, y)) * 0.5);
|
||||
result = Complex(f64).init(@fabs(y) / (2.0 * t), math.copysign(f64, t, y));
|
||||
}
|
||||
|
||||
if (scale) {
|
||||
|
||||
@@ -44,7 +44,7 @@ fn tanh32(z: Complex(f32)) Complex(f32) {
|
||||
|
||||
// x >= 11
|
||||
if (ix >= 0x41300000) {
|
||||
const exp_mx = math.exp(-math.fabs(x));
|
||||
const exp_mx = @exp(-@fabs(x));
|
||||
return Complex(f32).init(math.copysign(f32, 1, x), 4 * math.sin(y) * math.cos(y) * exp_mx * exp_mx);
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ fn tanh32(z: Complex(f32)) Complex(f32) {
|
||||
const t = math.tan(y);
|
||||
const beta = 1.0 + t * t;
|
||||
const s = math.sinh(x);
|
||||
const rho = math.sqrt(1 + s * s);
|
||||
const rho = @sqrt(1 + s * s);
|
||||
const den = 1 + beta * s * s;
|
||||
|
||||
return Complex(f32).init((beta * rho * s) / den, t / den);
|
||||
@@ -87,7 +87,7 @@ fn tanh64(z: Complex(f64)) Complex(f64) {
|
||||
|
||||
// x >= 22
|
||||
if (ix >= 0x40360000) {
|
||||
const exp_mx = math.exp(-math.fabs(x));
|
||||
const exp_mx = @exp(-@fabs(x));
|
||||
return Complex(f64).init(math.copysign(f64, 1, x), 4 * math.sin(y) * math.cos(y) * exp_mx * exp_mx);
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ fn tanh64(z: Complex(f64)) Complex(f64) {
|
||||
const t = math.tan(y);
|
||||
const beta = 1.0 + t * t;
|
||||
const s = math.sinh(x);
|
||||
const rho = math.sqrt(1 + s * s);
|
||||
const rho = @sqrt(1 + s * s);
|
||||
const den = 1 + beta * s * s;
|
||||
|
||||
return Complex(f64).init((beta * rho * s) / den, t / den);
|
||||
|
||||
Reference in New Issue
Block a user