@scriptc/compiler 0.3.2 → 0.3.3

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 (364) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +490 -39
  2. package/dist/backend/cycle-analysis.js +6 -1
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/llvm/alloc.js +24 -10
  5. package/dist/backend/llvm/alloc.js.map +1 -1
  6. package/dist/backend/llvm/alloc.test.js +47 -1
  7. package/dist/backend/llvm/alloc.test.js.map +1 -1
  8. package/dist/backend/llvm/array-search.d.ts +8 -0
  9. package/dist/backend/llvm/array-search.js +52 -0
  10. package/dist/backend/llvm/array-search.js.map +1 -0
  11. package/dist/backend/llvm/array-search.test.d.ts +1 -0
  12. package/dist/backend/llvm/array-search.test.js +72 -0
  13. package/dist/backend/llvm/array-search.test.js.map +1 -0
  14. package/dist/backend/llvm/call-lifetimes.d.ts +8 -1
  15. package/dist/backend/llvm/call-lifetimes.js +33 -11
  16. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  17. package/dist/backend/llvm/call-lifetimes.test.js +54 -0
  18. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  19. package/dist/backend/llvm/classes.js +87 -36
  20. package/dist/backend/llvm/classes.js.map +1 -1
  21. package/dist/backend/llvm/common.d.ts +1 -1
  22. package/dist/backend/llvm/common.js +1 -1
  23. package/dist/backend/llvm/dense-array-access.d.ts +5 -0
  24. package/dist/backend/llvm/dense-array-access.js +1 -1
  25. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  26. package/dist/backend/llvm/dyn.d.ts +4 -0
  27. package/dist/backend/llvm/dyn.js +73 -9
  28. package/dist/backend/llvm/dyn.js.map +1 -1
  29. package/dist/backend/llvm/emitter.d.ts +65 -14
  30. package/dist/backend/llvm/emitter.js +297 -81
  31. package/dist/backend/llvm/emitter.js.map +1 -1
  32. package/dist/backend/llvm/emitter.test.js +26 -3
  33. package/dist/backend/llvm/emitter.test.js.map +1 -1
  34. package/dist/backend/llvm/expr-async.js +52 -1
  35. package/dist/backend/llvm/expr-async.js.map +1 -1
  36. package/dist/backend/llvm/expr-bytes.js +11 -0
  37. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  38. package/dist/backend/llvm/expr-callbacks.js +16 -2
  39. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  40. package/dist/backend/llvm/expr-calls.js +8 -1
  41. package/dist/backend/llvm/expr-calls.js.map +1 -1
  42. package/dist/backend/llvm/expr-containers.js +42 -15
  43. package/dist/backend/llvm/expr-containers.js.map +1 -1
  44. package/dist/backend/llvm/expr-dynamic.js +19 -8
  45. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  46. package/dist/backend/llvm/expr-primitives.js +28 -30
  47. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  48. package/dist/backend/llvm/expr-records.js +8 -4
  49. package/dist/backend/llvm/expr-records.js.map +1 -1
  50. package/dist/backend/llvm/expr-stream-bridges.js +35 -32
  51. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  52. package/dist/backend/llvm/expr-stream-callbacks.d.ts +13 -2
  53. package/dist/backend/llvm/expr-stream-callbacks.js +80 -5
  54. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  55. package/dist/backend/llvm/inline-unions.d.ts +48 -0
  56. package/dist/backend/llvm/inline-unions.js +134 -0
  57. package/dist/backend/llvm/inline-unions.js.map +1 -0
  58. package/dist/backend/llvm/inline-unions.test.d.ts +1 -0
  59. package/dist/backend/llvm/inline-unions.test.js +124 -0
  60. package/dist/backend/llvm/inline-unions.test.js.map +1 -0
  61. package/dist/backend/llvm/integer-remainder.d.ts +28 -5
  62. package/dist/backend/llvm/integer-remainder.js +80 -9
  63. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  64. package/dist/backend/llvm/lib-dispatch.js +163 -28
  65. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  66. package/dist/backend/llvm/lib-filesystem.js +125 -7
  67. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  68. package/dist/backend/llvm/lib-network.js +9 -6
  69. package/dist/backend/llvm/lib-network.js.map +1 -1
  70. package/dist/backend/llvm/lib-process.js +2 -2
  71. package/dist/backend/llvm/lib-process.js.map +1 -1
  72. package/dist/backend/llvm/lib-shared.js +132 -0
  73. package/dist/backend/llvm/lib-shared.js.map +1 -1
  74. package/dist/backend/llvm/lib-stream.js +97 -0
  75. package/dist/backend/llvm/lib-stream.js.map +1 -1
  76. package/dist/backend/llvm/local-array-reads.js +7 -3
  77. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  78. package/dist/backend/llvm/local-array-reads.test.js +6 -3
  79. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  80. package/dist/backend/llvm/local-union-storage.d.ts +2 -0
  81. package/dist/backend/llvm/local-union-storage.js +5 -0
  82. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  83. package/dist/backend/llvm/local-union-storage.test.js +1 -0
  84. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  85. package/dist/backend/llvm/loop-array-borrows.d.ts +8 -2
  86. package/dist/backend/llvm/loop-array-borrows.js +93 -13
  87. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  88. package/dist/backend/llvm/map-number-lookup.d.ts +20 -0
  89. package/dist/backend/llvm/map-number-lookup.js +66 -0
  90. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  91. package/dist/backend/llvm/map-number-lookup.test.d.ts +1 -0
  92. package/dist/backend/llvm/map-number-lookup.test.js +102 -0
  93. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -0
  94. package/dist/backend/llvm/map-read-lifetimes.js +1 -0
  95. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  96. package/dist/backend/llvm/publish.d.ts +4 -0
  97. package/dist/backend/llvm/publish.js +3 -1
  98. package/dist/backend/llvm/publish.js.map +1 -1
  99. package/dist/backend/llvm/record-results.d.ts +8 -5
  100. package/dist/backend/llvm/record-results.js +20 -12
  101. package/dist/backend/llvm/record-results.js.map +1 -1
  102. package/dist/backend/llvm/reference-effects.js +13 -0
  103. package/dist/backend/llvm/reference-effects.js.map +1 -1
  104. package/dist/backend/llvm/reference-writes.js +14 -0
  105. package/dist/backend/llvm/reference-writes.js.map +1 -1
  106. package/dist/backend/llvm/regions.d.ts +1 -0
  107. package/dist/backend/llvm/regions.js +12 -7
  108. package/dist/backend/llvm/regions.js.map +1 -1
  109. package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
  110. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  111. package/dist/backend/llvm/shapes.d.ts +56 -10
  112. package/dist/backend/llvm/shapes.js +178 -39
  113. package/dist/backend/llvm/shapes.js.map +1 -1
  114. package/dist/backend/llvm/shapes.test.js +61 -3
  115. package/dist/backend/llvm/shapes.test.js.map +1 -1
  116. package/dist/backend/llvm/stack-objects.js +16 -4
  117. package/dist/backend/llvm/stack-objects.js.map +1 -1
  118. package/dist/backend/llvm/stack-objects.test.js +3 -0
  119. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  120. package/dist/backend/llvm/walkers.d.ts +11 -0
  121. package/dist/backend/llvm/walkers.js +106 -10
  122. package/dist/backend/llvm/walkers.js.map +1 -1
  123. package/dist/backend/may-throw.js +9 -4
  124. package/dist/backend/may-throw.js.map +1 -1
  125. package/dist/backend/native/contracts.d.ts +2 -2
  126. package/dist/backend/native/executable.js +14 -3
  127. package/dist/backend/native/executable.js.map +1 -1
  128. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  129. package/dist/backend/native/runtime-inputs.js +1 -0
  130. package/dist/backend/native/runtime-inputs.js.map +1 -1
  131. package/dist/backend/native-toolchain.test.js +1 -1
  132. package/dist/backend/native-toolchain.test.js.map +1 -1
  133. package/dist/backend/runtime-abi.d.ts +2 -2
  134. package/dist/backend/runtime-abi.js +2 -2
  135. package/dist/backend/runtime-pack-targets.test.js +1 -1
  136. package/dist/backend/runtime-pack.test.js +1 -1
  137. package/dist/backend/target-diagnostics.js +4 -1
  138. package/dist/backend/target-diagnostics.js.map +1 -1
  139. package/dist/backend/target-diagnostics.test.js +4 -1
  140. package/dist/backend/target-diagnostics.test.js.map +1 -1
  141. package/dist/compat/fetch-profile.js +4 -4
  142. package/dist/compat/fetch-profile.js.map +1 -1
  143. package/dist/contracts/check.js +2 -0
  144. package/dist/contracts/check.js.map +1 -1
  145. package/dist/coverage/report.js +1 -1
  146. package/dist/coverage/report.js.map +1 -1
  147. package/dist/diagnostics/diagnostic.d.ts +6 -5
  148. package/dist/diagnostics/diagnostic.js +7 -6
  149. package/dist/diagnostics/diagnostic.js.map +1 -1
  150. package/dist/frontend/builtin-modules.d.ts +1 -1
  151. package/dist/frontend/builtin-modules.js +1 -0
  152. package/dist/frontend/builtin-modules.js.map +1 -1
  153. package/dist/frontend/comptime-node.js +2 -2
  154. package/dist/frontend/comptime-node.js.map +1 -1
  155. package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
  156. package/dist/frontend/lowering/binding-analysis.js +1 -1
  157. package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
  158. package/dist/frontend/lowering/builtins/arguments.js +8 -4
  159. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  160. package/dist/frontend/lowering/builtins/blob.d.ts +20 -0
  161. package/dist/frontend/lowering/builtins/blob.js +167 -0
  162. package/dist/frontend/lowering/builtins/blob.js.map +1 -0
  163. package/dist/frontend/lowering/builtins/child-process-async.d.ts +2 -2
  164. package/dist/frontend/lowering/builtins/child-process-async.js +2 -2
  165. package/dist/frontend/lowering/builtins/child-process-methods.js +1 -1
  166. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  167. package/dist/frontend/lowering/builtins/child-process-sync.js +1 -1
  168. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  169. package/dist/frontend/lowering/builtins/compression.js +3 -2
  170. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  171. package/dist/frontend/lowering/builtins/crypto.js +415 -120
  172. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  173. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +10 -0
  174. package/dist/frontend/lowering/builtins/filesystem-calls.js +89 -1
  175. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  176. package/dist/frontend/lowering/builtins/filesystem.d.ts +16 -7
  177. package/dist/frontend/lowering/builtins/filesystem.js +97 -15
  178. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  179. package/dist/frontend/lowering/builtins/fs-glob.d.ts +23 -0
  180. package/dist/frontend/lowering/builtins/fs-glob.js +224 -0
  181. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -0
  182. package/dist/frontend/lowering/builtins/key-object.d.ts +13 -0
  183. package/dist/frontend/lowering/builtins/key-object.js +56 -0
  184. package/dist/frontend/lowering/builtins/key-object.js.map +1 -0
  185. package/dist/frontend/lowering/builtins/module-calls.js +44 -11
  186. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  187. package/dist/frontend/lowering/builtins/performance.d.ts +25 -3
  188. package/dist/frontend/lowering/builtins/performance.js +340 -5
  189. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  190. package/dist/frontend/lowering/builtins/process.d.ts +2 -2
  191. package/dist/frontend/lowering/builtins/process.js +107 -14
  192. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  193. package/dist/frontend/lowering/builtins/properties.d.ts +0 -7
  194. package/dist/frontend/lowering/builtins/properties.js +39 -11
  195. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  196. package/dist/frontend/lowering/builtins/readline.d.ts +23 -8
  197. package/dist/frontend/lowering/builtins/readline.js +266 -90
  198. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  199. package/dist/frontend/lowering/builtins/url.d.ts +8 -0
  200. package/dist/frontend/lowering/builtins/url.js +36 -0
  201. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  202. package/dist/frontend/lowering/call-arguments.js +1 -1
  203. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  204. package/dist/frontend/lowering/call-signatures.js +20 -2
  205. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  206. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +2 -0
  207. package/dist/frontend/lowering/class-dynamic-dispatch.js +105 -1
  208. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  209. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +1 -0
  210. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  211. package/dist/frontend/lowering/class-protocol-dispatch.d.ts +45 -0
  212. package/dist/frontend/lowering/class-protocol-dispatch.js +516 -0
  213. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -0
  214. package/dist/frontend/lowering/coercions/structural-plans.js +2 -1
  215. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  216. package/dist/frontend/lowering/coercions/structural.js +3 -3
  217. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  218. package/dist/frontend/lowering/collation-repertoire.js +6 -5
  219. package/dist/frontend/lowering/collation-repertoire.js.map +1 -1
  220. package/dist/frontend/lowering/containers/array-callbacks.js +4 -7
  221. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  222. package/dist/frontend/lowering/containers/array-methods.d.ts +0 -7
  223. package/dist/frontend/lowering/containers/array-methods.js +43 -2
  224. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  225. package/dist/frontend/lowering/containers/bytes.js +38 -26
  226. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  227. package/dist/frontend/lowering/containers/for-of.d.ts +1 -1
  228. package/dist/frontend/lowering/containers/for-of.js +5 -1
  229. package/dist/frontend/lowering/containers/for-of.js.map +1 -1
  230. package/dist/frontend/lowering/containers/indexed-objects.js +1 -1
  231. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  232. package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
  233. package/dist/frontend/lowering/crypto-tables.js +77 -12
  234. package/dist/frontend/lowering/crypto-tables.js.map +1 -1
  235. package/dist/frontend/lowering/expressions/nullish-assignment.js +10 -0
  236. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  237. package/dist/frontend/lowering/expressions/object-literals.js +16 -12
  238. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  239. package/dist/frontend/lowering/generic-functions.d.ts +2 -2
  240. package/dist/frontend/lowering/generic-functions.js +2 -2
  241. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  242. package/dist/frontend/lowering/http2-constants.js +1 -1
  243. package/dist/frontend/lowering/lower-array-sort.d.ts +12 -1
  244. package/dist/frontend/lowering/lower-array-sort.js +561 -191
  245. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  246. package/dist/frontend/lowering/lower-array-sort.test.js +4 -2
  247. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  248. package/dist/frontend/lowering/lower-assert.js +2 -2
  249. package/dist/frontend/lowering/lower-async-iteration.d.ts +6 -3
  250. package/dist/frontend/lowering/lower-async-iteration.js +248 -2
  251. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  252. package/dist/frontend/lowering/lower-calls.js +101 -9
  253. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  254. package/dist/frontend/lowering/lower-classes.d.ts +8 -2
  255. package/dist/frontend/lowering/lower-classes.js +40 -9
  256. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  257. package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
  258. package/dist/frontend/lowering/lower-comptime.js +4 -4
  259. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  260. package/dist/frontend/lowering/lower-event-target.d.ts +63 -0
  261. package/dist/frontend/lowering/lower-event-target.js +362 -0
  262. package/dist/frontend/lowering/lower-event-target.js.map +1 -0
  263. package/dist/frontend/lowering/lower-expando.js +2 -2
  264. package/dist/frontend/lowering/lower-exprs.js +112 -22
  265. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  266. package/dist/frontend/lowering/lower-inspect.js +129 -11
  267. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  268. package/dist/frontend/lowering/lower-mixins.js +1 -1
  269. package/dist/frontend/lowering/lower-modules.d.ts +1 -1
  270. package/dist/frontend/lowering/lower-modules.js +7 -3
  271. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  272. package/dist/frontend/lowering/lower-namespaces.d.ts +2 -2
  273. package/dist/frontend/lowering/lower-namespaces.js +2 -2
  274. package/dist/frontend/lowering/lower-server.js +39 -14
  275. package/dist/frontend/lowering/lower-server.js.map +1 -1
  276. package/dist/frontend/lowering/lower-stdlib.d.ts +7 -1
  277. package/dist/frontend/lowering/lower-stdlib.js +10 -3
  278. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  279. package/dist/frontend/lowering/lower-stmts.d.ts +2 -2
  280. package/dist/frontend/lowering/lower-stmts.js +46 -12
  281. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  282. package/dist/frontend/lowering/lower-stream.js +234 -22
  283. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  284. package/dist/frontend/lowering/lower-timers.js +1 -1
  285. package/dist/frontend/lowering/lowerer.d.ts +23 -5
  286. package/dist/frontend/lowering/lowerer.js +245 -41
  287. package/dist/frontend/lowering/lowerer.js.map +1 -1
  288. package/dist/frontend/lowering/native-ffi.js +2 -2
  289. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  290. package/dist/frontend/lowering/runtime-optional-records.d.ts +115 -0
  291. package/dist/frontend/lowering/runtime-optional-records.js +715 -0
  292. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -0
  293. package/dist/frontend/lowering/runtime-optional-records.test.d.ts +1 -0
  294. package/dist/frontend/lowering/runtime-optional-records.test.js +175 -0
  295. package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -0
  296. package/dist/frontend/lowering/surfaces.d.ts +7 -3
  297. package/dist/frontend/lowering/surfaces.js +273 -22
  298. package/dist/frontend/lowering/surfaces.js.map +1 -1
  299. package/dist/frontend/module-syntax.d.ts +1 -1
  300. package/dist/frontend/module-syntax.js +1 -1
  301. package/dist/frontend/npm-static-prune.js +1 -1
  302. package/dist/frontend/npm-static-prune.js.map +1 -1
  303. package/dist/frontend/npm-static-rewrite-syntax.js +4 -3
  304. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  305. package/dist/frontend/pipeline.js +1 -1
  306. package/dist/frontend/pipeline.js.map +1 -1
  307. package/dist/frontend/program.d.ts +3 -3
  308. package/dist/frontend/program.js +19 -17
  309. package/dist/frontend/program.js.map +1 -1
  310. package/dist/frontend/resolve.js +1 -1
  311. package/dist/frontend/ts7/adapter.js +1 -1
  312. package/dist/frontend/ts7/ast-bytes.d.ts +1 -1
  313. package/dist/frontend/ts7/ast-bytes.js +1 -1
  314. package/dist/frontend/ts7/semantic-json.d.ts +1 -1
  315. package/dist/frontend/ts7/semantic-json.js +1 -1
  316. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  317. package/dist/frontend/ts7/world-check.js +1 -1
  318. package/dist/frontend/tsc-codes.js +2 -2
  319. package/dist/frontend/tsc-codes.js.map +1 -1
  320. package/dist/frontend/type-mapper.d.ts +16 -1
  321. package/dist/frontend/type-mapper.js +143 -18
  322. package/dist/frontend/type-mapper.js.map +1 -1
  323. package/dist/index.js +5 -4
  324. package/dist/index.js.map +1 -1
  325. package/dist/ir/analysis.d.ts +12 -6
  326. package/dist/ir/analysis.js +26 -10
  327. package/dist/ir/analysis.js.map +1 -1
  328. package/dist/ir/analysis.test.js +15 -3
  329. package/dist/ir/analysis.test.js.map +1 -1
  330. package/dist/ir/builtin-effects.js +79 -0
  331. package/dist/ir/builtin-effects.js.map +1 -1
  332. package/dist/ir/builtin-signatures.d.ts +1 -1
  333. package/dist/ir/builtin-signatures.js +291 -38
  334. package/dist/ir/builtin-signatures.js.map +1 -1
  335. package/dist/ir/int32-slots.js +1 -0
  336. package/dist/ir/int32-slots.js.map +1 -1
  337. package/dist/ir/ir.d.ts +64 -16
  338. package/dist/ir/ir.js +37 -1
  339. package/dist/ir/ir.js.map +1 -1
  340. package/dist/ir/runtime-features.js +83 -6
  341. package/dist/ir/runtime-features.js.map +1 -1
  342. package/dist/ir/serialize.js +1 -1
  343. package/dist/ir/serialize.js.map +1 -1
  344. package/dist/ir/traverse.js +1 -0
  345. package/dist/ir/traverse.js.map +1 -1
  346. package/dist/ir/validate.js +100 -9
  347. package/dist/ir/validate.js.map +1 -1
  348. package/dist/ir/validate.test.js +60 -0
  349. package/dist/ir/validate.test.js.map +1 -1
  350. package/dist/library/fence-eval.d.ts +1 -1
  351. package/dist/library/fence-eval.js +5 -4
  352. package/dist/library/fence-eval.js.map +1 -1
  353. package/dist/library/ir-policy.js +10 -4
  354. package/dist/library/ir-policy.js.map +1 -1
  355. package/dist/library/library-profile.js +13 -13
  356. package/dist/library/library-profile.js.map +1 -1
  357. package/dist/library/prepare.js +1 -1
  358. package/dist/library/prepare.js.map +1 -1
  359. package/dist/library/sidecar.js +3 -3
  360. package/dist/library/sidecar.js.map +1 -1
  361. package/dist/native/prepare.js +3 -2
  362. package/dist/native/prepare.js.map +1 -1
  363. package/package.json +20 -20
  364. package/surface-manifest.json +379 -142
