@zigc/lib 0.16.0-test.1 → 0.17.0-dev.9

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.
Files changed (242) hide show
  1. package/LICENSE +19 -0
  2. package/c/math.zig +135 -35
  3. package/c/stropts.zig +17 -0
  4. package/c.zig +1 -0
  5. package/compiler/aro/aro/Attribute/names.zig +604 -589
  6. package/compiler/aro/aro/Attribute.zig +202 -116
  7. package/compiler/aro/aro/Builtins/common.zig +874 -863
  8. package/compiler/aro/aro/Builtins/eval.zig +15 -7
  9. package/compiler/aro/aro/Builtins.zig +0 -1
  10. package/compiler/aro/aro/CodeGen.zig +3 -1
  11. package/compiler/aro/aro/Compilation.zig +120 -97
  12. package/compiler/aro/aro/Diagnostics.zig +21 -17
  13. package/compiler/aro/aro/Driver/GCCDetector.zig +635 -0
  14. package/compiler/aro/aro/Driver.zig +124 -50
  15. package/compiler/aro/aro/LangOpts.zig +12 -2
  16. package/compiler/aro/aro/Parser/Diagnostic.zig +79 -19
  17. package/compiler/aro/aro/Parser.zig +336 -142
  18. package/compiler/aro/aro/Preprocessor/Diagnostic.zig +21 -0
  19. package/compiler/aro/aro/Preprocessor.zig +127 -56
  20. package/compiler/aro/aro/Target.zig +17 -12
  21. package/compiler/aro/aro/Tokenizer.zig +31 -14
  22. package/compiler/aro/aro/Toolchain.zig +4 -7
  23. package/compiler/aro/aro/Tree.zig +178 -148
  24. package/compiler/aro/aro/TypeStore.zig +82 -24
  25. package/compiler/aro/aro/Value.zig +13 -17
  26. package/compiler/aro/aro/features.zig +1 -0
  27. package/compiler/aro/aro/pragmas/once.zig +0 -1
  28. package/compiler/aro/aro/record_layout.zig +3 -3
  29. package/compiler/aro/assembly_backend/x86_64.zig +3 -4
  30. package/compiler/aro/backend/Assembly.zig +1 -2
  31. package/compiler/aro/backend/Interner.zig +2 -2
  32. package/compiler/aro/backend/Ir.zig +100 -92
  33. package/compiler/aro/include/ptrcheck.h +49 -0
  34. package/compiler/aro/main.zig +26 -10
  35. package/compiler/build_runner.zig +1 -0
  36. package/compiler/objdump.zig +93 -0
  37. package/compiler/reduce.zig +5 -1
  38. package/compiler/resinator/compile.zig +2 -2
  39. package/compiler/resinator/main.zig +7 -1
  40. package/compiler/resinator/preprocess.zig +1 -3
  41. package/compiler/std-docs.zig +8 -1
  42. package/compiler/test_runner.zig +193 -61
  43. package/compiler/translate-c/MacroTranslator.zig +80 -11
  44. package/compiler/translate-c/PatternList.zig +1 -9
  45. package/compiler/translate-c/Scope.zig +43 -6
  46. package/compiler/translate-c/Translator.zig +364 -126
  47. package/compiler/translate-c/ast.zig +19 -11
  48. package/compiler/translate-c/main.zig +75 -16
  49. package/compiler_rt/cos.zig +141 -52
  50. package/compiler_rt/limb64.zig +266 -0
  51. package/compiler_rt/long_double.zig +37 -0
  52. package/compiler_rt/mulo.zig +6 -1
  53. package/compiler_rt/rem_pio2l.zig +173 -0
  54. package/compiler_rt/sin.zig +140 -55
  55. package/compiler_rt/sincos.zig +279 -72
  56. package/compiler_rt/tan.zig +118 -47
  57. package/compiler_rt/trig.zig +256 -6
  58. package/compiler_rt.zig +2 -0
  59. package/fuzzer.zig +855 -307
  60. package/libc/musl/src/math/pow.c +343 -0
  61. package/package.json +1 -1
  62. package/std/Build/Fuzz.zig +6 -19
  63. package/std/Build/Module.zig +1 -1
  64. package/std/Build/Step/CheckObject.zig +3 -3
  65. package/std/Build/Step/Compile.zig +18 -0
  66. package/std/Build/Step/ConfigHeader.zig +49 -33
  67. package/std/Build/Step/InstallArtifact.zig +18 -0
  68. package/std/Build/Step/Run.zig +536 -87
  69. package/std/Build/Step/TranslateC.zig +0 -6
  70. package/std/Build/Step.zig +8 -15
  71. package/std/Build/WebServer.zig +29 -17
  72. package/std/Build/abi.zig +47 -11
  73. package/std/Build.zig +17 -14
  74. package/std/Io/Dispatch.zig +2 -0
  75. package/std/Io/File/Reader.zig +3 -1
  76. package/std/Io/File.zig +1 -0
  77. package/std/Io/Kqueue.zig +2 -2
  78. package/std/Io/Threaded.zig +181 -143
  79. package/std/Io/Uring.zig +2 -1
  80. package/std/Io.zig +970 -2
  81. package/std/Target.zig +3 -2
  82. package/std/Thread.zig +8 -3
  83. package/std/array_hash_map.zig +96 -555
  84. package/std/array_list.zig +22 -31
  85. package/std/bit_set.zig +22 -6
  86. package/std/builtin/assembly.zig +68 -0
  87. package/std/c.zig +17 -17
  88. package/std/compress/flate/Compress.zig +3 -3
  89. package/std/crypto/Certificate/Bundle.zig +15 -1
  90. package/std/crypto/codecs/asn1.zig +33 -18
  91. package/std/crypto/codecs/base64_hex_ct.zig +14 -4
  92. package/std/debug/Dwarf.zig +29 -9
  93. package/std/debug/Info.zig +4 -0
  94. package/std/debug/MachOFile.zig +46 -8
  95. package/std/debug/Pdb.zig +539 -36
  96. package/std/debug/SelfInfo/Elf.zig +19 -18
  97. package/std/debug/SelfInfo/MachO.zig +18 -7
  98. package/std/debug/SelfInfo/Windows.zig +138 -36
  99. package/std/debug.zig +179 -65
  100. package/std/enums.zig +25 -19
  101. package/std/heap/ArenaAllocator.zig +145 -154
  102. package/std/heap/debug_allocator.zig +7 -7
  103. package/std/http/Client.zig +10 -6
  104. package/std/http.zig +11 -9
  105. package/std/json/Stringify.zig +3 -3
  106. package/std/json/dynamic.zig +4 -4
  107. package/std/math/big/int.zig +16 -17
  108. package/std/mem/Allocator.zig +4 -5
  109. package/std/mem.zig +48 -0
  110. package/std/os/emscripten.zig +2 -18
  111. package/std/os/linux/arc.zig +144 -0
  112. package/std/os/linux.zig +21 -4
  113. package/std/os/windows.zig +2 -2
  114. package/std/pdb.zig +143 -4
  115. package/std/posix.zig +6 -12
  116. package/std/priority_dequeue.zig +13 -12
  117. package/std/priority_queue.zig +5 -4
  118. package/std/process/Child.zig +1 -1
  119. package/std/process/Environ.zig +1 -1
  120. package/std/start.zig +17 -4
  121. package/std/std.zig +19 -6
  122. package/std/testing/FailingAllocator.zig +4 -4
  123. package/std/testing/Smith.zig +37 -2
  124. package/std/zig/Ast/Render.zig +186 -458
  125. package/std/zig/Ast.zig +0 -4
  126. package/std/zig/AstGen.zig +44 -7
  127. package/std/zig/AstSmith.zig +2602 -0
  128. package/std/zig/Client.zig +8 -3
  129. package/std/zig/Parse.zig +83 -74
  130. package/std/zig/Server.zig +26 -0
  131. package/std/zig/Zir.zig +17 -0
  132. package/std/zig/c_translation/helpers.zig +14 -9
  133. package/std/zig/llvm/Builder.zig +107 -48
  134. package/std/zig/system.zig +20 -4
  135. package/std/zig/tokenizer.zig +2 -1
  136. package/std/zig.zig +6 -0
  137. package/compiler/aro/aro/Driver/Filesystem.zig +0 -241
  138. package/libc/mingw/complex/cabs.c +0 -48
  139. package/libc/mingw/complex/cabsf.c +0 -48
  140. package/libc/mingw/complex/cacos.c +0 -50
  141. package/libc/mingw/complex/cacosf.c +0 -50
  142. package/libc/mingw/complex/carg.c +0 -48
  143. package/libc/mingw/complex/cargf.c +0 -48
  144. package/libc/mingw/complex/casin.c +0 -50
  145. package/libc/mingw/complex/casinf.c +0 -50
  146. package/libc/mingw/complex/catan.c +0 -50
  147. package/libc/mingw/complex/catanf.c +0 -50
  148. package/libc/mingw/complex/ccos.c +0 -50
  149. package/libc/mingw/complex/ccosf.c +0 -50
  150. package/libc/mingw/complex/cexp.c +0 -48
  151. package/libc/mingw/complex/cexpf.c +0 -48
  152. package/libc/mingw/complex/cimag.c +0 -48
  153. package/libc/mingw/complex/cimagf.c +0 -48
  154. package/libc/mingw/complex/clog.c +0 -48
  155. package/libc/mingw/complex/clog10.c +0 -49
  156. package/libc/mingw/complex/clog10f.c +0 -49
  157. package/libc/mingw/complex/clogf.c +0 -48
  158. package/libc/mingw/complex/conj.c +0 -48
  159. package/libc/mingw/complex/conjf.c +0 -48
  160. package/libc/mingw/complex/cpow.c +0 -48
  161. package/libc/mingw/complex/cpowf.c +0 -48
  162. package/libc/mingw/complex/cproj.c +0 -48
  163. package/libc/mingw/complex/cprojf.c +0 -48
  164. package/libc/mingw/complex/creal.c +0 -48
  165. package/libc/mingw/complex/crealf.c +0 -48
  166. package/libc/mingw/complex/csin.c +0 -50
  167. package/libc/mingw/complex/csinf.c +0 -50
  168. package/libc/mingw/complex/csqrt.c +0 -48
  169. package/libc/mingw/complex/csqrtf.c +0 -48
  170. package/libc/mingw/complex/ctan.c +0 -50
  171. package/libc/mingw/complex/ctanf.c +0 -50
  172. package/libc/mingw/math/arm/s_rint.c +0 -86
  173. package/libc/mingw/math/arm/s_rintf.c +0 -51
  174. package/libc/mingw/math/arm/sincos.S +0 -30
  175. package/libc/mingw/math/arm-common/sincosl.c +0 -13
  176. package/libc/mingw/math/arm64/rint.c +0 -12
  177. package/libc/mingw/math/arm64/rintf.c +0 -12
  178. package/libc/mingw/math/arm64/sincos.S +0 -32
  179. package/libc/mingw/math/bsd_private_base.h +0 -148
  180. package/libc/mingw/math/frexpf.c +0 -13
  181. package/libc/mingw/math/frexpl.c +0 -71
  182. package/libc/mingw/math/x86/acosf.c +0 -29
  183. package/libc/mingw/math/x86/atanf.c +0 -23
  184. package/libc/mingw/math/x86/atanl.c +0 -18
  185. package/libc/mingw/math/x86/cos.def.h +0 -65
  186. package/libc/mingw/math/x86/cosl.c +0 -46
  187. package/libc/mingw/math/x86/cosl_internal.S +0 -55
  188. package/libc/mingw/math/x86/ldexp.c +0 -23
  189. package/libc/mingw/math/x86/scalbn.S +0 -41
  190. package/libc/mingw/math/x86/scalbnf.S +0 -40
  191. package/libc/mingw/math/x86/sin.def.h +0 -65
  192. package/libc/mingw/math/x86/sinl.c +0 -46
  193. package/libc/mingw/math/x86/sinl_internal.S +0 -58
  194. package/libc/mingw/math/x86/tanl.S +0 -62
  195. package/libc/mingw/misc/btowc.c +0 -28
  196. package/libc/mingw/misc/wcstof.c +0 -66
  197. package/libc/mingw/misc/wcstoimax.c +0 -132
  198. package/libc/mingw/misc/wcstoumax.c +0 -126
  199. package/libc/mingw/misc/wctob.c +0 -29
  200. package/libc/mingw/misc/winbs_uint64.c +0 -6
  201. package/libc/mingw/misc/winbs_ulong.c +0 -6
  202. package/libc/mingw/misc/winbs_ushort.c +0 -6
  203. package/libc/mingw/stdio/_Exit.c +0 -10
  204. package/libc/mingw/stdio/_findfirst64i32.c +0 -21
  205. package/libc/mingw/stdio/_findnext64i32.c +0 -21
  206. package/libc/mingw/stdio/_fstat64i32.c +0 -37
  207. package/libc/mingw/stdio/_stat64i32.c +0 -37
  208. package/libc/mingw/stdio/_wfindfirst64i32.c +0 -21
  209. package/libc/mingw/stdio/_wfindnext64i32.c +0 -21
  210. package/libc/mingw/stdio/_wstat64i32.c +0 -37
  211. package/libc/musl/src/legacy/isastream.c +0 -7
  212. package/libc/musl/src/legacy/valloc.c +0 -8
  213. package/libc/musl/src/math/__cosl.c +0 -96
  214. package/libc/musl/src/math/__sinl.c +0 -78
  215. package/libc/musl/src/math/__tanl.c +0 -143
  216. package/libc/musl/src/math/aarch64/lrint.c +0 -10
  217. package/libc/musl/src/math/aarch64/lrintf.c +0 -10
  218. package/libc/musl/src/math/aarch64/rintf.c +0 -7
  219. package/libc/musl/src/math/cosl.c +0 -39
  220. package/libc/musl/src/math/fdim.c +0 -10
  221. package/libc/musl/src/math/finite.c +0 -7
  222. package/libc/musl/src/math/finitef.c +0 -7
  223. package/libc/musl/src/math/frexp.c +0 -23
  224. package/libc/musl/src/math/frexpf.c +0 -23
  225. package/libc/musl/src/math/frexpl.c +0 -29
  226. package/libc/musl/src/math/i386/lrint.c +0 -8
  227. package/libc/musl/src/math/i386/lrintf.c +0 -8
  228. package/libc/musl/src/math/i386/rintf.c +0 -7
  229. package/libc/musl/src/math/lrint.c +0 -72
  230. package/libc/musl/src/math/lrintf.c +0 -8
  231. package/libc/musl/src/math/powerpc64/lrint.c +0 -16
  232. package/libc/musl/src/math/powerpc64/lrintf.c +0 -16
  233. package/libc/musl/src/math/rintf.c +0 -30
  234. package/libc/musl/src/math/s390x/rintf.c +0 -15
  235. package/libc/musl/src/math/sincosl.c +0 -60
  236. package/libc/musl/src/math/sinl.c +0 -41
  237. package/libc/musl/src/math/tanl.c +0 -29
  238. package/libc/musl/src/math/x32/lrint.s +0 -5
  239. package/libc/musl/src/math/x32/lrintf.s +0 -5
  240. package/libc/musl/src/math/x86_64/lrint.c +0 -8
  241. package/libc/musl/src/math/x86_64/lrintf.c +0 -8
  242. package/libc/wasi/libc-bottom-half/sources/reallocarray.c +0 -14
