@salang/sa 0.1.3 → 0.1.4

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 (282) hide show
  1. package/bin/sa.js +13 -1
  2. package/package.json +8 -7
  3. package/sa_std/alloc/layout.sal +12 -0
  4. package/sa_std/alloc/prelude.sa +1 -0
  5. package/sa_std/alloc/prelude.sal +1 -0
  6. package/sa_std/alloc/string.sa +3 -0
  7. package/sa_std/alloc/vec.sa +684 -0
  8. package/sa_std/alloc/vec.sal +4 -0
  9. package/sa_std/any.sa +130 -0
  10. package/sa_std/any.sal +23 -0
  11. package/sa_std/array.sa +1876 -0
  12. package/sa_std/ascii.sa +2 -0
  13. package/sa_std/ascii.sal +1 -0
  14. package/sa_std/async.sla +116 -0
  15. package/sa_std/binary_heap.sa +3003 -0
  16. package/sa_std/binary_heap.sal +7 -0
  17. package/sa_std/borrow.sa +171 -0
  18. package/sa_std/borrow.sal +13 -0
  19. package/sa_std/btree_map.sa +2210 -0
  20. package/sa_std/btree_map.sal +11 -0
  21. package/sa_std/btree_set.sa +1072 -0
  22. package/sa_std/btree_set.sal +6 -0
  23. package/sa_std/char.sa +1309 -0
  24. package/sa_std/char.sal +50 -0
  25. package/sa_std/cmp.sa +554 -0
  26. package/sa_std/cmp.sal +14 -0
  27. package/sa_std/collections/binary_heap.sa +1 -0
  28. package/sa_std/collections/btree_map.sa +1 -0
  29. package/sa_std/collections/btree_set.sa +1 -0
  30. package/sa_std/collections/hashmap.sa +1 -0
  31. package/sa_std/collections/hashset.sa +1 -0
  32. package/sa_std/collections/linked_list.sa +1120 -0
  33. package/sa_std/collections/linked_list.sal +10 -0
  34. package/sa_std/collections/prelude.sa +7 -0
  35. package/sa_std/collections/prelude.sal +1 -0
  36. package/sa_std/collections/vec_deque.sa +1 -0
  37. package/sa_std/collections.sal +13 -0
  38. package/sa_std/convert.sa +1115 -0
  39. package/sa_std/convert.sal +24 -0
  40. package/sa_std/core/arc.sa +233 -0
  41. package/sa_std/core/arc.sal +4 -0
  42. package/sa_std/core/ascii.sa +784 -0
  43. package/sa_std/core/ascii.sal +34 -0
  44. package/sa_std/core/bit.sa +41 -0
  45. package/sa_std/core/box.sa +1 -0
  46. package/sa_std/core/box.sal +2 -0
  47. package/sa_std/core/cell.sa +108 -0
  48. package/sa_std/core/cell.sal +5 -0
  49. package/sa_std/core/cleanup.sa +26 -0
  50. package/sa_std/core/control.sa +20 -0
  51. package/sa_std/core/derive.sa +60 -0
  52. package/sa_std/core/derive.sal +1 -0
  53. package/sa_std/core/dispatch.sa +7 -0
  54. package/sa_std/core/dispatch.sal +5 -0
  55. package/sa_std/core/future.sa +777 -0
  56. package/sa_std/core/future.sal +73 -0
  57. package/sa_std/core/hash.sa +48 -0
  58. package/sa_std/core/iter.sa +2805 -0
  59. package/sa_std/core/iter.sal +4 -0
  60. package/sa_std/core/loop.sa +60 -0
  61. package/sa_std/core/mem.sa +220 -0
  62. package/sa_std/core/option.sa +825 -0
  63. package/sa_std/core/option.sal +11 -0
  64. package/sa_std/core/panic.sa +23 -0
  65. package/sa_std/core/panic.sal +12 -0
  66. package/sa_std/core/prelude.sa +18 -0
  67. package/sa_std/core/prelude.sal +18 -0
  68. package/sa_std/core/rc.sa +225 -0
  69. package/sa_std/core/rc.sal +4 -0
  70. package/sa_std/core/refcell.sa +283 -0
  71. package/sa_std/core/refcell.sal +13 -0
  72. package/sa_std/core/result.sa +708 -0
  73. package/sa_std/core/result.sal +6 -0
  74. package/sa_std/core/rust_patterns.sal +295 -0
  75. package/sa_std/core/sa_core.sa +84 -0
  76. package/sa_std/core/slice.sa +4021 -0
  77. package/sa_std/core/slice.sal +7 -0
  78. package/sa_std/core/task.sa +112 -0
  79. package/sa_std/core/task.sal +15 -0
  80. package/sa_std/core/trait_object.sa +26 -0
  81. package/sa_std/core/trait_object.sal +4 -0
  82. package/sa_std/core/waker.sa +289 -0
  83. package/sa_std/core/waker.sal +31 -0
  84. package/sa_std/core/weak.sa +2 -0
  85. package/sa_std/core/weak.sal +4 -0
  86. package/sa_std/cow.sa +3 -0
  87. package/sa_std/cow.sal +2 -0
  88. package/sa_std/cstring.sa +3 -0
  89. package/sa_std/cstring.sal +2 -0
  90. package/sa_std/default.sa +99 -0
  91. package/sa_std/duration.sa +3 -0
  92. package/sa_std/duration.sal +2 -0
  93. package/sa_std/encoding/json.sa +259 -0
  94. package/sa_std/encoding/json.sai +54 -0
  95. package/sa_std/encoding/json.sal +35 -0
  96. package/sa_std/encoding/prelude.sa +1 -0
  97. package/sa_std/encoding/prelude.sal +0 -0
  98. package/sa_std/env.sa +390 -0
  99. package/sa_std/env.sai +25 -0
  100. package/sa_std/error.sa +253 -0
  101. package/sa_std/error.sal +44 -0
  102. package/sa_std/ffi/cstring.sa +3 -0
  103. package/sa_std/ffi/cstring.sal +1 -0
  104. package/sa_std/ffi/prelude.sa +2 -0
  105. package/sa_std/ffi/prelude.sal +2 -0
  106. package/sa_std/ffi.sa +635 -0
  107. package/sa_std/ffi.sal +51 -0
  108. package/sa_std/fmt.sa +2 -0
  109. package/sa_std/fmt.sai +18 -0
  110. package/sa_std/fmt.sal +35 -0
  111. package/sa_std/fs.sa +1023 -0
  112. package/sa_std/fs.sai +127 -0
  113. package/sa_std/fs.sal +51 -0
  114. package/sa_std/future.sa +2 -0
  115. package/sa_std/future.sal +1 -0
  116. package/sa_std/hash.sa +1486 -0
  117. package/sa_std/hash.sal +13 -0
  118. package/sa_std/hashmap.sa +1962 -0
  119. package/sa_std/hashmap.sal +20 -0
  120. package/sa_std/hashset.sa +1004 -0
  121. package/sa_std/hashset.sal +18 -0
  122. package/sa_std/http2.sa +78 -0
  123. package/sa_std/http2.sai +26 -0
  124. package/sa_std/http2.sal +36 -0
  125. package/sa_std/instant.sa +3 -0
  126. package/sa_std/instant.sal +2 -0
  127. package/sa_std/io/buf_reader.sa +43 -0
  128. package/sa_std/io/buf_writer.sa +35 -0
  129. package/sa_std/io/bufio.sa +4 -0
  130. package/sa_std/io/bufio.sal +4 -0
  131. package/sa_std/io/prelude.sa +1 -0
  132. package/sa_std/io/prelude.sal +1 -0
  133. package/sa_std/io/print.sa +2 -0
  134. package/sa_std/io/print.sai +3 -0
  135. package/sa_std/io.sa +925 -0
  136. package/sa_std/io.sai +25 -0
  137. package/sa_std/io.sal +84 -0
  138. package/sa_std/iter.sa +2 -0
  139. package/sa_std/iter.sal +1 -0
  140. package/sa_std/join_handle.sa +3 -0
  141. package/sa_std/join_handle.sal +2 -0
  142. package/sa_std/libsa_async.sa +80 -0
  143. package/sa_std/m_async.sa +137 -0
  144. package/sa_std/m_async.sal +30 -0
  145. package/sa_std/m_async.sla +2 -0
  146. package/sa_std/manually_drop.sa +3 -0
  147. package/sa_std/manually_drop.sal +2 -0
  148. package/sa_std/marker/phantom_data.sa +3 -0
  149. package/sa_std/marker/phantom_data.sal +1 -0
  150. package/sa_std/marker/prelude.sa +4 -0
  151. package/sa_std/marker/prelude.sal +4 -0
  152. package/sa_std/marker.sa +220 -0
  153. package/sa_std/marker.sal +15 -0
  154. package/sa_std/math.sa +84 -0
  155. package/sa_std/math.sai +10 -0
  156. package/sa_std/mem/manually_drop.sa +3 -0
  157. package/sa_std/mem/manually_drop.sal +1 -0
  158. package/sa_std/mem/prelude.sa +2 -0
  159. package/sa_std/mem/prelude.sal +2 -0
  160. package/sa_std/mem.sa +564 -0
  161. package/sa_std/mem.sal +40 -0
  162. package/sa_std/modstate.sai +19 -0
  163. package/sa_std/net.sa +4227 -0
  164. package/sa_std/net.sai +239 -0
  165. package/sa_std/net.sal +159 -0
  166. package/sa_std/netx.sa +85 -0
  167. package/sa_std/netx.sai +11 -0
  168. package/sa_std/netx.sal +39 -0
  169. package/sa_std/nonzero.sa +3 -0
  170. package/sa_std/nonzero.sal +2 -0
  171. package/sa_std/num/nonzero.sa +3 -0
  172. package/sa_std/num/nonzero.sal +1 -0
  173. package/sa_std/num/prelude.sa +3 -0
  174. package/sa_std/num/prelude.sal +3 -0
  175. package/sa_std/num.sa +17302 -0
  176. package/sa_std/num.sai +11 -0
  177. package/sa_std/num.sal +341 -0
  178. package/sa_std/ops.sa +1884 -0
  179. package/sa_std/ops.sal +68 -0
  180. package/sa_std/option.sa +2 -0
  181. package/sa_std/option.sal +1 -0
  182. package/sa_std/os/fd.sa +96 -0
  183. package/sa_std/os/fd.sai +7 -0
  184. package/sa_std/os/fd.sal +11 -0
  185. package/sa_std/os/prelude.sa +2 -0
  186. package/sa_std/os/prelude.sal +1 -0
  187. package/sa_std/os/unix_ffi.sa +271 -0
  188. package/sa_std/panic.sa +1 -0
  189. package/sa_std/panic.sal +1 -0
  190. package/sa_std/path.sa +3170 -0
  191. package/sa_std/path.sal +12 -0
  192. package/sa_std/phantom_data.sa +3 -0
  193. package/sa_std/phantom_data.sal +2 -0
  194. package/sa_std/pin.sa +79 -0
  195. package/sa_std/pin.sal +5 -0
  196. package/sa_std/plugin_async.sa +90 -0
  197. package/sa_std/plugin_async.sal +29 -0
  198. package/sa_std/plugin_async.sla +4 -0
  199. package/sa_std/plugin_http_async.sa +46 -0
  200. package/sa_std/plugin_http_server.sa +61 -0
  201. package/sa_std/plugin_http_server.sla +2 -0
  202. package/sa_std/plugin_sqlite.sa +106 -0
  203. package/sa_std/plugin_sqlite.sla +2 -0
  204. package/sa_std/prelude.sa +60 -0
  205. package/sa_std/prelude.sal +55 -0
  206. package/sa_std/process.sa +916 -0
  207. package/sa_std/process.sai +57 -0
  208. package/sa_std/process.sal +27 -0
  209. package/sa_std/ptr.sa +503 -0
  210. package/sa_std/ptr.sal +2 -0
  211. package/sa_std/result.sa +2 -0
  212. package/sa_std/result.sal +1 -0
  213. package/sa_std/rust_core.sa +51 -0
  214. package/sa_std/rust_core.sal +26 -0
  215. package/sa_std/sa.mod +7 -0
  216. package/sa_std/sort.sa +156 -0
  217. package/sa_std/str.sla +13 -0
  218. package/sa_std/string.sa +12240 -0
  219. package/sa_std/string.sai +25 -0
  220. package/sa_std/string.sal +17 -0
  221. package/sa_std/string_format.sa +269 -0
  222. package/sa_std/sync/atomic.sa +1500 -0
  223. package/sa_std/sync/atomic.sal +45 -0
  224. package/sa_std/sync/barrier.sa +105 -0
  225. package/sa_std/sync/barrier.sal +7 -0
  226. package/sa_std/sync/condvar.sa +240 -0
  227. package/sa_std/sync/condvar.sal +4 -0
  228. package/sa_std/sync/mpsc.sa +758 -0
  229. package/sa_std/sync/mpsc.sal +42 -0
  230. package/sa_std/sync/mpsc_list.sa +255 -0
  231. package/sa_std/sync/mpsc_list.sal +3 -0
  232. package/sa_std/sync/mutex.sa +182 -0
  233. package/sa_std/sync/mutex.sal +7 -0
  234. package/sa_std/sync/once.sa +371 -0
  235. package/sa_std/sync/once.sal +31 -0
  236. package/sa_std/sync/poison.sa +36 -0
  237. package/sa_std/sync/poison.sal +11 -0
  238. package/sa_std/sync/prelude.sa +8 -0
  239. package/sa_std/sync/prelude.sal +7 -0
  240. package/sa_std/sync/rwlock.sa +369 -0
  241. package/sa_std/sync/rwlock.sal +13 -0
  242. package/sa_std/task.sa +2 -0
  243. package/sa_std/task.sal +1 -0
  244. package/sa_std/term.sa +2 -0
  245. package/sa_std/term.sai +10 -0
  246. package/sa_std/term.sal +33 -0
  247. package/sa_std/testing/assert.sai +4 -0
  248. package/sa_std/testing/mock_io.sa +174 -0
  249. package/sa_std/testing/mock_io.sal +5 -0
  250. package/sa_std/testing/prelude.sa +2 -0
  251. package/sa_std/testing/prelude.sal +1 -0
  252. package/sa_std/text/prelude.sa +1 -0
  253. package/sa_std/text/prelude.sal +1 -0
  254. package/sa_std/text/regex.sa +2 -0
  255. package/sa_std/text/regex.sai +9 -0
  256. package/sa_std/text/regex.sal +33 -0
  257. package/sa_std/thread/join_handle.sa +3 -0
  258. package/sa_std/thread/join_handle.sal +1 -0
  259. package/sa_std/thread/prelude.sa +4 -0
  260. package/sa_std/thread/prelude.sal +3 -0
  261. package/sa_std/thread.sa +160 -0
  262. package/sa_std/thread.sai +11 -0
  263. package/sa_std/thread.sal +4 -0
  264. package/sa_std/thread_local.sa +45 -0
  265. package/sa_std/thread_local.sai +9 -0
  266. package/sa_std/time/duration.sa +3 -0
  267. package/sa_std/time/duration.sal +1 -0
  268. package/sa_std/time/instant.sa +3 -0
  269. package/sa_std/time/instant.sal +1 -0
  270. package/sa_std/time/prelude.sa +4 -0
  271. package/sa_std/time/prelude.sal +4 -0
  272. package/sa_std/time.sa +850 -0
  273. package/sa_std/time.sai +37 -0
  274. package/sa_std/time.sal +35 -0
  275. package/sa_std/time.sla +67 -0
  276. package/sa_std/tls_client.sai +39 -0
  277. package/sa_std/vec.sa +5754 -0
  278. package/sa_std/vec.sal +1 -0
  279. package/sa_std/vec_deque.sa +4925 -0
  280. package/sa_std/vec_deque.sal +8 -0
  281. package/sa_std/vec_runtime_macros.sa +11 -0
  282. package/sa_std/ws_client.sai +57 -0