@@ -0,0 +1,134 @@
1
+ /* Inline scalar-union fields. A record or class field typed as a scalar
2
+ * union (every arm a number, a boolean or a unit value, such as
3
+ * `number | undefined`) stores its tag and payload bits in the object itself
4
+ * instead of pointing at a `%ScrUnion` box. The slot owns nothing: building
5
+ * such an object allocates no per-field box, and retain, release, trace and
6
+ * teardown skip the field. An optional property's ABSENT state is the
7
+ * undefined arm's tag with ABSENT_FIELD_PAYLOAD bits, the same bits as the
8
+ * absent sentinel.
9
+ *
10
+ * Consumers that need a union value read the pair into a private stack box
11
+ * (projections and helper walkers, which only borrow) or a fresh heap box
12
+ * (owned values). Stores copy the tag and bits of any union value. */
13
+ import { isUnitType } from "../../ir/ir.js";
14
+ /** The in-struct type of an inline field: tag, then the payload bits of
15
+ * the `%ScrUnion` box it replaces (the register pair of a scalar union
16
+ * result). */
17
+ export const INLINE_UNION_FIELD = "{ i32, i64 }";
18
+ /** Every arm is a number, a boolean or a unit value. */
19
+ export function isScalarUnionDef(def) {
20
+ return (def !== undefined &&
21
+ def.arms.every((arm) => arm.kind === "f64" || arm.kind === "bool" || isUnitType(arm)));
22
+ }
23
+ /** Which struct fields store their union inline. Record fields qualify by
24
+ * type alone. Class fields qualify the same way unless the hierarchy's root
25
+ * is a runtime class (its C layout and helpers own the slots) or the field
26
+ * is internal ('%'-prefixed): the decision depends only on what a subclass
27
+ * shares with its bases, so inherited fields keep one layout. */
28
+ export class InlineUnionFields {
29
+ unions;
30
+ cache = new Map();
31
+ classes = new Map();
32
+ constructor(unions, classes = []) {
33
+ this.unions = unions;
34
+ for (const cls of classes)
35
+ this.classes.set(cls.name, cls);
36
+ }
37
+ /** A class field stores its scalar union inline. */
38
+ classField(className, field) {
39
+ let cls = this.classes.get(className);
40
+ if (!cls || field.startsWith("%"))
41
+ return false;
42
+ const type = cls.fields.find((f) => f.name === field)?.type;
43
+ if (!type || !this.record(type))
44
+ return false;
45
+ while (cls.base !== undefined) {
46
+ const base = this.classes.get(cls.base);
47
+ if (!base)
48
+ return false;
49
+ cls = base;
50
+ }
51
+ return cls.runtime !== true;
52
+ }
53
+ /** A record field of this type stores its tag and bits inline. */
54
+ record(type) {
55
+ if (type.kind !== "union")
56
+ return false;
57
+ let inline = this.cache.get(type.unionId);
58
+ if (inline === undefined) {
59
+ inline = isScalarUnionDef(this.unions.get(type.unionId));
60
+ this.cache.set(type.unionId, inline);
61
+ }
62
+ return inline;
63
+ }
64
+ }
65
+ /** The tag and payload bits of an inline field slot. */
66
+ export function loadInlineUnion(B, slot) {
67
+ const tagPtr = B.tmp(), bitsPtr = B.tmp(), tag = B.tmp(), bits = B.tmp();
68
+ B.line(`${tagPtr} = getelementptr inbounds ${INLINE_UNION_FIELD}, ptr ${slot}, i32 0, i32 0`);
69
+ B.line(`${tag} = load i32, ptr ${tagPtr}`);
70
+ B.line(`${bitsPtr} = getelementptr inbounds ${INLINE_UNION_FIELD}, ptr ${slot}, i32 0, i32 1`);
71
+ B.line(`${bits} = load i64, ptr ${bitsPtr}`);
72
+ return { tag, bits };
73
+ }
74
+ export function storeInlineUnion(B, slot, tag, bits) {
75
+ const tagPtr = B.tmp(), bitsPtr = B.tmp();
76
+ B.line(`${tagPtr} = getelementptr inbounds ${INLINE_UNION_FIELD}, ptr ${slot}, i32 0, i32 0`);
77
+ B.line(`store i32 ${tag}, ptr ${tagPtr}`);
78
+ B.line(`${bitsPtr} = getelementptr inbounds ${INLINE_UNION_FIELD}, ptr ${slot}, i32 0, i32 1`);
79
+ B.line(`store i64 ${bits}, ptr ${bitsPtr}`);
80
+ }
81
+ /** The tag and payload bits of a `%ScrUnion` box. A NULL box (the dummy
82
+ * value of an expression that left a pending exception) reads `none`, the
83
+ * module's zeroed box; the pending check unwinds before anything observes
84
+ * it. */
85
+ export function unionBoxBits(B, box, none) {
86
+ const isNull = B.tmp(), source = B.tmp(), tagPtr = B.tmp(), bitsPtr = B.tmp(), tag = B.tmp(), bits = B.tmp();
87
+ B.line(`${isNull} = icmp eq ptr ${box}, null`);
88
+ B.line(`${source} = select i1 ${isNull}, ptr ${none}, ptr ${box}`);
89
+ B.line(`${tagPtr} = getelementptr inbounds %ScrUnion, ptr ${source}, i64 0, i32 1`);
90
+ B.line(`${tag} = load i32, ptr ${tagPtr}`);
91
+ B.line(`${bitsPtr} = getelementptr inbounds %ScrUnion, ptr ${source}, i64 0, i32 5`);
92
+ B.line(`${bits} = load i64, ptr ${bitsPtr}`);
93
+ return { tag, bits };
94
+ }
95
+ /** The bits of an ordinary union value read from a slot that may hold the
96
+ * ABSENT state: the undefined arm's payload is zero. */
97
+ export function presentBits(B, tag, bits, undefinedTag) {
98
+ if (undefinedTag < 0)
99
+ return bits;
100
+ const isUndef = B.tmp(), out = B.tmp();
101
+ B.line(`${isUndef} = icmp eq i32 ${tag}, ${undefinedTag}`);
102
+ B.line(`${out} = select i1 ${isUndef}, i64 0, i64 ${bits}`);
103
+ return out;
104
+ }
105
+ /** A private stack box holding `tag` and `bits`. It may only be borrowed:
106
+ * nothing may retain, release or store it. Its immortal count makes a
107
+ * stray retain or release a no-op. */
108
+ export function stackUnionBox(B, sizeType, tag, bits) {
109
+ const box = B.slot();
110
+ B.entryAllocas.push(`${box} = alloca %ScrUnion`);
111
+ const tagPtr = B.tmp(), bitsPtr = B.tmp();
112
+ B.line(`store ${sizeType} -1, ptr ${box}`);
113
+ B.line(`${tagPtr} = getelementptr inbounds %ScrUnion, ptr ${box}, i64 0, i32 1`);
114
+ B.line(`store i32 ${tag}, ptr ${tagPtr}`);
115
+ B.line(`${bitsPtr} = getelementptr inbounds %ScrUnion, ptr ${box}, i64 0, i32 5`);
116
+ B.line(`store i64 ${bits}, ptr ${bitsPtr}`);
117
+ return box;
118
+ }
119
+ /** Text-template form for helpers written as raw LLVM lines: copy the tag
120
+ * and bits of the non-NULL union box `box` into the inline slot `slot`,
121
+ * with temps named after `out`. */
122
+ export function inlineUnionCopyLines(box, slot, out) {
123
+ return [
124
+ ` ${out}.tp = getelementptr inbounds %ScrUnion, ptr ${box}, i64 0, i32 1`,
125
+ ` ${out}.tag = load i32, ptr ${out}.tp`,
126
+ ` ${out}.bp = getelementptr inbounds %ScrUnion, ptr ${box}, i64 0, i32 5`,
127
+ ` ${out}.bits = load i64, ptr ${out}.bp`,
128
+ ` ${out}.stp = getelementptr inbounds ${INLINE_UNION_FIELD}, ptr ${slot}, i32 0, i32 0`,
129
+ ` store i32 ${out}.tag, ptr ${out}.stp`,
130
+ ` ${out}.sbp = getelementptr inbounds ${INLINE_UNION_FIELD}, ptr ${slot}, i32 0, i32 1`,
131
+ ` store i64 ${out}.bits, ptr ${out}.sbp`,
132
+ ];
133
+ }
134
+ //# sourceMappingURL=inline-unions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline-unions.js","sourceRoot":"","sources":["../../../src/backend/llvm/inline-unions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,124 @@
1
+ import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { expect, test } from "vitest";
5
+ import { compile, deserializeModule } from "../../index.js";
6
+ import { validateModule } from "../../ir/validate.js";
7
+ import { emitLlvmModule } from "./emitter.js";
8
+ import { InlineUnionFields, isScalarUnionDef } from "./inline-unions.js";
9
+ async function moduleFor(source) {
10
+ const dir = await mkdtemp(join(tmpdir(), "scriptc-inline-unions-"));
11
+ try {
12
+ const entry = join(dir, "main.ts"), output = join(dir, "main.ir.json");
13
+ await writeFile(entry, source);
14
+ const result = await compile(entry, { outDir: dir, outPath: output, outputKind: "ir" });
15
+ if (!result.ok)
16
+ throw new Error(result.diagnostics.map((item) => `${item.code}: ${item.message}`).join("\n"));
17
+ const module = deserializeModule(await readFile(output, "utf8"));
18
+ expect(validateModule(module)).toEqual([]);
19
+ return module;
20
+ }
21
+ finally {
22
+ await rm(dir, { recursive: true, force: true });
23
+ }
24
+ }
25
+ /** The body of a source function: its borrowing or i32 entry when it has one. */
26
+ function body(ir, name) {
27
+ return new RegExp(`^define internal [^\\n]*@sc_b?f_${name}(?:\\.i32)?\\([^]*?^}`, "m").exec(ir)[0];
28
+ }
29
+ const SAMPLES = `
30
+ interface Sample { v: number | undefined; w: number | undefined; label: string }
31
+ const kept: Sample[] = [];
32
+ export function sum(a: number[]): number {
33
+ let s = 0;
34
+ for (let i = 0; i < a.length; i++) {
35
+ const v = a[i];
36
+ const w = a[i + 1];
37
+ const o = { v, w };
38
+ s += (o.v ?? 0) + (o.w ?? 0);
39
+ }
40
+ return s;
41
+ }
42
+ export function keep(a: number[], i: number): number {
43
+ const o: Sample = { v: a[i], w: undefined, label: "k" };
44
+ kept.push(o);
45
+ o.w = o.v;
46
+ return kept.length;
47
+ }
48
+ console.log(sum([1, 2, 3]), keep([4], 0), kept);
49
+ `;
50
+ test("scalar-union record fields store their tag and bits inline", async () => {
51
+ const mod = await moduleFor(SAMPLES);
52
+ const ir = emitLlvmModule(mod);
53
+ // Both shapes lay out each union field as a { tag, bits } pair.
54
+ expect(ir).toMatch(/%sc_rs_\w+ = type \{ i64, \{ i32, i64 \}, \{ i32, i64 \} \}/);
55
+ expect(ir).toMatch(/%sc_rs_\w+ = type \{ i64, ptr, \{ i32, i64 \}, \{ i32, i64 \} \}/);
56
+ // The projected record and its union locals build no union boxes; the
57
+ // record itself lives in frame storage.
58
+ const sum = body(ir, "sum");
59
+ expect(sum).not.toMatch(/@scr_union_new_/);
60
+ expect(sum).not.toMatch(/@sc_rnew_/);
61
+ expect(sum).not.toMatch(/@scr_union_(retain|release)/);
62
+ // A stored record still allocates, but its fields own nothing.
63
+ const keep = body(ir, "keep");
64
+ expect(keep).toMatch(/call ptr @sc_rnew_/);
65
+ expect(keep).not.toMatch(/@scr_union_new_/);
66
+ const destroy = /^define internal void @sc_rrelease_r\d+_destroy\([^]*?^}/m.exec(ir)?.[0] ?? "";
67
+ expect(destroy).not.toContain("scr_union_release");
68
+ });
69
+ const PROBES = `
70
+ class Probe {
71
+ x: number | undefined;
72
+ hit: boolean | undefined;
73
+ constructor(x: number | undefined) {
74
+ if (x !== undefined) this.x = x;
75
+ }
76
+ }
77
+ export function probe(a: number[]): number {
78
+ let s = 0;
79
+ for (let i = 0; i < a.length; i++) {
80
+ const p = new Probe(a[i + 1]);
81
+ s += (p.x ?? 0) + (p.hit === undefined ? 1 : 0);
82
+ }
83
+ return s;
84
+ }
85
+ console.log(probe([1, 2, 3]));
86
+ `;
87
+ test("class fields store inline and projected instances live in frame storage", async () => {
88
+ const ir = emitLlvmModule(await moduleFor(PROBES));
89
+ expect(ir).toMatch(/%sc_o_Probe = type \{ i64, \{ i32, i64 \}, \{ i32, i64 \} \}/);
90
+ const probe = body(ir, "probe");
91
+ expect(probe).toMatch(/alloca %sc_o_Probe, align 8/);
92
+ expect(probe).not.toMatch(/@sc_new_Probe/);
93
+ // The constructor argument is a stack copy, not a heap box.
94
+ expect(probe).not.toMatch(/@scr_union_new_/);
95
+ // Fields the constructor may leave unset start at the undefined tag.
96
+ expect(probe).toContain("store %sc_o_Probe zeroinitializer");
97
+ expect(probe).toMatch(/getelementptr inbounds %sc_o_Probe, ptr %\w+, i64 0, i32 2, i32 0/);
98
+ });
99
+ test("only unions of numbers, booleans and unit values store inline", () => {
100
+ const unions = new Map([
101
+ ["u0", { id: "u0", arms: [{ kind: "f64" }, { kind: "undefinedT" }] }],
102
+ ["u1", { id: "u1", arms: [{ kind: "bool" }, { kind: "nullT" }] }],
103
+ [
104
+ "u2",
105
+ {
106
+ id: "u2",
107
+ arms: [
108
+ { kind: "f64" },
109
+ { kind: "bool" },
110
+ { kind: "undefinedT" },
111
+ ],
112
+ },
113
+ ],
114
+ ["u3", { id: "u3", arms: [{ kind: "string" }, { kind: "undefinedT" }] }],
115
+ ]);
116
+ const inline = new InlineUnionFields(unions);
117
+ expect(inline.record({ kind: "union", unionId: "u0" })).toBe(true);
118
+ expect(inline.record({ kind: "union", unionId: "u1" })).toBe(true);
119
+ expect(inline.record({ kind: "union", unionId: "u2" })).toBe(true);
120
+ expect(inline.record({ kind: "union", unionId: "u3" })).toBe(false);
121
+ expect(inline.record({ kind: "f64" })).toBe(false);
122
+ expect(isScalarUnionDef(undefined)).toBe(false);
123
+ });
124
+ //# sourceMappingURL=inline-unions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline-unions.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/inline-unions.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type IrExpr } from "../../ir/ir.js";
1
2
  import type { LlValue, LlvmEmitterContext } from "./expr-context.js";
