@zigc/lib 0.16.0-test.1 → 0.17.0-dev.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +19 -0
- package/c/math.zig +148 -35
- package/c/stropts.zig +17 -0
- package/c.zig +1 -0
- package/compiler/aro/aro/Attribute/names.zig +604 -589
- package/compiler/aro/aro/Attribute.zig +202 -116
- package/compiler/aro/aro/Builtins/common.zig +874 -863
- package/compiler/aro/aro/Builtins/eval.zig +15 -7
- package/compiler/aro/aro/Builtins.zig +0 -1
- package/compiler/aro/aro/CodeGen.zig +3 -1
- package/compiler/aro/aro/Compilation.zig +120 -97
- package/compiler/aro/aro/Diagnostics.zig +21 -17
- package/compiler/aro/aro/Driver/GCCDetector.zig +635 -0
- package/compiler/aro/aro/Driver.zig +124 -50
- package/compiler/aro/aro/LangOpts.zig +12 -2
- package/compiler/aro/aro/Parser/Diagnostic.zig +79 -19
- package/compiler/aro/aro/Parser.zig +336 -142
- package/compiler/aro/aro/Preprocessor/Diagnostic.zig +21 -0
- package/compiler/aro/aro/Preprocessor.zig +127 -56
- package/compiler/aro/aro/Target.zig +17 -12
- package/compiler/aro/aro/Tokenizer.zig +31 -14
- package/compiler/aro/aro/Toolchain.zig +4 -7
- package/compiler/aro/aro/Tree.zig +178 -148
- package/compiler/aro/aro/TypeStore.zig +82 -24
- package/compiler/aro/aro/Value.zig +13 -17
- package/compiler/aro/aro/features.zig +1 -0
- package/compiler/aro/aro/pragmas/once.zig +0 -1
- package/compiler/aro/aro/record_layout.zig +3 -3
- package/compiler/aro/assembly_backend/x86_64.zig +3 -4
- package/compiler/aro/backend/Assembly.zig +1 -2
- package/compiler/aro/backend/Interner.zig +2 -2
- package/compiler/aro/backend/Ir.zig +100 -92
- package/compiler/aro/include/ptrcheck.h +49 -0
- package/compiler/aro/main.zig +26 -10
- package/compiler/build_runner.zig +1 -0
- package/compiler/objdump.zig +93 -0
- package/compiler/reduce.zig +5 -1
- package/compiler/resinator/compile.zig +2 -2
- package/compiler/resinator/main.zig +7 -1
- package/compiler/resinator/preprocess.zig +1 -3
- package/compiler/std-docs.zig +8 -1
- package/compiler/test_runner.zig +194 -62
- package/compiler/translate-c/MacroTranslator.zig +80 -11
- package/compiler/translate-c/PatternList.zig +1 -9
- package/compiler/translate-c/Scope.zig +43 -6
- package/compiler/translate-c/Translator.zig +364 -126
- package/compiler/translate-c/ast.zig +19 -11
- package/compiler/translate-c/main.zig +75 -16
- package/compiler_rt/cos.zig +141 -52
- package/compiler_rt/divmodei4.zig +40 -17
- package/compiler_rt/exp.zig +1 -4
- package/compiler_rt/exp2.zig +1 -4
- package/compiler_rt/exp_f128.zig +377 -0
- package/compiler_rt/limb64.zig +1126 -0
- package/compiler_rt/long_double.zig +37 -0
- package/compiler_rt/mulXi3.zig +1 -1
- package/compiler_rt/mulo.zig +6 -1
- package/compiler_rt/rem_pio2l.zig +173 -0
- package/compiler_rt/sin.zig +140 -55
- package/compiler_rt/sincos.zig +279 -72
- package/compiler_rt/ssp.zig +1 -1
- package/compiler_rt/tan.zig +118 -47
- package/compiler_rt/trig.zig +256 -6
- package/compiler_rt/udivmodei4.zig +28 -0
- package/compiler_rt.zig +2 -0
- package/fuzzer.zig +855 -307
- package/libc/musl/src/math/pow.c +343 -0
- package/package.json +1 -1
- package/std/Build/Fuzz.zig +6 -19
- package/std/Build/Module.zig +1 -1
- package/std/Build/Step/CheckObject.zig +3 -3
- package/std/Build/Step/Compile.zig +18 -0
- package/std/Build/Step/ConfigHeader.zig +49 -33
- package/std/Build/Step/InstallArtifact.zig +18 -0
- package/std/Build/Step/Run.zig +536 -87
- package/std/Build/Step/TranslateC.zig +0 -6
- package/std/Build/Step.zig +8 -15
- package/std/Build/WebServer.zig +29 -17
- package/std/Build/abi.zig +47 -11
- package/std/Build.zig +17 -14
- package/std/Io/Dispatch.zig +2 -0
- package/std/Io/File/Reader.zig +3 -1
- package/std/Io/File.zig +1 -0
- package/std/Io/Kqueue.zig +2 -2
- package/std/Io/Threaded.zig +181 -143
- package/std/Io/Uring.zig +2 -1
- package/std/Io/Writer.zig +41 -41
- package/std/Io.zig +970 -2
- package/std/Target.zig +3 -2
- package/std/Thread.zig +8 -3
- package/std/array_hash_map.zig +96 -555
- package/std/array_list.zig +22 -31
- package/std/bit_set.zig +22 -6
- package/std/builtin/assembly.zig +68 -0
- package/std/c.zig +17 -17
- package/std/compress/flate/Compress.zig +3 -3
- package/std/crypto/Certificate/Bundle.zig +15 -1
- package/std/crypto/codecs/asn1.zig +33 -18
- package/std/crypto/codecs/base64_hex_ct.zig +14 -4
- package/std/debug/Dwarf.zig +29 -9
- package/std/debug/Info.zig +4 -0
- package/std/debug/MachOFile.zig +46 -8
- package/std/debug/Pdb.zig +539 -36
- package/std/debug/SelfInfo/Elf.zig +19 -18
- package/std/debug/SelfInfo/MachO.zig +18 -7
- package/std/debug/SelfInfo/Windows.zig +138 -36
- package/std/debug.zig +179 -65
- package/std/enums.zig +25 -19
- package/std/heap/ArenaAllocator.zig +145 -154
- package/std/heap/debug_allocator.zig +7 -7
- package/std/http/Client.zig +10 -6
- package/std/http.zig +11 -9
- package/std/json/Stringify.zig +3 -3
- package/std/json/dynamic.zig +4 -4
- package/std/math/big/int.zig +16 -17
- package/std/mem/Allocator.zig +4 -5
- package/std/mem.zig +48 -0
- package/std/os/emscripten.zig +2 -18
- package/std/os/linux/arc.zig +144 -0
- package/std/os/linux.zig +21 -4
- package/std/os/windows.zig +2 -2
- package/std/pdb.zig +143 -4
- package/std/posix.zig +6 -12
- package/std/priority_dequeue.zig +13 -12
- package/std/priority_queue.zig +5 -4
- package/std/process/Child.zig +1 -1
- package/std/process/Environ.zig +1 -1
- package/std/start.zig +17 -4
- package/std/std.zig +19 -6
- package/std/testing/FailingAllocator.zig +4 -4
- package/std/testing/Smith.zig +37 -2
- package/std/zig/Ast/Render.zig +186 -458
- package/std/zig/Ast.zig +0 -4
- package/std/zig/AstGen.zig +44 -7
- package/std/zig/AstSmith.zig +2602 -0
- package/std/zig/Client.zig +8 -3
- package/std/zig/Parse.zig +83 -74
- package/std/zig/Server.zig +26 -0
- package/std/zig/Zir.zig +17 -0
- package/std/zig/c_translation/helpers.zig +14 -9
- package/std/zig/llvm/Builder.zig +107 -48
- package/std/zig/system.zig +20 -4
- package/std/zig/tokenizer.zig +2 -1
- package/std/zig.zig +6 -0
- package/compiler/aro/aro/Driver/Filesystem.zig +0 -241
- package/libc/mingw/complex/cabs.c +0 -48
- package/libc/mingw/complex/cabsf.c +0 -48
- package/libc/mingw/complex/cacos.c +0 -50
- package/libc/mingw/complex/cacosf.c +0 -50
- package/libc/mingw/complex/carg.c +0 -48
- package/libc/mingw/complex/cargf.c +0 -48
- package/libc/mingw/complex/casin.c +0 -50
- package/libc/mingw/complex/casinf.c +0 -50
- package/libc/mingw/complex/catan.c +0 -50
- package/libc/mingw/complex/catanf.c +0 -50
- package/libc/mingw/complex/ccos.c +0 -50
- package/libc/mingw/complex/ccosf.c +0 -50
- package/libc/mingw/complex/cexp.c +0 -48
- package/libc/mingw/complex/cexpf.c +0 -48
- package/libc/mingw/complex/cimag.c +0 -48
- package/libc/mingw/complex/cimagf.c +0 -48
- package/libc/mingw/complex/clog.c +0 -48
- package/libc/mingw/complex/clog10.c +0 -49
- package/libc/mingw/complex/clog10f.c +0 -49
- package/libc/mingw/complex/clogf.c +0 -48
- package/libc/mingw/complex/conj.c +0 -48
- package/libc/mingw/complex/conjf.c +0 -48
- package/libc/mingw/complex/cpow.c +0 -48
- package/libc/mingw/complex/cpowf.c +0 -48
- package/libc/mingw/complex/cproj.c +0 -48
- package/libc/mingw/complex/cprojf.c +0 -48
- package/libc/mingw/complex/creal.c +0 -48
- package/libc/mingw/complex/crealf.c +0 -48
- package/libc/mingw/complex/csin.c +0 -50
- package/libc/mingw/complex/csinf.c +0 -50
- package/libc/mingw/complex/csqrt.c +0 -48
- package/libc/mingw/complex/csqrtf.c +0 -48
- package/libc/mingw/complex/ctan.c +0 -50
- package/libc/mingw/complex/ctanf.c +0 -50
- package/libc/mingw/math/arm/s_rint.c +0 -86
- package/libc/mingw/math/arm/s_rintf.c +0 -51
- package/libc/mingw/math/arm/sincos.S +0 -30
- package/libc/mingw/math/arm-common/sincosl.c +0 -13
- package/libc/mingw/math/arm64/rint.c +0 -12
- package/libc/mingw/math/arm64/rintf.c +0 -12
- package/libc/mingw/math/arm64/sincos.S +0 -32
- package/libc/mingw/math/bsd_private_base.h +0 -148
- package/libc/mingw/math/fdiml.c +0 -24
- package/libc/mingw/math/frexpf.c +0 -13
- package/libc/mingw/math/frexpl.c +0 -71
- package/libc/mingw/math/x86/acosf.c +0 -29
- package/libc/mingw/math/x86/atanf.c +0 -23
- package/libc/mingw/math/x86/atanl.c +0 -18
- package/libc/mingw/math/x86/cos.def.h +0 -65
- package/libc/mingw/math/x86/cosl.c +0 -46
- package/libc/mingw/math/x86/cosl_internal.S +0 -55
- package/libc/mingw/math/x86/ldexp.c +0 -23
- package/libc/mingw/math/x86/scalbn.S +0 -41
- package/libc/mingw/math/x86/scalbnf.S +0 -40
- package/libc/mingw/math/x86/sin.def.h +0 -65
- package/libc/mingw/math/x86/sinl.c +0 -46
- package/libc/mingw/math/x86/sinl_internal.S +0 -58
- package/libc/mingw/math/x86/tanl.S +0 -62
- package/libc/mingw/misc/btowc.c +0 -28
- package/libc/mingw/misc/wcstof.c +0 -66
- package/libc/mingw/misc/wcstoimax.c +0 -132
- package/libc/mingw/misc/wcstoumax.c +0 -126
- package/libc/mingw/misc/wctob.c +0 -29
- package/libc/mingw/misc/winbs_uint64.c +0 -6
- package/libc/mingw/misc/winbs_ulong.c +0 -6
- package/libc/mingw/misc/winbs_ushort.c +0 -6
- package/libc/mingw/stdio/_Exit.c +0 -10
- package/libc/mingw/stdio/_findfirst64i32.c +0 -21
- package/libc/mingw/stdio/_findnext64i32.c +0 -21
- package/libc/mingw/stdio/_fstat64i32.c +0 -37
- package/libc/mingw/stdio/_stat64i32.c +0 -37
- package/libc/mingw/stdio/_wfindfirst64i32.c +0 -21
- package/libc/mingw/stdio/_wfindnext64i32.c +0 -21
- package/libc/mingw/stdio/_wstat64i32.c +0 -37
- package/libc/musl/src/legacy/isastream.c +0 -7
- package/libc/musl/src/legacy/valloc.c +0 -8
- package/libc/musl/src/math/__cosl.c +0 -96
- package/libc/musl/src/math/__sinl.c +0 -78
- package/libc/musl/src/math/__tanl.c +0 -143
- package/libc/musl/src/math/aarch64/lrint.c +0 -10
- package/libc/musl/src/math/aarch64/lrintf.c +0 -10
- package/libc/musl/src/math/aarch64/rintf.c +0 -7
- package/libc/musl/src/math/cosl.c +0 -39
- package/libc/musl/src/math/fdim.c +0 -10
- package/libc/musl/src/math/fdimf.c +0 -10
- package/libc/musl/src/math/fdiml.c +0 -18
- package/libc/musl/src/math/finite.c +0 -7
- package/libc/musl/src/math/finitef.c +0 -7
- package/libc/musl/src/math/frexp.c +0 -23
- package/libc/musl/src/math/frexpf.c +0 -23
- package/libc/musl/src/math/frexpl.c +0 -29
- package/libc/musl/src/math/i386/lrint.c +0 -8
- package/libc/musl/src/math/i386/lrintf.c +0 -8
- package/libc/musl/src/math/i386/rintf.c +0 -7
- package/libc/musl/src/math/lrint.c +0 -72
- package/libc/musl/src/math/lrintf.c +0 -8
- package/libc/musl/src/math/powerpc64/lrint.c +0 -16
- package/libc/musl/src/math/powerpc64/lrintf.c +0 -16
- package/libc/musl/src/math/rintf.c +0 -30
- package/libc/musl/src/math/s390x/rintf.c +0 -15
- package/libc/musl/src/math/sincosl.c +0 -60
- package/libc/musl/src/math/sinl.c +0 -41
- package/libc/musl/src/math/tanl.c +0 -29
- package/libc/musl/src/math/x32/lrint.s +0 -5
- package/libc/musl/src/math/x32/lrintf.s +0 -5
- package/libc/musl/src/math/x86_64/lrint.c +0 -8
- package/libc/musl/src/math/x86_64/lrintf.c +0 -8
- package/libc/wasi/libc-bottom-half/sources/reallocarray.c +0 -14
package/compiler_rt/tan.zig
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
//!
|
|
4
4
|
//! https://git.musl-libc.org/cgit/musl/tree/src/math/tanf.c
|
|
5
5
|
//! https://git.musl-libc.org/cgit/musl/tree/src/math/tan.c
|
|
6
|
+
//! https://git.musl-libc.org/cgit/musl/tree/src/math/tanl.c
|
|
6
7
|
//! https://golang.org/src/math/tan.go
|
|
7
8
|
|
|
8
9
|
const std = @import("std");
|
|
@@ -10,20 +11,23 @@ const builtin = @import("builtin");
|
|
|
10
11
|
const math = std.math;
|
|
11
12
|
const mem = std.mem;
|
|
12
13
|
const expect = std.testing.expect;
|
|
14
|
+
const expectApproxEqAbs = std.testing.expectApproxEqAbs;
|
|
13
15
|
|
|
14
16
|
const kernel = @import("trig.zig");
|
|
15
17
|
const rem_pio2 = @import("rem_pio2.zig").rem_pio2;
|
|
16
18
|
const rem_pio2f = @import("rem_pio2f.zig").rem_pio2f;
|
|
19
|
+
const rem_pio2l = @import("rem_pio2l.zig").rem_pio2l;
|
|
20
|
+
const ld = @import("long_double.zig");
|
|
17
21
|
|
|
18
22
|
const arch = builtin.cpu.arch;
|
|
19
23
|
const compiler_rt = @import("../compiler_rt.zig");
|
|
20
24
|
const symbol = @import("../compiler_rt.zig").symbol;
|
|
21
25
|
|
|
22
26
|
comptime {
|
|
23
|
-
symbol(&
|
|
27
|
+
symbol(&tanh, "__tanh");
|
|
24
28
|
symbol(&tanf, "tanf");
|
|
25
29
|
symbol(&tan, "tan");
|
|
26
|
-
symbol(&
|
|
30
|
+
symbol(&tanx, "__tanx");
|
|
27
31
|
if (compiler_rt.want_ppc_abi) {
|
|
28
32
|
symbol(&tanq, "tanf128");
|
|
29
33
|
}
|
|
@@ -31,7 +35,7 @@ comptime {
|
|
|
31
35
|
symbol(&tanl, "tanl");
|
|
32
36
|
}
|
|
33
37
|
|
|
34
|
-
pub fn
|
|
38
|
+
pub fn tanh(x: f16) callconv(.c) f16 {
|
|
35
39
|
// TODO: more efficient implementation
|
|
36
40
|
return @floatCast(tanf(x));
|
|
37
41
|
}
|
|
@@ -59,20 +63,20 @@ pub fn tanf(x: f32) callconv(.c) f32 {
|
|
|
59
63
|
}
|
|
60
64
|
return x;
|
|
61
65
|
}
|
|
62
|
-
return kernel.
|
|
66
|
+
return kernel.tandf(x, false);
|
|
63
67
|
}
|
|
64
68
|
if (ix <= 0x407b53d1) { // |x| ~<= 5*pi/4
|
|
65
69
|
if (ix <= 0x4016cbe3) { // |x| ~<= 3pi/4
|
|
66
|
-
return kernel.
|
|
70
|
+
return kernel.tandf((if (sign) x + t1pio2 else x - t1pio2), true);
|
|
67
71
|
} else {
|
|
68
|
-
return kernel.
|
|
72
|
+
return kernel.tandf((if (sign) x + t2pio2 else x - t2pio2), false);
|
|
69
73
|
}
|
|
70
74
|
}
|
|
71
75
|
if (ix <= 0x40e231d5) { // |x| ~<= 9*pi/4
|
|
72
76
|
if (ix <= 0x40afeddf) { // |x| ~<= 7*pi/4
|
|
73
|
-
return kernel.
|
|
77
|
+
return kernel.tandf((if (sign) x + t3pio2 else x - t3pio2), true);
|
|
74
78
|
} else {
|
|
75
|
-
return kernel.
|
|
79
|
+
return kernel.tandf((if (sign) x + t4pio2 else x - t4pio2), false);
|
|
76
80
|
}
|
|
77
81
|
}
|
|
78
82
|
|
|
@@ -83,7 +87,7 @@ pub fn tanf(x: f32) callconv(.c) f32 {
|
|
|
83
87
|
|
|
84
88
|
var y: f64 = undefined;
|
|
85
89
|
const n = rem_pio2f(x, &y);
|
|
86
|
-
return kernel.
|
|
90
|
+
return kernel.tandf(y, n & 1 != 0);
|
|
87
91
|
}
|
|
88
92
|
|
|
89
93
|
pub fn tan(x: f64) callconv(.c) f64 {
|
|
@@ -103,7 +107,7 @@ pub fn tan(x: f64) callconv(.c) f64 {
|
|
|
103
107
|
}
|
|
104
108
|
return x;
|
|
105
109
|
}
|
|
106
|
-
return kernel.
|
|
110
|
+
return kernel.tan(x, 0.0, false);
|
|
107
111
|
}
|
|
108
112
|
|
|
109
113
|
// tan(Inf or NaN) is NaN
|
|
@@ -113,69 +117,136 @@ pub fn tan(x: f64) callconv(.c) f64 {
|
|
|
113
117
|
|
|
114
118
|
var y: [2]f64 = undefined;
|
|
115
119
|
const n = rem_pio2(x, &y);
|
|
116
|
-
return kernel.
|
|
120
|
+
return kernel.tan(y[0], y[1], n & 1 != 0);
|
|
117
121
|
}
|
|
118
122
|
|
|
119
|
-
pub fn
|
|
120
|
-
|
|
121
|
-
|
|
123
|
+
pub fn tanx(x: f80) callconv(.c) f80 {
|
|
124
|
+
const se = ld.signExponent(x) & 0x7fff;
|
|
125
|
+
if (se == 0x7fff) {
|
|
126
|
+
return x - x;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (@abs(x) < kernel.pi_4) {
|
|
130
|
+
if (se < 0x3fff - math.floatMantissaBits(f80) / 2) {
|
|
131
|
+
if (compiler_rt.want_float_exceptions) {
|
|
132
|
+
mem.doNotOptimizeAway(if (se == 0) x * 0x1p-120 else x + 0x1p120);
|
|
133
|
+
}
|
|
134
|
+
return x;
|
|
135
|
+
}
|
|
136
|
+
return kernel.tanx(x, 0.0, 0);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
var y: [2]f80 = undefined;
|
|
140
|
+
const n = rem_pio2l(f80, x, &y);
|
|
141
|
+
return kernel.tanx(y[0], y[1], n & 1);
|
|
122
142
|
}
|
|
123
143
|
|
|
124
144
|
pub fn tanq(x: f128) callconv(.c) f128 {
|
|
125
|
-
|
|
126
|
-
|
|
145
|
+
const se = ld.signExponent(x) & 0x7fff;
|
|
146
|
+
if (se == 0x7fff) {
|
|
147
|
+
return x - x;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (@abs(x) < kernel.pi_4) {
|
|
151
|
+
if (se < 0x3fff - math.floatMantissaBits(f128) / 2) {
|
|
152
|
+
if (compiler_rt.want_float_exceptions) {
|
|
153
|
+
mem.doNotOptimizeAway(if (se == 0) x * 0x1p-120 else x + 0x1p120);
|
|
154
|
+
}
|
|
155
|
+
return x;
|
|
156
|
+
}
|
|
157
|
+
return kernel.tanq(x, 0.0, 0);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
var y: [2]f128 = undefined;
|
|
161
|
+
const n = rem_pio2l(f128, x, &y);
|
|
162
|
+
return kernel.tanq(y[0], y[1], n & 1);
|
|
127
163
|
}
|
|
128
164
|
|
|
129
165
|
pub fn tanl(x: c_longdouble) callconv(.c) c_longdouble {
|
|
130
166
|
switch (@typeInfo(c_longdouble).float.bits) {
|
|
131
|
-
16 => return
|
|
167
|
+
16 => return tanh(x),
|
|
132
168
|
32 => return tanf(x),
|
|
133
169
|
64 => return tan(x),
|
|
134
|
-
80 => return
|
|
170
|
+
80 => return tanx(x),
|
|
135
171
|
128 => return tanq(x),
|
|
136
172
|
else => @compileError("unreachable"),
|
|
137
173
|
}
|
|
138
174
|
}
|
|
139
175
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
176
|
+
fn testTanNormal(comptime T: type) !void {
|
|
177
|
+
const f = switch (T) {
|
|
178
|
+
f32 => tanf,
|
|
179
|
+
f64 => tan,
|
|
180
|
+
else => @compileError("unimplemented"),
|
|
181
|
+
};
|
|
182
|
+
const epsilon = 0.00001;
|
|
183
|
+
|
|
184
|
+
try expectApproxEqAbs(@as(T, 0.0), f(0.0), epsilon);
|
|
185
|
+
try expectApproxEqAbs(@as(T, 0.202710), f(0.2), epsilon);
|
|
186
|
+
try expectApproxEqAbs(@as(T, 1.240422), f(0.8923), epsilon);
|
|
187
|
+
try expectApproxEqAbs(@as(T, 14.101420), f(1.5), epsilon);
|
|
188
|
+
try expectApproxEqAbs(@as(T, -0.254397), f(37.45), epsilon);
|
|
189
|
+
try expectApproxEqAbs(@as(T, 2.285837), f(89.123), epsilon);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
fn testTanSpecial(comptime T: type) !void {
|
|
193
|
+
const f = switch (T) {
|
|
194
|
+
f32 => tanf,
|
|
195
|
+
f64 => tan,
|
|
196
|
+
f80 => tanx,
|
|
197
|
+
f128 => tanq,
|
|
198
|
+
else => @compileError("unimplemented"),
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
try expect(math.isPositiveZero(f(0.0)));
|
|
202
|
+
try expect(math.isNegativeZero(f(-0.0)));
|
|
203
|
+
try expect(math.isNan(f(math.inf(f32))));
|
|
204
|
+
try expect(math.isNan(f(-math.inf(f32))));
|
|
205
|
+
try expect(math.isNan(f(math.nan(f32))));
|
|
143
206
|
}
|
|
144
207
|
|
|
145
|
-
test "tan32" {
|
|
146
|
-
|
|
208
|
+
test "tan32.normal" {
|
|
209
|
+
try testTanNormal(f32);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
test "tan64.normal" {
|
|
213
|
+
try testTanNormal(f64);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
test "tan80.normal" {
|
|
217
|
+
const epsilon = math.floatEps(f80);
|
|
147
218
|
|
|
148
|
-
try
|
|
149
|
-
try
|
|
150
|
-
try
|
|
151
|
-
try
|
|
152
|
-
try
|
|
153
|
-
try
|
|
219
|
+
try expectApproxEqAbs(@as(f80, 0.0), tanx(0.0), epsilon);
|
|
220
|
+
try expectApproxEqAbs(@as(f80, 0.2027100355086724833213582716475345), tanx(0.2), epsilon);
|
|
221
|
+
try expectApproxEqAbs(@as(f80, 1.2404217445497097995561220131857544), tanx(0.8923), epsilon);
|
|
222
|
+
try expectApproxEqAbs(@as(f80, 14.10141994717171938764), tanx(1.5), epsilon);
|
|
223
|
+
try expectApproxEqAbs(@as(f80, -0.25439607116885656232), tanx(37.45), epsilon);
|
|
224
|
+
try expectApproxEqAbs(@as(f80, 2.2858376251355320963), tanx(89.123), epsilon);
|
|
154
225
|
}
|
|
155
226
|
|
|
156
|
-
test "
|
|
157
|
-
const epsilon =
|
|
227
|
+
test "tan128.normal" {
|
|
228
|
+
const epsilon = math.floatEps(f128);
|
|
158
229
|
|
|
159
|
-
try
|
|
160
|
-
try
|
|
161
|
-
try
|
|
162
|
-
try
|
|
163
|
-
try
|
|
164
|
-
try
|
|
230
|
+
try expectApproxEqAbs(@as(f128, 0.0), tanq(0.0), epsilon);
|
|
231
|
+
try expectApproxEqAbs(@as(f128, 0.2027100355086724833213582716475345), tanq(0.2), epsilon);
|
|
232
|
+
try expectApproxEqAbs(@as(f128, 1.2404217445497097995561220131857544), tanq(0.8923), epsilon);
|
|
233
|
+
try expectApproxEqAbs(@as(f128, 14.101419947171719387646083651987755), tanq(1.5), epsilon);
|
|
234
|
+
try expectApproxEqAbs(@as(f128, -0.2543960711688565630469573224504774), tanq(37.45), epsilon);
|
|
235
|
+
try expectApproxEqAbs(@as(f128, 2.2858376251355321074066028114094292), tanq(89.123), epsilon);
|
|
165
236
|
}
|
|
166
237
|
|
|
167
238
|
test "tan32.special" {
|
|
168
|
-
try
|
|
169
|
-
try expect(tanf(-0.0) == -0.0);
|
|
170
|
-
try expect(math.isNan(tanf(math.inf(f32))));
|
|
171
|
-
try expect(math.isNan(tanf(-math.inf(f32))));
|
|
172
|
-
try expect(math.isNan(tanf(math.nan(f32))));
|
|
239
|
+
try testTanSpecial(f32);
|
|
173
240
|
}
|
|
174
241
|
|
|
175
242
|
test "tan64.special" {
|
|
176
|
-
try
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
try
|
|
243
|
+
try testTanSpecial(f64);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
test "tan80.special" {
|
|
247
|
+
try testTanSpecial(f80);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
test "tan128.special" {
|
|
251
|
+
try testTanSpecial(f128);
|
|
181
252
|
}
|
package/compiler_rt/trig.zig
CHANGED
|
@@ -7,6 +7,13 @@
|
|
|
7
7
|
// https://git.musl-libc.org/cgit/musl/tree/src/math/__sindf.c
|
|
8
8
|
// https://git.musl-libc.org/cgit/musl/tree/src/math/__tand.c
|
|
9
9
|
// https://git.musl-libc.org/cgit/musl/tree/src/math/__tandf.c
|
|
10
|
+
// https://git.musl-libc.org/cgit/musl/tree/src/math/__sinl.c
|
|
11
|
+
// https://git.musl-libc.org/cgit/musl/tree/src/math/__cosl.c
|
|
12
|
+
// https://git.musl-libc.org/cgit/musl/tree/src/math/__tanl.c
|
|
13
|
+
|
|
14
|
+
const std = @import("std");
|
|
15
|
+
|
|
16
|
+
pub const pi_4 = std.math.pi / 4.0;
|
|
10
17
|
|
|
11
18
|
/// kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164
|
|
12
19
|
/// Input x is assumed to be bounded by ~pi/4 in magnitude.
|
|
@@ -43,7 +50,7 @@
|
|
|
43
50
|
/// expression for cos(). Retention happens in all cases tested
|
|
44
51
|
/// under FreeBSD, so don't pessimize things by forcibly clipping
|
|
45
52
|
/// any extra precision in w.
|
|
46
|
-
pub fn
|
|
53
|
+
pub fn cos(x: f64, y: f64) f64 {
|
|
47
54
|
const C1 = 4.16666666666666019037e-02; // 0x3FA55555, 0x5555554C
|
|
48
55
|
const C2 = -1.38888888888741095749e-03; // 0xBF56C16C, 0x16C15177
|
|
49
56
|
const C3 = 2.48015872894767294178e-05; // 0x3EFA01A0, 0x19CB1590
|
|
@@ -59,7 +66,7 @@ pub fn __cos(x: f64, y: f64) f64 {
|
|
|
59
66
|
return w + (((1.0 - w) - hz) + (z * r - x * y));
|
|
60
67
|
}
|
|
61
68
|
|
|
62
|
-
pub fn
|
|
69
|
+
pub fn cosdf(x: f64) f32 {
|
|
63
70
|
// |cos(x) - c(x)| < 2**-34.1 (~[-5.37e-11, 5.295e-11]).
|
|
64
71
|
const C0 = -0x1ffffffd0c5e81.0p-54; // -0.499999997251031003120
|
|
65
72
|
const C1 = 0x155553e1053a42.0p-57; // 0.0416666233237390631894
|
|
@@ -73,6 +80,46 @@ pub fn __cosdf(x: f64) f32 {
|
|
|
73
80
|
return @floatCast(((1.0 + z * C0) + w * C1) + (w * z) * r);
|
|
74
81
|
}
|
|
75
82
|
|
|
83
|
+
pub fn cosx(x: f80, y: f80) f80 {
|
|
84
|
+
const C1: f80 = 0.0416666666666666666136;
|
|
85
|
+
const C2: f64 = -0.0013888888888888874;
|
|
86
|
+
const C3: f64 = 0.000024801587301571716;
|
|
87
|
+
const C4: f64 = -0.00000027557319215507120;
|
|
88
|
+
const C5: f64 = 0.0000000020876754400407278;
|
|
89
|
+
const C6: f64 = -1.1470297442401303e-11;
|
|
90
|
+
const C7: f64 = 4.7383039476436467e-14;
|
|
91
|
+
|
|
92
|
+
const z = x * x;
|
|
93
|
+
const r = z * (C1 + z * (C2 + z * (C3 + z * (C4 +
|
|
94
|
+
z * (C5 + z * (C6 + z * C7))))));
|
|
95
|
+
const hz = 0.5 * z;
|
|
96
|
+
const w = 1.0 - hz;
|
|
97
|
+
|
|
98
|
+
return w + (((1.0 - w) - hz) + (z * r - x * y));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
pub fn cosq(x: f128, y: f128) f128 {
|
|
102
|
+
const C1: f128 = 0.04166666666666666666666666666666658424671;
|
|
103
|
+
const C2: f128 = -0.001388888888888888888888888888863490893732;
|
|
104
|
+
const C3: f128 = 0.00002480158730158730158730158600795304914210;
|
|
105
|
+
const C4: f128 = -0.2755731922398589065255474947078934284324e-6;
|
|
106
|
+
const C5: f128 = 0.2087675698786809897659225313136400793948e-8;
|
|
107
|
+
const C6: f128 = -0.1147074559772972315817149986812031204775e-10;
|
|
108
|
+
const C7: f128 = 0.4779477332386808976875457937252120293400e-13;
|
|
109
|
+
const C8: f64 = -0.1561920696721507929516718307820958119868e-15;
|
|
110
|
+
const C9: f64 = 0.4110317413744594971475941557607804508039e-18;
|
|
111
|
+
const C10: f64 = -0.8896592467191938803288521958313920156409e-21;
|
|
112
|
+
const C11: f64 = 0.1601061435794535138244346256065192782581e-23;
|
|
113
|
+
|
|
114
|
+
const z = x * x;
|
|
115
|
+
const r = z * (C1 + z * (C2 + z * (C3 + z * (C4 + z * (C5 + z * (C6 +
|
|
116
|
+
z * (C7 + z * (C8 + z * (C9 + z * (C10 + z * C11))))))))));
|
|
117
|
+
const hz = 0.5 * z;
|
|
118
|
+
const w = 1.0 - hz;
|
|
119
|
+
|
|
120
|
+
return w + (((1.0 - w) - hz) + (z * r - x * y));
|
|
121
|
+
}
|
|
122
|
+
|
|
76
123
|
/// kernel sin function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854
|
|
77
124
|
/// Input x is assumed to be bounded by ~pi/4 in magnitude.
|
|
78
125
|
/// Input y is the tail of x.
|
|
@@ -100,7 +147,7 @@ pub fn __cosdf(x: f64) f32 {
|
|
|
100
147
|
/// r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
|
|
101
148
|
/// then 3 2
|
|
102
149
|
/// sin(x) = x + (S1*x + (x *(r-y/2)+y))
|
|
103
|
-
pub fn
|
|
150
|
+
pub fn sin(x: f64, y: f64, iy: i32) f64 {
|
|
104
151
|
const S1 = -1.66666666666666324348e-01; // 0xBFC55555, 0x55555549
|
|
105
152
|
const S2 = 8.33333333332248946124e-03; // 0x3F811111, 0x1110F8A6
|
|
106
153
|
const S3 = -1.98412698298579493134e-04; // 0xBF2A01A0, 0x19C161D5
|
|
@@ -119,7 +166,7 @@ pub fn __sin(x: f64, y: f64, iy: i32) f64 {
|
|
|
119
166
|
}
|
|
120
167
|
}
|
|
121
168
|
|
|
122
|
-
pub fn
|
|
169
|
+
pub fn sindf(x: f64) f32 {
|
|
123
170
|
// |sin(x)/x - s(x)| < 2**-37.5 (~[-4.89e-12, 4.824e-12]).
|
|
124
171
|
const S1 = -0x15555554cbac77.0p-55; // -0.166666666416265235595
|
|
125
172
|
const S2 = 0x111110896efbb2.0p-59; // 0.0083333293858894631756
|
|
@@ -134,6 +181,52 @@ pub fn __sindf(x: f64) f32 {
|
|
|
134
181
|
return @floatCast((x + s * (S1 + z * S2)) + s * w * r);
|
|
135
182
|
}
|
|
136
183
|
|
|
184
|
+
pub fn sinx(x: f80, y: f80, iy: i32) f80 {
|
|
185
|
+
const S1: f80 = -0.166666666666666666671;
|
|
186
|
+
const S2: f64 = 0.0083333333333333332;
|
|
187
|
+
const S3: f64 = -0.00019841269841269427;
|
|
188
|
+
const S4: f64 = 0.0000027557319223597490;
|
|
189
|
+
const S5: f64 = -0.000000025052108218074604;
|
|
190
|
+
const S6: f64 = 1.6059006598854211e-10;
|
|
191
|
+
const S7: f64 = -7.6429779983024564e-13;
|
|
192
|
+
const S8: f64 = 2.6174587166648325e-15;
|
|
193
|
+
|
|
194
|
+
const z = x * x;
|
|
195
|
+
const v = z * x;
|
|
196
|
+
const r = S2 + z * (S3 + z * (S4 + z * (S5 +
|
|
197
|
+
z * (S6 + z * (S7 + z * S8)))));
|
|
198
|
+
|
|
199
|
+
if (iy == 0)
|
|
200
|
+
return x + v * (S1 + z * r);
|
|
201
|
+
|
|
202
|
+
return x - ((z * (0.5 * y - v * r) - y) - v * S1);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
pub fn sinq(x: f128, y: f128, iy: i32) f128 {
|
|
206
|
+
const S1: f128 = -0.16666666666666666666666666666666666606732416116558;
|
|
207
|
+
const S2: f128 = 0.0083333333333333333333333333333331135404851288270047;
|
|
208
|
+
const S3: f128 = -0.00019841269841269841269841269839935785325638310428717;
|
|
209
|
+
const S4: f128 = 0.27557319223985890652557316053039946268333231205686e-5;
|
|
210
|
+
const S5: f128 = -0.25052108385441718775048214826384312253862930064745e-7;
|
|
211
|
+
const S6: f128 = 0.16059043836821614596571832194524392581082444805729e-9;
|
|
212
|
+
const S7: f128 = -0.76471637318198151807063387954939213287488216303768e-12;
|
|
213
|
+
const S8: f128 = 0.28114572543451292625024967174638477283187397621303e-14;
|
|
214
|
+
const S9: f64 = -0.82206352458348947812512122163446202498005154296863e-17;
|
|
215
|
+
const S10: f64 = 0.19572940011906109418080609928334380560135358385256e-19;
|
|
216
|
+
const S11: f64 = -0.38680813379701966970673724299207480965452616911420e-22;
|
|
217
|
+
const S12: f64 = 0.64038150078671872796678569586315881020659912139412e-25;
|
|
218
|
+
|
|
219
|
+
const z = x * x;
|
|
220
|
+
const v = z * x;
|
|
221
|
+
const r = S2 + z * (S3 + z * (S4 + z * (S5 + z * (S6 + z * (S7 + z * (S8 +
|
|
222
|
+
z * (S9 + z * (S10 + z * (S11 + z * S12)))))))));
|
|
223
|
+
|
|
224
|
+
if (iy == 0)
|
|
225
|
+
return x + v * (S1 + z * r);
|
|
226
|
+
|
|
227
|
+
return x - ((z * (0.5 * y - v * r) - y) - v * S1);
|
|
228
|
+
}
|
|
229
|
+
|
|
137
230
|
/// kernel tan function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854
|
|
138
231
|
/// Input x is assumed to be bounded by ~pi/4 in magnitude.
|
|
139
232
|
/// Input y is the tail of x.
|
|
@@ -166,7 +259,7 @@ pub fn __sindf(x: f64) f32 {
|
|
|
166
259
|
/// 4. For x in [0.67434,pi/4], let y = pi/4 - x, then
|
|
167
260
|
/// tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))
|
|
168
261
|
/// = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
|
|
169
|
-
pub fn
|
|
262
|
+
pub fn tan(x_: f64, y_: f64, odd: bool) f64 {
|
|
170
263
|
var x = x_;
|
|
171
264
|
var y = y_;
|
|
172
265
|
|
|
@@ -239,7 +332,7 @@ pub fn __tan(x_: f64, y_: f64, odd: bool) f64 {
|
|
|
239
332
|
return a0 + a * (1.0 + a0 * w0 + a0 * v);
|
|
240
333
|
}
|
|
241
334
|
|
|
242
|
-
pub fn
|
|
335
|
+
pub fn tandf(x: f64, odd: bool) f32 {
|
|
243
336
|
// |tan(x)/x - t(x)| < 2**-25.5 (~[-2e-08, 2e-08]).
|
|
244
337
|
const T = [_]f64{
|
|
245
338
|
0x15554d3418c99f.0p-54, // 0.333331395030791399758
|
|
@@ -271,3 +364,160 @@ pub fn __tandf(x: f64, odd: bool) f32 {
|
|
|
271
364
|
const r0 = (x + s * u) + (s * w) * (t + w * r);
|
|
272
365
|
return @floatCast(if (odd) -1.0 / r0 else r0);
|
|
273
366
|
}
|
|
367
|
+
|
|
368
|
+
pub fn tanx(x_: f80, y_: f80, odd: i32) f80 {
|
|
369
|
+
const pio4: f80 = 0.785398163397448309628;
|
|
370
|
+
const pio4lo: f80 = -1.25413940316708300586e-20;
|
|
371
|
+
|
|
372
|
+
const T3: f80 = 0.333333333333333333180;
|
|
373
|
+
const T5: f80 = 0.133333333333333372290;
|
|
374
|
+
const T7: f80 = 0.0539682539682504975744;
|
|
375
|
+
const T9: f64 = 0.021869488536312216;
|
|
376
|
+
const T11: f64 = 0.0088632355256619590;
|
|
377
|
+
const T13: f64 = 0.0035921281113786528;
|
|
378
|
+
const T15: f64 = 0.0014558334756312418;
|
|
379
|
+
const T17: f64 = 0.00059003538700862256;
|
|
380
|
+
const T19: f64 = 0.00023907843576635544;
|
|
381
|
+
const T21: f64 = 0.000097154625656538905;
|
|
382
|
+
const T23: f64 = 0.000038440165747303162;
|
|
383
|
+
const T25: f64 = 0.000018082171885432524;
|
|
384
|
+
const T27: f64 = 0.0000024196006108814377;
|
|
385
|
+
const T29: f64 = 0.0000078293456938132840;
|
|
386
|
+
const T31: f64 = -0.0000032609076735050182;
|
|
387
|
+
const T33: f64 = 0.0000023261313142559411;
|
|
388
|
+
|
|
389
|
+
var x = x_;
|
|
390
|
+
var y = y_;
|
|
391
|
+
const big = @abs(x) >= 0.67434;
|
|
392
|
+
var sign: i8 = 0;
|
|
393
|
+
|
|
394
|
+
if (big) {
|
|
395
|
+
if (x < 0) {
|
|
396
|
+
sign = -1;
|
|
397
|
+
x = -x;
|
|
398
|
+
y = -y;
|
|
399
|
+
}
|
|
400
|
+
x = (pio4 - x) + (pio4lo - y);
|
|
401
|
+
y = 0.0;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
var z = x * x;
|
|
405
|
+
var w = z * z;
|
|
406
|
+
|
|
407
|
+
var r = T5 + w * (T9 + w * (T13 + w * (T17 + w * (T21 +
|
|
408
|
+
w * (T25 + w * (T29 + w * T33))))));
|
|
409
|
+
|
|
410
|
+
var v = z * (T7 + w * (T11 + w * (T15 + w * (T19 + w * (T23 +
|
|
411
|
+
w * (T27 + w * T31))))));
|
|
412
|
+
|
|
413
|
+
var s = z * x;
|
|
414
|
+
r = y + z * (s * (r + v) + y) + T3 * s;
|
|
415
|
+
w = x + r;
|
|
416
|
+
|
|
417
|
+
if (big) {
|
|
418
|
+
s = @as(f80, @floatFromInt(1 - 2 * odd));
|
|
419
|
+
v = s - 2.0 * (x + (r - w * w / (w + s)));
|
|
420
|
+
return if (sign == -1) -v else v;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (odd == 0) {
|
|
424
|
+
return w;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// if allow error up to 2 ulp, simply return
|
|
428
|
+
// -1.0 / (x+r) here
|
|
429
|
+
//
|
|
430
|
+
// compute -1.0 / (x+r) accurately
|
|
431
|
+
z = w + 0x1p32 - 0x1p32;
|
|
432
|
+
v = r - (z - x);
|
|
433
|
+
const a = -1.0 / w;
|
|
434
|
+
const t = a + 0x1p32 - 0x1p32;
|
|
435
|
+
s = 1.0 + t * z;
|
|
436
|
+
return t + a * (s + t * v);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
pub fn tanq(x_: f128, y_: f128, odd: i32) f128 {
|
|
440
|
+
const pio4: f128 = 0x1.921fb54442d18469898cc51701b8p-1;
|
|
441
|
+
const pio4lo: f128 = 0x1.cd129024e088a67cc74020bbea60p-116;
|
|
442
|
+
|
|
443
|
+
const T3: f128 = 0x1.5555555555555555555555555553p-2;
|
|
444
|
+
const T5: f128 = 0x1.1111111111111111111111111eb5p-3;
|
|
445
|
+
const T7: f128 = 0x1.ba1ba1ba1ba1ba1ba1ba1b694cd6p-5;
|
|
446
|
+
const T9: f128 = 0x1.664f4882c10f9f32d6bbe09d8bcdp-6;
|
|
447
|
+
const T11: f128 = 0x1.226e355e6c23c8f5b4f5762322eep-7;
|
|
448
|
+
const T13: f128 = 0x1.d6d3d0e157ddfb5fed8e84e27b37p-9;
|
|
449
|
+
const T15: f128 = 0x1.7da36452b75e2b5fce9ee7c2c92ep-10;
|
|
450
|
+
const T17: f128 = 0x1.355824803674477dfcf726649efep-11;
|
|
451
|
+
const T19: f128 = 0x1.f57d7734d1656e0aceb716f614c2p-13;
|
|
452
|
+
const T21: f128 = 0x1.967e18afcb180ed942dfdc518d6cp-14;
|
|
453
|
+
const T23: f128 = 0x1.497d8eea21e95bc7e2aa79b9f2cdp-15;
|
|
454
|
+
const T25: f128 = 0x1.0b132d39f055c81be49eff7afd50p-16;
|
|
455
|
+
const T27: f128 = 0x1.b0f72d33eff7bfa2fbc1059d90b6p-18;
|
|
456
|
+
const T29: f128 = 0x1.5ef2daf21d1113df38d0fbc00267p-19;
|
|
457
|
+
const T31: f128 = 0x1.1c77d6eac0234988cdaa04c96626p-20;
|
|
458
|
+
const T33: f128 = 0x1.cd2a5a292b180e0bdd701057dfe3p-22;
|
|
459
|
+
const T35: f128 = 0x1.75c7357d0298c01a31d0a6f7d518p-23;
|
|
460
|
+
const T37: f128 = 0x1.2f3190f4718a9a520f98f50081fcp-24;
|
|
461
|
+
const T39: f64 = 0.000000028443389121318352;
|
|
462
|
+
const T41: f64 = 0.000000011981013102001973;
|
|
463
|
+
const T43: f64 = 0.0000000038303578044958070;
|
|
464
|
+
const T45: f64 = 0.0000000034664378216909893;
|
|
465
|
+
const T47: f64 = -0.0000000015090641701997785;
|
|
466
|
+
const T49: f64 = 0.0000000029449552300483952;
|
|
467
|
+
const T51: f64 = -0.0000000022006995706097711;
|
|
468
|
+
const T53: f64 = 0.0000000015468200913196612;
|
|
469
|
+
const T55: f64 = -0.00000000061311613386849674;
|
|
470
|
+
const T57: f64 = 1.4912469681508012e-10;
|
|
471
|
+
|
|
472
|
+
var x = x_;
|
|
473
|
+
var y = y_;
|
|
474
|
+
|
|
475
|
+
const big = @abs(x) >= 0.67434;
|
|
476
|
+
var sign: i8 = 0;
|
|
477
|
+
|
|
478
|
+
if (big) {
|
|
479
|
+
if (x < 0) {
|
|
480
|
+
sign = -1;
|
|
481
|
+
x = -x;
|
|
482
|
+
y = -y;
|
|
483
|
+
}
|
|
484
|
+
x = (pio4 - x) + (pio4lo - y);
|
|
485
|
+
y = 0.0;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
var z = x * x;
|
|
489
|
+
var w = z * z;
|
|
490
|
+
|
|
491
|
+
var r = T5 + w * (T9 + w * (T13 + w * (T17 + w * (T21 +
|
|
492
|
+
w * (T25 + w * (T29 + w * (T33 + w * (T37 + w * (T41 +
|
|
493
|
+
w * (T45 + w * (T49 + w * (T53 + w * T57))))))))))));
|
|
494
|
+
|
|
495
|
+
var v = z * (T7 + w * (T11 + w * (T15 + w * (T19 + w * (T23 +
|
|
496
|
+
w * (T27 + w * (T31 + w * (T35 + w * (T39 + w * (T43 +
|
|
497
|
+
w * (T47 + w * (T51 + w * T55))))))))))));
|
|
498
|
+
|
|
499
|
+
var s = z * x;
|
|
500
|
+
r = y + z * (s * (r + v) + y) + T3 * s;
|
|
501
|
+
w = x + r;
|
|
502
|
+
|
|
503
|
+
if (big) {
|
|
504
|
+
s = @as(f128, @floatFromInt(1 - 2 * odd));
|
|
505
|
+
v = s - 2.0 * (x + (r - w * w / (w + s)));
|
|
506
|
+
return if (sign == -1) -v else v;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
if (odd == 0) {
|
|
510
|
+
return w;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// if allow error up to 2 ulp, simply return
|
|
514
|
+
// -1.0 / (x+r) here
|
|
515
|
+
//
|
|
516
|
+
// compute -1.0 / (x+r) accurately
|
|
517
|
+
z = w + 0x1p32 - 0x1p32;
|
|
518
|
+
v = r - (z - x);
|
|
519
|
+
const a = -1.0 / w;
|
|
520
|
+
const t = a + 0x1p32 - 0x1p32;
|
|
521
|
+
s = 1.0 + t * z;
|
|
522
|
+
return t + a * (s + t * v);
|
|
523
|
+
}
|
|
@@ -13,6 +13,8 @@ const max_limbs = std.math.divCeil(usize, 65535, 32) catch unreachable; // max s
|
|
|
13
13
|
comptime {
|
|
14
14
|
symbol(&__udivei4, "__udivei4");
|
|
15
15
|
symbol(&__umodei4, "__umodei4");
|
|
16
|
+
symbol(&__udivei5, "__udivei5");
|
|
17
|
+
symbol(&__umodei5, "__umodei5");
|
|
16
18
|
}
|
|
17
19
|
|
|
18
20
|
/// Get the value of a limb.
|
|
@@ -132,6 +134,32 @@ pub fn __umodei4(r_p: [*]u8, u_p: [*]const u8, v_p: [*]const u8, bits: usize) ca
|
|
|
132
134
|
@call(.always_inline, divmod, .{ null, r, u, v }) catch unreachable;
|
|
133
135
|
}
|
|
134
136
|
|
|
137
|
+
pub fn __udivei5(q_p: [*]u8, u_p: [*]const u8, v_p: [*]const u8, t_p: [*]u8, bits: usize) callconv(.c) void {
|
|
138
|
+
@setRuntimeSafety(compiler_rt.test_safety);
|
|
139
|
+
const byte_size = std.zig.target.intByteSize(&builtin.target, @intCast(bits));
|
|
140
|
+
const q: []u32 = @ptrCast(@alignCast(q_p[0..byte_size]));
|
|
141
|
+
const u: []const u32 = @ptrCast(@alignCast(u_p[0..byte_size]));
|
|
142
|
+
const v: []const u32 = @ptrCast(@alignCast(v_p[0..byte_size]));
|
|
143
|
+
const tu: []u32 = @ptrCast(@alignCast(t_p[0..byte_size]));
|
|
144
|
+
_ = tu;
|
|
145
|
+
const tv: []u32 = @ptrCast(@alignCast(t_p[byte_size..][0..byte_size]));
|
|
146
|
+
_ = tv;
|
|
147
|
+
@call(.always_inline, divmod, .{ q, null, u, v }) catch unreachable;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
pub fn __umodei5(r_p: [*]u8, u_p: [*]const u8, v_p: [*]const u8, t_p: [*]u8, bits: usize) callconv(.c) void {
|
|
151
|
+
@setRuntimeSafety(compiler_rt.test_safety);
|
|
152
|
+
const byte_size = std.zig.target.intByteSize(&builtin.target, @intCast(bits));
|
|
153
|
+
const r: []u32 = @ptrCast(@alignCast(r_p[0..byte_size]));
|
|
154
|
+
const u: []const u32 = @ptrCast(@alignCast(u_p[0..byte_size]));
|
|
155
|
+
const v: []const u32 = @ptrCast(@alignCast(v_p[0..byte_size]));
|
|
156
|
+
const tu: []u32 = @ptrCast(@alignCast(t_p[0..byte_size]));
|
|
157
|
+
_ = tu;
|
|
158
|
+
const tv: []u32 = @ptrCast(@alignCast(t_p[byte_size..][0..byte_size]));
|
|
159
|
+
_ = tv;
|
|
160
|
+
@call(.always_inline, divmod, .{ null, r, u, v }) catch unreachable;
|
|
161
|
+
}
|
|
162
|
+
|
|
135
163
|
test "__udivei4/__umodei4" {
|
|
136
164
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
|
137
165
|
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
|
package/compiler_rt.zig
CHANGED
|
@@ -279,6 +279,8 @@ comptime {
|
|
|
279
279
|
_ = @import("compiler_rt/divmodei4.zig");
|
|
280
280
|
_ = @import("compiler_rt/udivmodei4.zig");
|
|
281
281
|
|
|
282
|
+
_ = @import("compiler_rt/limb64.zig");
|
|
283
|
+
|
|
282
284
|
// extra
|
|
283
285
|
_ = @import("compiler_rt/os_version_check.zig");
|
|
284
286
|
_ = @import("compiler_rt/emutls.zig");
|