@@ -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(&__tanh, "__tanh");
27
+ symbol(&tanh, "__tanh");
24
28
  symbol(&tanf, "tanf");
25
29
  symbol(&tan, "tan");
26
- symbol(&__tanx, "__tanx");
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 __tanh(x: f16) callconv(.c) f16 {
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.__tandf(x, false);
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.__tandf((if (sign) x + t1pio2 else x - t1pio2), true);
70
+ return kernel.tandf((if (sign) x + t1pio2 else x - t1pio2), true);
67
71
  } else {
68
- return kernel.__tandf((if (sign) x + t2pio2 else x - t2pio2), false);
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.__tandf((if (sign) x + t3pio2 else x - t3pio2), true);
77
+ return kernel.tandf((if (sign) x + t3pio2 else x - t3pio2), true);
74
78
  } else {
75
- return kernel.__tandf((if (sign) x + t4pio2 else x - t4pio2), false);
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.__tandf(y, n & 1 != 0);
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.__tan(x, 0.0, false);
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.__tan(y[0], y[1], n & 1 != 0);
120
+ return kernel.tan(y[0], y[1], n & 1 != 0);
117
121
  }
118
122
 
119
- pub fn __tanx(x: f80) callconv(.c) f80 {
120
- // TODO: more efficient implementation
121
- return @floatCast(tanq(x));
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
- // TODO: more correct implementation
126
- return tan(@floatCast(x));
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 __tanh(x),
167
+ 16 => return tanh(x),
132
168
  32 => return tanf(x),
133
169
  64 => return tan(x),
134
- 80 => return __tanx(x),
170
+ 80 => return tanx(x),
135
171
  128 => return tanq(x),
136
172
  else => @compileError("unreachable"),
137
173
  }