2
3
  import { type LlInteger } from "./integer-values.js";
3
4
  /** Integer proofs exclude negative zero and stay inside the exact-number
@@ -7,12 +8,34 @@ import { type LlInteger } from "./integer-values.js";
7
8
  export declare function emitSignedIntegerRemainder(host: LlvmEmitterContext, left: LlValue, dividend: LlInteger, divisor: LlInteger): LlValue | null;
8
9
  /** JS `%` with an inline integer path for operands that are not both
9
10
  * proven integers with a nonzero divisor. At run time the dividend must be
10
- * an integer of magnitude <= 2^53 and the divisor a nonzero integer; then
11
+ * an integer from -2^62 up to but not including 2^62 and the divisor a
12
+ * nonzero integer; then
11
13
  * i64 `srem` is exact (no INT64_MIN / -1 overflow is possible), takes the
12
14
  * dividend's sign like JS, and an exact zero takes the dividend's sign
13
- * (`-4 % 2` and `-0 % 3` are -0). A divisor that passes the round trip
14
- * with magnitude above 2^53 exceeds the dividend's, so `srem` returns the
15
- * dividend exactly as JS does. Everything else (fractions, NaN, ±Infinity,
16
- * zero divisors, huge dividends) takes the floating remainder, unchanged.
15
+ * (`-4 % 2` and `-0 % 3` are -0). The remainder of two doubles is itself a
16
+ * double, so its conversion back is exact, including for dividends above
17
+ * 2^53 (every double there is an integer). A divisor that passes the round
18
+ * trip with magnitude above 2^62 exceeds the dividend's, so `srem` returns
19
+ * the dividend exactly as JS does. Everything else (fractions, NaN,
20
+ * ±Infinity, zero divisors, huge dividends) takes the floating remainder,
21
+ * unchanged.
17
22
  * Returns null when the divisor is the constant zero (always NaN). */
