@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
@@ -0,0 +1,1500 @@
1
+ @import "atomic.sal"
2
+
3
+ [MACRO] ATOMIC_FENCE %ordering
4
+ fence %ordering
5
+ [END_MACRO]
6
+
7
+ [MACRO] ATOMIC_ORDERING_NEW %ordering_ptr, %ordering
8
+ store %ordering_ptr+AtomicOrdering_value, %ordering as u8
9
+ [END_MACRO]
10
+
11
+ [MACRO] ATOMIC_ORDERING_GET %out_ordering, %ordering_ptr
12
+ %out_ordering = load %ordering_ptr+AtomicOrdering_value as u8
13
+ [END_MACRO]
14
+
15
+ [MACRO] ATOMIC_ORDERING_IS_LOAD_VALID %out_bool, %ordering
16
+ __atomic_order_load_relaxed_%out_bool = eq %ordering, ATOMIC_ORDERING_RELAXED
17
+ __atomic_order_load_acquire_%out_bool = eq %ordering, ATOMIC_ORDERING_ACQUIRE
18
+ __atomic_order_load_seq_%out_bool = eq %ordering, ATOMIC_ORDERING_SEQ_CST
19
+ __atomic_order_load_ra_%out_bool = or __atomic_order_load_relaxed_%out_bool, __atomic_order_load_acquire_%out_bool
20
+ %out_bool = or __atomic_order_load_ra_%out_bool, __atomic_order_load_seq_%out_bool
21
+ !__atomic_order_load_ra_%out_bool
22
+ !__atomic_order_load_seq_%out_bool
23
+ !__atomic_order_load_acquire_%out_bool
24
+ !__atomic_order_load_relaxed_%out_bool
25
+ [END_MACRO]
26
+
27
+ [MACRO] ATOMIC_ORDERING_IS_STORE_VALID %out_bool, %ordering
28
+ __atomic_order_store_relaxed_%out_bool = eq %ordering, ATOMIC_ORDERING_RELAXED
29
+ __atomic_order_store_release_%out_bool = eq %ordering, ATOMIC_ORDERING_RELEASE
30
+ __atomic_order_store_seq_%out_bool = eq %ordering, ATOMIC_ORDERING_SEQ_CST
31
+ __atomic_order_store_rr_%out_bool = or __atomic_order_store_relaxed_%out_bool, __atomic_order_store_release_%out_bool
32
+ %out_bool = or __atomic_order_store_rr_%out_bool, __atomic_order_store_seq_%out_bool
33
+ !__atomic_order_store_rr_%out_bool
34
+ !__atomic_order_store_seq_%out_bool
35
+ !__atomic_order_store_release_%out_bool
36
+ !__atomic_order_store_relaxed_%out_bool
37
+ [END_MACRO]
38
+
39
+ [MACRO] ATOMIC_ORDERING_IS_FAILURE_VALID %out_bool, %ordering
40
+ EXPAND ATOMIC_ORDERING_IS_LOAD_VALID %out_bool, %ordering
41
+ [END_MACRO]
42
+
43
+ [MACRO] ATOMIC_ORDERING_IS_FENCE_VALID %out_bool, %ordering
44
+ __atomic_order_fence_acquire_%out_bool = eq %ordering, ATOMIC_ORDERING_ACQUIRE
45
+ __atomic_order_fence_release_%out_bool = eq %ordering, ATOMIC_ORDERING_RELEASE
46
+ __atomic_order_fence_acqrel_%out_bool = eq %ordering, ATOMIC_ORDERING_ACQ_REL
47
+ __atomic_order_fence_seq_%out_bool = eq %ordering, ATOMIC_ORDERING_SEQ_CST
48
+ __atomic_order_fence_ar_%out_bool = or __atomic_order_fence_acquire_%out_bool, __atomic_order_fence_release_%out_bool
49
+ __atomic_order_fence_as_%out_bool = or __atomic_order_fence_acqrel_%out_bool, __atomic_order_fence_seq_%out_bool
50
+ %out_bool = or __atomic_order_fence_ar_%out_bool, __atomic_order_fence_as_%out_bool
51
+ !__atomic_order_fence_as_%out_bool
52
+ !__atomic_order_fence_ar_%out_bool
53
+ !__atomic_order_fence_seq_%out_bool
54
+ !__atomic_order_fence_acqrel_%out_bool
55
+ !__atomic_order_fence_release_%out_bool
56
+ !__atomic_order_fence_acquire_%out_bool
57
+ [END_MACRO]
58
+
59
+ [MACRO] ATOMIC_BOOL_INIT %atomic_ptr, %value
60
+ store %atomic_ptr+AtomicBool_value, %value as u8
61
+ [END_MACRO]
62
+
63
+ [MACRO] ATOMIC_BOOL_GET_MUT_PTR %out_ptr, %atomic_ptr
64
+ %out_ptr = ptr_add %atomic_ptr, AtomicBool_value
65
+ [END_MACRO]
66
+
67
+ [MACRO] ATOMIC_BOOL_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
68
+ %out_atomic_ptr = ptr_add %value_ptr, 0
69
+ [END_MACRO]
70
+
71
+ [MACRO] ATOMIC_BOOL_FROM_PTR %out_atomic_ptr, %value_ptr
72
+ EXPAND ATOMIC_BOOL_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
73
+ [END_MACRO]
74
+
75
+ [MACRO] ATOMIC_BOOL_INTO_INNER %out_value, %atomic_ptr
76
+ %out_value = load %atomic_ptr+AtomicBool_value as u8
77
+ [END_MACRO]
78
+
79
+ [MACRO] ATOMIC_BOOL_LOAD %out_value, %atomic_ptr, %ordering
80
+ %out_value = atomic_load %atomic_ptr+AtomicBool_value as u8 %ordering
81
+ [END_MACRO]
82
+
83
+ [MACRO] ATOMIC_BOOL_STORE %atomic_ptr, %value, %ordering
84
+ atomic_store %atomic_ptr+AtomicBool_value, %value as u8 %ordering
85
+ [END_MACRO]
86
+
87
+ [MACRO] ATOMIC_BOOL_SWAP %out_old, %atomic_ptr, %value, %ordering
88
+ %out_old = atomic_rmw_xchg %atomic_ptr+AtomicBool_value, %value as u8 %ordering
89
+ [END_MACRO]
90
+
91
+ [MACRO] ATOMIC_BOOL_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
92
+ %out_old, %out_ok = cmpxchg %atomic_ptr+AtomicBool_value, %expected, %new_value as u8 %success_ordering %failure_ordering
93
+ [END_MACRO]
94
+
95
+ [MACRO] ATOMIC_BOOL_COMPARE_EXCHANGE_WEAK %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
96
+ EXPAND ATOMIC_BOOL_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
97
+ [END_MACRO]
98
+
99
+ // fetch_update-style loop over cmpxchg. The update function is a macro-level
100
+ // `u8 -> u8` register, not a Rust closure object. Always reports ok=1 when
101
+ // the store eventually succeeds (no None-abort path).
102
+
103
+ [MACRO] ATOMIC_BOOL_FETCH_UPDATE %out_ok, %out_old, %atomic_ptr, %update_fn, %success_ordering, %failure_ordering
104
+ jmp L_ATOMIC_BOOL_FETCH_UPDATE_HEAD_%out_ok
105
+ L_ATOMIC_BOOL_FETCH_UPDATE_HEAD_%out_ok:
106
+ %out_old = atomic_load %atomic_ptr+AtomicBool_value as u8 relaxed
107
+ __atomic_bool_fetch_update_new_%out_ok = call %update_fn(%out_old)
108
+ __atomic_bool_fetch_update_cur_%out_ok, __atomic_bool_fetch_update_ok_%out_ok = cmpxchg %atomic_ptr+AtomicBool_value, %out_old, __atomic_bool_fetch_update_new_%out_ok as u8 %success_ordering %failure_ordering
109
+ br __atomic_bool_fetch_update_ok_%out_ok -> L_ATOMIC_BOOL_FETCH_UPDATE_DONE_%out_ok, L_ATOMIC_BOOL_FETCH_UPDATE_RETRY_%out_ok
110
+ L_ATOMIC_BOOL_FETCH_UPDATE_RETRY_%out_ok:
111
+ !__atomic_bool_fetch_update_ok_%out_ok
112
+ !__atomic_bool_fetch_update_cur_%out_ok
113
+ !__atomic_bool_fetch_update_new_%out_ok
114
+ !%out_old
115
+ jmp L_ATOMIC_BOOL_FETCH_UPDATE_HEAD_%out_ok
116
+ L_ATOMIC_BOOL_FETCH_UPDATE_DONE_%out_ok:
117
+ %out_ok = add 0, 1
118
+ !__atomic_bool_fetch_update_ok_%out_ok
119
+ !__atomic_bool_fetch_update_cur_%out_ok
120
+ !__atomic_bool_fetch_update_new_%out_ok
121
+ [END_MACRO]
122
+
123
+ [MACRO] ATOMIC_U8_INIT %atomic_ptr, %value
124
+ store %atomic_ptr+AtomicU8_value, %value as u8
125
+ [END_MACRO]
126
+
127
+ [MACRO] ATOMIC_U8_GET_MUT_PTR %out_ptr, %atomic_ptr
128
+ %out_ptr = ptr_add %atomic_ptr, AtomicU8_value
129
+ [END_MACRO]
130
+
131
+ [MACRO] ATOMIC_U8_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
132
+ %out_atomic_ptr = ptr_add %value_ptr, 0
133
+ [END_MACRO]
134
+
135
+ [MACRO] ATOMIC_U8_FROM_PTR %out_atomic_ptr, %value_ptr
136
+ EXPAND ATOMIC_U8_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
137
+ [END_MACRO]
138
+
139
+ [MACRO] ATOMIC_U8_INTO_INNER %out_value, %atomic_ptr
140
+ %out_value = load %atomic_ptr+AtomicU8_value as u8
141
+ [END_MACRO]
142
+
143
+ [MACRO] ATOMIC_U8_LOAD %out_value, %atomic_ptr, %ordering
144
+ %out_value = atomic_load %atomic_ptr+AtomicU8_value as u8 %ordering
145
+ [END_MACRO]
146
+
147
+ [MACRO] ATOMIC_U8_STORE %atomic_ptr, %value, %ordering
148
+ atomic_store %atomic_ptr+AtomicU8_value, %value as u8 %ordering
149
+ [END_MACRO]
150
+
151
+ [MACRO] ATOMIC_U8_SWAP %out_old, %atomic_ptr, %value, %ordering
152
+ %out_old = atomic_rmw_xchg %atomic_ptr+AtomicU8_value, %value as u8 %ordering
153
+ [END_MACRO]
154
+
155
+ [MACRO] ATOMIC_U8_FETCH_ADD %out_old, %atomic_ptr, %value, %ordering
156
+ %out_old = atomic_rmw_add %atomic_ptr+AtomicU8_value, %value as u8 %ordering
157
+ [END_MACRO]
158
+
159
+ [MACRO] ATOMIC_U8_FETCH_SUB %out_old, %atomic_ptr, %value, %ordering
160
+ %out_old = atomic_rmw_sub %atomic_ptr+AtomicU8_value, %value as u8 %ordering
161
+ [END_MACRO]
162
+
163
+ [MACRO] ATOMIC_U8_FETCH_AND %out_old, %atomic_ptr, %value, %ordering
164
+ %out_old = atomic_rmw_and %atomic_ptr+AtomicU8_value, %value as u8 %ordering
165
+ [END_MACRO]
166
+
167
+ [MACRO] ATOMIC_U8_FETCH_OR %out_old, %atomic_ptr, %value, %ordering
168
+ %out_old = atomic_rmw_or %atomic_ptr+AtomicU8_value, %value as u8 %ordering
169
+ [END_MACRO]
170
+
171
+ [MACRO] ATOMIC_U8_FETCH_XOR %out_old, %atomic_ptr, %value, %ordering
172
+ %out_old = atomic_rmw_xor %atomic_ptr+AtomicU8_value, %value as u8 %ordering
173
+ [END_MACRO]
174
+
175
+ [MACRO] ATOMIC_U8_FETCH_NAND %out_old, %atomic_ptr, %value, %ordering
176
+ jmp L_ATOMIC_U8_FETCH_NAND_HEAD_%out_old
177
+ L_ATOMIC_U8_FETCH_NAND_HEAD_%out_old:
178
+ %out_old = atomic_load %atomic_ptr+AtomicU8_value as u8 relaxed
179
+ __atomic_u8_nand_and_%out_old = and %out_old, %value
180
+ __atomic_u8_nand_new_%out_old = xor __atomic_u8_nand_and_%out_old, -1
181
+ __atomic_u8_nand_cur_%out_old, __atomic_u8_nand_ok_%out_old = cmpxchg %atomic_ptr+AtomicU8_value, %out_old, __atomic_u8_nand_new_%out_old as u8 %ordering %ordering
182
+ br __atomic_u8_nand_ok_%out_old -> L_ATOMIC_U8_FETCH_NAND_DONE_%out_old, L_ATOMIC_U8_FETCH_NAND_RETRY_%out_old
183
+ L_ATOMIC_U8_FETCH_NAND_RETRY_%out_old:
184
+ !__atomic_u8_nand_ok_%out_old
185
+ !__atomic_u8_nand_cur_%out_old
186
+ !__atomic_u8_nand_new_%out_old
187
+ !__atomic_u8_nand_and_%out_old
188
+ !%out_old
189
+ jmp L_ATOMIC_U8_FETCH_NAND_HEAD_%out_old
190
+ L_ATOMIC_U8_FETCH_NAND_DONE_%out_old:
191
+ !__atomic_u8_nand_ok_%out_old
192
+ !__atomic_u8_nand_cur_%out_old
193
+ !__atomic_u8_nand_new_%out_old
194
+ !__atomic_u8_nand_and_%out_old
195
+ [END_MACRO]
196
+
197
+
198
+ [MACRO] ATOMIC_U8_FETCH_MIN %out_old, %atomic_ptr, %value, %ordering
199
+ %out_old = atomic_rmw_min %atomic_ptr+AtomicU8_value, %value as u8 %ordering
200
+ [END_MACRO]
201
+
202
+ [MACRO] ATOMIC_U8_FETCH_MAX %out_old, %atomic_ptr, %value, %ordering
203
+ %out_old = atomic_rmw_max %atomic_ptr+AtomicU8_value, %value as u8 %ordering
204
+ [END_MACRO]
205
+
206
+ [MACRO] ATOMIC_U8_FETCH_UMIN %out_old, %atomic_ptr, %value, %ordering
207
+ %out_old = atomic_rmw_umin %atomic_ptr+AtomicU8_value, %value as u8 %ordering
208
+ [END_MACRO]
209
+
210
+ [MACRO] ATOMIC_U8_FETCH_UMAX %out_old, %atomic_ptr, %value, %ordering
211
+ %out_old = atomic_rmw_umax %atomic_ptr+AtomicU8_value, %value as u8 %ordering
212
+ [END_MACRO]
213
+
214
+ [MACRO] ATOMIC_U8_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
215
+ %out_old, %out_ok = cmpxchg %atomic_ptr+AtomicU8_value, %expected, %new_value as u8 %success_ordering %failure_ordering
216
+ [END_MACRO]
217
+
218
+ [MACRO] ATOMIC_U8_COMPARE_EXCHANGE_WEAK %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
219
+ EXPAND ATOMIC_U8_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
220
+ [END_MACRO]
221
+
222
+ // fetch_update-style loop over cmpxchg. The update function is a macro-level
223
+ // `u8 -> u8` register, not a Rust closure object. Always reports ok=1 when
224
+ // the store eventually succeeds (no None-abort path).
225
+
226
+ [MACRO] ATOMIC_U8_FETCH_UPDATE %out_ok, %out_old, %atomic_ptr, %update_fn, %success_ordering, %failure_ordering
227
+ jmp L_ATOMIC_U8_FETCH_UPDATE_HEAD_%out_ok
228
+ L_ATOMIC_U8_FETCH_UPDATE_HEAD_%out_ok:
229
+ %out_old = atomic_load %atomic_ptr+AtomicU8_value as u8 relaxed
230
+ __atomic_u8_fetch_update_new_%out_ok = call %update_fn(%out_old)
231
+ __atomic_u8_fetch_update_cur_%out_ok, __atomic_u8_fetch_update_ok_%out_ok = cmpxchg %atomic_ptr+AtomicU8_value, %out_old, __atomic_u8_fetch_update_new_%out_ok as u8 %success_ordering %failure_ordering
232
+ br __atomic_u8_fetch_update_ok_%out_ok -> L_ATOMIC_U8_FETCH_UPDATE_DONE_%out_ok, L_ATOMIC_U8_FETCH_UPDATE_RETRY_%out_ok
233
+ L_ATOMIC_U8_FETCH_UPDATE_RETRY_%out_ok:
234
+ !__atomic_u8_fetch_update_ok_%out_ok
235
+ !__atomic_u8_fetch_update_cur_%out_ok
236
+ !__atomic_u8_fetch_update_new_%out_ok
237
+ !%out_old
238
+ jmp L_ATOMIC_U8_FETCH_UPDATE_HEAD_%out_ok
239
+ L_ATOMIC_U8_FETCH_UPDATE_DONE_%out_ok:
240
+ %out_ok = add 0, 1
241
+ !__atomic_u8_fetch_update_ok_%out_ok
242
+ !__atomic_u8_fetch_update_cur_%out_ok
243
+ !__atomic_u8_fetch_update_new_%out_ok
244
+ [END_MACRO]
245
+
246
+ [MACRO] ATOMIC_I8_INIT %atomic_ptr, %value
247
+ store %atomic_ptr+AtomicI8_value, %value as i8
248
+ [END_MACRO]
249
+
250
+ [MACRO] ATOMIC_I8_GET_MUT_PTR %out_ptr, %atomic_ptr
251
+ %out_ptr = ptr_add %atomic_ptr, AtomicI8_value
252
+ [END_MACRO]
253
+
254
+ [MACRO] ATOMIC_I8_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
255
+ %out_atomic_ptr = ptr_add %value_ptr, 0
256
+ [END_MACRO]
257
+
258
+ [MACRO] ATOMIC_I8_FROM_PTR %out_atomic_ptr, %value_ptr
259
+ EXPAND ATOMIC_I8_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
260
+ [END_MACRO]
261
+
262
+ [MACRO] ATOMIC_I8_INTO_INNER %out_value, %atomic_ptr
263
+ %out_value = load %atomic_ptr+AtomicI8_value as i8
264
+ [END_MACRO]
265
+
266
+ [MACRO] ATOMIC_I8_LOAD %out_value, %atomic_ptr, %ordering
267
+ %out_value = atomic_load %atomic_ptr+AtomicI8_value as i8 %ordering
268
+ [END_MACRO]
269
+
270
+ [MACRO] ATOMIC_I8_STORE %atomic_ptr, %value, %ordering
271
+ atomic_store %atomic_ptr+AtomicI8_value, %value as i8 %ordering
272
+ [END_MACRO]
273
+
274
+ [MACRO] ATOMIC_I8_SWAP %out_old, %atomic_ptr, %value, %ordering
275
+ %out_old = atomic_rmw_xchg %atomic_ptr+AtomicI8_value, %value as i8 %ordering
276
+ [END_MACRO]
277
+
278
+ [MACRO] ATOMIC_I8_FETCH_ADD %out_old, %atomic_ptr, %value, %ordering
279
+ %out_old = atomic_rmw_add %atomic_ptr+AtomicI8_value, %value as i8 %ordering
280
+ [END_MACRO]
281
+
282
+ [MACRO] ATOMIC_I8_FETCH_SUB %out_old, %atomic_ptr, %value, %ordering
283
+ %out_old = atomic_rmw_sub %atomic_ptr+AtomicI8_value, %value as i8 %ordering
284
+ [END_MACRO]
285
+
286
+ [MACRO] ATOMIC_I8_FETCH_AND %out_old, %atomic_ptr, %value, %ordering
287
+ %out_old = atomic_rmw_and %atomic_ptr+AtomicI8_value, %value as i8 %ordering
288
+ [END_MACRO]
289
+
290
+ [MACRO] ATOMIC_I8_FETCH_OR %out_old, %atomic_ptr, %value, %ordering
291
+ %out_old = atomic_rmw_or %atomic_ptr+AtomicI8_value, %value as i8 %ordering
292
+ [END_MACRO]
293
+
294
+ [MACRO] ATOMIC_I8_FETCH_XOR %out_old, %atomic_ptr, %value, %ordering
295
+ %out_old = atomic_rmw_xor %atomic_ptr+AtomicI8_value, %value as i8 %ordering
296
+ [END_MACRO]
297
+
298
+ [MACRO] ATOMIC_I8_FETCH_NAND %out_old, %atomic_ptr, %value, %ordering
299
+ jmp L_ATOMIC_I8_FETCH_NAND_HEAD_%out_old
300
+ L_ATOMIC_I8_FETCH_NAND_HEAD_%out_old:
301
+ %out_old = atomic_load %atomic_ptr+AtomicI8_value as i8 relaxed
302
+ __atomic_i8_nand_and_%out_old = and %out_old, %value
303
+ __atomic_i8_nand_new_%out_old = xor __atomic_i8_nand_and_%out_old, -1
304
+ __atomic_i8_nand_cur_%out_old, __atomic_i8_nand_ok_%out_old = cmpxchg %atomic_ptr+AtomicI8_value, %out_old, __atomic_i8_nand_new_%out_old as i8 %ordering %ordering
305
+ br __atomic_i8_nand_ok_%out_old -> L_ATOMIC_I8_FETCH_NAND_DONE_%out_old, L_ATOMIC_I8_FETCH_NAND_RETRY_%out_old
306
+ L_ATOMIC_I8_FETCH_NAND_RETRY_%out_old:
307
+ !__atomic_i8_nand_ok_%out_old
308
+ !__atomic_i8_nand_cur_%out_old
309
+ !__atomic_i8_nand_new_%out_old
310
+ !__atomic_i8_nand_and_%out_old
311
+ !%out_old
312
+ jmp L_ATOMIC_I8_FETCH_NAND_HEAD_%out_old
313
+ L_ATOMIC_I8_FETCH_NAND_DONE_%out_old:
314
+ !__atomic_i8_nand_ok_%out_old
315
+ !__atomic_i8_nand_cur_%out_old
316
+ !__atomic_i8_nand_new_%out_old
317
+ !__atomic_i8_nand_and_%out_old
318
+ [END_MACRO]
319
+
320
+
321
+ [MACRO] ATOMIC_I8_FETCH_MIN %out_old, %atomic_ptr, %value, %ordering
322
+ %out_old = atomic_rmw_min %atomic_ptr+AtomicI8_value, %value as i8 %ordering
323
+ [END_MACRO]
324
+
325
+ [MACRO] ATOMIC_I8_FETCH_MAX %out_old, %atomic_ptr, %value, %ordering
326
+ %out_old = atomic_rmw_max %atomic_ptr+AtomicI8_value, %value as i8 %ordering
327
+ [END_MACRO]
328
+
329
+ [MACRO] ATOMIC_I8_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
330
+ %out_old, %out_ok = cmpxchg %atomic_ptr+AtomicI8_value, %expected, %new_value as i8 %success_ordering %failure_ordering
331
+ [END_MACRO]
332
+
333
+ [MACRO] ATOMIC_I8_COMPARE_EXCHANGE_WEAK %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
334
+ EXPAND ATOMIC_I8_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
335
+ [END_MACRO]
336
+
337
+ // fetch_update-style loop over cmpxchg. The update function is a macro-level
338
+ // `i8 -> i8` register, not a Rust closure object. Always reports ok=1 when
339
+ // the store eventually succeeds (no None-abort path).
340
+
341
+ [MACRO] ATOMIC_I8_FETCH_UPDATE %out_ok, %out_old, %atomic_ptr, %update_fn, %success_ordering, %failure_ordering
342
+ jmp L_ATOMIC_I8_FETCH_UPDATE_HEAD_%out_ok
343
+ L_ATOMIC_I8_FETCH_UPDATE_HEAD_%out_ok:
344
+ %out_old = atomic_load %atomic_ptr+AtomicI8_value as i8 relaxed
345
+ __atomic_i8_fetch_update_new_%out_ok = call %update_fn(%out_old)
346
+ __atomic_i8_fetch_update_cur_%out_ok, __atomic_i8_fetch_update_ok_%out_ok = cmpxchg %atomic_ptr+AtomicI8_value, %out_old, __atomic_i8_fetch_update_new_%out_ok as i8 %success_ordering %failure_ordering
347
+ br __atomic_i8_fetch_update_ok_%out_ok -> L_ATOMIC_I8_FETCH_UPDATE_DONE_%out_ok, L_ATOMIC_I8_FETCH_UPDATE_RETRY_%out_ok
348
+ L_ATOMIC_I8_FETCH_UPDATE_RETRY_%out_ok:
349
+ !__atomic_i8_fetch_update_ok_%out_ok
350
+ !__atomic_i8_fetch_update_cur_%out_ok
351
+ !__atomic_i8_fetch_update_new_%out_ok
352
+ !%out_old
353
+ jmp L_ATOMIC_I8_FETCH_UPDATE_HEAD_%out_ok
354
+ L_ATOMIC_I8_FETCH_UPDATE_DONE_%out_ok:
355
+ %out_ok = add 0, 1
356
+ !__atomic_i8_fetch_update_ok_%out_ok
357
+ !__atomic_i8_fetch_update_cur_%out_ok
358
+ !__atomic_i8_fetch_update_new_%out_ok
359
+ [END_MACRO]
360
+
361
+ [MACRO] ATOMIC_U16_INIT %atomic_ptr, %value
362
+ store %atomic_ptr+AtomicU16_value, %value as u16
363
+ [END_MACRO]
364
+
365
+ [MACRO] ATOMIC_U16_GET_MUT_PTR %out_ptr, %atomic_ptr
366
+ %out_ptr = ptr_add %atomic_ptr, AtomicU16_value
367
+ [END_MACRO]
368
+
369
+ [MACRO] ATOMIC_U16_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
370
+ %out_atomic_ptr = ptr_add %value_ptr, 0
371
+ [END_MACRO]
372
+
373
+ [MACRO] ATOMIC_U16_FROM_PTR %out_atomic_ptr, %value_ptr
374
+ EXPAND ATOMIC_U16_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
375
+ [END_MACRO]
376
+
377
+ [MACRO] ATOMIC_U16_INTO_INNER %out_value, %atomic_ptr
378
+ %out_value = load %atomic_ptr+AtomicU16_value as u16
379
+ [END_MACRO]
380
+
381
+ [MACRO] ATOMIC_U16_LOAD %out_value, %atomic_ptr, %ordering
382
+ %out_value = atomic_load %atomic_ptr+AtomicU16_value as u16 %ordering
383
+ [END_MACRO]
384
+
385
+ [MACRO] ATOMIC_U16_STORE %atomic_ptr, %value, %ordering
386
+ atomic_store %atomic_ptr+AtomicU16_value, %value as u16 %ordering
387
+ [END_MACRO]
388
+
389
+ [MACRO] ATOMIC_U16_SWAP %out_old, %atomic_ptr, %value, %ordering
390
+ %out_old = atomic_rmw_xchg %atomic_ptr+AtomicU16_value, %value as u16 %ordering
391
+ [END_MACRO]
392
+
393
+ [MACRO] ATOMIC_U16_FETCH_ADD %out_old, %atomic_ptr, %value, %ordering
394
+ %out_old = atomic_rmw_add %atomic_ptr+AtomicU16_value, %value as u16 %ordering
395
+ [END_MACRO]
396
+
397
+ [MACRO] ATOMIC_U16_FETCH_SUB %out_old, %atomic_ptr, %value, %ordering
398
+ %out_old = atomic_rmw_sub %atomic_ptr+AtomicU16_value, %value as u16 %ordering
399
+ [END_MACRO]
400
+
401
+ [MACRO] ATOMIC_U16_FETCH_AND %out_old, %atomic_ptr, %value, %ordering
402
+ %out_old = atomic_rmw_and %atomic_ptr+AtomicU16_value, %value as u16 %ordering
403
+ [END_MACRO]
404
+
405
+ [MACRO] ATOMIC_U16_FETCH_OR %out_old, %atomic_ptr, %value, %ordering
406
+ %out_old = atomic_rmw_or %atomic_ptr+AtomicU16_value, %value as u16 %ordering
407
+ [END_MACRO]
408
+
409
+ [MACRO] ATOMIC_U16_FETCH_XOR %out_old, %atomic_ptr, %value, %ordering
410
+ %out_old = atomic_rmw_xor %atomic_ptr+AtomicU16_value, %value as u16 %ordering
411
+ [END_MACRO]
412
+
413
+ [MACRO] ATOMIC_U16_FETCH_NAND %out_old, %atomic_ptr, %value, %ordering
414
+ jmp L_ATOMIC_U16_FETCH_NAND_HEAD_%out_old
415
+ L_ATOMIC_U16_FETCH_NAND_HEAD_%out_old:
416
+ %out_old = atomic_load %atomic_ptr+AtomicU16_value as u16 relaxed
417
+ __atomic_u16_nand_and_%out_old = and %out_old, %value
418
+ __atomic_u16_nand_new_%out_old = xor __atomic_u16_nand_and_%out_old, -1
419
+ __atomic_u16_nand_cur_%out_old, __atomic_u16_nand_ok_%out_old = cmpxchg %atomic_ptr+AtomicU16_value, %out_old, __atomic_u16_nand_new_%out_old as u16 %ordering %ordering
420
+ br __atomic_u16_nand_ok_%out_old -> L_ATOMIC_U16_FETCH_NAND_DONE_%out_old, L_ATOMIC_U16_FETCH_NAND_RETRY_%out_old
421
+ L_ATOMIC_U16_FETCH_NAND_RETRY_%out_old:
422
+ !__atomic_u16_nand_ok_%out_old
423
+ !__atomic_u16_nand_cur_%out_old
424
+ !__atomic_u16_nand_new_%out_old
425
+ !__atomic_u16_nand_and_%out_old
426
+ !%out_old
427
+ jmp L_ATOMIC_U16_FETCH_NAND_HEAD_%out_old
428
+ L_ATOMIC_U16_FETCH_NAND_DONE_%out_old:
429
+ !__atomic_u16_nand_ok_%out_old
430
+ !__atomic_u16_nand_cur_%out_old
431
+ !__atomic_u16_nand_new_%out_old
432
+ !__atomic_u16_nand_and_%out_old
433
+ [END_MACRO]
434
+
435
+
436
+ [MACRO] ATOMIC_U16_FETCH_MIN %out_old, %atomic_ptr, %value, %ordering
437
+ %out_old = atomic_rmw_min %atomic_ptr+AtomicU16_value, %value as u16 %ordering
438
+ [END_MACRO]
439
+
440
+ [MACRO] ATOMIC_U16_FETCH_MAX %out_old, %atomic_ptr, %value, %ordering
441
+ %out_old = atomic_rmw_max %atomic_ptr+AtomicU16_value, %value as u16 %ordering
442
+ [END_MACRO]
443
+
444
+ [MACRO] ATOMIC_U16_FETCH_UMIN %out_old, %atomic_ptr, %value, %ordering
445
+ %out_old = atomic_rmw_umin %atomic_ptr+AtomicU16_value, %value as u16 %ordering
446
+ [END_MACRO]
447
+
448
+ [MACRO] ATOMIC_U16_FETCH_UMAX %out_old, %atomic_ptr, %value, %ordering
449
+ %out_old = atomic_rmw_umax %atomic_ptr+AtomicU16_value, %value as u16 %ordering
450
+ [END_MACRO]
451
+
452
+ [MACRO] ATOMIC_U16_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
453
+ %out_old, %out_ok = cmpxchg %atomic_ptr+AtomicU16_value, %expected, %new_value as u16 %success_ordering %failure_ordering
454
+ [END_MACRO]
455
+
456
+ [MACRO] ATOMIC_U16_COMPARE_EXCHANGE_WEAK %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
457
+ EXPAND ATOMIC_U16_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
458
+ [END_MACRO]
459
+
460
+ // fetch_update-style loop over cmpxchg. The update function is a macro-level
461
+ // `u16 -> u16` register, not a Rust closure object. Always reports ok=1 when
462
+ // the store eventually succeeds (no None-abort path).
463
+
464
+ [MACRO] ATOMIC_U16_FETCH_UPDATE %out_ok, %out_old, %atomic_ptr, %update_fn, %success_ordering, %failure_ordering
465
+ jmp L_ATOMIC_U16_FETCH_UPDATE_HEAD_%out_ok
466
+ L_ATOMIC_U16_FETCH_UPDATE_HEAD_%out_ok:
467
+ %out_old = atomic_load %atomic_ptr+AtomicU16_value as u16 relaxed
468
+ __atomic_u16_fetch_update_new_%out_ok = call %update_fn(%out_old)
469
+ __atomic_u16_fetch_update_cur_%out_ok, __atomic_u16_fetch_update_ok_%out_ok = cmpxchg %atomic_ptr+AtomicU16_value, %out_old, __atomic_u16_fetch_update_new_%out_ok as u16 %success_ordering %failure_ordering
470
+ br __atomic_u16_fetch_update_ok_%out_ok -> L_ATOMIC_U16_FETCH_UPDATE_DONE_%out_ok, L_ATOMIC_U16_FETCH_UPDATE_RETRY_%out_ok
471
+ L_ATOMIC_U16_FETCH_UPDATE_RETRY_%out_ok:
472
+ !__atomic_u16_fetch_update_ok_%out_ok
473
+ !__atomic_u16_fetch_update_cur_%out_ok
474
+ !__atomic_u16_fetch_update_new_%out_ok
475
+ !%out_old
476
+ jmp L_ATOMIC_U16_FETCH_UPDATE_HEAD_%out_ok
477
+ L_ATOMIC_U16_FETCH_UPDATE_DONE_%out_ok:
478
+ %out_ok = add 0, 1
479
+ !__atomic_u16_fetch_update_ok_%out_ok
480
+ !__atomic_u16_fetch_update_cur_%out_ok
481
+ !__atomic_u16_fetch_update_new_%out_ok
482
+ [END_MACRO]
483
+
484
+ [MACRO] ATOMIC_I16_INIT %atomic_ptr, %value
485
+ store %atomic_ptr+AtomicI16_value, %value as i16
486
+ [END_MACRO]
487
+
488
+ [MACRO] ATOMIC_I16_GET_MUT_PTR %out_ptr, %atomic_ptr
489
+ %out_ptr = ptr_add %atomic_ptr, AtomicI16_value
490
+ [END_MACRO]
491
+
492
+ [MACRO] ATOMIC_I16_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
493
+ %out_atomic_ptr = ptr_add %value_ptr, 0
494
+ [END_MACRO]
495
+
496
+ [MACRO] ATOMIC_I16_FROM_PTR %out_atomic_ptr, %value_ptr
497
+ EXPAND ATOMIC_I16_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
498
+ [END_MACRO]
499
+
500
+ [MACRO] ATOMIC_I16_INTO_INNER %out_value, %atomic_ptr
501
+ %out_value = load %atomic_ptr+AtomicI16_value as i16
502
+ [END_MACRO]
503
+
504
+ [MACRO] ATOMIC_I16_LOAD %out_value, %atomic_ptr, %ordering
505
+ %out_value = atomic_load %atomic_ptr+AtomicI16_value as i16 %ordering
506
+ [END_MACRO]
507
+
508
+ [MACRO] ATOMIC_I16_STORE %atomic_ptr, %value, %ordering
509
+ atomic_store %atomic_ptr+AtomicI16_value, %value as i16 %ordering
510
+ [END_MACRO]
511
+
512
+ [MACRO] ATOMIC_I16_SWAP %out_old, %atomic_ptr, %value, %ordering
513
+ %out_old = atomic_rmw_xchg %atomic_ptr+AtomicI16_value, %value as i16 %ordering
514
+ [END_MACRO]
515
+
516
+ [MACRO] ATOMIC_I16_FETCH_ADD %out_old, %atomic_ptr, %value, %ordering
517
+ %out_old = atomic_rmw_add %atomic_ptr+AtomicI16_value, %value as i16 %ordering
518
+ [END_MACRO]
519
+
520
+ [MACRO] ATOMIC_I16_FETCH_SUB %out_old, %atomic_ptr, %value, %ordering
521
+ %out_old = atomic_rmw_sub %atomic_ptr+AtomicI16_value, %value as i16 %ordering
522
+ [END_MACRO]
523
+
524
+ [MACRO] ATOMIC_I16_FETCH_AND %out_old, %atomic_ptr, %value, %ordering
525
+ %out_old = atomic_rmw_and %atomic_ptr+AtomicI16_value, %value as i16 %ordering
526
+ [END_MACRO]
527
+
528
+ [MACRO] ATOMIC_I16_FETCH_OR %out_old, %atomic_ptr, %value, %ordering
529
+ %out_old = atomic_rmw_or %atomic_ptr+AtomicI16_value, %value as i16 %ordering
530
+ [END_MACRO]
531
+
532
+ [MACRO] ATOMIC_I16_FETCH_XOR %out_old, %atomic_ptr, %value, %ordering
533
+ %out_old = atomic_rmw_xor %atomic_ptr+AtomicI16_value, %value as i16 %ordering
534
+ [END_MACRO]
535
+
536
+ [MACRO] ATOMIC_I16_FETCH_NAND %out_old, %atomic_ptr, %value, %ordering
537
+ jmp L_ATOMIC_I16_FETCH_NAND_HEAD_%out_old
538
+ L_ATOMIC_I16_FETCH_NAND_HEAD_%out_old:
539
+ %out_old = atomic_load %atomic_ptr+AtomicI16_value as i16 relaxed
540
+ __atomic_i16_nand_and_%out_old = and %out_old, %value
541
+ __atomic_i16_nand_new_%out_old = xor __atomic_i16_nand_and_%out_old, -1
542
+ __atomic_i16_nand_cur_%out_old, __atomic_i16_nand_ok_%out_old = cmpxchg %atomic_ptr+AtomicI16_value, %out_old, __atomic_i16_nand_new_%out_old as i16 %ordering %ordering
543
+ br __atomic_i16_nand_ok_%out_old -> L_ATOMIC_I16_FETCH_NAND_DONE_%out_old, L_ATOMIC_I16_FETCH_NAND_RETRY_%out_old
544
+ L_ATOMIC_I16_FETCH_NAND_RETRY_%out_old:
545
+ !__atomic_i16_nand_ok_%out_old
546
+ !__atomic_i16_nand_cur_%out_old
547
+ !__atomic_i16_nand_new_%out_old
548
+ !__atomic_i16_nand_and_%out_old
549
+ !%out_old
550
+ jmp L_ATOMIC_I16_FETCH_NAND_HEAD_%out_old
551
+ L_ATOMIC_I16_FETCH_NAND_DONE_%out_old:
552
+ !__atomic_i16_nand_ok_%out_old
553
+ !__atomic_i16_nand_cur_%out_old
554
+ !__atomic_i16_nand_new_%out_old
555
+ !__atomic_i16_nand_and_%out_old
556
+ [END_MACRO]
557
+
558
+
559
+ [MACRO] ATOMIC_I16_FETCH_MIN %out_old, %atomic_ptr, %value, %ordering
560
+ %out_old = atomic_rmw_min %atomic_ptr+AtomicI16_value, %value as i16 %ordering
561
+ [END_MACRO]
562
+
563
+ [MACRO] ATOMIC_I16_FETCH_MAX %out_old, %atomic_ptr, %value, %ordering
564
+ %out_old = atomic_rmw_max %atomic_ptr+AtomicI16_value, %value as i16 %ordering
565
+ [END_MACRO]
566
+
567
+ [MACRO] ATOMIC_I16_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
568
+ %out_old, %out_ok = cmpxchg %atomic_ptr+AtomicI16_value, %expected, %new_value as i16 %success_ordering %failure_ordering
569
+ [END_MACRO]
570
+
571
+ [MACRO] ATOMIC_I16_COMPARE_EXCHANGE_WEAK %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
572
+ EXPAND ATOMIC_I16_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
573
+ [END_MACRO]
574
+
575
+ // fetch_update-style loop over cmpxchg. The update function is a macro-level
576
+ // `i16 -> i16` register, not a Rust closure object. Always reports ok=1 when
577
+ // the store eventually succeeds (no None-abort path).
578
+
579
+ [MACRO] ATOMIC_I16_FETCH_UPDATE %out_ok, %out_old, %atomic_ptr, %update_fn, %success_ordering, %failure_ordering
580
+ jmp L_ATOMIC_I16_FETCH_UPDATE_HEAD_%out_ok
581
+ L_ATOMIC_I16_FETCH_UPDATE_HEAD_%out_ok:
582
+ %out_old = atomic_load %atomic_ptr+AtomicI16_value as i16 relaxed
583
+ __atomic_i16_fetch_update_new_%out_ok = call %update_fn(%out_old)
584
+ __atomic_i16_fetch_update_cur_%out_ok, __atomic_i16_fetch_update_ok_%out_ok = cmpxchg %atomic_ptr+AtomicI16_value, %out_old, __atomic_i16_fetch_update_new_%out_ok as i16 %success_ordering %failure_ordering
585
+ br __atomic_i16_fetch_update_ok_%out_ok -> L_ATOMIC_I16_FETCH_UPDATE_DONE_%out_ok, L_ATOMIC_I16_FETCH_UPDATE_RETRY_%out_ok
586
+ L_ATOMIC_I16_FETCH_UPDATE_RETRY_%out_ok:
587
+ !__atomic_i16_fetch_update_ok_%out_ok
588
+ !__atomic_i16_fetch_update_cur_%out_ok
589
+ !__atomic_i16_fetch_update_new_%out_ok
590
+ !%out_old
591
+ jmp L_ATOMIC_I16_FETCH_UPDATE_HEAD_%out_ok
592
+ L_ATOMIC_I16_FETCH_UPDATE_DONE_%out_ok:
593
+ %out_ok = add 0, 1
594
+ !__atomic_i16_fetch_update_ok_%out_ok
595
+ !__atomic_i16_fetch_update_cur_%out_ok
596
+ !__atomic_i16_fetch_update_new_%out_ok
597
+ [END_MACRO]
598
+
599
+ [MACRO] ATOMIC_U32_INIT %atomic_ptr, %value
600
+ store %atomic_ptr+AtomicU32_value, %value as u32
601
+ [END_MACRO]
602
+
603
+ [MACRO] ATOMIC_U32_GET_MUT_PTR %out_ptr, %atomic_ptr
604
+ %out_ptr = ptr_add %atomic_ptr, AtomicU32_value
605
+ [END_MACRO]
606
+
607
+ [MACRO] ATOMIC_U32_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
608
+ %out_atomic_ptr = ptr_add %value_ptr, 0
609
+ [END_MACRO]
610
+
611
+ [MACRO] ATOMIC_U32_FROM_PTR %out_atomic_ptr, %value_ptr
612
+ EXPAND ATOMIC_U32_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
613
+ [END_MACRO]
614
+
615
+ [MACRO] ATOMIC_U32_INTO_INNER %out_value, %atomic_ptr
616
+ %out_value = load %atomic_ptr+AtomicU32_value as u32
617
+ [END_MACRO]
618
+
619
+ [MACRO] ATOMIC_U32_LOAD %out_value, %atomic_ptr, %ordering
620
+ %out_value = atomic_load %atomic_ptr+AtomicU32_value as u32 %ordering
621
+ [END_MACRO]
622
+
623
+ [MACRO] ATOMIC_U32_STORE %atomic_ptr, %value, %ordering
624
+ atomic_store %atomic_ptr+AtomicU32_value, %value as u32 %ordering
625
+ [END_MACRO]
626
+
627
+ [MACRO] ATOMIC_U32_SWAP %out_old, %atomic_ptr, %value, %ordering
628
+ %out_old = atomic_rmw_xchg %atomic_ptr+AtomicU32_value, %value as u32 %ordering
629
+ [END_MACRO]
630
+
631
+ [MACRO] ATOMIC_U32_FETCH_ADD %out_old, %atomic_ptr, %value, %ordering
632
+ %out_old = atomic_rmw_add %atomic_ptr+AtomicU32_value, %value as u32 %ordering
633
+ [END_MACRO]
634
+
635
+ [MACRO] ATOMIC_U32_FETCH_SUB %out_old, %atomic_ptr, %value, %ordering
636
+ %out_old = atomic_rmw_sub %atomic_ptr+AtomicU32_value, %value as u32 %ordering
637
+ [END_MACRO]
638
+
639
+ [MACRO] ATOMIC_U32_FETCH_AND %out_old, %atomic_ptr, %value, %ordering
640
+ %out_old = atomic_rmw_and %atomic_ptr+AtomicU32_value, %value as u32 %ordering
641
+ [END_MACRO]
642
+
643
+ [MACRO] ATOMIC_U32_FETCH_OR %out_old, %atomic_ptr, %value, %ordering
644
+ %out_old = atomic_rmw_or %atomic_ptr+AtomicU32_value, %value as u32 %ordering
645
+ [END_MACRO]
646
+
647
+ [MACRO] ATOMIC_U32_FETCH_XOR %out_old, %atomic_ptr, %value, %ordering
648
+ %out_old = atomic_rmw_xor %atomic_ptr+AtomicU32_value, %value as u32 %ordering
649
+ [END_MACRO]
650
+
651
+ [MACRO] ATOMIC_U32_FETCH_NAND %out_old, %atomic_ptr, %value, %ordering
652
+ jmp L_ATOMIC_U32_FETCH_NAND_HEAD_%out_old
653
+ L_ATOMIC_U32_FETCH_NAND_HEAD_%out_old:
654
+ %out_old = atomic_load %atomic_ptr+AtomicU32_value as u32 relaxed
655
+ __atomic_u32_nand_and_%out_old = and %out_old, %value
656
+ __atomic_u32_nand_new_%out_old = xor __atomic_u32_nand_and_%out_old, -1
657
+ __atomic_u32_nand_cur_%out_old, __atomic_u32_nand_ok_%out_old = cmpxchg %atomic_ptr+AtomicU32_value, %out_old, __atomic_u32_nand_new_%out_old as u32 %ordering %ordering
658
+ br __atomic_u32_nand_ok_%out_old -> L_ATOMIC_U32_FETCH_NAND_DONE_%out_old, L_ATOMIC_U32_FETCH_NAND_RETRY_%out_old
659
+ L_ATOMIC_U32_FETCH_NAND_RETRY_%out_old:
660
+ !__atomic_u32_nand_ok_%out_old
661
+ !__atomic_u32_nand_cur_%out_old
662
+ !__atomic_u32_nand_new_%out_old
663
+ !__atomic_u32_nand_and_%out_old
664
+ !%out_old
665
+ jmp L_ATOMIC_U32_FETCH_NAND_HEAD_%out_old
666
+ L_ATOMIC_U32_FETCH_NAND_DONE_%out_old:
667
+ !__atomic_u32_nand_ok_%out_old
668
+ !__atomic_u32_nand_cur_%out_old
669
+ !__atomic_u32_nand_new_%out_old
670
+ !__atomic_u32_nand_and_%out_old
671
+ [END_MACRO]
672
+
673
+
674
+ [MACRO] ATOMIC_U32_FETCH_MIN %out_old, %atomic_ptr, %value, %ordering
675
+ %out_old = atomic_rmw_min %atomic_ptr+AtomicU32_value, %value as u32 %ordering
676
+ [END_MACRO]
677
+
678
+ [MACRO] ATOMIC_U32_FETCH_MAX %out_old, %atomic_ptr, %value, %ordering
679
+ %out_old = atomic_rmw_max %atomic_ptr+AtomicU32_value, %value as u32 %ordering
680
+ [END_MACRO]
681
+
682
+ [MACRO] ATOMIC_U32_FETCH_UMIN %out_old, %atomic_ptr, %value, %ordering
683
+ %out_old = atomic_rmw_umin %atomic_ptr+AtomicU32_value, %value as u32 %ordering
684
+ [END_MACRO]
685
+
686
+ [MACRO] ATOMIC_U32_FETCH_UMAX %out_old, %atomic_ptr, %value, %ordering
687
+ %out_old = atomic_rmw_umax %atomic_ptr+AtomicU32_value, %value as u32 %ordering
688
+ [END_MACRO]
689
+
690
+ [MACRO] ATOMIC_U32_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
691
+ %out_old, %out_ok = cmpxchg %atomic_ptr+AtomicU32_value, %expected, %new_value as u32 %success_ordering %failure_ordering
692
+ [END_MACRO]
693
+
694
+ [MACRO] ATOMIC_U32_COMPARE_EXCHANGE_WEAK %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
695
+ EXPAND ATOMIC_U32_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
696
+ [END_MACRO]
697
+
698
+ // fetch_update-style loop over cmpxchg. The update function is a macro-level
699
+ // `u32 -> u32` register, not a Rust closure object. Always reports ok=1 when
700
+ // the store eventually succeeds (no None-abort path).
701
+
702
+ [MACRO] ATOMIC_U32_FETCH_UPDATE %out_ok, %out_old, %atomic_ptr, %update_fn, %success_ordering, %failure_ordering
703
+ jmp L_ATOMIC_U32_FETCH_UPDATE_HEAD_%out_ok
704
+ L_ATOMIC_U32_FETCH_UPDATE_HEAD_%out_ok:
705
+ %out_old = atomic_load %atomic_ptr+AtomicU32_value as u32 relaxed
706
+ __atomic_u32_fetch_update_new_%out_ok = call %update_fn(%out_old)
707
+ __atomic_u32_fetch_update_cur_%out_ok, __atomic_u32_fetch_update_ok_%out_ok = cmpxchg %atomic_ptr+AtomicU32_value, %out_old, __atomic_u32_fetch_update_new_%out_ok as u32 %success_ordering %failure_ordering
708
+ br __atomic_u32_fetch_update_ok_%out_ok -> L_ATOMIC_U32_FETCH_UPDATE_DONE_%out_ok, L_ATOMIC_U32_FETCH_UPDATE_RETRY_%out_ok
709
+ L_ATOMIC_U32_FETCH_UPDATE_RETRY_%out_ok:
710
+ !__atomic_u32_fetch_update_ok_%out_ok
711
+ !__atomic_u32_fetch_update_cur_%out_ok
712
+ !__atomic_u32_fetch_update_new_%out_ok
713
+ !%out_old
714
+ jmp L_ATOMIC_U32_FETCH_UPDATE_HEAD_%out_ok
715
+ L_ATOMIC_U32_FETCH_UPDATE_DONE_%out_ok:
716
+ %out_ok = add 0, 1
717
+ !__atomic_u32_fetch_update_ok_%out_ok
718
+ !__atomic_u32_fetch_update_cur_%out_ok
719
+ !__atomic_u32_fetch_update_new_%out_ok
720
+ [END_MACRO]
721
+
722
+ [MACRO] ATOMIC_I32_INIT %atomic_ptr, %value
723
+ store %atomic_ptr+AtomicI32_value, %value as i32
724
+ [END_MACRO]
725
+
726
+ [MACRO] ATOMIC_I32_GET_MUT_PTR %out_ptr, %atomic_ptr
727
+ %out_ptr = ptr_add %atomic_ptr, AtomicI32_value
728
+ [END_MACRO]
729
+
730
+ [MACRO] ATOMIC_I32_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
731
+ %out_atomic_ptr = ptr_add %value_ptr, 0
732
+ [END_MACRO]
733
+
734
+ [MACRO] ATOMIC_I32_FROM_PTR %out_atomic_ptr, %value_ptr
735
+ EXPAND ATOMIC_I32_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
736
+ [END_MACRO]
737
+
738
+ [MACRO] ATOMIC_I32_INTO_INNER %out_value, %atomic_ptr
739
+ %out_value = load %atomic_ptr+AtomicI32_value as i32
740
+ [END_MACRO]
741
+
742
+ [MACRO] ATOMIC_I32_LOAD %out_value, %atomic_ptr, %ordering
743
+ %out_value = atomic_load %atomic_ptr+AtomicI32_value as i32 %ordering
744
+ [END_MACRO]
745
+
746
+ [MACRO] ATOMIC_I32_STORE %atomic_ptr, %value, %ordering
747
+ atomic_store %atomic_ptr+AtomicI32_value, %value as i32 %ordering
748
+ [END_MACRO]
749
+
750
+ [MACRO] ATOMIC_I32_SWAP %out_old, %atomic_ptr, %value, %ordering
751
+ %out_old = atomic_rmw_xchg %atomic_ptr+AtomicI32_value, %value as i32 %ordering
752
+ [END_MACRO]
753
+
754
+ [MACRO] ATOMIC_I32_FETCH_ADD %out_old, %atomic_ptr, %value, %ordering
755
+ %out_old = atomic_rmw_add %atomic_ptr+AtomicI32_value, %value as i32 %ordering
756
+ [END_MACRO]
757
+
758
+ [MACRO] ATOMIC_I32_FETCH_SUB %out_old, %atomic_ptr, %value, %ordering
759
+ %out_old = atomic_rmw_sub %atomic_ptr+AtomicI32_value, %value as i32 %ordering
760
+ [END_MACRO]
761
+
762
+ [MACRO] ATOMIC_I32_FETCH_AND %out_old, %atomic_ptr, %value, %ordering
763
+ %out_old = atomic_rmw_and %atomic_ptr+AtomicI32_value, %value as i32 %ordering
764
+ [END_MACRO]
765
+
766
+ [MACRO] ATOMIC_I32_FETCH_OR %out_old, %atomic_ptr, %value, %ordering
767
+ %out_old = atomic_rmw_or %atomic_ptr+AtomicI32_value, %value as i32 %ordering
768
+ [END_MACRO]
769
+
770
+ [MACRO] ATOMIC_I32_FETCH_XOR %out_old, %atomic_ptr, %value, %ordering
771
+ %out_old = atomic_rmw_xor %atomic_ptr+AtomicI32_value, %value as i32 %ordering
772
+ [END_MACRO]
773
+
774
+ [MACRO] ATOMIC_I32_FETCH_NAND %out_old, %atomic_ptr, %value, %ordering
775
+ jmp L_ATOMIC_I32_FETCH_NAND_HEAD_%out_old
776
+ L_ATOMIC_I32_FETCH_NAND_HEAD_%out_old:
777
+ %out_old = atomic_load %atomic_ptr+AtomicI32_value as i32 relaxed
778
+ __atomic_i32_nand_and_%out_old = and %out_old, %value
779
+ __atomic_i32_nand_new_%out_old = xor __atomic_i32_nand_and_%out_old, -1
780
+ __atomic_i32_nand_cur_%out_old, __atomic_i32_nand_ok_%out_old = cmpxchg %atomic_ptr+AtomicI32_value, %out_old, __atomic_i32_nand_new_%out_old as i32 %ordering %ordering
781
+ br __atomic_i32_nand_ok_%out_old -> L_ATOMIC_I32_FETCH_NAND_DONE_%out_old, L_ATOMIC_I32_FETCH_NAND_RETRY_%out_old
782
+ L_ATOMIC_I32_FETCH_NAND_RETRY_%out_old:
783
+ !__atomic_i32_nand_ok_%out_old
784
+ !__atomic_i32_nand_cur_%out_old
785
+ !__atomic_i32_nand_new_%out_old
786
+ !__atomic_i32_nand_and_%out_old
787
+ !%out_old
788
+ jmp L_ATOMIC_I32_FETCH_NAND_HEAD_%out_old
789
+ L_ATOMIC_I32_FETCH_NAND_DONE_%out_old:
790
+ !__atomic_i32_nand_ok_%out_old
791
+ !__atomic_i32_nand_cur_%out_old
792
+ !__atomic_i32_nand_new_%out_old
793
+ !__atomic_i32_nand_and_%out_old
794
+ [END_MACRO]
795
+
796
+
797
+ [MACRO] ATOMIC_I32_FETCH_MIN %out_old, %atomic_ptr, %value, %ordering
798
+ %out_old = atomic_rmw_min %atomic_ptr+AtomicI32_value, %value as i32 %ordering
799
+ [END_MACRO]
800
+
801
+ [MACRO] ATOMIC_I32_FETCH_MAX %out_old, %atomic_ptr, %value, %ordering
802
+ %out_old = atomic_rmw_max %atomic_ptr+AtomicI32_value, %value as i32 %ordering
803
+ [END_MACRO]
804
+
805
+ [MACRO] ATOMIC_I32_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
806
+ %out_old, %out_ok = cmpxchg %atomic_ptr+AtomicI32_value, %expected, %new_value as i32 %success_ordering %failure_ordering
807
+ [END_MACRO]
808
+
809
+ [MACRO] ATOMIC_I32_COMPARE_EXCHANGE_WEAK %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
810
+ EXPAND ATOMIC_I32_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
811
+ [END_MACRO]
812
+
813
+ // fetch_update-style loop over cmpxchg. The update function is a macro-level
814
+ // `i32 -> i32` register, not a Rust closure object. Always reports ok=1 when
815
+ // the store eventually succeeds (no None-abort path).
816
+
817
+ [MACRO] ATOMIC_I32_FETCH_UPDATE %out_ok, %out_old, %atomic_ptr, %update_fn, %success_ordering, %failure_ordering
818
+ jmp L_ATOMIC_I32_FETCH_UPDATE_HEAD_%out_ok
819
+ L_ATOMIC_I32_FETCH_UPDATE_HEAD_%out_ok:
820
+ %out_old = atomic_load %atomic_ptr+AtomicI32_value as i32 relaxed
821
+ __atomic_i32_fetch_update_new_%out_ok = call %update_fn(%out_old)
822
+ __atomic_i32_fetch_update_cur_%out_ok, __atomic_i32_fetch_update_ok_%out_ok = cmpxchg %atomic_ptr+AtomicI32_value, %out_old, __atomic_i32_fetch_update_new_%out_ok as i32 %success_ordering %failure_ordering
823
+ br __atomic_i32_fetch_update_ok_%out_ok -> L_ATOMIC_I32_FETCH_UPDATE_DONE_%out_ok, L_ATOMIC_I32_FETCH_UPDATE_RETRY_%out_ok
824
+ L_ATOMIC_I32_FETCH_UPDATE_RETRY_%out_ok:
825
+ !__atomic_i32_fetch_update_ok_%out_ok
826
+ !__atomic_i32_fetch_update_cur_%out_ok
827
+ !__atomic_i32_fetch_update_new_%out_ok
828
+ !%out_old
829
+ jmp L_ATOMIC_I32_FETCH_UPDATE_HEAD_%out_ok
830
+ L_ATOMIC_I32_FETCH_UPDATE_DONE_%out_ok:
831
+ %out_ok = add 0, 1
832
+ !__atomic_i32_fetch_update_ok_%out_ok
833
+ !__atomic_i32_fetch_update_cur_%out_ok
834
+ !__atomic_i32_fetch_update_new_%out_ok
835
+ [END_MACRO]
836
+
837
+ [MACRO] ATOMIC_U64_INIT %atomic_ptr, %value
838
+ store %atomic_ptr+AtomicU64_value, %value as u64
839
+ [END_MACRO]
840
+
841
+ [MACRO] ATOMIC_U64_GET_MUT_PTR %out_ptr, %atomic_ptr
842
+ %out_ptr = ptr_add %atomic_ptr, AtomicU64_value
843
+ [END_MACRO]
844
+
845
+ [MACRO] ATOMIC_U64_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
846
+ %out_atomic_ptr = ptr_add %value_ptr, 0
847
+ [END_MACRO]
848
+
849
+ [MACRO] ATOMIC_U64_FROM_PTR %out_atomic_ptr, %value_ptr
850
+ EXPAND ATOMIC_U64_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
851
+ [END_MACRO]
852
+
853
+ [MACRO] ATOMIC_U64_INTO_INNER %out_value, %atomic_ptr
854
+ %out_value = load %atomic_ptr+AtomicU64_value as u64
855
+ [END_MACRO]
856
+
857
+ [MACRO] ATOMIC_U64_LOAD %out_value, %atomic_ptr, %ordering
858
+ %out_value = atomic_load %atomic_ptr+AtomicU64_value as u64 %ordering
859
+ [END_MACRO]
860
+
861
+ [MACRO] ATOMIC_U64_STORE %atomic_ptr, %value, %ordering
862
+ atomic_store %atomic_ptr+AtomicU64_value, %value as u64 %ordering
863
+ [END_MACRO]
864
+
865
+ [MACRO] ATOMIC_U64_SWAP %out_old, %atomic_ptr, %value, %ordering
866
+ %out_old = atomic_rmw_xchg %atomic_ptr+AtomicU64_value, %value as u64 %ordering
867
+ [END_MACRO]
868
+
869
+ [MACRO] ATOMIC_U64_FETCH_ADD %out_old, %atomic_ptr, %value, %ordering
870
+ %out_old = atomic_rmw_add %atomic_ptr+AtomicU64_value, %value as u64 %ordering
871
+ [END_MACRO]
872
+
873
+ [MACRO] ATOMIC_U64_FETCH_SUB %out_old, %atomic_ptr, %value, %ordering
874
+ %out_old = atomic_rmw_sub %atomic_ptr+AtomicU64_value, %value as u64 %ordering
875
+ [END_MACRO]
876
+
877
+ [MACRO] ATOMIC_U64_FETCH_AND %out_old, %atomic_ptr, %value, %ordering
878
+ %out_old = atomic_rmw_and %atomic_ptr+AtomicU64_value, %value as u64 %ordering
879
+ [END_MACRO]
880
+
881
+ [MACRO] ATOMIC_U64_FETCH_OR %out_old, %atomic_ptr, %value, %ordering
882
+ %out_old = atomic_rmw_or %atomic_ptr+AtomicU64_value, %value as u64 %ordering
883
+ [END_MACRO]
884
+
885
+ [MACRO] ATOMIC_U64_FETCH_XOR %out_old, %atomic_ptr, %value, %ordering
886
+ %out_old = atomic_rmw_xor %atomic_ptr+AtomicU64_value, %value as u64 %ordering
887
+ [END_MACRO]
888
+
889
+ [MACRO] ATOMIC_U64_FETCH_NAND %out_old, %atomic_ptr, %value, %ordering
890
+ jmp L_ATOMIC_U64_FETCH_NAND_HEAD_%out_old
891
+ L_ATOMIC_U64_FETCH_NAND_HEAD_%out_old:
892
+ %out_old = atomic_load %atomic_ptr+AtomicU64_value as u64 relaxed
893
+ __atomic_u64_nand_and_%out_old = and %out_old, %value
894
+ __atomic_u64_nand_new_%out_old = xor __atomic_u64_nand_and_%out_old, -1
895
+ __atomic_u64_nand_cur_%out_old, __atomic_u64_nand_ok_%out_old = cmpxchg %atomic_ptr+AtomicU64_value, %out_old, __atomic_u64_nand_new_%out_old as u64 %ordering %ordering
896
+ br __atomic_u64_nand_ok_%out_old -> L_ATOMIC_U64_FETCH_NAND_DONE_%out_old, L_ATOMIC_U64_FETCH_NAND_RETRY_%out_old
897
+ L_ATOMIC_U64_FETCH_NAND_RETRY_%out_old:
898
+ !__atomic_u64_nand_ok_%out_old
899
+ !__atomic_u64_nand_cur_%out_old
900
+ !__atomic_u64_nand_new_%out_old
901
+ !__atomic_u64_nand_and_%out_old
902
+ !%out_old
903
+ jmp L_ATOMIC_U64_FETCH_NAND_HEAD_%out_old
904
+ L_ATOMIC_U64_FETCH_NAND_DONE_%out_old:
905
+ !__atomic_u64_nand_ok_%out_old
906
+ !__atomic_u64_nand_cur_%out_old
907
+ !__atomic_u64_nand_new_%out_old
908
+ !__atomic_u64_nand_and_%out_old
909
+ [END_MACRO]
910
+
911
+ [MACRO] ATOMIC_U64_FETCH_MIN %out_old, %atomic_ptr, %value, %ordering
912
+ %out_old = atomic_rmw_min %atomic_ptr+AtomicU64_value, %value as u64 %ordering
913
+ [END_MACRO]
914
+
915
+ [MACRO] ATOMIC_U64_FETCH_MAX %out_old, %atomic_ptr, %value, %ordering
916
+ %out_old = atomic_rmw_max %atomic_ptr+AtomicU64_value, %value as u64 %ordering
917
+ [END_MACRO]
918
+
919
+ [MACRO] ATOMIC_U64_FETCH_UMIN %out_old, %atomic_ptr, %value, %ordering
920
+ %out_old = atomic_rmw_umin %atomic_ptr+AtomicU64_value, %value as u64 %ordering
921
+ [END_MACRO]
922
+
923
+ [MACRO] ATOMIC_U64_FETCH_UMAX %out_old, %atomic_ptr, %value, %ordering
924
+ %out_old = atomic_rmw_umax %atomic_ptr+AtomicU64_value, %value as u64 %ordering
925
+ [END_MACRO]
926
+
927
+ [MACRO] ATOMIC_U64_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
928
+ %out_old, %out_ok = cmpxchg %atomic_ptr+AtomicU64_value, %expected, %new_value as u64 %success_ordering %failure_ordering
929
+ [END_MACRO]
930
+
931
+ [MACRO] ATOMIC_U64_COMPARE_EXCHANGE_WEAK %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
932
+ EXPAND ATOMIC_U64_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
933
+ [END_MACRO]
934
+
935
+ // fetch_update-style loop over cmpxchg. The update function is a macro-level
936
+ // `u64 -> u64` register, not a Rust closure object. Always reports ok=1 when
937
+ // the store eventually succeeds (no None-abort path).
938
+
939
+ [MACRO] ATOMIC_U64_FETCH_UPDATE %out_ok, %out_old, %atomic_ptr, %update_fn, %success_ordering, %failure_ordering
940
+ jmp L_ATOMIC_U64_FETCH_UPDATE_HEAD_%out_ok
941
+ L_ATOMIC_U64_FETCH_UPDATE_HEAD_%out_ok:
942
+ %out_old = atomic_load %atomic_ptr+AtomicU64_value as u64 relaxed
943
+ __atomic_u64_fetch_update_new_%out_ok = call %update_fn(%out_old)
944
+ __atomic_u64_fetch_update_cur_%out_ok, __atomic_u64_fetch_update_ok_%out_ok = cmpxchg %atomic_ptr+AtomicU64_value, %out_old, __atomic_u64_fetch_update_new_%out_ok as u64 %success_ordering %failure_ordering
945
+ br __atomic_u64_fetch_update_ok_%out_ok -> L_ATOMIC_U64_FETCH_UPDATE_DONE_%out_ok, L_ATOMIC_U64_FETCH_UPDATE_RETRY_%out_ok
946
+ L_ATOMIC_U64_FETCH_UPDATE_RETRY_%out_ok:
947
+ !__atomic_u64_fetch_update_ok_%out_ok
948
+ !__atomic_u64_fetch_update_cur_%out_ok
949
+ !__atomic_u64_fetch_update_new_%out_ok
950
+ !%out_old
951
+ jmp L_ATOMIC_U64_FETCH_UPDATE_HEAD_%out_ok
952
+ L_ATOMIC_U64_FETCH_UPDATE_DONE_%out_ok:
953
+ %out_ok = add 0, 1
954
+ !__atomic_u64_fetch_update_ok_%out_ok
955
+ !__atomic_u64_fetch_update_cur_%out_ok
956
+ !__atomic_u64_fetch_update_new_%out_ok
957
+ [END_MACRO]
958
+
959
+ [MACRO] ATOMIC_I64_INIT %atomic_ptr, %value
960
+ store %atomic_ptr+AtomicI64_value, %value as i64
961
+ [END_MACRO]
962
+
963
+ [MACRO] ATOMIC_I64_GET_MUT_PTR %out_ptr, %atomic_ptr
964
+ %out_ptr = ptr_add %atomic_ptr, AtomicI64_value
965
+ [END_MACRO]
966
+
967
+ [MACRO] ATOMIC_I64_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
968
+ %out_atomic_ptr = ptr_add %value_ptr, 0
969
+ [END_MACRO]
970
+
971
+ [MACRO] ATOMIC_I64_FROM_PTR %out_atomic_ptr, %value_ptr
972
+ EXPAND ATOMIC_I64_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
973
+ [END_MACRO]
974
+
975
+ [MACRO] ATOMIC_I64_INTO_INNER %out_value, %atomic_ptr
976
+ %out_value = load %atomic_ptr+AtomicI64_value as i64
977
+ [END_MACRO]
978
+
979
+ [MACRO] ATOMIC_I64_LOAD %out_value, %atomic_ptr, %ordering
980
+ %out_value = atomic_load %atomic_ptr+AtomicI64_value as i64 %ordering
981
+ [END_MACRO]
982
+
983
+ [MACRO] ATOMIC_I64_STORE %atomic_ptr, %value, %ordering
984
+ atomic_store %atomic_ptr+AtomicI64_value, %value as i64 %ordering
985
+ [END_MACRO]
986
+
987
+ [MACRO] ATOMIC_I64_SWAP %out_old, %atomic_ptr, %value, %ordering
988
+ %out_old = atomic_rmw_xchg %atomic_ptr+AtomicI64_value, %value as i64 %ordering
989
+ [END_MACRO]
990
+
991
+ [MACRO] ATOMIC_I64_FETCH_ADD %out_old, %atomic_ptr, %value, %ordering
992
+ %out_old = atomic_rmw_add %atomic_ptr+AtomicI64_value, %value as i64 %ordering
993
+ [END_MACRO]
994
+
995
+ [MACRO] ATOMIC_I64_FETCH_SUB %out_old, %atomic_ptr, %value, %ordering
996
+ %out_old = atomic_rmw_sub %atomic_ptr+AtomicI64_value, %value as i64 %ordering
997
+ [END_MACRO]
998
+
999
+ [MACRO] ATOMIC_I64_FETCH_AND %out_old, %atomic_ptr, %value, %ordering
1000
+ %out_old = atomic_rmw_and %atomic_ptr+AtomicI64_value, %value as i64 %ordering
1001
+ [END_MACRO]
1002
+
1003
+ [MACRO] ATOMIC_I64_FETCH_OR %out_old, %atomic_ptr, %value, %ordering
1004
+ %out_old = atomic_rmw_or %atomic_ptr+AtomicI64_value, %value as i64 %ordering
1005
+ [END_MACRO]
1006
+
1007
+ [MACRO] ATOMIC_I64_FETCH_XOR %out_old, %atomic_ptr, %value, %ordering
1008
+ %out_old = atomic_rmw_xor %atomic_ptr+AtomicI64_value, %value as i64 %ordering
1009
+ [END_MACRO]
1010
+
1011
+ [MACRO] ATOMIC_I64_FETCH_NAND %out_old, %atomic_ptr, %value, %ordering
1012
+ jmp L_ATOMIC_I64_FETCH_NAND_HEAD_%out_old
1013
+ L_ATOMIC_I64_FETCH_NAND_HEAD_%out_old:
1014
+ %out_old = atomic_load %atomic_ptr+AtomicI64_value as i64 relaxed
1015
+ __atomic_i64_nand_and_%out_old = and %out_old, %value
1016
+ __atomic_i64_nand_new_%out_old = xor __atomic_i64_nand_and_%out_old, -1
1017
+ __atomic_i64_nand_cur_%out_old, __atomic_i64_nand_ok_%out_old = cmpxchg %atomic_ptr+AtomicI64_value, %out_old, __atomic_i64_nand_new_%out_old as i64 %ordering %ordering
1018
+ br __atomic_i64_nand_ok_%out_old -> L_ATOMIC_I64_FETCH_NAND_DONE_%out_old, L_ATOMIC_I64_FETCH_NAND_RETRY_%out_old
1019
+ L_ATOMIC_I64_FETCH_NAND_RETRY_%out_old:
1020
+ !__atomic_i64_nand_ok_%out_old
1021
+ !__atomic_i64_nand_cur_%out_old
1022
+ !__atomic_i64_nand_new_%out_old
1023
+ !__atomic_i64_nand_and_%out_old
1024
+ !%out_old
1025
+ jmp L_ATOMIC_I64_FETCH_NAND_HEAD_%out_old
1026
+ L_ATOMIC_I64_FETCH_NAND_DONE_%out_old:
1027
+ !__atomic_i64_nand_ok_%out_old
1028
+ !__atomic_i64_nand_cur_%out_old
1029
+ !__atomic_i64_nand_new_%out_old
1030
+ !__atomic_i64_nand_and_%out_old
1031
+ [END_MACRO]
1032
+
1033
+
1034
+ [MACRO] ATOMIC_I64_FETCH_MIN %out_old, %atomic_ptr, %value, %ordering
1035
+ %out_old = atomic_rmw_min %atomic_ptr+AtomicI64_value, %value as i64 %ordering
1036
+ [END_MACRO]
1037
+
1038
+ [MACRO] ATOMIC_I64_FETCH_MAX %out_old, %atomic_ptr, %value, %ordering
1039
+ %out_old = atomic_rmw_max %atomic_ptr+AtomicI64_value, %value as i64 %ordering
1040
+ [END_MACRO]
1041
+
1042
+ [MACRO] ATOMIC_I64_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
1043
+ %out_old, %out_ok = cmpxchg %atomic_ptr+AtomicI64_value, %expected, %new_value as i64 %success_ordering %failure_ordering
1044
+ [END_MACRO]
1045
+
1046
+ [MACRO] ATOMIC_I64_COMPARE_EXCHANGE_WEAK %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
1047
+ EXPAND ATOMIC_I64_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
1048
+ [END_MACRO]
1049
+
1050
+ // fetch_update-style loop over cmpxchg. The update function is a macro-level
1051
+ // `i64 -> i64` register, not a Rust closure object. Always reports ok=1 when
1052
+ // the store eventually succeeds (no None-abort path).
1053
+
1054
+ [MACRO] ATOMIC_I64_FETCH_UPDATE %out_ok, %out_old, %atomic_ptr, %update_fn, %success_ordering, %failure_ordering
1055
+ jmp L_ATOMIC_I64_FETCH_UPDATE_HEAD_%out_ok
1056
+ L_ATOMIC_I64_FETCH_UPDATE_HEAD_%out_ok:
1057
+ %out_old = atomic_load %atomic_ptr+AtomicI64_value as i64 relaxed
1058
+ __atomic_i64_fetch_update_new_%out_ok = call %update_fn(%out_old)
1059
+ __atomic_i64_fetch_update_cur_%out_ok, __atomic_i64_fetch_update_ok_%out_ok = cmpxchg %atomic_ptr+AtomicI64_value, %out_old, __atomic_i64_fetch_update_new_%out_ok as i64 %success_ordering %failure_ordering
1060
+ br __atomic_i64_fetch_update_ok_%out_ok -> L_ATOMIC_I64_FETCH_UPDATE_DONE_%out_ok, L_ATOMIC_I64_FETCH_UPDATE_RETRY_%out_ok
1061
+ L_ATOMIC_I64_FETCH_UPDATE_RETRY_%out_ok:
1062
+ !__atomic_i64_fetch_update_ok_%out_ok
1063
+ !__atomic_i64_fetch_update_cur_%out_ok
1064
+ !__atomic_i64_fetch_update_new_%out_ok
1065
+ !%out_old
1066
+ jmp L_ATOMIC_I64_FETCH_UPDATE_HEAD_%out_ok
1067
+ L_ATOMIC_I64_FETCH_UPDATE_DONE_%out_ok:
1068
+ %out_ok = add 0, 1
1069
+ !__atomic_i64_fetch_update_ok_%out_ok
1070
+ !__atomic_i64_fetch_update_cur_%out_ok
1071
+ !__atomic_i64_fetch_update_new_%out_ok
1072
+ [END_MACRO]
1073
+
1074
+ [MACRO] ATOMIC_USIZE_INIT %atomic_ptr, %value
1075
+ store %atomic_ptr+AtomicUsize_value, %value as u64
1076
+ [END_MACRO]
1077
+
1078
+ [MACRO] ATOMIC_USIZE_GET_MUT_PTR %out_ptr, %atomic_ptr
1079
+ %out_ptr = ptr_add %atomic_ptr, AtomicUsize_value
1080
+ [END_MACRO]
1081
+
1082
+ [MACRO] ATOMIC_USIZE_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
1083
+ %out_atomic_ptr = ptr_add %value_ptr, 0
1084
+ [END_MACRO]
1085
+
1086
+ [MACRO] ATOMIC_USIZE_FROM_PTR %out_atomic_ptr, %value_ptr
1087
+ EXPAND ATOMIC_USIZE_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
1088
+ [END_MACRO]
1089
+
1090
+ [MACRO] ATOMIC_USIZE_INTO_INNER %out_value, %atomic_ptr
1091
+ %out_value = load %atomic_ptr+AtomicUsize_value as u64
1092
+ [END_MACRO]
1093
+
1094
+ [MACRO] ATOMIC_USIZE_LOAD %out_value, %atomic_ptr, %ordering
1095
+ %out_value = atomic_load %atomic_ptr+AtomicUsize_value as u64 %ordering
1096
+ [END_MACRO]
1097
+
1098
+ [MACRO] ATOMIC_USIZE_STORE %atomic_ptr, %value, %ordering
1099
+ atomic_store %atomic_ptr+AtomicUsize_value, %value as u64 %ordering
1100
+ [END_MACRO]
1101
+
1102
+ [MACRO] ATOMIC_USIZE_SWAP %out_old, %atomic_ptr, %value, %ordering
1103
+ %out_old = atomic_rmw_xchg %atomic_ptr+AtomicUsize_value, %value as u64 %ordering
1104
+ [END_MACRO]
1105
+
1106
+ [MACRO] ATOMIC_USIZE_FETCH_ADD %out_old, %atomic_ptr, %value, %ordering
1107
+ %out_old = atomic_rmw_add %atomic_ptr+AtomicUsize_value, %value as u64 %ordering
1108
+ [END_MACRO]
1109
+
1110
+ [MACRO] ATOMIC_USIZE_FETCH_SUB %out_old, %atomic_ptr, %value, %ordering
1111
+ %out_old = atomic_rmw_sub %atomic_ptr+AtomicUsize_value, %value as u64 %ordering
1112
+ [END_MACRO]
1113
+
1114
+ [MACRO] ATOMIC_USIZE_FETCH_AND %out_old, %atomic_ptr, %value, %ordering
1115
+ %out_old = atomic_rmw_and %atomic_ptr+AtomicUsize_value, %value as u64 %ordering
1116
+ [END_MACRO]
1117
+
1118
+ [MACRO] ATOMIC_USIZE_FETCH_OR %out_old, %atomic_ptr, %value, %ordering
1119
+ %out_old = atomic_rmw_or %atomic_ptr+AtomicUsize_value, %value as u64 %ordering
1120
+ [END_MACRO]
1121
+
1122
+ [MACRO] ATOMIC_USIZE_FETCH_XOR %out_old, %atomic_ptr, %value, %ordering
1123
+ %out_old = atomic_rmw_xor %atomic_ptr+AtomicUsize_value, %value as u64 %ordering
1124
+ [END_MACRO]
1125
+
1126
+ [MACRO] ATOMIC_USIZE_FETCH_NAND %out_old, %atomic_ptr, %value, %ordering
1127
+ jmp L_ATOMIC_USIZE_FETCH_NAND_HEAD_%out_old
1128
+ L_ATOMIC_USIZE_FETCH_NAND_HEAD_%out_old:
1129
+ %out_old = atomic_load %atomic_ptr+AtomicUsize_value as u64 relaxed
1130
+ __atomic_usize_nand_and_%out_old = and %out_old, %value
1131
+ __atomic_usize_nand_new_%out_old = xor __atomic_usize_nand_and_%out_old, -1
1132
+ __atomic_usize_nand_cur_%out_old, __atomic_usize_nand_ok_%out_old = cmpxchg %atomic_ptr+AtomicUsize_value, %out_old, __atomic_usize_nand_new_%out_old as u64 %ordering %ordering
1133
+ br __atomic_usize_nand_ok_%out_old -> L_ATOMIC_USIZE_FETCH_NAND_DONE_%out_old, L_ATOMIC_USIZE_FETCH_NAND_RETRY_%out_old
1134
+ L_ATOMIC_USIZE_FETCH_NAND_RETRY_%out_old:
1135
+ !__atomic_usize_nand_ok_%out_old
1136
+ !__atomic_usize_nand_cur_%out_old
1137
+ !__atomic_usize_nand_new_%out_old
1138
+ !__atomic_usize_nand_and_%out_old
1139
+ !%out_old
1140
+ jmp L_ATOMIC_USIZE_FETCH_NAND_HEAD_%out_old
1141
+ L_ATOMIC_USIZE_FETCH_NAND_DONE_%out_old:
1142
+ !__atomic_usize_nand_ok_%out_old
1143
+ !__atomic_usize_nand_cur_%out_old
1144
+ !__atomic_usize_nand_new_%out_old
1145
+ !__atomic_usize_nand_and_%out_old
1146
+ [END_MACRO]
1147
+
1148
+
1149
+ [MACRO] ATOMIC_USIZE_FETCH_MIN %out_old, %atomic_ptr, %value, %ordering
1150
+ %out_old = atomic_rmw_min %atomic_ptr+AtomicUsize_value, %value as u64 %ordering
1151
+ [END_MACRO]
1152
+
1153
+ [MACRO] ATOMIC_USIZE_FETCH_MAX %out_old, %atomic_ptr, %value, %ordering
1154
+ %out_old = atomic_rmw_max %atomic_ptr+AtomicUsize_value, %value as u64 %ordering
1155
+ [END_MACRO]
1156
+
1157
+ [MACRO] ATOMIC_USIZE_FETCH_UMIN %out_old, %atomic_ptr, %value, %ordering
1158
+ %out_old = atomic_rmw_umin %atomic_ptr+AtomicUsize_value, %value as u64 %ordering
1159
+ [END_MACRO]
1160
+
1161
+ [MACRO] ATOMIC_USIZE_FETCH_UMAX %out_old, %atomic_ptr, %value, %ordering
1162
+ %out_old = atomic_rmw_umax %atomic_ptr+AtomicUsize_value, %value as u64 %ordering
1163
+ [END_MACRO]
1164
+
1165
+ [MACRO] ATOMIC_USIZE_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
1166
+ %out_old, %out_ok = cmpxchg %atomic_ptr+AtomicUsize_value, %expected, %new_value as u64 %success_ordering %failure_ordering
1167
+ [END_MACRO]
1168
+
1169
+ [MACRO] ATOMIC_USIZE_COMPARE_EXCHANGE_WEAK %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
1170
+ EXPAND ATOMIC_USIZE_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
1171
+ [END_MACRO]
1172
+
1173
+ // fetch_update-style loop over cmpxchg. The update function is a macro-level
1174
+ // `u64 -> u64` register, not a Rust closure object. Always reports ok=1 when
1175
+ // the store eventually succeeds (no None-abort path).
1176
+
1177
+ [MACRO] ATOMIC_USIZE_FETCH_UPDATE %out_ok, %out_old, %atomic_ptr, %update_fn, %success_ordering, %failure_ordering
1178
+ jmp L_ATOMIC_USIZE_FETCH_UPDATE_HEAD_%out_ok
1179
+ L_ATOMIC_USIZE_FETCH_UPDATE_HEAD_%out_ok:
1180
+ %out_old = atomic_load %atomic_ptr+AtomicUsize_value as u64 relaxed
1181
+ __atomic_usize_fetch_update_new_%out_ok = call %update_fn(%out_old)
1182
+ __atomic_usize_fetch_update_cur_%out_ok, __atomic_usize_fetch_update_ok_%out_ok = cmpxchg %atomic_ptr+AtomicUsize_value, %out_old, __atomic_usize_fetch_update_new_%out_ok as u64 %success_ordering %failure_ordering
1183
+ br __atomic_usize_fetch_update_ok_%out_ok -> L_ATOMIC_USIZE_FETCH_UPDATE_DONE_%out_ok, L_ATOMIC_USIZE_FETCH_UPDATE_RETRY_%out_ok
1184
+ L_ATOMIC_USIZE_FETCH_UPDATE_RETRY_%out_ok:
1185
+ !__atomic_usize_fetch_update_ok_%out_ok
1186
+ !__atomic_usize_fetch_update_cur_%out_ok
1187
+ !__atomic_usize_fetch_update_new_%out_ok
1188
+ !%out_old
1189
+ jmp L_ATOMIC_USIZE_FETCH_UPDATE_HEAD_%out_ok
1190
+ L_ATOMIC_USIZE_FETCH_UPDATE_DONE_%out_ok:
1191
+ %out_ok = add 0, 1
1192
+ !__atomic_usize_fetch_update_ok_%out_ok
1193
+ !__atomic_usize_fetch_update_cur_%out_ok
1194
+ !__atomic_usize_fetch_update_new_%out_ok
1195
+ [END_MACRO]
1196
+
1197
+ [MACRO] ATOMIC_ISIZE_INIT %atomic_ptr, %value
1198
+ store %atomic_ptr+AtomicIsize_value, %value as i64
1199
+ [END_MACRO]
1200
+
1201
+ [MACRO] ATOMIC_ISIZE_GET_MUT_PTR %out_ptr, %atomic_ptr
1202
+ %out_ptr = ptr_add %atomic_ptr, AtomicIsize_value
1203
+ [END_MACRO]
1204
+
1205
+ [MACRO] ATOMIC_ISIZE_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
1206
+ %out_atomic_ptr = ptr_add %value_ptr, 0
1207
+ [END_MACRO]
1208
+
1209
+ [MACRO] ATOMIC_ISIZE_FROM_PTR %out_atomic_ptr, %value_ptr
1210
+ EXPAND ATOMIC_ISIZE_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
1211
+ [END_MACRO]
1212
+
1213
+ [MACRO] ATOMIC_ISIZE_INTO_INNER %out_value, %atomic_ptr
1214
+ %out_value = load %atomic_ptr+AtomicIsize_value as i64
1215
+ [END_MACRO]
1216
+
1217
+ [MACRO] ATOMIC_ISIZE_LOAD %out_value, %atomic_ptr, %ordering
1218
+ %out_value = atomic_load %atomic_ptr+AtomicIsize_value as i64 %ordering
1219
+ [END_MACRO]
1220
+
1221
+ [MACRO] ATOMIC_ISIZE_STORE %atomic_ptr, %value, %ordering
1222
+ atomic_store %atomic_ptr+AtomicIsize_value, %value as i64 %ordering
1223
+ [END_MACRO]
1224
+
1225
+ [MACRO] ATOMIC_ISIZE_SWAP %out_old, %atomic_ptr, %value, %ordering
1226
+ %out_old = atomic_rmw_xchg %atomic_ptr+AtomicIsize_value, %value as i64 %ordering
1227
+ [END_MACRO]
1228
+
1229
+ [MACRO] ATOMIC_ISIZE_FETCH_ADD %out_old, %atomic_ptr, %value, %ordering
1230
+ %out_old = atomic_rmw_add %atomic_ptr+AtomicIsize_value, %value as i64 %ordering
1231
+ [END_MACRO]
1232
+
1233
+ [MACRO] ATOMIC_ISIZE_FETCH_SUB %out_old, %atomic_ptr, %value, %ordering
1234
+ %out_old = atomic_rmw_sub %atomic_ptr+AtomicIsize_value, %value as i64 %ordering
1235
+ [END_MACRO]
1236
+
1237
+ [MACRO] ATOMIC_ISIZE_FETCH_AND %out_old, %atomic_ptr, %value, %ordering
1238
+ %out_old = atomic_rmw_and %atomic_ptr+AtomicIsize_value, %value as i64 %ordering
1239
+ [END_MACRO]
1240
+
1241
+ [MACRO] ATOMIC_ISIZE_FETCH_OR %out_old, %atomic_ptr, %value, %ordering
1242
+ %out_old = atomic_rmw_or %atomic_ptr+AtomicIsize_value, %value as i64 %ordering
1243
+ [END_MACRO]
1244
+
1245
+ [MACRO] ATOMIC_ISIZE_FETCH_XOR %out_old, %atomic_ptr, %value, %ordering
1246
+ %out_old = atomic_rmw_xor %atomic_ptr+AtomicIsize_value, %value as i64 %ordering
1247
+ [END_MACRO]
1248
+
1249
+ [MACRO] ATOMIC_ISIZE_FETCH_NAND %out_old, %atomic_ptr, %value, %ordering
1250
+ jmp L_ATOMIC_ISIZE_FETCH_NAND_HEAD_%out_old
1251
+ L_ATOMIC_ISIZE_FETCH_NAND_HEAD_%out_old:
1252
+ %out_old = atomic_load %atomic_ptr+AtomicIsize_value as i64 relaxed
1253
+ __atomic_isize_nand_and_%out_old = and %out_old, %value
1254
+ __atomic_isize_nand_new_%out_old = xor __atomic_isize_nand_and_%out_old, -1
1255
+ __atomic_isize_nand_cur_%out_old, __atomic_isize_nand_ok_%out_old = cmpxchg %atomic_ptr+AtomicIsize_value, %out_old, __atomic_isize_nand_new_%out_old as i64 %ordering %ordering
1256
+ br __atomic_isize_nand_ok_%out_old -> L_ATOMIC_ISIZE_FETCH_NAND_DONE_%out_old, L_ATOMIC_ISIZE_FETCH_NAND_RETRY_%out_old
1257
+ L_ATOMIC_ISIZE_FETCH_NAND_RETRY_%out_old:
1258
+ !__atomic_isize_nand_ok_%out_old
1259
+ !__atomic_isize_nand_cur_%out_old
1260
+ !__atomic_isize_nand_new_%out_old
1261
+ !__atomic_isize_nand_and_%out_old
1262
+ !%out_old
1263
+ jmp L_ATOMIC_ISIZE_FETCH_NAND_HEAD_%out_old
1264
+ L_ATOMIC_ISIZE_FETCH_NAND_DONE_%out_old:
1265
+ !__atomic_isize_nand_ok_%out_old
1266
+ !__atomic_isize_nand_cur_%out_old
1267
+ !__atomic_isize_nand_new_%out_old
1268
+ !__atomic_isize_nand_and_%out_old
1269
+ [END_MACRO]
1270
+
1271
+
1272
+ [MACRO] ATOMIC_ISIZE_FETCH_MIN %out_old, %atomic_ptr, %value, %ordering
1273
+ %out_old = atomic_rmw_min %atomic_ptr+AtomicIsize_value, %value as i64 %ordering
1274
+ [END_MACRO]
1275
+
1276
+ [MACRO] ATOMIC_ISIZE_FETCH_MAX %out_old, %atomic_ptr, %value, %ordering
1277
+ %out_old = atomic_rmw_max %atomic_ptr+AtomicIsize_value, %value as i64 %ordering
1278
+ [END_MACRO]
1279
+
1280
+ [MACRO] ATOMIC_ISIZE_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
1281
+ %out_old, %out_ok = cmpxchg %atomic_ptr+AtomicIsize_value, %expected, %new_value as i64 %success_ordering %failure_ordering
1282
+ [END_MACRO]
1283
+
1284
+ [MACRO] ATOMIC_ISIZE_COMPARE_EXCHANGE_WEAK %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
1285
+ EXPAND ATOMIC_ISIZE_COMPARE_EXCHANGE %out_old, %out_ok, %atomic_ptr, %expected, %new_value, %success_ordering, %failure_ordering
1286
+ [END_MACRO]
1287
+
1288
+ // fetch_update-style loop over cmpxchg. The update function is a macro-level
1289
+ // `i64 -> i64` register, not a Rust closure object. Always reports ok=1 when
1290
+ // the store eventually succeeds (no None-abort path).
1291
+
1292
+ [MACRO] ATOMIC_ISIZE_FETCH_UPDATE %out_ok, %out_old, %atomic_ptr, %update_fn, %success_ordering, %failure_ordering
1293
+ jmp L_ATOMIC_ISIZE_FETCH_UPDATE_HEAD_%out_ok
1294
+ L_ATOMIC_ISIZE_FETCH_UPDATE_HEAD_%out_ok:
1295
+ %out_old = atomic_load %atomic_ptr+AtomicIsize_value as i64 relaxed
1296
+ __atomic_isize_fetch_update_new_%out_ok = call %update_fn(%out_old)
1297
+ __atomic_isize_fetch_update_cur_%out_ok, __atomic_isize_fetch_update_ok_%out_ok = cmpxchg %atomic_ptr+AtomicIsize_value, %out_old, __atomic_isize_fetch_update_new_%out_ok as i64 %success_ordering %failure_ordering
1298
+ br __atomic_isize_fetch_update_ok_%out_ok -> L_ATOMIC_ISIZE_FETCH_UPDATE_DONE_%out_ok, L_ATOMIC_ISIZE_FETCH_UPDATE_RETRY_%out_ok
1299
+ L_ATOMIC_ISIZE_FETCH_UPDATE_RETRY_%out_ok:
1300
+ !__atomic_isize_fetch_update_ok_%out_ok
1301
+ !__atomic_isize_fetch_update_cur_%out_ok
1302
+ !__atomic_isize_fetch_update_new_%out_ok
1303
+ !%out_old
1304
+ jmp L_ATOMIC_ISIZE_FETCH_UPDATE_HEAD_%out_ok
1305
+ L_ATOMIC_ISIZE_FETCH_UPDATE_DONE_%out_ok:
1306
+ %out_ok = add 0, 1
1307
+ !__atomic_isize_fetch_update_ok_%out_ok
1308
+ !__atomic_isize_fetch_update_cur_%out_ok
1309
+ !__atomic_isize_fetch_update_new_%out_ok
1310
+ [END_MACRO]
1311
+
1312
+ [MACRO] ATOMIC_PTR_INIT %atomic_ptr, %value_ptr
1313
+ store %atomic_ptr+AtomicPtr_value, %value_ptr as ptr
1314
+ [END_MACRO]
1315
+
1316
+ [MACRO] ATOMIC_PTR_GET_MUT_PTR %out_ptr, %atomic_ptr
1317
+ %out_ptr = ptr_add %atomic_ptr, AtomicPtr_value
1318
+ [END_MACRO]
1319
+
1320
+ [MACRO] ATOMIC_PTR_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
1321
+ %out_atomic_ptr = ptr_add %value_ptr, 0
1322
+ [END_MACRO]
1323
+
1324
+ [MACRO] ATOMIC_PTR_FROM_PTR %out_atomic_ptr, %value_ptr
1325
+ EXPAND ATOMIC_PTR_FROM_MUT_PTR %out_atomic_ptr, %value_ptr
1326
+ [END_MACRO]
1327
+
1328
+ [MACRO] ATOMIC_PTR_INTO_INNER %out_ptr, %atomic_ptr
1329
+ %out_ptr = load %atomic_ptr+AtomicPtr_value as ptr
1330
+ [END_MACRO]
1331
+
1332
+ [MACRO] ATOMIC_PTR_LOAD %out_ptr, %atomic_ptr, %ordering
1333
+ %out_ptr = atomic_load %atomic_ptr+AtomicPtr_value as ptr %ordering
1334
+ [END_MACRO]
1335
+
1336
+ [MACRO] ATOMIC_PTR_STORE %atomic_ptr, %value_ptr, %ordering
1337
+ atomic_store %atomic_ptr+AtomicPtr_value, %value_ptr as ptr %ordering
1338
+ [END_MACRO]
1339
+
1340
+ [MACRO] ATOMIC_PTR_SWAP %out_old_ptr, %atomic_ptr, %value_ptr, %ordering
1341
+ jmp L_ATOMIC_PTR_SWAP_HEAD_%out_old_ptr
1342
+
1343
+ L_ATOMIC_PTR_SWAP_HEAD_%out_old_ptr:
1344
+ __atomic_ptr_swap_expected_%out_old_ptr = atomic_load %atomic_ptr+AtomicPtr_value as ptr relaxed
1345
+ %out_old_ptr, __atomic_ptr_swap_ok_%out_old_ptr = cmpxchg %atomic_ptr+AtomicPtr_value, __atomic_ptr_swap_expected_%out_old_ptr, %value_ptr as ptr %ordering relaxed
1346
+ br __atomic_ptr_swap_ok_%out_old_ptr -> L_ATOMIC_PTR_SWAP_DONE_%out_old_ptr, L_ATOMIC_PTR_SWAP_RETRY_%out_old_ptr
1347
+
1348
+ L_ATOMIC_PTR_SWAP_RETRY_%out_old_ptr:
1349
+ !__atomic_ptr_swap_ok_%out_old_ptr
1350
+ !__atomic_ptr_swap_expected_%out_old_ptr
1351
+ !%out_old_ptr
1352
+ jmp L_ATOMIC_PTR_SWAP_HEAD_%out_old_ptr
1353
+
1354
+ L_ATOMIC_PTR_SWAP_DONE_%out_old_ptr:
1355
+ !__atomic_ptr_swap_ok_%out_old_ptr
1356
+ !__atomic_ptr_swap_expected_%out_old_ptr
1357
+ [END_MACRO]
1358
+
1359
+ [MACRO] ATOMIC_PTR_FETCH_BYTE_ADD %out_old_ptr, %atomic_ptr, %byte_offset, %ordering
1360
+ jmp L_ATOMIC_PTR_BYTE_ADD_HEAD_%out_old_ptr
1361
+
1362
+ L_ATOMIC_PTR_BYTE_ADD_HEAD_%out_old_ptr:
1363
+ __atomic_ptr_byte_add_expected_%out_old_ptr = atomic_load %atomic_ptr+AtomicPtr_value as ptr relaxed
1364
+ __atomic_ptr_byte_add_new_%out_old_ptr = ptr_add __atomic_ptr_byte_add_expected_%out_old_ptr, %byte_offset
1365
+ %out_old_ptr, __atomic_ptr_byte_add_ok_%out_old_ptr = cmpxchg %atomic_ptr+AtomicPtr_value, __atomic_ptr_byte_add_expected_%out_old_ptr, __atomic_ptr_byte_add_new_%out_old_ptr as ptr %ordering relaxed
1366
+ br __atomic_ptr_byte_add_ok_%out_old_ptr -> L_ATOMIC_PTR_BYTE_ADD_DONE_%out_old_ptr, L_ATOMIC_PTR_BYTE_ADD_RETRY_%out_old_ptr
1367
+
1368
+ L_ATOMIC_PTR_BYTE_ADD_RETRY_%out_old_ptr:
1369
+ !__atomic_ptr_byte_add_ok_%out_old_ptr
1370
+ !__atomic_ptr_byte_add_new_%out_old_ptr
1371
+ !__atomic_ptr_byte_add_expected_%out_old_ptr
1372
+ !%out_old_ptr
1373
+ jmp L_ATOMIC_PTR_BYTE_ADD_HEAD_%out_old_ptr
1374
+
1375
+ L_ATOMIC_PTR_BYTE_ADD_DONE_%out_old_ptr:
1376
+ !__atomic_ptr_byte_add_ok_%out_old_ptr
1377
+ !__atomic_ptr_byte_add_new_%out_old_ptr
1378
+ !__atomic_ptr_byte_add_expected_%out_old_ptr
1379
+ [END_MACRO]
1380
+
1381
+ [MACRO] ATOMIC_PTR_FETCH_BYTE_SUB %out_old_ptr, %atomic_ptr, %byte_offset, %ordering
1382
+ jmp L_ATOMIC_PTR_BYTE_SUB_HEAD_%out_old_ptr
1383
+
1384
+ L_ATOMIC_PTR_BYTE_SUB_HEAD_%out_old_ptr:
1385
+ __atomic_ptr_byte_sub_expected_%out_old_ptr = atomic_load %atomic_ptr+AtomicPtr_value as ptr relaxed
1386
+ __atomic_ptr_byte_sub_offset_%out_old_ptr = sub 0, %byte_offset
1387
+ __atomic_ptr_byte_sub_new_%out_old_ptr = ptr_add __atomic_ptr_byte_sub_expected_%out_old_ptr, __atomic_ptr_byte_sub_offset_%out_old_ptr
1388
+ %out_old_ptr, __atomic_ptr_byte_sub_ok_%out_old_ptr = cmpxchg %atomic_ptr+AtomicPtr_value, __atomic_ptr_byte_sub_expected_%out_old_ptr, __atomic_ptr_byte_sub_new_%out_old_ptr as ptr %ordering relaxed
1389
+ br __atomic_ptr_byte_sub_ok_%out_old_ptr -> L_ATOMIC_PTR_BYTE_SUB_DONE_%out_old_ptr, L_ATOMIC_PTR_BYTE_SUB_RETRY_%out_old_ptr
1390
+
1391
+ L_ATOMIC_PTR_BYTE_SUB_RETRY_%out_old_ptr:
1392
+ !__atomic_ptr_byte_sub_ok_%out_old_ptr
1393
+ !__atomic_ptr_byte_sub_new_%out_old_ptr
1394
+ !__atomic_ptr_byte_sub_offset_%out_old_ptr
1395
+ !__atomic_ptr_byte_sub_expected_%out_old_ptr
1396
+ !%out_old_ptr
1397
+ jmp L_ATOMIC_PTR_BYTE_SUB_HEAD_%out_old_ptr
1398
+
1399
+ L_ATOMIC_PTR_BYTE_SUB_DONE_%out_old_ptr:
1400
+ !__atomic_ptr_byte_sub_ok_%out_old_ptr
1401
+ !__atomic_ptr_byte_sub_new_%out_old_ptr
1402
+ !__atomic_ptr_byte_sub_offset_%out_old_ptr
1403
+ !__atomic_ptr_byte_sub_expected_%out_old_ptr
1404
+ [END_MACRO]
1405
+
1406
+ [MACRO] ATOMIC_PTR_FETCH_U64_ADD %out_old_ptr, %atomic_ptr, %count, %ordering
1407
+ __atomic_ptr_u64_add_bytes_%out_old_ptr = mul %count, 8
1408
+ EXPAND ATOMIC_PTR_FETCH_BYTE_ADD %out_old_ptr, %atomic_ptr, __atomic_ptr_u64_add_bytes_%out_old_ptr, %ordering
1409
+ !__atomic_ptr_u64_add_bytes_%out_old_ptr
1410
+ [END_MACRO]
1411
+
1412
+ [MACRO] ATOMIC_PTR_FETCH_U64_SUB %out_old_ptr, %atomic_ptr, %count, %ordering
1413
+ __atomic_ptr_u64_sub_bytes_%out_old_ptr = mul %count, 8
1414
+ EXPAND ATOMIC_PTR_FETCH_BYTE_SUB %out_old_ptr, %atomic_ptr, __atomic_ptr_u64_sub_bytes_%out_old_ptr, %ordering
1415
+ !__atomic_ptr_u64_sub_bytes_%out_old_ptr
1416
+ [END_MACRO]
1417
+
1418
+ [MACRO] ATOMIC_PTR_COMPARE_EXCHANGE %out_old_ptr, %out_ok, %atomic_ptr, %expected_ptr, %new_ptr, %success_ordering, %failure_ordering
1419
+ %out_old_ptr, %out_ok = cmpxchg %atomic_ptr+AtomicPtr_value, %expected_ptr, %new_ptr as ptr %success_ordering %failure_ordering
1420
+ [END_MACRO]
1421
+
1422
+ [MACRO] ATOMIC_PTR_COMPARE_EXCHANGE_WEAK %out_old_ptr, %out_ok, %atomic_ptr, %expected_ptr, %new_ptr, %success_ordering, %failure_ordering
1423
+ EXPAND ATOMIC_PTR_COMPARE_EXCHANGE %out_old_ptr, %out_ok, %atomic_ptr, %expected_ptr, %new_ptr, %success_ordering, %failure_ordering
1424
+ [END_MACRO]
1425
+
1426
+ // fetch_update-style loop over cmpxchg. The update function is a macro-level
1427
+ // `ptr -> ptr` register, not a Rust closure object. Always reports ok=1 when
1428
+ // the store eventually succeeds (no None-abort path).
1429
+
1430
+ [MACRO] ATOMIC_PTR_FETCH_UPDATE %out_ok, %out_old, %atomic_ptr, %update_fn, %success_ordering, %failure_ordering
1431
+ jmp L_ATOMIC_PTR_FETCH_UPDATE_HEAD_%out_ok
1432
+ L_ATOMIC_PTR_FETCH_UPDATE_HEAD_%out_ok:
1433
+ %out_old = atomic_load %atomic_ptr+AtomicPtr_value as ptr relaxed
1434
+ __atomic_ptr_fetch_update_new_%out_ok = call %update_fn(%out_old)
1435
+ __atomic_ptr_fetch_update_cur_%out_ok, __atomic_ptr_fetch_update_ok_%out_ok = cmpxchg %atomic_ptr+AtomicPtr_value, %out_old, __atomic_ptr_fetch_update_new_%out_ok as ptr %success_ordering %failure_ordering
1436
+ br __atomic_ptr_fetch_update_ok_%out_ok -> L_ATOMIC_PTR_FETCH_UPDATE_DONE_%out_ok, L_ATOMIC_PTR_FETCH_UPDATE_RETRY_%out_ok
1437
+ L_ATOMIC_PTR_FETCH_UPDATE_RETRY_%out_ok:
1438
+ !__atomic_ptr_fetch_update_ok_%out_ok
1439
+ !__atomic_ptr_fetch_update_cur_%out_ok
1440
+ !__atomic_ptr_fetch_update_new_%out_ok
1441
+ !%out_old
1442
+ jmp L_ATOMIC_PTR_FETCH_UPDATE_HEAD_%out_ok
1443
+ L_ATOMIC_PTR_FETCH_UPDATE_DONE_%out_ok:
1444
+ %out_ok = add 0, 1
1445
+ !__atomic_ptr_fetch_update_ok_%out_ok
1446
+ !__atomic_ptr_fetch_update_cur_%out_ok
1447
+ !__atomic_ptr_fetch_update_new_%out_ok
1448
+ [END_MACRO]
1449
+
1450
+ // Default-style zero initialization helpers (store 0 into existing atomic slots).
1451
+
1452
+ [MACRO] ATOMIC_BOOL_DEFAULT %atomic_ptr
1453
+ EXPAND ATOMIC_BOOL_INIT %atomic_ptr, 0
1454
+ [END_MACRO]
1455
+
1456
+ [MACRO] ATOMIC_U8_DEFAULT %atomic_ptr
1457
+ EXPAND ATOMIC_U8_INIT %atomic_ptr, 0
1458
+ [END_MACRO]
1459
+
1460
+ [MACRO] ATOMIC_U16_DEFAULT %atomic_ptr
1461
+ EXPAND ATOMIC_U16_INIT %atomic_ptr, 0
1462
+ [END_MACRO]
1463
+
1464
+ [MACRO] ATOMIC_U32_DEFAULT %atomic_ptr
1465
+ EXPAND ATOMIC_U32_INIT %atomic_ptr, 0
1466
+ [END_MACRO]
1467
+
1468
+ [MACRO] ATOMIC_U64_DEFAULT %atomic_ptr
1469
+ EXPAND ATOMIC_U64_INIT %atomic_ptr, 0
1470
+ [END_MACRO]
1471
+
1472
+ [MACRO] ATOMIC_USIZE_DEFAULT %atomic_ptr
1473
+ EXPAND ATOMIC_USIZE_INIT %atomic_ptr, 0
1474
+ [END_MACRO]
1475
+
1476
+ [MACRO] ATOMIC_I8_DEFAULT %atomic_ptr
1477
+ EXPAND ATOMIC_I8_INIT %atomic_ptr, 0
1478
+ [END_MACRO]
1479
+
1480
+ [MACRO] ATOMIC_I16_DEFAULT %atomic_ptr
1481
+ EXPAND ATOMIC_I16_INIT %atomic_ptr, 0
1482
+ [END_MACRO]
1483
+
1484
+ [MACRO] ATOMIC_I32_DEFAULT %atomic_ptr
1485
+ EXPAND ATOMIC_I32_INIT %atomic_ptr, 0
1486
+ [END_MACRO]
1487
+
1488
+ [MACRO] ATOMIC_I64_DEFAULT %atomic_ptr
1489
+ EXPAND ATOMIC_I64_INIT %atomic_ptr, 0
1490
+ [END_MACRO]
1491
+
1492
+ [MACRO] ATOMIC_ISIZE_DEFAULT %atomic_ptr
1493
+ EXPAND ATOMIC_ISIZE_INIT %atomic_ptr, 0
1494
+ [END_MACRO]
1495
+
1496
+ [MACRO] ATOMIC_PTR_DEFAULT %atomic_ptr
1497
+ __atomic_ptr_default_null_%atomic_ptr = 0 as ptr
1498
+ EXPAND ATOMIC_PTR_INIT %atomic_ptr, __atomic_ptr_default_null_%atomic_ptr
1499
+ !__atomic_ptr_default_null_%atomic_ptr
1500
+ [END_MACRO]