diff --git a/lib/compiler_rt.zig b/lib/compiler_rt.zig index 89801438a37f1147b303e69084e26fcf93d2b78e..92e44f9706631ed198c090c7f119523c83acd3e4 100644 --- a/lib/compiler_rt.zig +++ b/lib/compiler_rt.zig @@ -394,6 +394,14 @@ fn complexAbi(comptime Float: type, comptime float: type) type { }; } +pub const have_c_longdouble = if (builtin.target.cTypeBitSize(.longdouble)) |bits| switch (bits) { + else => true, + 80 => switch (std.zig.target.compilerRtFloatAbi(&builtin.target, bits)) { + .soft => false, + .hard => true, + }, +} else false; + pub fn Complex(comptime Float: type) type { return struct { real: Float, imag: Float }; } diff --git a/lib/compiler_rt/cos.zig b/lib/compiler_rt/cos.zig index 72ea9026472a1f8e31bca5cddc9e106cfd66155b..0d836ccfa9e8cff50ef2a2a7fc608a5b30d57ff9 100644 --- a/lib/compiler_rt/cos.zig +++ b/lib/compiler_rt/cos.zig @@ -25,8 +25,10 @@ comptime { symbol(&cos, "cos"); symbol(&__cosx, "__cosx"); symbol(&cosq, "cosf128"); - symbol(&cosl, "cosl"); - symbol(&cosl, "__cosl"); // required by musl + if (compiler_rt.have_c_longdouble) { + symbol(&cosl, "cosl"); + symbol(&cosl, "__cosl"); // required by musl + } } fn __cosh(x: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/exp.zig b/lib/compiler_rt/exp.zig index 6f9d19ddb3adbfe743fd278ce9e458ae45341502..4d26f7cff292ec5741b2b9501cdb10b3567b1080 100644 --- a/lib/compiler_rt/exp.zig +++ b/lib/compiler_rt/exp.zig @@ -22,7 +22,7 @@ comptime { symbol(&exp, "exp"); symbol(&__expx, "__expx"); symbol(&expq, "expf128"); - symbol(&expl, "expl"); + if (compiler_rt.have_c_longdouble) symbol(&expl, "expl"); } fn __exph(x: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/exp2.zig b/lib/compiler_rt/exp2.zig index 4f25cdec63332788d1bdda417503901b02ce6154..9c0e087b674d9c66e3a4abda3a923b2f8c222c0e 100644 --- a/lib/compiler_rt/exp2.zig +++ b/lib/compiler_rt/exp2.zig @@ -20,7 +20,7 @@ comptime { symbol(&exp2, "exp2"); symbol(&__exp2x, "__exp2x"); symbol(&exp2q, "exp2f128"); - symbol(&exp2l, "exp2l"); + if (compiler_rt.have_c_longdouble) symbol(&exp2l, "exp2l"); } fn __exp2h(x: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/fabs.zig b/lib/compiler_rt/fabs.zig index 2238e65e61292668cb2e7bc2e2be3f090470b2e9..971bb72893b3c683227f1456170f99c81c9758a6 100644 --- a/lib/compiler_rt/fabs.zig +++ b/lib/compiler_rt/fabs.zig @@ -10,7 +10,7 @@ comptime { symbol(&fabs, "fabs"); symbol(&__fabsx, "__fabsx"); symbol(&fabsq, "fabsf128"); - symbol(&fabsl, "fabsl"); + if (compiler_rt.have_c_longdouble) symbol(&fabsl, "fabsl"); } fn __fabsh(a: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/floor_ceil.zig b/lib/compiler_rt/floor_ceil.zig index 8bd82275e3787ae52587eb84c1391ee5949f616b..a11076bb0bcfa1da7a55e3608544c8c8b2f5d211 100644 --- a/lib/compiler_rt/floor_ceil.zig +++ b/lib/compiler_rt/floor_ceil.zig @@ -24,7 +24,7 @@ comptime { symbol(&floor, "floor"); symbol(&__floorx, "__floorx"); symbol(&floorq, "floorf128"); - symbol(&floorl, "floorl"); + if (compiler_rt.have_c_longdouble) symbol(&floorl, "floorl"); // ceil symbol(&__ceilh, "__ceilh"); @@ -32,7 +32,7 @@ comptime { symbol(&ceil, "ceil"); symbol(&__ceilx, "__ceilx"); symbol(&ceilq, "ceilf128"); - symbol(&ceill, "ceill"); + if (compiler_rt.have_c_longdouble) symbol(&ceill, "ceill"); } fn __floorh(x: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/fma.zig b/lib/compiler_rt/fma.zig index dfaefd0eb557e7be939f47d9340ef4d7ea3e094c..c244b72c03aa04e3e1381cf033e8028c80542c77 100644 --- a/lib/compiler_rt/fma.zig +++ b/lib/compiler_rt/fma.zig @@ -18,7 +18,7 @@ comptime { symbol(&fma, "fma"); symbol(&__fmax, "__fmax"); symbol(&fmaq, "fmaf128"); - symbol(&fmal, "fmal"); + if (compiler_rt.have_c_longdouble) symbol(&fmal, "fmal"); } fn __fmah(x: compiler_rt.f16.Abi, y: compiler_rt.f16.Abi, z: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/fmax.zig b/lib/compiler_rt/fmax.zig index f69912472044f62c50733968b382fec866d069c7..de72a1141d64878e80f5ebc99c69f6a69733e3ee 100644 --- a/lib/compiler_rt/fmax.zig +++ b/lib/compiler_rt/fmax.zig @@ -11,7 +11,7 @@ comptime { symbol(&fmax, "fmax"); symbol(&__fmaxx, "__fmaxx"); symbol(&fmaxq, "fmaxf128"); - symbol(&fmaxl, "fmaxl"); + if (compiler_rt.have_c_longdouble) symbol(&fmaxl, "fmaxl"); } fn __fmaxh(x: compiler_rt.f16.Abi, y: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/fmin.zig b/lib/compiler_rt/fmin.zig index bece9262f2a673919e33260576c2ce7d8730cdee..c00dab3ef6d2853f155f8d95e37dee0df1652edf 100644 --- a/lib/compiler_rt/fmin.zig +++ b/lib/compiler_rt/fmin.zig @@ -11,7 +11,7 @@ comptime { symbol(&fmin, "fmin"); symbol(&__fminx, "__fminx"); symbol(&fminq, "fminf128"); - symbol(&fminl, "fminl"); + if (compiler_rt.have_c_longdouble) symbol(&fminl, "fminl"); } fn __fminh(x: compiler_rt.f16.Abi, y: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/fmod.zig b/lib/compiler_rt/fmod.zig index 951b90d06e529e8a3a2606d7fe0eff1dcd9d667a..c079049f15d08ba6b59301db1523a3644dd1e940 100644 --- a/lib/compiler_rt/fmod.zig +++ b/lib/compiler_rt/fmod.zig @@ -13,7 +13,7 @@ comptime { symbol(&fmod, "fmod"); symbol(&__fmodx, "__fmodx"); symbol(&fmodq, "fmodf128"); - symbol(&fmodl, "fmodl"); + if (compiler_rt.have_c_longdouble) symbol(&fmodl, "fmodl"); } fn __fmodh(a: compiler_rt.f16.Abi, b: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/log.zig b/lib/compiler_rt/log.zig index 8b2937921d5998941e7731ac8decce71f60c85cb..d9935822b3a76cd47180ce9797f390c43e6ca5d5 100644 --- a/lib/compiler_rt/log.zig +++ b/lib/compiler_rt/log.zig @@ -19,7 +19,7 @@ comptime { symbol(&log, "log"); symbol(&__logx, "__logx"); symbol(&logq, "logf128"); - symbol(&logl, "logl"); + if (compiler_rt.have_c_longdouble) symbol(&logl, "logl"); } fn __logh(a: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/log10.zig b/lib/compiler_rt/log10.zig index 0813c1ae7c0dc6d71ae7aa2699f17e05bdffe039..75064c587c6ee632465bd6d695cf4fdc5aa7701a 100644 --- a/lib/compiler_rt/log10.zig +++ b/lib/compiler_rt/log10.zig @@ -19,7 +19,7 @@ comptime { symbol(&log10, "log10"); symbol(&__log10x, "__log10x"); symbol(&log10q, "log10f128"); - symbol(&log10l, "log10l"); + if (compiler_rt.have_c_longdouble) symbol(&log10l, "log10l"); } fn __log10h(a: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/log2.zig b/lib/compiler_rt/log2.zig index 0806fb079419787d33dd3b825b4057aac51f1397..d8033860a1b7ea63a2d391b940374f7613711fd2 100644 --- a/lib/compiler_rt/log2.zig +++ b/lib/compiler_rt/log2.zig @@ -20,7 +20,7 @@ comptime { symbol(&log2, "log2"); symbol(&__log2x, "__log2x"); symbol(&log2q, "log2f128"); - symbol(&log2l, "log2l"); + if (compiler_rt.have_c_longdouble) symbol(&log2l, "log2l"); } fn __log2h(a: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/round.zig b/lib/compiler_rt/round.zig index ffcaed60774e70e5067ff107380a8af5a057d718..f8074e46b473e34394b21aebff1c86f0fce4c4b5 100644 --- a/lib/compiler_rt/round.zig +++ b/lib/compiler_rt/round.zig @@ -19,7 +19,7 @@ comptime { symbol(&round, "round"); symbol(&__roundx, "__roundx"); symbol(&roundq, "roundf128"); - symbol(&roundl, "roundl"); + if (compiler_rt.have_c_longdouble) symbol(&roundl, "roundl"); } fn __roundh(x: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/sin.zig b/lib/compiler_rt/sin.zig index 3e0b8f0cbd823b0e57fe0172217c7726955c7fd1..004e55219e17902a0009fdd0a7dcc2c2aa56231d 100644 --- a/lib/compiler_rt/sin.zig +++ b/lib/compiler_rt/sin.zig @@ -25,8 +25,10 @@ comptime { symbol(&sin, "sin"); symbol(&__sinx, "__sinx"); symbol(&sinq, "sinf128"); - symbol(&sinl, "sinl"); - symbol(&sinl, "__sinl"); // required by musl + if (compiler_rt.have_c_longdouble) { + symbol(&sinl, "sinl"); + symbol(&sinl, "__sinl"); // required by musl + } } fn __sinh(x: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/sincos.zig b/lib/compiler_rt/sincos.zig index d43f55b623954f602edf850b75d409931b1aaee6..93b3965173ba4e9ef4c767889cb2ca8c19804975 100644 --- a/lib/compiler_rt/sincos.zig +++ b/lib/compiler_rt/sincos.zig @@ -19,7 +19,7 @@ comptime { symbol(&sincos, "sincos"); symbol(&sincosx, "__sincosx"); symbol(&sincosq, "sincosf128"); - symbol(&sincosl, "sincosl"); + if (compiler_rt.have_c_longdouble) symbol(&sincosl, "sincosl"); } fn sincosh(x: compiler_rt.f16.Abi, r_sin: *compiler_rt.f16.Abi, r_cos: *compiler_rt.f16.Abi) callconv(.c) void { diff --git a/lib/compiler_rt/sqrt.zig b/lib/compiler_rt/sqrt.zig index a37fe429c1458153dded08805982d118dedb8ebb..6ba6d62b8e92d8d07e9ca99f2dd65559bd2ecfdb 100644 --- a/lib/compiler_rt/sqrt.zig +++ b/lib/compiler_rt/sqrt.zig @@ -23,7 +23,7 @@ comptime { } else if (compiler_rt.want_sparc32_abi) { symbol(&sqrtq, "_Q_sqrt"); } - symbol(&sqrtl, "sqrtl"); + if (compiler_rt.have_c_longdouble) symbol(&sqrtl, "sqrtl"); } fn __sqrth(x: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/tan.zig b/lib/compiler_rt/tan.zig index 4ee4440dd6c5cd7417842de27084cab36ae85907..51b5078dbffb54e78bbc9822d10e15e839cae9e4 100644 --- a/lib/compiler_rt/tan.zig +++ b/lib/compiler_rt/tan.zig @@ -29,7 +29,7 @@ comptime { symbol(&tan, "tan"); symbol(&__tanx, "__tanx"); symbol(&tanq, "tanf128"); - symbol(&tanl, "tanl"); + if (compiler_rt.have_c_longdouble) symbol(&tanl, "tanl"); } fn __tanh(x: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi { diff --git a/lib/compiler_rt/trunc.zig b/lib/compiler_rt/trunc.zig index 0dbacf0e9d822385a8dc558a29bf0401f6d97e21..bba0751be28d13a3d5ac6084307e6a531579363f 100644 --- a/lib/compiler_rt/trunc.zig +++ b/lib/compiler_rt/trunc.zig @@ -18,7 +18,7 @@ comptime { symbol(&trunc, "trunc"); symbol(&__truncx, "__truncx"); symbol(&truncq, "truncf128"); - symbol(&truncl, "truncl"); + if (compiler_rt.have_c_longdouble) symbol(&truncl, "truncl"); } fn __trunch(x: compiler_rt.f16.Abi) callconv(.c) compiler_rt.f16.Abi {