18
23
  export declare function emitCheckedRemainder(host: LlvmEmitterContext, left: LlValue, right: LlValue, dividend: LlInteger | null, divisor: LlInteger | null): LlValue | null;
24
+ /** The value of a divisor known at compile time: a number literal, its
25
+ * negation, `2 ** k` for an integer literal k from 0 to 1023 (exactly 2^k),
26
+ * or an integer whose proven range is a single value. */
27
+ export declare function constantDivisor(expr: IrExpr, integer: LlInteger | null): number | null;
28
+ /** JS `%` by a constant divisor whose magnitude c is a power of two of at
29
+ * least 1, as `x - trunc(x / c) * c`, which is exact for every double x.
30
+ * When |x| < c the quotient's magnitude is below 1 and truncates to zero,
31
+ * so the result is x. Otherwise x / c is a normal double and exact, and
32
+ * the truncated quotient times c is a multiple of c of magnitude at most
33
+ * |x|, also exact. When c is below x's ulp, x is itself a multiple of c and
34
+ * the difference is zero; otherwise both terms are multiples of x's ulp and
35
+ * the difference, smaller than c, is exact. ±Infinity gives the default
36
+ * NaN of `Infinity - Infinity`, the NaN fmod also returns for it, and a NaN
37
+ * dividend propagates. A zero difference takes the dividend's sign
38
+ * (`-4 % 2` and `-0 % 1` are -0). The divisor's sign does not change the
39
+ * result. Returns null for any other divisor; a power of two below 1 keeps
40
+ * frem, because x / c can overflow. */
41
+ export declare function emitPowerOfTwoRemainder(host: LlvmEmitterContext, left: LlValue, divisor: number): LlValue | null;
@@ -1,6 +1,7 @@
1
1
  import { F64 } from "../../ir/ir.js";