138
174
  }
139
175
 
140
- test "tan" {
141
- try expect(tan(@as(f32, 0.0)) == tanf(0.0));
142
- try expect(tan(@as(f64, 0.0)) == tan(0.0));
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
- const epsilon = 0.00001;
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 expect(math.approxEqAbs(f32, tanf(0.0), 0.0, epsilon));
149
- try expect(math.approxEqAbs(f32, tanf(0.2), 0.202710, epsilon));
150
- try expect(math.approxEqAbs(f32, tanf(0.8923), 1.240422, epsilon));
151
- try expect(math.approxEqAbs(f32, tanf(1.5), 14.101420, epsilon));
152
- try expect(math.approxEqAbs(f32, tanf(37.45), -0.254397, epsilon));
153
- try expect(math.approxEqAbs(f32, tanf(89.123), 2.285852, epsilon));
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 "tan64" {
157
- const epsilon = 0.000001;
227
+ test "tan128.normal" {
228
+ const epsilon = math.floatEps(f128);
158
229
 
159
- try expect(math.approxEqAbs(f64, tan(0.0), 0.0, epsilon));
160
- try expect(math.approxEqAbs(f64, tan(0.2), 0.202710, epsilon));
161
- try expect(math.approxEqAbs(f64, tan(0.8923), 1.240422, epsilon));
162
- try expect(math.approxEqAbs(f64, tan(1.5), 14.101420, epsilon));
163
- try expect(math.approxEqAbs(f64, tan(37.45), -0.254397, epsilon));
164
- try expect(math.approxEqAbs(f64, tan(89.123), 2.2858376, epsilon));
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 expect(tanf(0.0) == 0.0);
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 expect(tan(0.0) == 0.0);
177
- try expect(tan(-0.0) == -0.0);
178
- try expect(math.isNan(tan(math.inf(f64))));
179
- try expect(math.isNan(tan(-math.inf(f64))));
180
- try expect(math.isNan(tan(math.nan(f64))));
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
  }
@@ -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 __cos(x: f64, y: f64) f64 {
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 __cosdf(x: f64) f32 {
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 __sin(x: f64, y: f64, iy: i32) f64 {
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 __sindf(x: f64) f32 {
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 __tan(x_: f64, y_: f64, odd: bool) f64 {
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 __tandf(x: f64, odd: bool) f32 {
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
+ }
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");