package/sa_std/time.sa ADDED
@@ -0,0 +1,850 @@
1
+ @import "time.sal"
2
+ @import "time.sai"
3
+ @import "hash.sa"
4
+
5
+ [MACRO] TIME_NOW_NS %out_ns
6
+ %out_ns = call @sa_time_instant_ns()
7
+ [END_MACRO]
8
+
9
+ [MACRO] TIME_NOW_UNIX_S %out_secs
10
+ %out_secs = call @sa_time_unix_s()
11
+ [END_MACRO]
12
+
13
+ [MACRO] TIME_NOW_UNIX_MS %out_ms
14
+ %out_ms = call @sa_time_unix_ms()
15
+ [END_MACRO]
16
+
17
+ [MACRO] TIME_NOW_UNIX_NS %out_ns
18
+ %out_ns = call @sa_time_unix_ns()
19
+ [END_MACRO]
20
+
21
+ [MACRO] TIME_UTC_NOW %out_date
22
+ __time_utc_status = call @sa_time_utc_now(&%out_date)
23
+ !__time_utc_status
24
+ [END_MACRO]
25
+
26
+ [MACRO] TIME_SLEEP_NS %ns
27
+ __time_sleep_status = call @sa_time_sleep_ns(%ns)
28
+ !__time_sleep_status
29
+ [END_MACRO]
30
+
31
+ [MACRO] TIME_SLEEP_MS %ms
32
+ __time_sleep_ms_status = call @sa_time_sleep_ms(%ms)
33
+ !__time_sleep_ms_status
34
+ [END_MACRO]
35
+
36
+ [MACRO] TIME_THREAD_SLEEP_NS %ns
37
+ __time_thread_sleep_status = call @sa_time_sleep_ns(%ns)
38
+ !__time_thread_sleep_status
39
+ [END_MACRO]
40
+
41
+ [MACRO] TIME_DURATION_FROM_MS %out_ns, %ms
42
+ %out_ns = mul %ms, Time_NS_PER_MS
43
+ [END_MACRO]
44
+
45
+ [MACRO] TIME_DURATION_FROM_US %out_ns, %us
46
+ %out_ns = mul %us, Time_NS_PER_US
47
+ [END_MACRO]
48
+
49
+ [MACRO] TIME_DURATION_FROM_S %out_ns, %secs
50
+ %out_ns = mul %secs, Time_NS_PER_S
51
+ [END_MACRO]
52
+
53
+ [MACRO] TIME_DURATION_FROM_NS %out_ns, %ns
54
+ %out_ns = add %ns, 0
55
+ [END_MACRO]
56
+
57
+ [MACRO] TIME_DURATION_NEW %out_ns, %secs, %nanos
58
+ __time_new_secs_ns_%out_ns = mul %secs, Time_NS_PER_S
59
+ %out_ns = add __time_new_secs_ns_%out_ns, %nanos
60
+ !__time_new_secs_ns_%out_ns
61
+ [END_MACRO]
62
+
63
+ [MACRO] TIME_DURATION_FROM_SECS %out_ns, %secs
64
+ EXPAND TIME_DURATION_FROM_S %out_ns, %secs
65
+ [END_MACRO]
66
+
67
+ [MACRO] TIME_DURATION_FROM_MILLIS %out_ns, %millis
68
+ EXPAND TIME_DURATION_FROM_MS %out_ns, %millis
69
+ [END_MACRO]
70
+
71
+ [MACRO] TIME_DURATION_FROM_MICROS %out_ns, %micros
72
+ EXPAND TIME_DURATION_FROM_US %out_ns, %micros
73
+ [END_MACRO]
74
+
75
+ [MACRO] TIME_DURATION_FROM_NANOS %out_ns, %nanos
76
+ EXPAND TIME_DURATION_FROM_NS %out_ns, %nanos
77
+ [END_MACRO]
78
+
79
+ [MACRO] TIME_DURATION_FROM_MINS %out_ns, %mins
80
+ __time_mins_secs_%out_ns = mul %mins, Time_S_PER_MIN
81
+ EXPAND TIME_DURATION_FROM_S %out_ns, __time_mins_secs_%out_ns
82
+ !__time_mins_secs_%out_ns
83
+ [END_MACRO]
84
+
85
+ [MACRO] TIME_DURATION_FROM_HOURS %out_ns, %hours
86
+ __time_hours_secs_%out_ns = mul %hours, Time_S_PER_HOUR
87
+ EXPAND TIME_DURATION_FROM_S %out_ns, __time_hours_secs_%out_ns
88
+ !__time_hours_secs_%out_ns
89
+ [END_MACRO]
90
+
91
+ [MACRO] TIME_DURATION_FROM_DAYS %out_ns, %days
92
+ __time_days_secs_%out_ns = mul %days, Time_S_PER_DAY
93
+ EXPAND TIME_DURATION_FROM_S %out_ns, __time_days_secs_%out_ns
94
+ !__time_days_secs_%out_ns
95
+ [END_MACRO]
96
+
97
+ [MACRO] TIME_DURATION_FROM_WEEKS %out_ns, %weeks
98
+ __time_weeks_secs_%out_ns = mul %weeks, Time_S_PER_WEEK
99
+ EXPAND TIME_DURATION_FROM_S %out_ns, __time_weeks_secs_%out_ns
100
+ !__time_weeks_secs_%out_ns
101
+ [END_MACRO]
102
+
103
+ [MACRO] TIME_DURATION_CHECKED_FROM_NANOS %out_ok, %out_ns, %nanos
104
+ %out_ns = add %nanos, 0
105
+ %out_ok = add 0, 1
106
+ [END_MACRO]
107
+
108
+ [MACRO] TIME_DURATION_CHECKED_FROM_SECS %out_ok, %out_ns, %secs
109
+ EXPAND TIME_CHECKED_MUL_NS %out_ok, %out_ns, %secs, Time_NS_PER_S
110
+ [END_MACRO]
111
+
112
+ [MACRO] TIME_DURATION_CHECKED_FROM_MILLIS %out_ok, %out_ns, %millis
113
+ EXPAND TIME_CHECKED_MUL_NS %out_ok, %out_ns, %millis, Time_NS_PER_MS
114
+ [END_MACRO]
115
+
116
+ [MACRO] TIME_DURATION_CHECKED_FROM_MICROS %out_ok, %out_ns, %micros
117
+ EXPAND TIME_CHECKED_MUL_NS %out_ok, %out_ns, %micros, Time_NS_PER_US
118
+ [END_MACRO]
119
+
120
+ [MACRO] TIME_DURATION_CHECKED_FROM_MINS %out_ok, %out_ns, %mins
121
+ EXPAND TIME_CHECKED_MUL_NS __time_checked_mins_secs_ok_%out_ok, __time_checked_mins_secs_%out_ok, %mins, Time_S_PER_MIN
122
+ br __time_checked_mins_secs_ok_%out_ok -> L_TIME_CHECKED_FROM_MINS_SECS_OK_%out_ok, L_TIME_CHECKED_FROM_MINS_FAIL_%out_ok
123
+
124
+ L_TIME_CHECKED_FROM_MINS_SECS_OK_%out_ok:
125
+ EXPAND TIME_DURATION_CHECKED_FROM_SECS %out_ok, %out_ns, __time_checked_mins_secs_%out_ok
126
+ !__time_checked_mins_secs_%out_ok
127
+ !__time_checked_mins_secs_ok_%out_ok
128
+ jmp L_TIME_CHECKED_FROM_MINS_END_%out_ok
129
+
130
+ L_TIME_CHECKED_FROM_MINS_FAIL_%out_ok:
131
+ %out_ns = add 0, 0
132
+ %out_ok = add 0, 0
133
+ !__time_checked_mins_secs_%out_ok
134
+ !__time_checked_mins_secs_ok_%out_ok
135
+
136
+ L_TIME_CHECKED_FROM_MINS_END_%out_ok:
137
+ [END_MACRO]
138
+
139
+ [MACRO] TIME_DURATION_CHECKED_FROM_HOURS %out_ok, %out_ns, %hours
140
+ EXPAND TIME_CHECKED_MUL_NS __time_checked_hours_secs_ok_%out_ok, __time_checked_hours_secs_%out_ok, %hours, Time_S_PER_HOUR
141
+ br __time_checked_hours_secs_ok_%out_ok -> L_TIME_CHECKED_FROM_HOURS_SECS_OK_%out_ok, L_TIME_CHECKED_FROM_HOURS_FAIL_%out_ok
142
+
143
+ L_TIME_CHECKED_FROM_HOURS_SECS_OK_%out_ok:
144
+ EXPAND TIME_DURATION_CHECKED_FROM_SECS %out_ok, %out_ns, __time_checked_hours_secs_%out_ok
145
+ !__time_checked_hours_secs_%out_ok
146
+ !__time_checked_hours_secs_ok_%out_ok
147
+ jmp L_TIME_CHECKED_FROM_HOURS_END_%out_ok
148
+
149
+ L_TIME_CHECKED_FROM_HOURS_FAIL_%out_ok:
150
+ %out_ns = add 0, 0
151
+ %out_ok = add 0, 0
152
+ !__time_checked_hours_secs_%out_ok
153
+ !__time_checked_hours_secs_ok_%out_ok
154
+
155
+ L_TIME_CHECKED_FROM_HOURS_END_%out_ok:
156
+ [END_MACRO]
157
+
158
+ [MACRO] TIME_DURATION_CHECKED_FROM_DAYS %out_ok, %out_ns, %days
159
+ EXPAND TIME_CHECKED_MUL_NS __time_checked_days_secs_ok_%out_ok, __time_checked_days_secs_%out_ok, %days, Time_S_PER_DAY
160
+ br __time_checked_days_secs_ok_%out_ok -> L_TIME_CHECKED_FROM_DAYS_SECS_OK_%out_ok, L_TIME_CHECKED_FROM_DAYS_FAIL_%out_ok
161
+
162
+ L_TIME_CHECKED_FROM_DAYS_SECS_OK_%out_ok:
163
+ EXPAND TIME_DURATION_CHECKED_FROM_SECS %out_ok, %out_ns, __time_checked_days_secs_%out_ok
164
+ !__time_checked_days_secs_%out_ok
165
+ !__time_checked_days_secs_ok_%out_ok
166
+ jmp L_TIME_CHECKED_FROM_DAYS_END_%out_ok
167
+
168
+ L_TIME_CHECKED_FROM_DAYS_FAIL_%out_ok:
169
+ %out_ns = add 0, 0
170
+ %out_ok = add 0, 0
171
+ !__time_checked_days_secs_%out_ok
172
+ !__time_checked_days_secs_ok_%out_ok
173
+
174
+ L_TIME_CHECKED_FROM_DAYS_END_%out_ok:
175
+ [END_MACRO]
176
+
177
+ [MACRO] TIME_DURATION_CHECKED_FROM_WEEKS %out_ok, %out_ns, %weeks
178
+ EXPAND TIME_CHECKED_MUL_NS __time_checked_weeks_secs_ok_%out_ok, __time_checked_weeks_secs_%out_ok, %weeks, Time_S_PER_WEEK
179
+ br __time_checked_weeks_secs_ok_%out_ok -> L_TIME_CHECKED_FROM_WEEKS_SECS_OK_%out_ok, L_TIME_CHECKED_FROM_WEEKS_FAIL_%out_ok
180
+
181
+ L_TIME_CHECKED_FROM_WEEKS_SECS_OK_%out_ok:
182
+ EXPAND TIME_DURATION_CHECKED_FROM_SECS %out_ok, %out_ns, __time_checked_weeks_secs_%out_ok
183
+ !__time_checked_weeks_secs_%out_ok
184
+ !__time_checked_weeks_secs_ok_%out_ok
185
+ jmp L_TIME_CHECKED_FROM_WEEKS_END_%out_ok
186
+
187
+ L_TIME_CHECKED_FROM_WEEKS_FAIL_%out_ok:
188
+ %out_ns = add 0, 0
189
+ %out_ok = add 0, 0
190
+ !__time_checked_weeks_secs_%out_ok
191
+ !__time_checked_weeks_secs_ok_%out_ok
192
+
193
+ L_TIME_CHECKED_FROM_WEEKS_END_%out_ok:
194
+ [END_MACRO]
195
+
196
+ [MACRO] TIME_DURATION_CHECKED_NEW %out_ok, %out_ns, %secs, %nanos
197
+ EXPAND TIME_DURATION_CHECKED_FROM_SECS __time_checked_new_secs_ok_%out_ok, __time_checked_new_secs_ns_%out_ok, %secs
198
+ br __time_checked_new_secs_ok_%out_ok -> L_TIME_CHECKED_NEW_SECS_OK_%out_ok, L_TIME_CHECKED_NEW_FAIL_%out_ok
199
+
200
+ L_TIME_CHECKED_NEW_SECS_OK_%out_ok:
201
+ EXPAND TIME_CHECKED_ADD_NS %out_ok, %out_ns, __time_checked_new_secs_ns_%out_ok, %nanos
202
+ !__time_checked_new_secs_ns_%out_ok
203
+ !__time_checked_new_secs_ok_%out_ok
204
+ jmp L_TIME_CHECKED_NEW_END_%out_ok
205
+
206
+ L_TIME_CHECKED_NEW_FAIL_%out_ok:
207
+ %out_ns = add 0, 0
208
+ %out_ok = add 0, 0
209
+ !__time_checked_new_secs_ns_%out_ok
210
+ !__time_checked_new_secs_ok_%out_ok
211
+
212
+ L_TIME_CHECKED_NEW_END_%out_ok:
213
+ [END_MACRO]
214
+
215
+ [MACRO] TIME_DURATION_ZERO %out_ns
216
+ %out_ns = add 0, 0
217
+ [END_MACRO]
218
+
219
+ [MACRO] TIME_DURATION_MAX %out_ns
220
+ %out_ns = sub 0, 1
221
+ [END_MACRO]
222
+
223
+ [MACRO] TIME_DURATION_IS_ZERO %out_bool, %duration_ns
224
+ %out_bool = eq %duration_ns, 0
225
+ [END_MACRO]
226
+
227
+ [MACRO] TIME_DURATION_AS_MS %out_ms, %ns
228
+ %out_ms = udiv %ns, Time_NS_PER_MS
229
+ [END_MACRO]
230
+
231
+ [MACRO] TIME_DURATION_AS_US %out_us, %ns
232
+ %out_us = udiv %ns, Time_NS_PER_US
233
+ [END_MACRO]
234
+
235
+ [MACRO] TIME_DURATION_AS_S %out_secs, %ns
236
+ %out_secs = udiv %ns, Time_NS_PER_S
237
+ [END_MACRO]
238
+
239
+ [MACRO] TIME_DURATION_AS_NS %out_ns, %duration_ns
240
+ %out_ns = add %duration_ns, 0
241
+ [END_MACRO]
242
+
243
+ [MACRO] TIME_DURATION_AS_SECS %out_secs, %duration_ns
244
+ EXPAND TIME_DURATION_AS_S %out_secs, %duration_ns
245
+ [END_MACRO]
246
+
247
+ [MACRO] TIME_DURATION_AS_MILLIS %out_ms, %duration_ns
248
+ EXPAND TIME_DURATION_AS_MS %out_ms, %duration_ns
249
+ [END_MACRO]
250
+
251
+ [MACRO] TIME_DURATION_AS_MICROS %out_us, %duration_ns
252
+ EXPAND TIME_DURATION_AS_US %out_us, %duration_ns
253
+ [END_MACRO]
254
+
255
+ [MACRO] TIME_DURATION_AS_NANOS %out_ns, %duration_ns
256
+ EXPAND TIME_DURATION_AS_NS %out_ns, %duration_ns
257
+ [END_MACRO]
258
+
259
+ [MACRO] DEFAULT_HASHER_WRITE_DURATION %hasher, %duration_ns
260
+ __time_duration_hash_secs_%hasher = udiv %duration_ns, Time_NS_PER_S
261
+ __time_duration_hash_nanos_%hasher = urem %duration_ns, Time_NS_PER_S
262
+ EXPAND DEFAULT_HASHER_WRITE_U64 %hasher, __time_duration_hash_secs_%hasher
263
+ EXPAND DEFAULT_HASHER_WRITE_U32 %hasher, __time_duration_hash_nanos_%hasher
264
+ !__time_duration_hash_nanos_%hasher
265
+ !__time_duration_hash_secs_%hasher
266
+ [END_MACRO]
267
+
268
+ [MACRO] TIME_DURATION_HASH %out_hash, %duration_ns
269
+ __time_duration_hash_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
270
+ EXPAND DEFAULT_HASHER_NEW __time_duration_hash_hasher_%out_hash
271
+ EXPAND DEFAULT_HASHER_WRITE_DURATION __time_duration_hash_hasher_%out_hash, %duration_ns
272
+ EXPAND DEFAULT_HASHER_FINISH %out_hash, __time_duration_hash_hasher_%out_hash
273
+ [END_MACRO]
274
+
275
+ [MACRO] BUILD_HASHER_DEFAULT_HASH_ONE_DURATION %out_hash, %builder, %duration_ns
276
+ __build_hash_one_duration_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
277
+ EXPAND BUILD_HASHER_DEFAULT_BUILD __build_hash_one_duration_hasher_%out_hash, %builder
278
+ EXPAND DEFAULT_HASHER_WRITE_DURATION __build_hash_one_duration_hasher_%out_hash, %duration_ns
279
+ EXPAND DEFAULT_HASHER_FINISH %out_hash, __build_hash_one_duration_hasher_%out_hash
280
+ [END_MACRO]
281
+
282
+ [MACRO] RANDOM_STATE_HASH_ONE_DURATION %out_hash, %state, %duration_ns
283
+ __random_state_hash_one_duration_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
284
+ EXPAND RANDOM_STATE_BUILD __random_state_hash_one_duration_hasher_%out_hash, %state
285
+ EXPAND DEFAULT_HASHER_WRITE_DURATION __random_state_hash_one_duration_hasher_%out_hash, %duration_ns
286
+ EXPAND DEFAULT_HASHER_FINISH %out_hash, __random_state_hash_one_duration_hasher_%out_hash
287
+ [END_MACRO]
288
+
289
+ [MACRO] DEFAULT_HASHER_WRITE_UNIX_TIMESPEC_NS %hasher, %time_ns
290
+ __time_timespec_hash_secs_%hasher = udiv %time_ns, Time_NS_PER_S
291
+ __time_timespec_hash_nanos_%hasher = urem %time_ns, Time_NS_PER_S
292
+ EXPAND DEFAULT_HASHER_WRITE_I64 %hasher, __time_timespec_hash_secs_%hasher
293
+ EXPAND DEFAULT_HASHER_WRITE_U32 %hasher, __time_timespec_hash_nanos_%hasher
294
+ !__time_timespec_hash_nanos_%hasher
295
+ !__time_timespec_hash_secs_%hasher
296
+ [END_MACRO]
297
+
298
+ [MACRO] DEFAULT_HASHER_WRITE_INSTANT %hasher, %instant_ns
299
+ EXPAND DEFAULT_HASHER_WRITE_UNIX_TIMESPEC_NS %hasher, %instant_ns
300
+ [END_MACRO]
301
+
302
+ [MACRO] TIME_INSTANT_HASH %out_hash, %instant_ns
303
+ __time_instant_hash_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
304
+ EXPAND DEFAULT_HASHER_NEW __time_instant_hash_hasher_%out_hash
305
+ EXPAND DEFAULT_HASHER_WRITE_INSTANT __time_instant_hash_hasher_%out_hash, %instant_ns
306
+ EXPAND DEFAULT_HASHER_FINISH %out_hash, __time_instant_hash_hasher_%out_hash
307
+ [END_MACRO]
308
+
309
+ [MACRO] BUILD_HASHER_DEFAULT_HASH_ONE_INSTANT %out_hash, %builder, %instant_ns
310
+ __build_hash_one_instant_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
311
+ EXPAND BUILD_HASHER_DEFAULT_BUILD __build_hash_one_instant_hasher_%out_hash, %builder
312
+ EXPAND DEFAULT_HASHER_WRITE_INSTANT __build_hash_one_instant_hasher_%out_hash, %instant_ns
313
+ EXPAND DEFAULT_HASHER_FINISH %out_hash, __build_hash_one_instant_hasher_%out_hash
314
+ [END_MACRO]
315
+
316
+ [MACRO] RANDOM_STATE_HASH_ONE_INSTANT %out_hash, %state, %instant_ns
317
+ __random_state_hash_one_instant_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
318
+ EXPAND RANDOM_STATE_BUILD __random_state_hash_one_instant_hasher_%out_hash, %state
319
+ EXPAND DEFAULT_HASHER_WRITE_INSTANT __random_state_hash_one_instant_hasher_%out_hash, %instant_ns
320
+ EXPAND DEFAULT_HASHER_FINISH %out_hash, __random_state_hash_one_instant_hasher_%out_hash
321
+ [END_MACRO]
322
+
323
+ [MACRO] DEFAULT_HASHER_WRITE_SYSTEM_TIME %hasher, %system_ns
324
+ EXPAND DEFAULT_HASHER_WRITE_UNIX_TIMESPEC_NS %hasher, %system_ns
325
+ [END_MACRO]
326
+
327
+ [MACRO] TIME_SYSTEM_TIME_HASH %out_hash, %system_ns
328
+ __time_system_hash_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
329
+ EXPAND DEFAULT_HASHER_NEW __time_system_hash_hasher_%out_hash
330
+ EXPAND DEFAULT_HASHER_WRITE_SYSTEM_TIME __time_system_hash_hasher_%out_hash, %system_ns
331
+ EXPAND DEFAULT_HASHER_FINISH %out_hash, __time_system_hash_hasher_%out_hash
332
+ [END_MACRO]
333
+
334
+ [MACRO] BUILD_HASHER_DEFAULT_HASH_ONE_SYSTEM_TIME %out_hash, %builder, %system_ns
335
+ __build_hash_one_system_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
336
+ EXPAND BUILD_HASHER_DEFAULT_BUILD __build_hash_one_system_hasher_%out_hash, %builder
337
+ EXPAND DEFAULT_HASHER_WRITE_SYSTEM_TIME __build_hash_one_system_hasher_%out_hash, %system_ns
338
+ EXPAND DEFAULT_HASHER_FINISH %out_hash, __build_hash_one_system_hasher_%out_hash
339
+ [END_MACRO]
340
+
341
+ [MACRO] RANDOM_STATE_HASH_ONE_SYSTEM_TIME %out_hash, %state, %system_ns
342
+ __random_state_hash_one_system_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
343
+ EXPAND RANDOM_STATE_BUILD __random_state_hash_one_system_hasher_%out_hash, %state
344
+ EXPAND DEFAULT_HASHER_WRITE_SYSTEM_TIME __random_state_hash_one_system_hasher_%out_hash, %system_ns
345
+ EXPAND DEFAULT_HASHER_FINISH %out_hash, __random_state_hash_one_system_hasher_%out_hash
346
+ [END_MACRO]
347
+
348
+ [MACRO] TIME_DURATION_DIV_DURATION_FLOOR %out_ok, %out_ratio, %duration_ns, %rhs_ns
349
+ __time_div_dur_zero_%out_ok = eq %rhs_ns, 0
350
+ br __time_div_dur_zero_%out_ok -> L_TIME_DIV_DUR_FLOOR_ZERO_%out_ok, L_TIME_DIV_DUR_FLOOR_OK_%out_ok
351
+
352
+ L_TIME_DIV_DUR_FLOOR_OK_%out_ok:
353
+ %out_ratio = udiv %duration_ns, %rhs_ns
354
+ %out_ok = add 0, 1
355
+ !__time_div_dur_zero_%out_ok
356
+ jmp L_TIME_DIV_DUR_FLOOR_END_%out_ok
357
+
358
+ L_TIME_DIV_DUR_FLOOR_ZERO_%out_ok:
359
+ %out_ratio = add 0, 0
360
+ %out_ok = add 0, 0
361
+ !__time_div_dur_zero_%out_ok
362
+
363
+ L_TIME_DIV_DUR_FLOOR_END_%out_ok:
364
+ [END_MACRO]
365
+
366
+ [MACRO] TIME_DURATION_DIV_DURATION_CEIL %out_ok, %out_ratio, %duration_ns, %rhs_ns
367
+ __time_div_ceil_zero_%out_ok = eq %rhs_ns, 0
368
+ br __time_div_ceil_zero_%out_ok -> L_TIME_DIV_DUR_CEIL_ZERO_%out_ok, L_TIME_DIV_DUR_CEIL_COMPUTE_%out_ok
369
+
370
+ L_TIME_DIV_DUR_CEIL_COMPUTE_%out_ok:
371
+ __time_div_ceil_q_%out_ok = udiv %duration_ns, %rhs_ns
372
+ __time_div_ceil_r_%out_ok = urem %duration_ns, %rhs_ns
373
+ __time_div_ceil_has_rem_%out_ok = ne __time_div_ceil_r_%out_ok, 0
374
+ br __time_div_ceil_has_rem_%out_ok -> L_TIME_DIV_DUR_CEIL_ADD_%out_ok, L_TIME_DIV_DUR_CEIL_EXACT_%out_ok
375
+
376
+ L_TIME_DIV_DUR_CEIL_ADD_%out_ok:
377
+ %out_ratio = add __time_div_ceil_q_%out_ok, 1
378
+ %out_ok = add 0, 1
379
+ !__time_div_ceil_has_rem_%out_ok
380
+ !__time_div_ceil_r_%out_ok
381
+ !__time_div_ceil_q_%out_ok
382
+ !__time_div_ceil_zero_%out_ok
383
+ jmp L_TIME_DIV_DUR_CEIL_END_%out_ok
384
+
385
+ L_TIME_DIV_DUR_CEIL_EXACT_%out_ok:
386
+ %out_ratio = add __time_div_ceil_q_%out_ok, 0
387
+ %out_ok = add 0, 1
388
+ !__time_div_ceil_has_rem_%out_ok
389
+ !__time_div_ceil_r_%out_ok
390
+ !__time_div_ceil_q_%out_ok
391
+ !__time_div_ceil_zero_%out_ok
392
+ jmp L_TIME_DIV_DUR_CEIL_END_%out_ok
393
+
394
+ L_TIME_DIV_DUR_CEIL_ZERO_%out_ok:
395
+ %out_ratio = add 0, 0
396
+ %out_ok = add 0, 0
397
+ !__time_div_ceil_zero_%out_ok
398
+
399
+ L_TIME_DIV_DUR_CEIL_END_%out_ok:
400
+ [END_MACRO]
401
+
402
+ [MACRO] TIME_DURATION_SUBSEC_NANOS %out_ns, %duration_ns
403
+ %out_ns = urem %duration_ns, Time_NS_PER_S
404
+ [END_MACRO]
405
+
406
+ [MACRO] TIME_DURATION_SUBSEC_MICROS %out_us, %duration_ns
407
+ __time_subsec_ns_%out_us = urem %duration_ns, Time_NS_PER_S
408
+ %out_us = udiv __time_subsec_ns_%out_us, Time_NS_PER_US
409
+ !__time_subsec_ns_%out_us
410
+ [END_MACRO]
411
+
412
+ [MACRO] TIME_DURATION_SUBSEC_MILLIS %out_ms, %duration_ns
413
+ __time_subsec_ns_%out_ms = urem %duration_ns, Time_NS_PER_S
414
+ %out_ms = udiv __time_subsec_ns_%out_ms, Time_NS_PER_MS
415
+ !__time_subsec_ns_%out_ms
416
+ [END_MACRO]
417
+
418
+ [MACRO] TIME_CHECKED_ADD_NS %out_ok, %out_ns, %base_ns, %duration_ns
419
+ __time_add_sum_%out_ok = add %base_ns, %duration_ns
420
+ __time_add_overflow_%out_ok = ult __time_add_sum_%out_ok, %base_ns
421
+ br __time_add_overflow_%out_ok -> L_TIME_CHECKED_ADD_OVERFLOW_%out_ok, L_TIME_CHECKED_ADD_OK_%out_ok
422
+
423
+ L_TIME_CHECKED_ADD_OK_%out_ok:
424
+ %out_ns = add __time_add_sum_%out_ok, 0
425
+ %out_ok = add 0, 1
426
+ !__time_add_overflow_%out_ok
427
+ !__time_add_sum_%out_ok
428
+ jmp L_TIME_CHECKED_ADD_END_%out_ok
429
+
430
+ L_TIME_CHECKED_ADD_OVERFLOW_%out_ok:
431
+ %out_ns = add 0, 0
432
+ %out_ok = add 0, 0
433
+ !__time_add_overflow_%out_ok
434
+ !__time_add_sum_%out_ok
435
+
436
+ L_TIME_CHECKED_ADD_END_%out_ok:
437
+ [END_MACRO]
438
+
439
+ [MACRO] TIME_CHECKED_SUB_NS %out_ok, %out_ns, %base_ns, %duration_ns
440
+ __time_sub_ok_%out_ok = ule %duration_ns, %base_ns
441
+ br __time_sub_ok_%out_ok -> L_TIME_CHECKED_SUB_OK_%out_ok, L_TIME_CHECKED_SUB_UNDERFLOW_%out_ok
442
+
443
+ L_TIME_CHECKED_SUB_OK_%out_ok:
444
+ %out_ns = sub %base_ns, %duration_ns
445
+ %out_ok = add 0, 1
446
+ !__time_sub_ok_%out_ok
447
+ jmp L_TIME_CHECKED_SUB_END_%out_ok
448
+
449
+ L_TIME_CHECKED_SUB_UNDERFLOW_%out_ok:
450
+ %out_ns = add 0, 0
451
+ %out_ok = add 0, 0
452
+ !__time_sub_ok_%out_ok
453
+
454
+ L_TIME_CHECKED_SUB_END_%out_ok:
455
+ [END_MACRO]
456
+
457
+ [MACRO] TIME_SATURATING_ADD_NS %out_ns, %base_ns, %duration_ns
458
+ EXPAND TIME_CHECKED_ADD_NS __time_sat_add_ok_%out_ns, __time_sat_add_value_%out_ns, %base_ns, %duration_ns
459
+ br __time_sat_add_ok_%out_ns -> L_TIME_SAT_ADD_OK_%out_ns, L_TIME_SAT_ADD_MAX_%out_ns
460
+
461
+ L_TIME_SAT_ADD_OK_%out_ns:
462
+ %out_ns = add __time_sat_add_value_%out_ns, 0
463
+ !__time_sat_add_value_%out_ns
464
+ !__time_sat_add_ok_%out_ns
465
+ jmp L_TIME_SAT_ADD_END_%out_ns
466
+
467
+ L_TIME_SAT_ADD_MAX_%out_ns:
468
+ %out_ns = sub 0, 1
469
+ !__time_sat_add_value_%out_ns
470
+ !__time_sat_add_ok_%out_ns
471
+
472
+ L_TIME_SAT_ADD_END_%out_ns:
473
+ [END_MACRO]
474
+
475
+ [MACRO] TIME_SATURATING_SUB_NS %out_ns, %base_ns, %duration_ns
476
+ EXPAND TIME_CHECKED_SUB_NS __time_sat_sub_ok_%out_ns, __time_sat_sub_value_%out_ns, %base_ns, %duration_ns
477
+ br __time_sat_sub_ok_%out_ns -> L_TIME_SAT_SUB_OK_%out_ns, L_TIME_SAT_SUB_ZERO_%out_ns
478
+
479
+ L_TIME_SAT_SUB_OK_%out_ns:
480
+ %out_ns = add __time_sat_sub_value_%out_ns, 0
481
+ !__time_sat_sub_value_%out_ns
482
+ !__time_sat_sub_ok_%out_ns
483
+ jmp L_TIME_SAT_SUB_END_%out_ns
484
+
485
+ L_TIME_SAT_SUB_ZERO_%out_ns:
486
+ %out_ns = add 0, 0
487
+ !__time_sat_sub_value_%out_ns
488
+ !__time_sat_sub_ok_%out_ns
489
+
490
+ L_TIME_SAT_SUB_END_%out_ns:
491
+ [END_MACRO]
492
+
493
+ [MACRO] TIME_CHECKED_MUL_NS %out_ok, %out_ns, %duration_ns, %factor
494
+ __time_mul_zero_factor_%out_ok = eq %factor, 0
495
+ br __time_mul_zero_factor_%out_ok -> L_TIME_CHECKED_MUL_ZERO_FACTOR_%out_ok, L_TIME_CHECKED_MUL_COMPUTE_%out_ok
496
+
497
+ L_TIME_CHECKED_MUL_COMPUTE_%out_ok:
498
+ __time_mul_product_%out_ok = mul %duration_ns, %factor
499
+ __time_mul_roundtrip_%out_ok = udiv __time_mul_product_%out_ok, %factor
500
+ __time_mul_ok_%out_ok = eq __time_mul_roundtrip_%out_ok, %duration_ns
501
+ br __time_mul_ok_%out_ok -> L_TIME_CHECKED_MUL_OK_%out_ok, L_TIME_CHECKED_MUL_OVERFLOW_%out_ok
502
+
503
+ L_TIME_CHECKED_MUL_OK_%out_ok:
504
+ %out_ns = add __time_mul_product_%out_ok, 0
505
+ %out_ok = add 0, 1
506
+ !__time_mul_ok_%out_ok
507
+ !__time_mul_roundtrip_%out_ok
508
+ !__time_mul_product_%out_ok
509
+ !__time_mul_zero_factor_%out_ok
510
+ jmp L_TIME_CHECKED_MUL_END_%out_ok
511
+
512
+ L_TIME_CHECKED_MUL_OVERFLOW_%out_ok:
513
+ %out_ns = add 0, 0
514
+ %out_ok = add 0, 0
515
+ !__time_mul_ok_%out_ok
516
+ !__time_mul_roundtrip_%out_ok
517
+ !__time_mul_product_%out_ok
518
+ !__time_mul_zero_factor_%out_ok
519
+ jmp L_TIME_CHECKED_MUL_END_%out_ok
520
+
521
+ L_TIME_CHECKED_MUL_ZERO_FACTOR_%out_ok:
522
+ %out_ns = add 0, 0
523
+ %out_ok = add 0, 1
524
+ !__time_mul_zero_factor_%out_ok
525
+
526
+ L_TIME_CHECKED_MUL_END_%out_ok:
527
+ [END_MACRO]
528
+
529
+ [MACRO] TIME_CHECKED_DIV_NS %out_ok, %out_ns, %duration_ns, %divisor
530
+ __time_div_zero_%out_ok = eq %divisor, 0
531
+ br __time_div_zero_%out_ok -> L_TIME_CHECKED_DIV_ZERO_%out_ok, L_TIME_CHECKED_DIV_OK_%out_ok
532
+
533
+ L_TIME_CHECKED_DIV_OK_%out_ok:
534
+ %out_ns = udiv %duration_ns, %divisor
535
+ %out_ok = add 0, 1
536
+ !__time_div_zero_%out_ok
537
+ jmp L_TIME_CHECKED_DIV_END_%out_ok
538
+
539
+ L_TIME_CHECKED_DIV_ZERO_%out_ok:
540
+ %out_ns = add 0, 0
541
+ %out_ok = add 0, 0
542
+ !__time_div_zero_%out_ok
543
+
544
+ L_TIME_CHECKED_DIV_END_%out_ok:
545
+ [END_MACRO]
546
+
547
+ [MACRO] TIME_SATURATING_MUL_NS %out_ns, %duration_ns, %factor
548
+ EXPAND TIME_CHECKED_MUL_NS __time_sat_mul_ok_%out_ns, __time_sat_mul_value_%out_ns, %duration_ns, %factor
549
+ br __time_sat_mul_ok_%out_ns -> L_TIME_SAT_MUL_OK_%out_ns, L_TIME_SAT_MUL_MAX_%out_ns
550
+
551
+ L_TIME_SAT_MUL_OK_%out_ns:
552
+ %out_ns = add __time_sat_mul_value_%out_ns, 0
553
+ !__time_sat_mul_value_%out_ns
554
+ !__time_sat_mul_ok_%out_ns
555
+ jmp L_TIME_SAT_MUL_END_%out_ns
556
+
557
+ L_TIME_SAT_MUL_MAX_%out_ns:
558
+ %out_ns = sub 0, 1
559
+ !__time_sat_mul_value_%out_ns
560
+ !__time_sat_mul_ok_%out_ns
561
+
562
+ L_TIME_SAT_MUL_END_%out_ns:
563
+ [END_MACRO]
564
+
565
+ [MACRO] TIME_SATURATING_DIV_NS %out_ns, %duration_ns, %divisor
566
+ EXPAND TIME_CHECKED_DIV_NS __time_sat_div_ok_%out_ns, __time_sat_div_value_%out_ns, %duration_ns, %divisor
567
+ br __time_sat_div_ok_%out_ns -> L_TIME_SAT_DIV_OK_%out_ns, L_TIME_SAT_DIV_MAX_%out_ns
568
+
569
+ L_TIME_SAT_DIV_OK_%out_ns:
570
+ %out_ns = add __time_sat_div_value_%out_ns, 0
571
+ !__time_sat_div_value_%out_ns
572
+ !__time_sat_div_ok_%out_ns
573
+ jmp L_TIME_SAT_DIV_END_%out_ns
574
+
575
+ L_TIME_SAT_DIV_MAX_%out_ns:
576
+ %out_ns = sub 0, 1
577
+ !__time_sat_div_value_%out_ns
578
+ !__time_sat_div_ok_%out_ns
579
+
580
+ L_TIME_SAT_DIV_END_%out_ns:
581
+ [END_MACRO]
582
+
583
+ [MACRO] TIME_DURATION_CHECKED_ADD_NS %out_ok, %out_ns, %base_ns, %duration_ns
584
+ EXPAND TIME_CHECKED_ADD_NS %out_ok, %out_ns, %base_ns, %duration_ns
585
+ [END_MACRO]
586
+
587
+ [MACRO] TIME_DURATION_CHECKED_ADD %out_ok, %out_ns, %base_ns, %duration_ns
588
+ EXPAND TIME_DURATION_CHECKED_ADD_NS %out_ok, %out_ns, %base_ns, %duration_ns
589
+ [END_MACRO]
590
+
591
+ [MACRO] TIME_DURATION_CHECKED_SUB_NS %out_ok, %out_ns, %base_ns, %duration_ns
592
+ EXPAND TIME_CHECKED_SUB_NS %out_ok, %out_ns, %base_ns, %duration_ns
593
+ [END_MACRO]
594
+
595
+ [MACRO] TIME_DURATION_CHECKED_SUB %out_ok, %out_ns, %base_ns, %duration_ns
596
+ EXPAND TIME_DURATION_CHECKED_SUB_NS %out_ok, %out_ns, %base_ns, %duration_ns
597
+ [END_MACRO]
598
+
599
+ [MACRO] TIME_DURATION_CHECKED_MUL_NS %out_ok, %out_ns, %duration_ns, %factor
600
+ EXPAND TIME_CHECKED_MUL_NS %out_ok, %out_ns, %duration_ns, %factor
601
+ [END_MACRO]
602
+
603
+ [MACRO] TIME_DURATION_CHECKED_MUL %out_ok, %out_ns, %duration_ns, %factor
604
+ EXPAND TIME_DURATION_CHECKED_MUL_NS %out_ok, %out_ns, %duration_ns, %factor
605
+ [END_MACRO]
606
+
607
+ [MACRO] TIME_DURATION_CHECKED_DIV_NS %out_ok, %out_ns, %duration_ns, %divisor
608
+ EXPAND TIME_CHECKED_DIV_NS %out_ok, %out_ns, %duration_ns, %divisor
609
+ [END_MACRO]
610
+
611
+ [MACRO] TIME_DURATION_CHECKED_DIV %out_ok, %out_ns, %duration_ns, %divisor
612
+ EXPAND TIME_DURATION_CHECKED_DIV_NS %out_ok, %out_ns, %duration_ns, %divisor
613
+ [END_MACRO]
614
+
615
+ [MACRO] TIME_DURATION_SATURATING_ADD_NS %out_ns, %base_ns, %duration_ns
616
+ EXPAND TIME_SATURATING_ADD_NS %out_ns, %base_ns, %duration_ns
617
+ [END_MACRO]
618
+
619
+ [MACRO] TIME_DURATION_SATURATING_ADD %out_ns, %base_ns, %duration_ns
620
+ EXPAND TIME_DURATION_SATURATING_ADD_NS %out_ns, %base_ns, %duration_ns
621
+ [END_MACRO]
622
+
623
+ [MACRO] TIME_DURATION_SATURATING_SUB_NS %out_ns, %base_ns, %duration_ns
624
+ EXPAND TIME_SATURATING_SUB_NS %out_ns, %base_ns, %duration_ns
625
+ [END_MACRO]
626
+
627
+ [MACRO] TIME_DURATION_SATURATING_SUB %out_ns, %base_ns, %duration_ns
628
+ EXPAND TIME_DURATION_SATURATING_SUB_NS %out_ns, %base_ns, %duration_ns
629
+ [END_MACRO]
630
+
631
+ [MACRO] TIME_DURATION_SATURATING_MUL_NS %out_ns, %duration_ns, %factor
632
+ EXPAND TIME_SATURATING_MUL_NS %out_ns, %duration_ns, %factor
633
+ [END_MACRO]
634
+
635
+ [MACRO] TIME_DURATION_SATURATING_MUL %out_ns, %duration_ns, %factor
636
+ EXPAND TIME_DURATION_SATURATING_MUL_NS %out_ns, %duration_ns, %factor
637
+ [END_MACRO]
638
+
639
+ [MACRO] TIME_DURATION_SATURATING_DIV_NS %out_ns, %duration_ns, %divisor
640
+ EXPAND TIME_SATURATING_DIV_NS %out_ns, %duration_ns, %divisor
641
+ [END_MACRO]
642
+
643
+ [MACRO] TIME_DURATION_ABS_DIFF_NS %out_ns, %left_ns, %right_ns
644
+ __time_abs_left_ge_%out_ns = uge %left_ns, %right_ns
645
+ br __time_abs_left_ge_%out_ns -> L_TIME_ABS_DIFF_LEFT_%out_ns, L_TIME_ABS_DIFF_RIGHT_%out_ns
646
+
647
+ L_TIME_ABS_DIFF_LEFT_%out_ns:
648
+ %out_ns = sub %left_ns, %right_ns
649
+ !__time_abs_left_ge_%out_ns
650
+ jmp L_TIME_ABS_DIFF_END_%out_ns
651
+
652
+ L_TIME_ABS_DIFF_RIGHT_%out_ns:
653
+ %out_ns = sub %right_ns, %left_ns
654
+ !__time_abs_left_ge_%out_ns
655
+
656
+ L_TIME_ABS_DIFF_END_%out_ns:
657
+ [END_MACRO]
658
+
659
+ [MACRO] TIME_DURATION_ABS_DIFF %out_ns, %left_ns, %right_ns
660
+ EXPAND TIME_DURATION_ABS_DIFF_NS %out_ns, %left_ns, %right_ns
661
+ [END_MACRO]
662
+
663
+ [MACRO] TIME_CHECKED_DURATION_SINCE %out_ok, %out_ns, %later_ns, %earlier_ns
664
+ EXPAND TIME_CHECKED_SUB_NS %out_ok, %out_ns, %later_ns, %earlier_ns
665
+ [END_MACRO]
666
+
667
+ [MACRO] TIME_DURATION_SINCE %out_ns, %later_ns, %earlier_ns
668
+ EXPAND TIME_CHECKED_DURATION_SINCE __time_since_ok_%out_ns, %out_ns, %later_ns, %earlier_ns
669
+ !__time_since_ok_%out_ns
670
+ [END_MACRO]
671
+
672
+ [MACRO] TIME_INSTANT_CHECKED_ADD %out_ok, %out_instant_ns, %instant_ns, %duration_ns
673
+ EXPAND TIME_CHECKED_ADD_NS %out_ok, %out_instant_ns, %instant_ns, %duration_ns
674
+ [END_MACRO]
675
+
676
+ [MACRO] TIME_INSTANT_CHECKED_SUB %out_ok, %out_instant_ns, %instant_ns, %duration_ns
677
+ EXPAND TIME_CHECKED_SUB_NS %out_ok, %out_instant_ns, %instant_ns, %duration_ns
678
+ [END_MACRO]
679
+
680
+ [MACRO] TIME_INSTANT_CHECKED_DURATION_SINCE %out_ok, %out_ns, %later_ns, %earlier_ns
681
+ EXPAND TIME_CHECKED_DURATION_SINCE %out_ok, %out_ns, %later_ns, %earlier_ns
682
+ [END_MACRO]
683
+
684
+ [MACRO] TIME_INSTANT_DURATION_SINCE %out_ns, %later_ns, %earlier_ns
685
+ EXPAND TIME_DURATION_SINCE %out_ns, %later_ns, %earlier_ns
686
+ [END_MACRO]
687
+
688
+ [MACRO] TIME_INSTANT_ELAPSED %out_ns, %instant_ns
689
+ EXPAND TIME_NOW_NS __time_elapsed_now_%out_ns
690
+ EXPAND TIME_DURATION_SINCE %out_ns, __time_elapsed_now_%out_ns, %instant_ns
691
+ !__time_elapsed_now_%out_ns
692
+ [END_MACRO]
693
+
694
+ // Instant / SystemTime naming aliases over existing ns clocks.
695
+ // Instant uses monotonic TIME_NOW_NS; SystemTime uses unix epoch ns.
696
+
697
+ [MACRO] TIME_INSTANT_NOW %out_instant_ns
698
+ EXPAND TIME_NOW_NS %out_instant_ns
699
+ [END_MACRO]
700
+
701
+ [MACRO] TIME_SYSTEM_TIME_NOW %out_system_ns
702
+ EXPAND TIME_NOW_UNIX_NS %out_system_ns
703
+ [END_MACRO]
704
+
705
+ [MACRO] TIME_SYSTEM_TIME_FROM_UNIX_NS %out_system_ns, %unix_ns
706
+ %out_system_ns = add %unix_ns, 0
707
+ [END_MACRO]
708
+
709
+ [MACRO] TIME_SYSTEM_TIME_AS_UNIX_NS %out_unix_ns, %system_ns
710
+ %out_unix_ns = add %system_ns, 0
711
+ [END_MACRO]
712
+
713
+ [MACRO] TIME_SYSTEM_TIME_CHECKED_DURATION_SINCE %out_ok, %out_ns, %later_ns, %earlier_ns
714
+ EXPAND TIME_CHECKED_DURATION_SINCE %out_ok, %out_ns, %later_ns, %earlier_ns
715
+ [END_MACRO]
716
+
717
+ [MACRO] TIME_SYSTEM_TIME_DURATION_SINCE %out_ns, %later_ns, %earlier_ns
718
+ EXPAND TIME_DURATION_SINCE %out_ns, %later_ns, %earlier_ns
719
+ [END_MACRO]
720
+
721
+ [MACRO] TIME_SYSTEM_TIME_ELAPSED %out_ns, %system_ns
722
+ EXPAND TIME_NOW_UNIX_NS __time_system_elapsed_now_%out_ns
723
+ EXPAND TIME_DURATION_SINCE %out_ns, __time_system_elapsed_now_%out_ns, %system_ns
724
+ !__time_system_elapsed_now_%out_ns
725
+ [END_MACRO]
726
+
727
+ [MACRO] TIME_SYSTEM_TIME_CHECKED_ADD %out_ok, %out_system_ns, %system_ns, %duration_ns
728
+ EXPAND TIME_CHECKED_ADD_NS %out_ok, %out_system_ns, %system_ns, %duration_ns
729
+ [END_MACRO]
730
+
731
+ [MACRO] TIME_SYSTEM_TIME_CHECKED_SUB %out_ok, %out_system_ns, %system_ns, %duration_ns
732
+ EXPAND TIME_CHECKED_SUB_NS %out_ok, %out_system_ns, %system_ns, %duration_ns
733
+ [END_MACRO]
734
+
735
+ // Extra Instant/SystemTime/Duration naming aliases.
736
+
737
+ [MACRO] TIME_DURATION_DEFAULT %out_ns
738
+ EXPAND TIME_DURATION_ZERO %out_ns
739
+ [END_MACRO]
740
+
741
+ [MACRO] TIME_SYSTEM_TIME_UNIX_EPOCH %out_system_ns
742
+ %out_system_ns = add 0, 0
743
+ [END_MACRO]
744
+
745
+ [MACRO] TIME_INSTANT_SATURATING_DURATION_SINCE %out_ns, %later_ns, %earlier_ns
746
+ EXPAND TIME_INSTANT_DURATION_SINCE %out_ns, %later_ns, %earlier_ns
747
+ [END_MACRO]
748
+
749
+ // Additional Duration/Instant/SystemTime naming aliases.
750
+
751
+ [MACRO] TIME_SLEEP_DURATION_NS %duration_ns
752
+ EXPAND TIME_SLEEP_NS %duration_ns
753
+ [END_MACRO]
754
+
755
+ [MACRO] TIME_INSTANT_DEFAULT %out_instant_ns
756
+ %out_instant_ns = add 0, 0
757
+ [END_MACRO]
758
+
759
+ [MACRO] TIME_SYSTEM_TIME_DEFAULT %out_system_ns
760
+ EXPAND TIME_SYSTEM_TIME_UNIX_EPOCH %out_system_ns
761
+ [END_MACRO]
762
+
763
+ // Stable std-style aliases for Duration, Instant, and SystemTime operations.
764
+ [MACRO] DURATION_ZERO %out_ns
765
+ EXPAND TIME_DURATION_ZERO %out_ns
766
+ [END_MACRO]
767
+
768
+ [MACRO] DURATION_MAX %out_ns
769
+ EXPAND TIME_DURATION_MAX %out_ns
770
+ [END_MACRO]
771
+
772
+ [MACRO] DURATION_FROM_NANOS %out_ns, %nanos
773
+ EXPAND TIME_DURATION_FROM_NANOS %out_ns, %nanos
774
+ [END_MACRO]
775
+
776
+ [MACRO] DURATION_FROM_MICROS %out_ns, %micros
777
+ EXPAND TIME_DURATION_FROM_MICROS %out_ns, %micros
778
+ [END_MACRO]
779
+
780
+ [MACRO] DURATION_FROM_MILLIS %out_ns, %millis
781
+ EXPAND TIME_DURATION_FROM_MILLIS %out_ns, %millis
782
+ [END_MACRO]
783
+
784
+ [MACRO] DURATION_FROM_SECS %out_ns, %secs
785
+ EXPAND TIME_DURATION_FROM_SECS %out_ns, %secs
786
+ [END_MACRO]
787
+
788
+ [MACRO] DURATION_AS_NANOS %out_ns, %duration_ns
789
+ EXPAND TIME_DURATION_AS_NANOS %out_ns, %duration_ns
790
+ [END_MACRO]
791
+
792
+ [MACRO] DURATION_AS_MICROS %out_us, %duration_ns
793
+ EXPAND TIME_DURATION_AS_MICROS %out_us, %duration_ns
794
+ [END_MACRO]
795
+
796
+ [MACRO] DURATION_AS_MILLIS %out_ms, %duration_ns
797
+ EXPAND TIME_DURATION_AS_MILLIS %out_ms, %duration_ns
798
+ [END_MACRO]
799
+
800
+ [MACRO] DURATION_AS_SECS %out_secs, %duration_ns
801
+ EXPAND TIME_DURATION_AS_SECS %out_secs, %duration_ns
802
+ [END_MACRO]
803
+
804
+ [MACRO] DURATION_CHECKED_ADD %out_ok, %out_ns, %base_ns, %duration_ns
805
+ EXPAND TIME_DURATION_CHECKED_ADD %out_ok, %out_ns, %base_ns, %duration_ns
806
+ [END_MACRO]
807
+
808
+ [MACRO] DURATION_CHECKED_SUB %out_ok, %out_ns, %base_ns, %duration_ns
809
+ EXPAND TIME_DURATION_CHECKED_SUB %out_ok, %out_ns, %base_ns, %duration_ns
810
+ [END_MACRO]
811
+
812
+ [MACRO] DURATION_SATURATING_ADD %out_ns, %base_ns, %duration_ns
813
+ EXPAND TIME_DURATION_SATURATING_ADD %out_ns, %base_ns, %duration_ns
814
+ [END_MACRO]
815
+
816
+ [MACRO] DURATION_SATURATING_SUB %out_ns, %base_ns, %duration_ns
817
+ EXPAND TIME_DURATION_SATURATING_SUB %out_ns, %base_ns, %duration_ns
818
+ [END_MACRO]
819
+
820
+ [MACRO] DURATION_ABS_DIFF %out_ns, %left_ns, %right_ns
821
+ EXPAND TIME_DURATION_ABS_DIFF %out_ns, %left_ns, %right_ns
822
+ [END_MACRO]
823
+
824
+ [MACRO] INSTANT_NOW %out_instant_ns
825
+ EXPAND TIME_INSTANT_NOW %out_instant_ns
826
+ [END_MACRO]
827
+
828
+ [MACRO] INSTANT_DURATION_SINCE %out_ns, %later_ns, %earlier_ns
829
+ EXPAND TIME_INSTANT_DURATION_SINCE %out_ns, %later_ns, %earlier_ns
830
+ [END_MACRO]
831
+
832
+ [MACRO] INSTANT_CHECKED_DURATION_SINCE %out_ok, %out_ns, %later_ns, %earlier_ns
833
+ EXPAND TIME_INSTANT_CHECKED_DURATION_SINCE %out_ok, %out_ns, %later_ns, %earlier_ns
834
+ [END_MACRO]
835
+
836
+ [MACRO] INSTANT_ELAPSED %out_ns, %instant_ns
837
+ EXPAND TIME_INSTANT_ELAPSED %out_ns, %instant_ns
838
+ [END_MACRO]
839
+
840
+ [MACRO] SYSTEM_TIME_NOW %out_system_ns
841
+ EXPAND TIME_SYSTEM_TIME_NOW %out_system_ns
842
+ [END_MACRO]
843
+
844
+ [MACRO] SYSTEM_TIME_FROM_UNIX_NS %out_system_ns, %unix_ns
845
+ EXPAND TIME_SYSTEM_TIME_FROM_UNIX_NS %out_system_ns, %unix_ns
846
+ [END_MACRO]
847
+
848
+ [MACRO] SYSTEM_TIME_AS_UNIX_NS %out_unix_ns, %system_ns
849
+ EXPAND TIME_SYSTEM_TIME_AS_UNIX_NS %out_unix_ns, %system_ns
850
+ [END_MACRO]