2
2
  import { f64Lit } from "./common.js";
3
3
  import { integerNumber, widenInteger } from "./integer-values.js";
4
+ import { emitTruncF64 } from "./trunc.js";
4
5
  /** Integer proofs exclude negative zero and stay inside the exact-number
5
6
  * range, so signed i64 division cannot overflow. A possibly zero divisor
6
7
  * keeps floating remainder. Negative multiples must still produce -0;
@@ -23,13 +24,15 @@ export function emitSignedIntegerRemainder(host, left, dividend, divisor) {
23
24
  B.line(`${result} = select i1 ${zero}, double ${signedZero}, double ${number}`);
24
25
  return { name: result, type: F64 };
25
26
  }
26
- const EXACT = 2 ** 53;
27
+ /** 2^62, the bound on dividends the inline integer path accepts, as an
28
+ * i64 literal (`String(2 ** 62)` rounds its digits). */
29
+ const DIVIDEND_LIMIT = "4611686018427387904";
27
30
  /** Convert an unproven double to a candidate i64. `freeze` keeps NaN and
28
31
  * out-of-range conversions from producing poison; the returned condition
29
32
  * is the exact round trip, so it rejects every non-integer. Integral
30
33
  * doubles inside the i64 range convert exactly; a passing value outside
31
34
  * it (|x| >= 2^63) can only pair with a frozen integer of magnitude above
32
- * 2^53. `-0` converts to 0 and passes. */
35
+ * 2^62. `-0` converts to 0 and passes. */
33
36
  function candidateInteger(host, value) {
34
37
  const B = host.B;
35
38
  const raw = B.tmp(), integer = B.tmp(), back = B.tmp(), exact = B.tmp();
@@ -41,13 +44,17 @@ function candidateInteger(host, value) {
41
44
  }
42
45
  /** JS `%` with an inline integer path for operands that are not both
43
46
  * proven integers with a nonzero divisor. At run time the dividend must be
44
- * an integer of magnitude <= 2^53 and the divisor a nonzero integer; then
47
+ * an integer from -2^62 up to but not including 2^62 and the divisor a
48
+ * nonzero integer; then
45
49
  * i64 `srem` is exact (no INT64_MIN / -1 overflow is possible), takes the
46
50
  * dividend's sign like JS, and an exact zero takes the dividend's sign
47
- * (`-4 % 2` and `-0 % 3` are -0). A divisor that passes the round trip
48
- * with magnitude above 2^53 exceeds the dividend's, so `srem` returns the
49
- * dividend exactly as JS does. Everything else (fractions, NaN, ±Infinity,
50
- * zero divisors, huge dividends) takes the floating remainder, unchanged.
51
+ * (`-4 % 2` and `-0 % 3` are -0). The remainder of two doubles is itself a
52
+ * double, so its conversion back is exact, including for dividends above
53
+ * 2^53 (every double there is an integer). A divisor that passes the round
54
+ * trip with magnitude above 2^62 exceeds the dividend's, so `srem` returns
55
+ * the dividend exactly as JS does. Everything else (fractions, NaN,
56
+ * ±Infinity, zero divisors, huge dividends) takes the floating remainder,
57
+ * unchanged.
51
58
  * Returns null when the divisor is the constant zero (always NaN). */
52
59
  export function emitCheckedRemainder(host, left, right, dividend, divisor) {
53
60
  if (divisor && divisor.range.min === 0 && divisor.range.max === 0)
@@ -60,8 +67,9 @@ export function emitCheckedRemainder(host, left, right, dividend, divisor) {
60
67
  else {
61
68
  const [integer, exact] = candidateInteger(host, left.name);
62
69
  const biased = B.tmp(), inRange = B.tmp();
63
- B.line(`${biased} = add i64 ${integer}, ${EXACT}`);
64
- B.line(`${inRange} = icmp ule i64 ${biased}, ${2 * EXACT}`);
70
+ // -2^62 <= integer < 2^62: the biased value is nonnegative.
71
+ B.line(`${biased} = add i64 ${integer}, ${DIVIDEND_LIMIT}`);
72
+ B.line(`${inRange} = icmp sge i64 ${biased}, 0`);
65
73
  conditions.push(exact, inRange);
66
74
  x = integer;
67
75
  }
@@ -114,4 +122,67 @@ export function emitCheckedRemainder(host, left, right, dividend, divisor) {
114
122
  B.line(`${result} = phi double [ ${fastValue}, %${fast} ], [ ${floating}, %${slow} ]`);
115
123
  return { name: result, type: F64 };
116
124
  }
125
+ /** The value of a divisor known at compile time: a number literal, its
126
+ * negation, `2 ** k` for an integer literal k from 0 to 1023 (exactly 2^k),
127
+ * or an integer whose proven range is a single value. */
128
+ export function constantDivisor(expr, integer) {
129
+ if (integer && integer.range.min === integer.range.max)
130
+ return integer.range.min;
131
+ if (expr.kind === "numLit")
132
+ return expr.value;
133
+ if (expr.kind === "unary" && expr.op === "-") {
134
+ const value = constantDivisor(expr.operand, null);
135
+ return value === null ? null : -value;
136
+ }
137
+ if (expr.kind === "bin" &&
138
+ expr.op === "**" &&
139
+ expr.left.kind === "numLit" &&
140
+ expr.left.value === 2 &&
141
+ expr.right.kind === "numLit" &&
142
+ Number.isInteger(expr.right.value) &&
143
+ expr.right.value >= 0 &&
144
+ expr.right.value <= 1023)
145
+ return 2 ** expr.right.value;
146
+ return null;
147
+ }
148
+ /** Whether `value` is a power of two of at least 1. */
149
+ function isPowerOfTwo(value) {
150
+ if (!Number.isFinite(value) || value < 1)
151
+ return false;
152
+ let power = 1;
153
+ while (power < value)
154
+ power *= 2;
155
+ return power === value;
156
+ }
157
+ /** JS `%` by a constant divisor whose magnitude c is a power of two of at
158
+ * least 1, as `x - trunc(x / c) * c`, which is exact for every double x.
159
+ * When |x| < c the quotient's magnitude is below 1 and truncates to zero,
160
+ * so the result is x. Otherwise x / c is a normal double and exact, and
161
+ * the truncated quotient times c is a multiple of c of magnitude at most
162
+ * |x|, also exact. When c is below x's ulp, x is itself a multiple of c and
163
+ * the difference is zero; otherwise both terms are multiples of x's ulp and
164
+ * the difference, smaller than c, is exact. ±Infinity gives the default
165
+ * NaN of `Infinity - Infinity`, the NaN fmod also returns for it, and a NaN
166
+ * dividend propagates. A zero difference takes the dividend's sign
167
+ * (`-4 % 2` and `-0 % 1` are -0). The divisor's sign does not change the
168
+ * result. Returns null for any other divisor; a power of two below 1 keeps
169
+ * frem, because x / c can overflow. */
170
+ export function emitPowerOfTwoRemainder(host, left, divisor) {
171
+ const magnitude = Math.abs(divisor);
172
+ if (!isPowerOfTwo(magnitude))
173
+ return null;
174
+ const B = host.B;
175
+ const c = f64Lit(magnitude);
176
+ const quotient = B.tmp();
177
+ B.line(`${quotient} = fdiv double ${left.name}, ${c}`);
178
+ const whole = emitTruncF64(host, quotient);
179
+ const multiple = B.tmp(), difference = B.tmp(), zero = B.tmp(), signedZero = B.tmp(), result = B.tmp();
180
+ host.declare("declare double @llvm.copysign.f64(double, double)");
181
+ B.line(`${multiple} = fmul double ${whole}, ${c}`);
182
+ B.line(`${difference} = fsub double ${left.name}, ${multiple}`);
183
+ B.line(`${zero} = fcmp oeq double ${difference}, ${f64Lit(0)}`);
184
+ B.line(`${signedZero} = call double @llvm.copysign.f64(double ${f64Lit(0)}, double ${left.name})`);
185
+ B.line(`${result} = select i1 ${zero}, double ${signedZero}, double ${difference}`);
186
+ return { name: result, type: F64 };
187
+ }
117
188
  //# sourceMappingURL=integer-remainder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"integer-remainder.js","sourceRoot":"","sources":["../../../src/backend/llvm/integer-remainder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAErC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAkB,MAAM,qBAAqB,CAAC;AAElF;;;wDAGwD;AACxD,MAAM,UAAU,0BAA0B,CACxC,IAAwB,EACxB,IAAa,EACb,QAAmB,EACnB,OAAkB;IAElB,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACjB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,EAC1C,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,EACzC,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,eAAe,OAAO,KAAK,WAAW,EAAE,CAAC,CAAC;IAC7D,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QACzB,OAAO,aAAa,CAClB,IAAI,EACJ,SAAS,EACT;YACE,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,IAAI,CAAC,GAAG,CACX,QAAQ,CAAC,KAAK,CAAC,GAAG,EAClB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CACvE;SACF,EACD,GAAG,CACJ,CAAC;IACJ,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,EACpB,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,EACd,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,EACpB,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,iBAAiB,SAAS,YAAY,CAAC,CAAC;IACxD,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,kBAAkB,SAAS,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU,kBAAkB,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,gBAAgB,IAAI,YAAY,UAAU,YAAY,MAAM,EAAE,CAAC,CAAC;IAChF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;AAEtB;;;;;0CAK0C;AAC1C,SAAS,gBAAgB,CAAC,IAAwB,EAAE,KAAa;IAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACjB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,EACjB,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,EACjB,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,EACd,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAClB,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,oBAAoB,KAAK,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,iBAAiB,GAAG,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,iBAAiB,OAAO,YAAY,CAAC,CAAC;IACpD,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,sBAAsB,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;;;;sEASsE;AACtE,MAAM,UAAU,oBAAoB,CAClC,IAAwB,EACxB,IAAa,EACb,KAAc,EACd,QAA0B,EAC1B,OAAyB;IAEzB,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACjB,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,CAAS,CAAC;IACd,IAAI,QAAQ;QAAE,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;SAC1C,CAAC;QACJ,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,EACpB,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACpB,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,cAAc,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,mBAAmB,MAAM,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;QAC5D,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC,GAAG,OAAO,CAAC;IACd,CAAC;IACD,IAAI,CAAS,CAAC;IACd,IAAI,OAAO,EAAE,CAAC;QACZ,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACxB,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC3C,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACxB,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,kBAAkB,OAAO,KAAK,CAAC,CAAC;QACjD,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC,GAAG,OAAO,CAAC;IACd,CAAC;IACD,IAAI,EAAE,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAClB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACpC,EAAE,GAAG,CAAC,CAAC;IACT,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACzB,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,iCAAiC,EAAE,YAAY,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAChC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAC9B,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,EACvB,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,iBAAiB,SAAS,YAAY,CAAC,CAAC;IACxD,IAAI,SAAS,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,EAClB,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACvB,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACpB,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,kBAAkB,SAAS,KAAK,CAAC,CAAC;QAChD,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU,kBAAkB,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,gBAAgB,IAAI,YAAY,UAAU,YAAY,MAAM,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACX,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACzB,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,kBAAkB,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACX,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACvB,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,mBAAmB,SAAS,MAAM,IAAI,SAAS,QAAQ,MAAM,IAAI,IAAI,CAAC,CAAC;IACvF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"integer-remainder.js","sourceRoot":"","sources":["../../../src/backend/llvm/integer-remainder.ts"],"names":[],"mappings":"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"}