@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.
- package/bin/sa.js +13 -1
- package/package.json +8 -7
- package/sa_std/alloc/layout.sal +12 -0
- package/sa_std/alloc/prelude.sa +1 -0
- package/sa_std/alloc/prelude.sal +1 -0
- package/sa_std/alloc/string.sa +3 -0
- package/sa_std/alloc/vec.sa +684 -0
- package/sa_std/alloc/vec.sal +4 -0
- package/sa_std/any.sa +130 -0
- package/sa_std/any.sal +23 -0
- package/sa_std/array.sa +1876 -0
- package/sa_std/ascii.sa +2 -0
- package/sa_std/ascii.sal +1 -0
- package/sa_std/async.sla +116 -0
- package/sa_std/binary_heap.sa +3003 -0
- package/sa_std/binary_heap.sal +7 -0
- package/sa_std/borrow.sa +171 -0
- package/sa_std/borrow.sal +13 -0
- package/sa_std/btree_map.sa +2210 -0
- package/sa_std/btree_map.sal +11 -0
- package/sa_std/btree_set.sa +1072 -0
- package/sa_std/btree_set.sal +6 -0
- package/sa_std/char.sa +1309 -0
- package/sa_std/char.sal +50 -0
- package/sa_std/cmp.sa +554 -0
- package/sa_std/cmp.sal +14 -0
- package/sa_std/collections/binary_heap.sa +1 -0
- package/sa_std/collections/btree_map.sa +1 -0
- package/sa_std/collections/btree_set.sa +1 -0
- package/sa_std/collections/hashmap.sa +1 -0
- package/sa_std/collections/hashset.sa +1 -0
- package/sa_std/collections/linked_list.sa +1120 -0
- package/sa_std/collections/linked_list.sal +10 -0
- package/sa_std/collections/prelude.sa +7 -0
- package/sa_std/collections/prelude.sal +1 -0
- package/sa_std/collections/vec_deque.sa +1 -0
- package/sa_std/collections.sal +13 -0
- package/sa_std/convert.sa +1115 -0
- package/sa_std/convert.sal +24 -0
- package/sa_std/core/arc.sa +233 -0
- package/sa_std/core/arc.sal +4 -0
- package/sa_std/core/ascii.sa +784 -0
- package/sa_std/core/ascii.sal +34 -0
- package/sa_std/core/bit.sa +41 -0
- package/sa_std/core/box.sa +1 -0
- package/sa_std/core/box.sal +2 -0
- package/sa_std/core/cell.sa +108 -0
- package/sa_std/core/cell.sal +5 -0
- package/sa_std/core/cleanup.sa +26 -0
- package/sa_std/core/control.sa +20 -0
- package/sa_std/core/derive.sa +60 -0
- package/sa_std/core/derive.sal +1 -0
- package/sa_std/core/dispatch.sa +7 -0
- package/sa_std/core/dispatch.sal +5 -0
- package/sa_std/core/future.sa +777 -0
- package/sa_std/core/future.sal +73 -0
- package/sa_std/core/hash.sa +48 -0
- package/sa_std/core/iter.sa +2805 -0
- package/sa_std/core/iter.sal +4 -0
- package/sa_std/core/loop.sa +60 -0
- package/sa_std/core/mem.sa +220 -0
- package/sa_std/core/option.sa +825 -0
- package/sa_std/core/option.sal +11 -0
- package/sa_std/core/panic.sa +23 -0
- package/sa_std/core/panic.sal +12 -0
- package/sa_std/core/prelude.sa +18 -0
- package/sa_std/core/prelude.sal +18 -0
- package/sa_std/core/rc.sa +225 -0
- package/sa_std/core/rc.sal +4 -0
- package/sa_std/core/refcell.sa +283 -0
- package/sa_std/core/refcell.sal +13 -0
- package/sa_std/core/result.sa +708 -0
- package/sa_std/core/result.sal +6 -0
- package/sa_std/core/rust_patterns.sal +295 -0
- package/sa_std/core/sa_core.sa +84 -0
- package/sa_std/core/slice.sa +4021 -0
- package/sa_std/core/slice.sal +7 -0
- package/sa_std/core/task.sa +112 -0
- package/sa_std/core/task.sal +15 -0
- package/sa_std/core/trait_object.sa +26 -0
- package/sa_std/core/trait_object.sal +4 -0
- package/sa_std/core/waker.sa +289 -0
- package/sa_std/core/waker.sal +31 -0
- package/sa_std/core/weak.sa +2 -0
- package/sa_std/core/weak.sal +4 -0
- package/sa_std/cow.sa +3 -0
- package/sa_std/cow.sal +2 -0
- package/sa_std/cstring.sa +3 -0
- package/sa_std/cstring.sal +2 -0
- package/sa_std/default.sa +99 -0
- package/sa_std/duration.sa +3 -0
- package/sa_std/duration.sal +2 -0
- package/sa_std/encoding/json.sa +259 -0
- package/sa_std/encoding/json.sai +54 -0
- package/sa_std/encoding/json.sal +35 -0
- package/sa_std/encoding/prelude.sa +1 -0
- package/sa_std/encoding/prelude.sal +0 -0
- package/sa_std/env.sa +390 -0
- package/sa_std/env.sai +25 -0
- package/sa_std/error.sa +253 -0
- package/sa_std/error.sal +44 -0
- package/sa_std/ffi/cstring.sa +3 -0
- package/sa_std/ffi/cstring.sal +1 -0
- package/sa_std/ffi/prelude.sa +2 -0
- package/sa_std/ffi/prelude.sal +2 -0
- package/sa_std/ffi.sa +635 -0
- package/sa_std/ffi.sal +51 -0
- package/sa_std/fmt.sa +2 -0
- package/sa_std/fmt.sai +18 -0
- package/sa_std/fmt.sal +35 -0
- package/sa_std/fs.sa +1023 -0
- package/sa_std/fs.sai +127 -0
- package/sa_std/fs.sal +51 -0
- package/sa_std/future.sa +2 -0
- package/sa_std/future.sal +1 -0
- package/sa_std/hash.sa +1486 -0
- package/sa_std/hash.sal +13 -0
- package/sa_std/hashmap.sa +1962 -0
- package/sa_std/hashmap.sal +20 -0
- package/sa_std/hashset.sa +1004 -0
- package/sa_std/hashset.sal +18 -0
- package/sa_std/http2.sa +78 -0
- package/sa_std/http2.sai +26 -0
- package/sa_std/http2.sal +36 -0
- package/sa_std/instant.sa +3 -0
- package/sa_std/instant.sal +2 -0
- package/sa_std/io/buf_reader.sa +43 -0
- package/sa_std/io/buf_writer.sa +35 -0
- package/sa_std/io/bufio.sa +4 -0
- package/sa_std/io/bufio.sal +4 -0
- package/sa_std/io/prelude.sa +1 -0
- package/sa_std/io/prelude.sal +1 -0
- package/sa_std/io/print.sa +2 -0
- package/sa_std/io/print.sai +3 -0
- package/sa_std/io.sa +925 -0
- package/sa_std/io.sai +25 -0
- package/sa_std/io.sal +84 -0
- package/sa_std/iter.sa +2 -0
- package/sa_std/iter.sal +1 -0
- package/sa_std/join_handle.sa +3 -0
- package/sa_std/join_handle.sal +2 -0
- package/sa_std/libsa_async.sa +80 -0
- package/sa_std/m_async.sa +137 -0
- package/sa_std/m_async.sal +30 -0
- package/sa_std/m_async.sla +2 -0
- package/sa_std/manually_drop.sa +3 -0
- package/sa_std/manually_drop.sal +2 -0
- package/sa_std/marker/phantom_data.sa +3 -0
- package/sa_std/marker/phantom_data.sal +1 -0
- package/sa_std/marker/prelude.sa +4 -0
- package/sa_std/marker/prelude.sal +4 -0
- package/sa_std/marker.sa +220 -0
- package/sa_std/marker.sal +15 -0
- package/sa_std/math.sa +84 -0
- package/sa_std/math.sai +10 -0
- package/sa_std/mem/manually_drop.sa +3 -0
- package/sa_std/mem/manually_drop.sal +1 -0
- package/sa_std/mem/prelude.sa +2 -0
- package/sa_std/mem/prelude.sal +2 -0
- package/sa_std/mem.sa +564 -0
- package/sa_std/mem.sal +40 -0
- package/sa_std/modstate.sai +19 -0
- package/sa_std/net.sa +4227 -0
- package/sa_std/net.sai +239 -0
- package/sa_std/net.sal +159 -0
- package/sa_std/netx.sa +85 -0
- package/sa_std/netx.sai +11 -0
- package/sa_std/netx.sal +39 -0
- package/sa_std/nonzero.sa +3 -0
- package/sa_std/nonzero.sal +2 -0
- package/sa_std/num/nonzero.sa +3 -0
- package/sa_std/num/nonzero.sal +1 -0
- package/sa_std/num/prelude.sa +3 -0
- package/sa_std/num/prelude.sal +3 -0
- package/sa_std/num.sa +17302 -0
- package/sa_std/num.sai +11 -0
- package/sa_std/num.sal +341 -0
- package/sa_std/ops.sa +1884 -0
- package/sa_std/ops.sal +68 -0
- package/sa_std/option.sa +2 -0
- package/sa_std/option.sal +1 -0
- package/sa_std/os/fd.sa +96 -0
- package/sa_std/os/fd.sai +7 -0
- package/sa_std/os/fd.sal +11 -0
- package/sa_std/os/prelude.sa +2 -0
- package/sa_std/os/prelude.sal +1 -0
- package/sa_std/os/unix_ffi.sa +271 -0
- package/sa_std/panic.sa +1 -0
- package/sa_std/panic.sal +1 -0
- package/sa_std/path.sa +3170 -0
- package/sa_std/path.sal +12 -0
- package/sa_std/phantom_data.sa +3 -0
- package/sa_std/phantom_data.sal +2 -0
- package/sa_std/pin.sa +79 -0
- package/sa_std/pin.sal +5 -0
- package/sa_std/plugin_async.sa +90 -0
- package/sa_std/plugin_async.sal +29 -0
- package/sa_std/plugin_async.sla +4 -0
- package/sa_std/plugin_http_async.sa +46 -0
- package/sa_std/plugin_http_server.sa +61 -0
- package/sa_std/plugin_http_server.sla +2 -0
- package/sa_std/plugin_sqlite.sa +106 -0
- package/sa_std/plugin_sqlite.sla +2 -0
- package/sa_std/prelude.sa +60 -0
- package/sa_std/prelude.sal +55 -0
- package/sa_std/process.sa +916 -0
- package/sa_std/process.sai +57 -0
- package/sa_std/process.sal +27 -0
- package/sa_std/ptr.sa +503 -0
- package/sa_std/ptr.sal +2 -0
- package/sa_std/result.sa +2 -0
- package/sa_std/result.sal +1 -0
- package/sa_std/rust_core.sa +51 -0
- package/sa_std/rust_core.sal +26 -0
- package/sa_std/sa.mod +7 -0
- package/sa_std/sort.sa +156 -0
- package/sa_std/str.sla +13 -0
- package/sa_std/string.sa +12240 -0
- package/sa_std/string.sai +25 -0
- package/sa_std/string.sal +17 -0
- package/sa_std/string_format.sa +269 -0
- package/sa_std/sync/atomic.sa +1500 -0
- package/sa_std/sync/atomic.sal +45 -0
- package/sa_std/sync/barrier.sa +105 -0
- package/sa_std/sync/barrier.sal +7 -0
- package/sa_std/sync/condvar.sa +240 -0
- package/sa_std/sync/condvar.sal +4 -0
- package/sa_std/sync/mpsc.sa +758 -0
- package/sa_std/sync/mpsc.sal +42 -0
- package/sa_std/sync/mpsc_list.sa +255 -0
- package/sa_std/sync/mpsc_list.sal +3 -0
- package/sa_std/sync/mutex.sa +182 -0
- package/sa_std/sync/mutex.sal +7 -0
- package/sa_std/sync/once.sa +371 -0
- package/sa_std/sync/once.sal +31 -0
- package/sa_std/sync/poison.sa +36 -0
- package/sa_std/sync/poison.sal +11 -0
- package/sa_std/sync/prelude.sa +8 -0
- package/sa_std/sync/prelude.sal +7 -0
- package/sa_std/sync/rwlock.sa +369 -0
- package/sa_std/sync/rwlock.sal +13 -0
- package/sa_std/task.sa +2 -0
- package/sa_std/task.sal +1 -0
- package/sa_std/term.sa +2 -0
- package/sa_std/term.sai +10 -0
- package/sa_std/term.sal +33 -0
- package/sa_std/testing/assert.sai +4 -0
- package/sa_std/testing/mock_io.sa +174 -0
- package/sa_std/testing/mock_io.sal +5 -0
- package/sa_std/testing/prelude.sa +2 -0
- package/sa_std/testing/prelude.sal +1 -0
- package/sa_std/text/prelude.sa +1 -0
- package/sa_std/text/prelude.sal +1 -0
- package/sa_std/text/regex.sa +2 -0
- package/sa_std/text/regex.sai +9 -0
- package/sa_std/text/regex.sal +33 -0
- package/sa_std/thread/join_handle.sa +3 -0
- package/sa_std/thread/join_handle.sal +1 -0
- package/sa_std/thread/prelude.sa +4 -0
- package/sa_std/thread/prelude.sal +3 -0
- package/sa_std/thread.sa +160 -0
- package/sa_std/thread.sai +11 -0
- package/sa_std/thread.sal +4 -0
- package/sa_std/thread_local.sa +45 -0
- package/sa_std/thread_local.sai +9 -0
- package/sa_std/time/duration.sa +3 -0
- package/sa_std/time/duration.sal +1 -0
- package/sa_std/time/instant.sa +3 -0
- package/sa_std/time/instant.sal +1 -0
- package/sa_std/time/prelude.sa +4 -0
- package/sa_std/time/prelude.sal +4 -0
- package/sa_std/time.sa +850 -0
- package/sa_std/time.sai +37 -0
- package/sa_std/time.sal +35 -0
- package/sa_std/time.sla +67 -0
- package/sa_std/tls_client.sai +39 -0
- package/sa_std/vec.sa +5754 -0
- package/sa_std/vec.sal +1 -0
- package/sa_std/vec_deque.sa +4925 -0
- package/sa_std/vec_deque.sal +8 -0
- package/sa_std/vec_runtime_macros.sa +11 -0
- package/sa_std/ws_client.sai +57 -0
|
@@ -0,0 +1,2210 @@
|
|
|
1
|
+
// Concrete ordered map backed by a sorted entry array.
|
|
2
|
+
@import "core/mem.sa"
|
|
3
|
+
@import "core/slice.sal"
|
|
4
|
+
@import "alloc/vec.sa"
|
|
5
|
+
@import "num.sa"
|
|
6
|
+
@import "btree_map.sal"
|
|
7
|
+
@import "hash.sa"
|
|
8
|
+
|
|
9
|
+
@btree_map_entry_cmp(&lhs: ptr, &rhs: ptr) -> i32:
|
|
10
|
+
L_ENTRY:
|
|
11
|
+
cmp = call @btree_map_entry_cmp_at(&lhs, &rhs, 0)
|
|
12
|
+
return cmp
|
|
13
|
+
|
|
14
|
+
@btree_map_entry_cmp_at(&lhs: ptr, &rhs: ptr, idx: u64) -> i32:
|
|
15
|
+
L_ENTRY:
|
|
16
|
+
lhs_len = load lhs+Slice_len as u64
|
|
17
|
+
rhs_len = load rhs+Slice_len as u64
|
|
18
|
+
lhs_done = eq idx, lhs_len
|
|
19
|
+
br lhs_done -> L_LHS_DONE, L_BODY
|
|
20
|
+
|
|
21
|
+
L_BODY:
|
|
22
|
+
rhs_done = eq idx, rhs_len
|
|
23
|
+
br rhs_done -> L_RHS_DONE, L_COMPARE
|
|
24
|
+
|
|
25
|
+
L_COMPARE:
|
|
26
|
+
lhs_ptr = load lhs+Slice_ptr as ptr
|
|
27
|
+
rhs_ptr = load rhs+Slice_ptr as ptr
|
|
28
|
+
lhs_ip = ptr_add lhs_ptr, idx
|
|
29
|
+
rhs_ip = ptr_add rhs_ptr, idx
|
|
30
|
+
lhs_byte = load lhs_ip+0 as u8
|
|
31
|
+
rhs_byte = load rhs_ip+0 as u8
|
|
32
|
+
lhs_lt = ult lhs_byte, rhs_byte
|
|
33
|
+
br lhs_lt -> L_LESS, L_GT_CHECK
|
|
34
|
+
|
|
35
|
+
L_GT_CHECK:
|
|
36
|
+
lhs_gt = ugt lhs_byte, rhs_byte
|
|
37
|
+
br lhs_gt -> L_GREATER, L_RECURSE
|
|
38
|
+
|
|
39
|
+
L_RECURSE:
|
|
40
|
+
next_idx = add idx, 1
|
|
41
|
+
cmp = call @btree_map_entry_cmp_at(&lhs, &rhs, next_idx)
|
|
42
|
+
!next_idx
|
|
43
|
+
!lhs_lt
|
|
44
|
+
!rhs_byte
|
|
45
|
+
!lhs_byte
|
|
46
|
+
!rhs_ip
|
|
47
|
+
!lhs_ip
|
|
48
|
+
!rhs_done
|
|
49
|
+
!lhs_done
|
|
50
|
+
!idx
|
|
51
|
+
!rhs_len
|
|
52
|
+
!lhs_len
|
|
53
|
+
!rhs
|
|
54
|
+
!lhs
|
|
55
|
+
return cmp
|
|
56
|
+
|
|
57
|
+
L_LESS:
|
|
58
|
+
cmp_result = sub 0, 1
|
|
59
|
+
!lhs_lt
|
|
60
|
+
!rhs_byte
|
|
61
|
+
!lhs_byte
|
|
62
|
+
!rhs_ip
|
|
63
|
+
!lhs_ip
|
|
64
|
+
!rhs_done
|
|
65
|
+
!lhs_done
|
|
66
|
+
!idx
|
|
67
|
+
!rhs_len
|
|
68
|
+
!lhs_len
|
|
69
|
+
!rhs
|
|
70
|
+
!lhs
|
|
71
|
+
return cmp_result
|
|
72
|
+
|
|
73
|
+
L_GREATER:
|
|
74
|
+
cmp_result = add 0, 1
|
|
75
|
+
!lhs_lt
|
|
76
|
+
!rhs_byte
|
|
77
|
+
!lhs_byte
|
|
78
|
+
!rhs_ip
|
|
79
|
+
!lhs_ip
|
|
80
|
+
!rhs_done
|
|
81
|
+
!lhs_done
|
|
82
|
+
!idx
|
|
83
|
+
!rhs_len
|
|
84
|
+
!lhs_len
|
|
85
|
+
!rhs
|
|
86
|
+
!lhs
|
|
87
|
+
return cmp_result
|
|
88
|
+
|
|
89
|
+
L_LHS_DONE:
|
|
90
|
+
rhs_done2 = eq idx, rhs_len
|
|
91
|
+
br rhs_done2 -> L_EQUAL, L_LHS_SHORTER
|
|
92
|
+
|
|
93
|
+
L_RHS_DONE:
|
|
94
|
+
cmp_result = add 0, 1
|
|
95
|
+
!rhs_done
|
|
96
|
+
!lhs_done
|
|
97
|
+
!idx
|
|
98
|
+
!rhs_len
|
|
99
|
+
!lhs_len
|
|
100
|
+
!rhs
|
|
101
|
+
!lhs
|
|
102
|
+
return cmp_result
|
|
103
|
+
|
|
104
|
+
L_LHS_SHORTER:
|
|
105
|
+
cmp_result = sub 0, 1
|
|
106
|
+
!rhs_done2
|
|
107
|
+
!lhs_done
|
|
108
|
+
!idx
|
|
109
|
+
!rhs_len
|
|
110
|
+
!lhs_len
|
|
111
|
+
!rhs
|
|
112
|
+
!lhs
|
|
113
|
+
return cmp_result
|
|
114
|
+
|
|
115
|
+
L_EQUAL:
|
|
116
|
+
!rhs_done2
|
|
117
|
+
!lhs_done
|
|
118
|
+
!idx
|
|
119
|
+
!rhs_len
|
|
120
|
+
!lhs_len
|
|
121
|
+
!rhs
|
|
122
|
+
!lhs
|
|
123
|
+
return 0
|
|
124
|
+
|
|
125
|
+
@btree_map_find(&entries: ptr, len: u64, &key: ptr, &out_index: ptr, &out_found: ptr) -> void:
|
|
126
|
+
L_ENTRY:
|
|
127
|
+
store out_index+0, 0 as u64
|
|
128
|
+
store out_found+0, 0 as u64
|
|
129
|
+
call @btree_map_find_at(&entries, len, &key, 0, &out_index, &out_found)
|
|
130
|
+
!out_found
|
|
131
|
+
!out_index
|
|
132
|
+
!key
|
|
133
|
+
!len
|
|
134
|
+
!entries
|
|
135
|
+
return
|
|
136
|
+
|
|
137
|
+
@btree_map_find_at(&entries: ptr, len: u64, &key: ptr, idx: u64, &out_index: ptr, &out_found: ptr) -> void:
|
|
138
|
+
L_ENTRY:
|
|
139
|
+
done = eq idx, len
|
|
140
|
+
br done -> L_FIND_DONE, L_FIND_BODY
|
|
141
|
+
|
|
142
|
+
L_FIND_BODY:
|
|
143
|
+
entry_off = mul idx, BTreeMapEntry_SIZE
|
|
144
|
+
entry = ptr_add entries, entry_off
|
|
145
|
+
cmp = call @btree_map_entry_cmp(&entry, &key)
|
|
146
|
+
is_equal = eq cmp, 0
|
|
147
|
+
br is_equal -> L_FIND_FOUND, L_FIND_GT_CHECK
|
|
148
|
+
|
|
149
|
+
L_FIND_GT_CHECK:
|
|
150
|
+
is_greater = sgt cmp, 0
|
|
151
|
+
br is_greater -> L_FIND_INSERT_POS, L_FIND_RECURSE
|
|
152
|
+
|
|
153
|
+
L_FIND_RECURSE:
|
|
154
|
+
next_idx = add idx, 1
|
|
155
|
+
call @btree_map_find_at(&entries, len, &key, next_idx, &out_index, &out_found)
|
|
156
|
+
!next_idx
|
|
157
|
+
!is_equal
|
|
158
|
+
!cmp
|
|
159
|
+
!entry
|
|
160
|
+
!entry_off
|
|
161
|
+
!idx
|
|
162
|
+
!done
|
|
163
|
+
!len
|
|
164
|
+
!key
|
|
165
|
+
!out_index
|
|
166
|
+
!out_found
|
|
167
|
+
!entries
|
|
168
|
+
return
|
|
169
|
+
|
|
170
|
+
L_FIND_FOUND:
|
|
171
|
+
store out_index+0, idx as u64
|
|
172
|
+
store out_found+0, 1 as u64
|
|
173
|
+
!is_equal
|
|
174
|
+
!cmp
|
|
175
|
+
!entry
|
|
176
|
+
!entry_off
|
|
177
|
+
!idx
|
|
178
|
+
!done
|
|
179
|
+
!len
|
|
180
|
+
!key
|
|
181
|
+
!out_index
|
|
182
|
+
!out_found
|
|
183
|
+
!entries
|
|
184
|
+
return
|
|
185
|
+
|
|
186
|
+
L_FIND_INSERT_POS:
|
|
187
|
+
store out_index+0, idx as u64
|
|
188
|
+
!is_equal
|
|
189
|
+
!cmp
|
|
190
|
+
!entry
|
|
191
|
+
!entry_off
|
|
192
|
+
!idx
|
|
193
|
+
!done
|
|
194
|
+
!len
|
|
195
|
+
!key
|
|
196
|
+
!out_index
|
|
197
|
+
!out_found
|
|
198
|
+
!entries
|
|
199
|
+
return
|
|
200
|
+
|
|
201
|
+
L_FIND_DONE:
|
|
202
|
+
store out_index+0, len as u64
|
|
203
|
+
!done
|
|
204
|
+
!len
|
|
205
|
+
!key
|
|
206
|
+
!out_index
|
|
207
|
+
!out_found
|
|
208
|
+
!entries
|
|
209
|
+
return
|
|
210
|
+
|
|
211
|
+
@btree_map_hash_entries_str_u64(&hasher: ptr, entries: ptr, len: u64, idx: u64) -> void:
|
|
212
|
+
L_ENTRY:
|
|
213
|
+
done = eq idx, len
|
|
214
|
+
br done -> L_BTREE_MAP_HASH_DONE, L_BTREE_MAP_HASH_BODY
|
|
215
|
+
|
|
216
|
+
L_BTREE_MAP_HASH_BODY:
|
|
217
|
+
entry_off = mul idx, BTreeMapEntry_SIZE
|
|
218
|
+
entry = ptr_add entries, entry_off
|
|
219
|
+
value = load entry+BTreeMapEntry_value as u64
|
|
220
|
+
EXPAND DEFAULT_HASHER_WRITE_STR hasher, entry
|
|
221
|
+
EXPAND DEFAULT_HASHER_WRITE_U64 hasher, value
|
|
222
|
+
next_idx = add idx, 1
|
|
223
|
+
call @btree_map_hash_entries_str_u64(&hasher, entries, len, next_idx)
|
|
224
|
+
!next_idx
|
|
225
|
+
!value
|
|
226
|
+
!entry
|
|
227
|
+
!entry_off
|
|
228
|
+
!done
|
|
229
|
+
!idx
|
|
230
|
+
!len
|
|
231
|
+
!entries
|
|
232
|
+
!hasher
|
|
233
|
+
return
|
|
234
|
+
|
|
235
|
+
L_BTREE_MAP_HASH_DONE:
|
|
236
|
+
!done
|
|
237
|
+
!idx
|
|
238
|
+
!len
|
|
239
|
+
!entries
|
|
240
|
+
!hasher
|
|
241
|
+
return
|
|
242
|
+
|
|
243
|
+
@btree_map_write_hash_str_u64(&hasher: ptr, &map: ptr) -> void:
|
|
244
|
+
L_ENTRY:
|
|
245
|
+
len = load map+BTreeMap_len as u64
|
|
246
|
+
entries = load map+BTreeMap_entries as ptr
|
|
247
|
+
EXPAND DEFAULT_HASHER_WRITE_LENGTH_PREFIX hasher, len
|
|
248
|
+
call @btree_map_hash_entries_str_u64(&hasher, entries, len, 0)
|
|
249
|
+
!entries
|
|
250
|
+
!len
|
|
251
|
+
!map
|
|
252
|
+
!hasher
|
|
253
|
+
return
|
|
254
|
+
|
|
255
|
+
@btree_map_grow(&map: ptr) -> void:
|
|
256
|
+
L_ENTRY:
|
|
257
|
+
old_entries = take map+BTreeMap_entries
|
|
258
|
+
old_cap = load map+BTreeMap_cap as u64
|
|
259
|
+
old_len = load map+BTreeMap_len as u64
|
|
260
|
+
EXPAND NUM_U64_CHECKED_ADD next_cap_ok, next_cap, old_cap, old_cap
|
|
261
|
+
br next_cap_ok -> L_GROW_CAP_OK, L_GROW_CAP_OVERFLOW
|
|
262
|
+
|
|
263
|
+
L_GROW_CAP_OVERFLOW:
|
|
264
|
+
panic(2001)
|
|
265
|
+
|
|
266
|
+
L_GROW_CAP_OK:
|
|
267
|
+
EXPAND NUM_U64_CHECKED_MUL copy_bytes_ok, copy_bytes, old_len, BTreeMapEntry_SIZE
|
|
268
|
+
br copy_bytes_ok -> L_GROW_COPY_BYTES_OK, L_GROW_COPY_BYTES_OVERFLOW
|
|
269
|
+
|
|
270
|
+
L_GROW_COPY_BYTES_OVERFLOW:
|
|
271
|
+
panic(2002)
|
|
272
|
+
|
|
273
|
+
L_GROW_COPY_BYTES_OK:
|
|
274
|
+
EXPAND NUM_U64_CHECKED_MUL new_bytes_ok, new_bytes, next_cap, BTreeMapEntry_SIZE
|
|
275
|
+
br new_bytes_ok -> L_GROW_ALLOC_BYTES_OK, L_GROW_ALLOC_BYTES_OVERFLOW
|
|
276
|
+
|
|
277
|
+
L_GROW_ALLOC_BYTES_OVERFLOW:
|
|
278
|
+
panic(2003)
|
|
279
|
+
|
|
280
|
+
L_GROW_ALLOC_BYTES_OK:
|
|
281
|
+
new_entries = alloc new_bytes
|
|
282
|
+
call @sa_mem_copy(&new_entries, &old_entries, copy_bytes)
|
|
283
|
+
store map+BTreeMap_entries, new_entries as ptr
|
|
284
|
+
store map+BTreeMap_cap, next_cap as u64
|
|
285
|
+
!new_bytes_ok
|
|
286
|
+
!copy_bytes_ok
|
|
287
|
+
!next_cap_ok
|
|
288
|
+
!copy_bytes
|
|
289
|
+
!new_bytes
|
|
290
|
+
!old_len
|
|
291
|
+
!old_cap
|
|
292
|
+
!old_entries
|
|
293
|
+
^new_entries
|
|
294
|
+
!next_cap
|
|
295
|
+
!map
|
|
296
|
+
return
|
|
297
|
+
|
|
298
|
+
@export sa_btree_map_new() -> ^ptr:
|
|
299
|
+
L_ENTRY:
|
|
300
|
+
map = alloc BTreeMap_SIZE
|
|
301
|
+
initial_bytes = mul BTreeMap_INITIAL_CAP, BTreeMapEntry_SIZE
|
|
302
|
+
entries = alloc initial_bytes
|
|
303
|
+
call @sa_mem_set(&entries, 0, initial_bytes)
|
|
304
|
+
store map+BTreeMap_entries, entries as ptr
|
|
305
|
+
store map+BTreeMap_cap, BTreeMap_INITIAL_CAP as u64
|
|
306
|
+
store map+BTreeMap_len, 0 as u64
|
|
307
|
+
!initial_bytes
|
|
308
|
+
^entries
|
|
309
|
+
return map
|
|
310
|
+
|
|
311
|
+
@export sa_btree_map_free(^map: ptr) -> void:
|
|
312
|
+
L_ENTRY:
|
|
313
|
+
entries = take map+BTreeMap_entries
|
|
314
|
+
!entries
|
|
315
|
+
!map
|
|
316
|
+
return
|
|
317
|
+
|
|
318
|
+
@export sa_btree_map_len(&map: ptr) -> u64:
|
|
319
|
+
L_ENTRY:
|
|
320
|
+
len = load map+BTreeMap_len as u64
|
|
321
|
+
!map
|
|
322
|
+
return len
|
|
323
|
+
|
|
324
|
+
@export sa_btree_map_is_empty(&map: ptr) -> i32:
|
|
325
|
+
L_ENTRY:
|
|
326
|
+
len = load map+BTreeMap_len as u64
|
|
327
|
+
empty = eq len, 0
|
|
328
|
+
result = empty as i32
|
|
329
|
+
!len
|
|
330
|
+
!map
|
|
331
|
+
return result
|
|
332
|
+
|
|
333
|
+
@export sa_btree_map_contains_key(&map: ptr, &key: ptr) -> i32:
|
|
334
|
+
L_ENTRY:
|
|
335
|
+
find_index_slot = stack_alloc 8
|
|
336
|
+
find_found_slot = stack_alloc 8
|
|
337
|
+
entries = load map+BTreeMap_entries as ptr
|
|
338
|
+
len = load map+BTreeMap_len as u64
|
|
339
|
+
call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
|
|
340
|
+
found = load find_found_slot+0 as u64
|
|
341
|
+
present = ne found, 0
|
|
342
|
+
result = present as i32
|
|
343
|
+
!found
|
|
344
|
+
!len
|
|
345
|
+
!key
|
|
346
|
+
!entries
|
|
347
|
+
!map
|
|
348
|
+
return result
|
|
349
|
+
|
|
350
|
+
@export sa_btree_map_clear(&map: ptr) -> void:
|
|
351
|
+
L_ENTRY:
|
|
352
|
+
entries = load map+BTreeMap_entries as ptr
|
|
353
|
+
cap = load map+BTreeMap_cap as u64
|
|
354
|
+
EXPAND NUM_U64_CHECKED_MUL clear_bytes_ok, bytes, cap, BTreeMapEntry_SIZE
|
|
355
|
+
br clear_bytes_ok -> L_CLEAR_BYTES_OK, L_CLEAR_BYTES_OVERFLOW
|
|
356
|
+
|
|
357
|
+
L_CLEAR_BYTES_OVERFLOW:
|
|
358
|
+
panic(2004)
|
|
359
|
+
|
|
360
|
+
L_CLEAR_BYTES_OK:
|
|
361
|
+
has_entries = ne entries, 0
|
|
362
|
+
br has_entries -> L_CLEAR_ENTRIES, L_CLEAR_DONE
|
|
363
|
+
|
|
364
|
+
L_CLEAR_ENTRIES:
|
|
365
|
+
call @sa_mem_set(&entries, 0, bytes)
|
|
366
|
+
jmp L_CLEAR_DONE
|
|
367
|
+
|
|
368
|
+
L_CLEAR_DONE:
|
|
369
|
+
store map+BTreeMap_len, 0 as u64
|
|
370
|
+
!clear_bytes_ok
|
|
371
|
+
!bytes
|
|
372
|
+
!has_entries
|
|
373
|
+
!cap
|
|
374
|
+
!entries
|
|
375
|
+
!map
|
|
376
|
+
return
|
|
377
|
+
|
|
378
|
+
@export sa_btree_map_remove(&map: ptr, &key: ptr) -> u64:
|
|
379
|
+
L_ENTRY:
|
|
380
|
+
find_index_slot = stack_alloc 8
|
|
381
|
+
find_found_slot = stack_alloc 8
|
|
382
|
+
entries = load map+BTreeMap_entries as ptr
|
|
383
|
+
len = load map+BTreeMap_len as u64
|
|
384
|
+
call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
|
|
385
|
+
find_index = load find_index_slot+0 as u64
|
|
386
|
+
found = load find_found_slot+0 as u64
|
|
387
|
+
is_found = ne found, 0
|
|
388
|
+
br is_found -> L_REMOVE_HIT, L_REMOVE_MISS
|
|
389
|
+
|
|
390
|
+
L_REMOVE_HIT:
|
|
391
|
+
remove_off = mul find_index, BTreeMapEntry_SIZE
|
|
392
|
+
remove_entry = ptr_add entries, remove_off
|
|
393
|
+
removed_value = load remove_entry+BTreeMapEntry_value as u64
|
|
394
|
+
removed_value_slot = stack_alloc 8
|
|
395
|
+
store removed_value_slot+0, removed_value as u64
|
|
396
|
+
last_index = sub len, 1
|
|
397
|
+
shift_slot = stack_alloc 8
|
|
398
|
+
store shift_slot+0, find_index as u64
|
|
399
|
+
jmp L_REMOVE_SHIFT_LOOP
|
|
400
|
+
|
|
401
|
+
L_REMOVE_SHIFT_LOOP:
|
|
402
|
+
shift_idx = load shift_slot+0 as u64
|
|
403
|
+
needs_shift = ult shift_idx, last_index
|
|
404
|
+
br needs_shift -> L_REMOVE_SHIFT_BODY, L_REMOVE_DONE
|
|
405
|
+
|
|
406
|
+
L_REMOVE_SHIFT_BODY:
|
|
407
|
+
next_idx = add shift_idx, 1
|
|
408
|
+
src_off = mul next_idx, BTreeMapEntry_SIZE
|
|
409
|
+
dst_off = mul shift_idx, BTreeMapEntry_SIZE
|
|
410
|
+
src_entry = ptr_add entries, src_off
|
|
411
|
+
dst_entry = ptr_add entries, dst_off
|
|
412
|
+
src_key_ptr = load src_entry+BTreeMapEntry_key_ptr as ptr
|
|
413
|
+
src_key_len = load src_entry+BTreeMapEntry_key_len as u64
|
|
414
|
+
src_value = load src_entry+BTreeMapEntry_value as u64
|
|
415
|
+
store dst_entry+BTreeMapEntry_key_ptr, src_key_ptr as ptr
|
|
416
|
+
store dst_entry+BTreeMapEntry_key_len, src_key_len as u64
|
|
417
|
+
store dst_entry+BTreeMapEntry_value, src_value as u64
|
|
418
|
+
next_shift = add shift_idx, 1
|
|
419
|
+
store shift_slot+0, next_shift as u64
|
|
420
|
+
!src_value
|
|
421
|
+
!src_key_len
|
|
422
|
+
!src_key_ptr
|
|
423
|
+
!dst_entry
|
|
424
|
+
!src_entry
|
|
425
|
+
!dst_off
|
|
426
|
+
!src_off
|
|
427
|
+
!next_idx
|
|
428
|
+
!next_shift
|
|
429
|
+
!shift_idx
|
|
430
|
+
!needs_shift
|
|
431
|
+
jmp L_REMOVE_SHIFT_LOOP
|
|
432
|
+
|
|
433
|
+
L_REMOVE_DONE:
|
|
434
|
+
last_off = mul last_index, BTreeMapEntry_SIZE
|
|
435
|
+
last_entry = ptr_add entries, last_off
|
|
436
|
+
store last_entry+BTreeMapEntry_key_ptr, 0 as ptr
|
|
437
|
+
store last_entry+BTreeMapEntry_key_len, 0 as u64
|
|
438
|
+
store last_entry+BTreeMapEntry_value, 0 as u64
|
|
439
|
+
next_len = sub len, 1
|
|
440
|
+
store map+BTreeMap_len, next_len as u64
|
|
441
|
+
!last_entry
|
|
442
|
+
!last_off
|
|
443
|
+
!next_len
|
|
444
|
+
!last_index
|
|
445
|
+
!remove_entry
|
|
446
|
+
!remove_off
|
|
447
|
+
!is_found
|
|
448
|
+
!found
|
|
449
|
+
!find_index
|
|
450
|
+
!len
|
|
451
|
+
!entries
|
|
452
|
+
!key
|
|
453
|
+
!map
|
|
454
|
+
removed_value2 = load removed_value_slot+0 as u64
|
|
455
|
+
return removed_value2
|
|
456
|
+
|
|
457
|
+
L_REMOVE_MISS:
|
|
458
|
+
!is_found
|
|
459
|
+
!found
|
|
460
|
+
!find_index
|
|
461
|
+
!len
|
|
462
|
+
!entries
|
|
463
|
+
!key
|
|
464
|
+
!map
|
|
465
|
+
return 0
|
|
466
|
+
|
|
467
|
+
@export sa_btree_map_get(&map: ptr, &key: ptr) -> u64:
|
|
468
|
+
L_ENTRY:
|
|
469
|
+
find_index_slot = stack_alloc 8
|
|
470
|
+
find_found_slot = stack_alloc 8
|
|
471
|
+
value_off = add 0, 0
|
|
472
|
+
value_entry = 0 as ptr
|
|
473
|
+
entries = load map+BTreeMap_entries as ptr
|
|
474
|
+
len = load map+BTreeMap_len as u64
|
|
475
|
+
call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
|
|
476
|
+
find_index = load find_index_slot+0 as u64
|
|
477
|
+
found = load find_found_slot+0 as u64
|
|
478
|
+
is_found = ne found, 0
|
|
479
|
+
br is_found -> L_GET_HIT, L_GET_MISS
|
|
480
|
+
|
|
481
|
+
L_GET_HIT:
|
|
482
|
+
value_off = mul find_index, BTreeMapEntry_SIZE
|
|
483
|
+
value_entry = ptr_add entries, value_off
|
|
484
|
+
value = load value_entry+BTreeMapEntry_value as u64
|
|
485
|
+
!value_entry
|
|
486
|
+
!value_off
|
|
487
|
+
!is_found
|
|
488
|
+
!found
|
|
489
|
+
!find_index
|
|
490
|
+
!len
|
|
491
|
+
!key
|
|
492
|
+
!entries
|
|
493
|
+
!map
|
|
494
|
+
return value
|
|
495
|
+
|
|
496
|
+
L_GET_MISS:
|
|
497
|
+
!value_entry
|
|
498
|
+
!value_off
|
|
499
|
+
!is_found
|
|
500
|
+
!found
|
|
501
|
+
!find_index
|
|
502
|
+
!len
|
|
503
|
+
!key
|
|
504
|
+
!entries
|
|
505
|
+
!map
|
|
506
|
+
return 0
|
|
507
|
+
|
|
508
|
+
@export sa_btree_map_try_get(&map: ptr, &key: ptr, &out_value_slot: ptr) -> i32:
|
|
509
|
+
L_ENTRY:
|
|
510
|
+
find_index_slot = stack_alloc 8
|
|
511
|
+
find_found_slot = stack_alloc 8
|
|
512
|
+
entries = load map+BTreeMap_entries as ptr
|
|
513
|
+
len = load map+BTreeMap_len as u64
|
|
514
|
+
call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
|
|
515
|
+
find_index = load find_index_slot+0 as u64
|
|
516
|
+
found = load find_found_slot+0 as u64
|
|
517
|
+
is_found = ne found, 0
|
|
518
|
+
br is_found -> L_TRY_GET_HIT, L_TRY_GET_MISS
|
|
519
|
+
|
|
520
|
+
L_TRY_GET_HIT:
|
|
521
|
+
value_off = mul find_index, BTreeMapEntry_SIZE
|
|
522
|
+
value_entry = ptr_add entries, value_off
|
|
523
|
+
value = load value_entry+BTreeMapEntry_value as u64
|
|
524
|
+
store out_value_slot+0, value as u64
|
|
525
|
+
!value
|
|
526
|
+
!value_entry
|
|
527
|
+
!value_off
|
|
528
|
+
!is_found
|
|
529
|
+
!found
|
|
530
|
+
!find_index
|
|
531
|
+
!len
|
|
532
|
+
!entries
|
|
533
|
+
!out_value_slot
|
|
534
|
+
!key
|
|
535
|
+
!map
|
|
536
|
+
return 1
|
|
537
|
+
|
|
538
|
+
L_TRY_GET_MISS:
|
|
539
|
+
store out_value_slot+0, 0 as u64
|
|
540
|
+
!is_found
|
|
541
|
+
!found
|
|
542
|
+
!find_index
|
|
543
|
+
!len
|
|
544
|
+
!entries
|
|
545
|
+
!out_value_slot
|
|
546
|
+
!key
|
|
547
|
+
!map
|
|
548
|
+
return 0
|
|
549
|
+
|
|
550
|
+
@export sa_btree_map_try_get_key_value(&map: ptr, &key: ptr, &out_key: ptr, &out_value_slot: ptr) -> i32:
|
|
551
|
+
L_ENTRY:
|
|
552
|
+
find_index_slot = stack_alloc 8
|
|
553
|
+
find_found_slot = stack_alloc 8
|
|
554
|
+
entries = load map+BTreeMap_entries as ptr
|
|
555
|
+
len = load map+BTreeMap_len as u64
|
|
556
|
+
call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
|
|
557
|
+
find_index = load find_index_slot+0 as u64
|
|
558
|
+
found = load find_found_slot+0 as u64
|
|
559
|
+
is_found = ne found, 0
|
|
560
|
+
br is_found -> L_GET_KEY_VALUE_HIT, L_GET_KEY_VALUE_MISS
|
|
561
|
+
|
|
562
|
+
L_GET_KEY_VALUE_HIT:
|
|
563
|
+
entry_off = mul find_index, BTreeMapEntry_SIZE
|
|
564
|
+
entry = ptr_add entries, entry_off
|
|
565
|
+
key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
|
|
566
|
+
key_len = load entry+BTreeMapEntry_key_len as u64
|
|
567
|
+
value = load entry+BTreeMapEntry_value as u64
|
|
568
|
+
store out_key+Slice_ptr, key_ptr as ptr
|
|
569
|
+
store out_key+Slice_len, key_len as u64
|
|
570
|
+
store out_value_slot+0, value as u64
|
|
571
|
+
!value
|
|
572
|
+
!key_len
|
|
573
|
+
!key_ptr
|
|
574
|
+
!entry
|
|
575
|
+
!entry_off
|
|
576
|
+
!is_found
|
|
577
|
+
!found
|
|
578
|
+
!find_index
|
|
579
|
+
!len
|
|
580
|
+
!entries
|
|
581
|
+
!out_value_slot
|
|
582
|
+
!out_key
|
|
583
|
+
!key
|
|
584
|
+
!map
|
|
585
|
+
return 1
|
|
586
|
+
|
|
587
|
+
L_GET_KEY_VALUE_MISS:
|
|
588
|
+
store out_key+Slice_ptr, 0 as ptr
|
|
589
|
+
store out_key+Slice_len, 0 as u64
|
|
590
|
+
store out_value_slot+0, 0 as u64
|
|
591
|
+
!is_found
|
|
592
|
+
!found
|
|
593
|
+
!find_index
|
|
594
|
+
!len
|
|
595
|
+
!entries
|
|
596
|
+
!out_value_slot
|
|
597
|
+
!out_key
|
|
598
|
+
!key
|
|
599
|
+
!map
|
|
600
|
+
return 0
|
|
601
|
+
|
|
602
|
+
@export sa_btree_map_get_mut_ptr(&map: ptr, &key: ptr, &out_ptr_slot: ptr) -> i32:
|
|
603
|
+
L_ENTRY:
|
|
604
|
+
find_index_slot = stack_alloc 8
|
|
605
|
+
find_found_slot = stack_alloc 8
|
|
606
|
+
entries = load map+BTreeMap_entries as ptr
|
|
607
|
+
len = load map+BTreeMap_len as u64
|
|
608
|
+
call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
|
|
609
|
+
find_index = load find_index_slot+0 as u64
|
|
610
|
+
found = load find_found_slot+0 as u64
|
|
611
|
+
is_found = ne found, 0
|
|
612
|
+
br is_found -> L_GET_MUT_HIT, L_GET_MUT_MISS
|
|
613
|
+
|
|
614
|
+
L_GET_MUT_HIT:
|
|
615
|
+
value_off = mul find_index, BTreeMapEntry_SIZE
|
|
616
|
+
value_entry = ptr_add entries, value_off
|
|
617
|
+
value_ptr = ptr_add value_entry, BTreeMapEntry_value
|
|
618
|
+
store out_ptr_slot+0, value_ptr as ptr
|
|
619
|
+
!value_ptr
|
|
620
|
+
!value_entry
|
|
621
|
+
!value_off
|
|
622
|
+
!is_found
|
|
623
|
+
!found
|
|
624
|
+
!find_index
|
|
625
|
+
!len
|
|
626
|
+
!entries
|
|
627
|
+
!out_ptr_slot
|
|
628
|
+
!key
|
|
629
|
+
!map
|
|
630
|
+
return 1
|
|
631
|
+
|
|
632
|
+
L_GET_MUT_MISS:
|
|
633
|
+
store out_ptr_slot+0, 0 as ptr
|
|
634
|
+
!is_found
|
|
635
|
+
!found
|
|
636
|
+
!find_index
|
|
637
|
+
!len
|
|
638
|
+
!entries
|
|
639
|
+
!out_ptr_slot
|
|
640
|
+
!key
|
|
641
|
+
!map
|
|
642
|
+
return 0
|
|
643
|
+
|
|
644
|
+
@export sa_btree_map_first_entry_mut_ptr(&map: ptr, &out_key: ptr, &out_ptr_slot: ptr) -> i32:
|
|
645
|
+
L_ENTRY:
|
|
646
|
+
len = load map+BTreeMap_len as u64
|
|
647
|
+
empty = eq len, 0
|
|
648
|
+
br empty -> L_FIRST_ENTRY_MUT_MISS, L_FIRST_ENTRY_MUT_HIT
|
|
649
|
+
|
|
650
|
+
L_FIRST_ENTRY_MUT_HIT:
|
|
651
|
+
entries = load map+BTreeMap_entries as ptr
|
|
652
|
+
entry = ptr_add entries, 0
|
|
653
|
+
key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
|
|
654
|
+
key_len = load entry+BTreeMapEntry_key_len as u64
|
|
655
|
+
value_ptr = ptr_add entry, BTreeMapEntry_value
|
|
656
|
+
store out_key+Slice_ptr, key_ptr as ptr
|
|
657
|
+
store out_key+Slice_len, key_len as u64
|
|
658
|
+
store out_ptr_slot+0, value_ptr as ptr
|
|
659
|
+
!value_ptr
|
|
660
|
+
!key_len
|
|
661
|
+
!key_ptr
|
|
662
|
+
!entry
|
|
663
|
+
!entries
|
|
664
|
+
!empty
|
|
665
|
+
!len
|
|
666
|
+
!out_ptr_slot
|
|
667
|
+
!out_key
|
|
668
|
+
!map
|
|
669
|
+
return 1
|
|
670
|
+
|
|
671
|
+
L_FIRST_ENTRY_MUT_MISS:
|
|
672
|
+
store out_key+Slice_ptr, 0 as ptr
|
|
673
|
+
store out_key+Slice_len, 0 as u64
|
|
674
|
+
store out_ptr_slot+0, 0 as ptr
|
|
675
|
+
!empty
|
|
676
|
+
!len
|
|
677
|
+
!out_ptr_slot
|
|
678
|
+
!out_key
|
|
679
|
+
!map
|
|
680
|
+
return 0
|
|
681
|
+
|
|
682
|
+
@export sa_btree_map_last_entry_mut_ptr(&map: ptr, &out_key: ptr, &out_ptr_slot: ptr) -> i32:
|
|
683
|
+
L_ENTRY:
|
|
684
|
+
len = load map+BTreeMap_len as u64
|
|
685
|
+
empty = eq len, 0
|
|
686
|
+
br empty -> L_LAST_ENTRY_MUT_MISS, L_LAST_ENTRY_MUT_HIT
|
|
687
|
+
|
|
688
|
+
L_LAST_ENTRY_MUT_HIT:
|
|
689
|
+
entries = load map+BTreeMap_entries as ptr
|
|
690
|
+
last_index = sub len, 1
|
|
691
|
+
entry_off = mul last_index, BTreeMapEntry_SIZE
|
|
692
|
+
entry = ptr_add entries, entry_off
|
|
693
|
+
key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
|
|
694
|
+
key_len = load entry+BTreeMapEntry_key_len as u64
|
|
695
|
+
value_ptr = ptr_add entry, BTreeMapEntry_value
|
|
696
|
+
store out_key+Slice_ptr, key_ptr as ptr
|
|
697
|
+
store out_key+Slice_len, key_len as u64
|
|
698
|
+
store out_ptr_slot+0, value_ptr as ptr
|
|
699
|
+
!value_ptr
|
|
700
|
+
!key_len
|
|
701
|
+
!key_ptr
|
|
702
|
+
!entry
|
|
703
|
+
!entry_off
|
|
704
|
+
!last_index
|
|
705
|
+
!entries
|
|
706
|
+
!empty
|
|
707
|
+
!len
|
|
708
|
+
!out_ptr_slot
|
|
709
|
+
!out_key
|
|
710
|
+
!map
|
|
711
|
+
return 1
|
|
712
|
+
|
|
713
|
+
L_LAST_ENTRY_MUT_MISS:
|
|
714
|
+
store out_key+Slice_ptr, 0 as ptr
|
|
715
|
+
store out_key+Slice_len, 0 as u64
|
|
716
|
+
store out_ptr_slot+0, 0 as ptr
|
|
717
|
+
!empty
|
|
718
|
+
!len
|
|
719
|
+
!out_ptr_slot
|
|
720
|
+
!out_key
|
|
721
|
+
!map
|
|
722
|
+
return 0
|
|
723
|
+
|
|
724
|
+
@export sa_btree_map_try_get_disjoint_mut_ptrs(&map: ptr, &key_a: ptr, &key_b: ptr, &out_ptr_a_slot: ptr, &out_ptr_b_slot: ptr) -> i32:
|
|
725
|
+
L_ENTRY:
|
|
726
|
+
key_cmp = call @btree_map_entry_cmp(&key_a, &key_b)
|
|
727
|
+
same_key = eq key_cmp, 0
|
|
728
|
+
br same_key -> L_BTREE_DISJOINT_MUT_SAME, L_BTREE_DISJOINT_MUT_LOOKUP_A
|
|
729
|
+
|
|
730
|
+
L_BTREE_DISJOINT_MUT_LOOKUP_A:
|
|
731
|
+
found_a = call @sa_btree_map_get_mut_ptr(&map, &key_a, &out_ptr_a_slot)
|
|
732
|
+
has_a = ne found_a, 0
|
|
733
|
+
br has_a -> L_BTREE_DISJOINT_MUT_LOOKUP_B, L_BTREE_DISJOINT_MUT_MISS_A
|
|
734
|
+
|
|
735
|
+
L_BTREE_DISJOINT_MUT_LOOKUP_B:
|
|
736
|
+
found_b = call @sa_btree_map_get_mut_ptr(&map, &key_b, &out_ptr_b_slot)
|
|
737
|
+
has_b = ne found_b, 0
|
|
738
|
+
br has_b -> L_BTREE_DISJOINT_MUT_HIT, L_BTREE_DISJOINT_MUT_MISS_B
|
|
739
|
+
|
|
740
|
+
L_BTREE_DISJOINT_MUT_HIT:
|
|
741
|
+
!has_b
|
|
742
|
+
!found_b
|
|
743
|
+
!has_a
|
|
744
|
+
!found_a
|
|
745
|
+
!same_key
|
|
746
|
+
!key_cmp
|
|
747
|
+
!out_ptr_b_slot
|
|
748
|
+
!out_ptr_a_slot
|
|
749
|
+
!key_b
|
|
750
|
+
!key_a
|
|
751
|
+
!map
|
|
752
|
+
return 1
|
|
753
|
+
|
|
754
|
+
L_BTREE_DISJOINT_MUT_MISS_B:
|
|
755
|
+
store out_ptr_a_slot+0, 0 as ptr
|
|
756
|
+
store out_ptr_b_slot+0, 0 as ptr
|
|
757
|
+
!has_b
|
|
758
|
+
!found_b
|
|
759
|
+
!has_a
|
|
760
|
+
!found_a
|
|
761
|
+
!same_key
|
|
762
|
+
!key_cmp
|
|
763
|
+
!out_ptr_b_slot
|
|
764
|
+
!out_ptr_a_slot
|
|
765
|
+
!key_b
|
|
766
|
+
!key_a
|
|
767
|
+
!map
|
|
768
|
+
return 0
|
|
769
|
+
|
|
770
|
+
L_BTREE_DISJOINT_MUT_MISS_A:
|
|
771
|
+
store out_ptr_a_slot+0, 0 as ptr
|
|
772
|
+
store out_ptr_b_slot+0, 0 as ptr
|
|
773
|
+
!has_a
|
|
774
|
+
!found_a
|
|
775
|
+
!same_key
|
|
776
|
+
!key_cmp
|
|
777
|
+
!out_ptr_b_slot
|
|
778
|
+
!out_ptr_a_slot
|
|
779
|
+
!key_b
|
|
780
|
+
!key_a
|
|
781
|
+
!map
|
|
782
|
+
return 0
|
|
783
|
+
|
|
784
|
+
L_BTREE_DISJOINT_MUT_SAME:
|
|
785
|
+
store out_ptr_a_slot+0, 0 as ptr
|
|
786
|
+
store out_ptr_b_slot+0, 0 as ptr
|
|
787
|
+
!same_key
|
|
788
|
+
!key_cmp
|
|
789
|
+
!out_ptr_b_slot
|
|
790
|
+
!out_ptr_a_slot
|
|
791
|
+
!key_b
|
|
792
|
+
!key_a
|
|
793
|
+
!map
|
|
794
|
+
return 0
|
|
795
|
+
|
|
796
|
+
@export sa_btree_map_first_key_value(&map: ptr, &out_key: ptr, &out_value_slot: ptr) -> i32:
|
|
797
|
+
L_ENTRY:
|
|
798
|
+
len = load map+BTreeMap_len as u64
|
|
799
|
+
empty = eq len, 0
|
|
800
|
+
br empty -> L_FIRST_MISS, L_FIRST_HIT
|
|
801
|
+
|
|
802
|
+
L_FIRST_HIT:
|
|
803
|
+
entries = load map+BTreeMap_entries as ptr
|
|
804
|
+
entry_off = add 0, 0
|
|
805
|
+
entry = ptr_add entries, entry_off
|
|
806
|
+
key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
|
|
807
|
+
key_len = load entry+BTreeMapEntry_key_len as u64
|
|
808
|
+
value = load entry+BTreeMapEntry_value as u64
|
|
809
|
+
store out_key+Slice_ptr, key_ptr as ptr
|
|
810
|
+
store out_key+Slice_len, key_len as u64
|
|
811
|
+
store out_value_slot+0, value as u64
|
|
812
|
+
!value
|
|
813
|
+
!key_len
|
|
814
|
+
!key_ptr
|
|
815
|
+
!entry
|
|
816
|
+
!entry_off
|
|
817
|
+
!entries
|
|
818
|
+
!empty
|
|
819
|
+
!len
|
|
820
|
+
!out_value_slot
|
|
821
|
+
!out_key
|
|
822
|
+
!map
|
|
823
|
+
return 1
|
|
824
|
+
|
|
825
|
+
L_FIRST_MISS:
|
|
826
|
+
store out_key+Slice_ptr, 0 as ptr
|
|
827
|
+
store out_key+Slice_len, 0 as u64
|
|
828
|
+
store out_value_slot+0, 0 as u64
|
|
829
|
+
!empty
|
|
830
|
+
!len
|
|
831
|
+
!out_value_slot
|
|
832
|
+
!out_key
|
|
833
|
+
!map
|
|
834
|
+
return 0
|
|
835
|
+
|
|
836
|
+
@export sa_btree_map_last_key_value(&map: ptr, &out_key: ptr, &out_value_slot: ptr) -> i32:
|
|
837
|
+
L_ENTRY:
|
|
838
|
+
len = load map+BTreeMap_len as u64
|
|
839
|
+
empty = eq len, 0
|
|
840
|
+
br empty -> L_LAST_MISS, L_LAST_HIT
|
|
841
|
+
|
|
842
|
+
L_LAST_HIT:
|
|
843
|
+
entries = load map+BTreeMap_entries as ptr
|
|
844
|
+
last_index = sub len, 1
|
|
845
|
+
entry_off = mul last_index, BTreeMapEntry_SIZE
|
|
846
|
+
entry = ptr_add entries, entry_off
|
|
847
|
+
key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
|
|
848
|
+
key_len = load entry+BTreeMapEntry_key_len as u64
|
|
849
|
+
value = load entry+BTreeMapEntry_value as u64
|
|
850
|
+
store out_key+Slice_ptr, key_ptr as ptr
|
|
851
|
+
store out_key+Slice_len, key_len as u64
|
|
852
|
+
store out_value_slot+0, value as u64
|
|
853
|
+
!value
|
|
854
|
+
!key_len
|
|
855
|
+
!key_ptr
|
|
856
|
+
!entry
|
|
857
|
+
!entry_off
|
|
858
|
+
!last_index
|
|
859
|
+
!entries
|
|
860
|
+
!empty
|
|
861
|
+
!len
|
|
862
|
+
!out_value_slot
|
|
863
|
+
!out_key
|
|
864
|
+
!map
|
|
865
|
+
return 1
|
|
866
|
+
|
|
867
|
+
L_LAST_MISS:
|
|
868
|
+
store out_key+Slice_ptr, 0 as ptr
|
|
869
|
+
store out_key+Slice_len, 0 as u64
|
|
870
|
+
store out_value_slot+0, 0 as u64
|
|
871
|
+
!empty
|
|
872
|
+
!len
|
|
873
|
+
!out_value_slot
|
|
874
|
+
!out_key
|
|
875
|
+
!map
|
|
876
|
+
return 0
|
|
877
|
+
|
|
878
|
+
@export sa_btree_map_insert(&map: ptr, &key: ptr, value: u64) -> void:
|
|
879
|
+
L_ENTRY:
|
|
880
|
+
find_index_slot = stack_alloc 8
|
|
881
|
+
find_found_slot = stack_alloc 8
|
|
882
|
+
entries = load map+BTreeMap_entries as ptr
|
|
883
|
+
cap = load map+BTreeMap_cap as u64
|
|
884
|
+
len = load map+BTreeMap_len as u64
|
|
885
|
+
call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
|
|
886
|
+
find_index = load find_index_slot+0 as u64
|
|
887
|
+
found = load find_found_slot+0 as u64
|
|
888
|
+
br found -> L_INSERT_UPDATE, L_INSERT_NEED_GROW
|
|
889
|
+
|
|
890
|
+
L_INSERT_UPDATE:
|
|
891
|
+
update_off = mul find_index, BTreeMapEntry_SIZE
|
|
892
|
+
update_entry = ptr_add entries, update_off
|
|
893
|
+
store update_entry+BTreeMapEntry_value, value as u64
|
|
894
|
+
!update_entry
|
|
895
|
+
!update_off
|
|
896
|
+
!find_index
|
|
897
|
+
!len
|
|
898
|
+
!cap
|
|
899
|
+
!value
|
|
900
|
+
!key
|
|
901
|
+
!entries
|
|
902
|
+
!map
|
|
903
|
+
return
|
|
904
|
+
|
|
905
|
+
L_INSERT_NEED_GROW:
|
|
906
|
+
len_is_cap = eq len, cap
|
|
907
|
+
br len_is_cap -> L_INSERT_GROW, L_INSERT_RELEASE
|
|
908
|
+
|
|
909
|
+
L_INSERT_GROW:
|
|
910
|
+
!entries
|
|
911
|
+
!len
|
|
912
|
+
!cap
|
|
913
|
+
call @btree_map_grow(&map)
|
|
914
|
+
jmp L_INSERT_READY
|
|
915
|
+
|
|
916
|
+
L_INSERT_RELEASE:
|
|
917
|
+
!entries
|
|
918
|
+
!len
|
|
919
|
+
!cap
|
|
920
|
+
jmp L_INSERT_READY
|
|
921
|
+
|
|
922
|
+
L_INSERT_READY:
|
|
923
|
+
entries2 = load map+BTreeMap_entries as ptr
|
|
924
|
+
len2 = load map+BTreeMap_len as u64
|
|
925
|
+
shift_slot = stack_alloc 8
|
|
926
|
+
store shift_slot+0, len2 as u64
|
|
927
|
+
jmp L_INSERT_SHIFT_LOOP
|
|
928
|
+
|
|
929
|
+
L_INSERT_SHIFT_LOOP:
|
|
930
|
+
shift_idx = load shift_slot+0 as u64
|
|
931
|
+
done = eq shift_idx, find_index
|
|
932
|
+
br done -> L_INSERT_WRITE, L_INSERT_SHIFT_BODY
|
|
933
|
+
|
|
934
|
+
L_INSERT_SHIFT_BODY:
|
|
935
|
+
prev_idx = sub shift_idx, 1
|
|
936
|
+
prev_off = mul prev_idx, BTreeMapEntry_SIZE
|
|
937
|
+
dst_off = mul shift_idx, BTreeMapEntry_SIZE
|
|
938
|
+
prev_entry = ptr_add entries2, prev_off
|
|
939
|
+
dst_entry = ptr_add entries2, dst_off
|
|
940
|
+
prev_key_ptr = load prev_entry+BTreeMapEntry_key_ptr as ptr
|
|
941
|
+
prev_key_len = load prev_entry+BTreeMapEntry_key_len as u64
|
|
942
|
+
prev_value = load prev_entry+BTreeMapEntry_value as u64
|
|
943
|
+
store dst_entry+BTreeMapEntry_key_ptr, prev_key_ptr as ptr
|
|
944
|
+
store dst_entry+BTreeMapEntry_key_len, prev_key_len as u64
|
|
945
|
+
store dst_entry+BTreeMapEntry_value, prev_value as u64
|
|
946
|
+
next_shift = sub shift_idx, 1
|
|
947
|
+
store shift_slot+0, next_shift as u64
|
|
948
|
+
!prev_idx
|
|
949
|
+
!next_shift
|
|
950
|
+
!prev_value
|
|
951
|
+
!prev_key_len
|
|
952
|
+
!prev_key_ptr
|
|
953
|
+
!dst_entry
|
|
954
|
+
!prev_entry
|
|
955
|
+
!dst_off
|
|
956
|
+
!prev_off
|
|
957
|
+
!shift_idx
|
|
958
|
+
!done
|
|
959
|
+
jmp L_INSERT_SHIFT_LOOP
|
|
960
|
+
|
|
961
|
+
L_INSERT_WRITE:
|
|
962
|
+
insert_off = mul find_index, BTreeMapEntry_SIZE
|
|
963
|
+
insert_entry = ptr_add entries2, insert_off
|
|
964
|
+
key_ptr = load key+Slice_ptr as ptr
|
|
965
|
+
key_len = load key+Slice_len as u64
|
|
966
|
+
store insert_entry+BTreeMapEntry_key_ptr, key_ptr as ptr
|
|
967
|
+
store insert_entry+BTreeMapEntry_key_len, key_len as u64
|
|
968
|
+
store insert_entry+BTreeMapEntry_value, value as u64
|
|
969
|
+
next_len = add len2, 1
|
|
970
|
+
store map+BTreeMap_len, next_len as u64
|
|
971
|
+
!key_len
|
|
972
|
+
!key_ptr
|
|
973
|
+
!insert_entry
|
|
974
|
+
!insert_off
|
|
975
|
+
!entries2
|
|
976
|
+
!len2
|
|
977
|
+
!value
|
|
978
|
+
!key
|
|
979
|
+
!find_index
|
|
980
|
+
!map
|
|
981
|
+
return
|
|
982
|
+
|
|
983
|
+
@export sa_btree_map_insert_old(&map: ptr, &key: ptr, value: u64, &out_old_value_slot: ptr) -> i32:
|
|
984
|
+
L_ENTRY:
|
|
985
|
+
replaced = call @sa_btree_map_try_get(&map, &key, &out_old_value_slot)
|
|
986
|
+
call @sa_btree_map_insert(&map, &key, value)
|
|
987
|
+
!out_old_value_slot
|
|
988
|
+
!value
|
|
989
|
+
!key
|
|
990
|
+
!map
|
|
991
|
+
return replaced
|
|
992
|
+
|
|
993
|
+
@export sa_btree_map_try_insert(&map: ptr, &key: ptr, value: u64, &out_value_ptr_slot: ptr) -> i32:
|
|
994
|
+
L_ENTRY:
|
|
995
|
+
existing_ptr_slot = stack_alloc 8
|
|
996
|
+
found = call @sa_btree_map_get_mut_ptr(&map, &key, &existing_ptr_slot)
|
|
997
|
+
exists = ne found, 0
|
|
998
|
+
br exists -> L_BTREE_TRY_INSERT_EXISTS, L_BTREE_TRY_INSERT_NEW
|
|
999
|
+
|
|
1000
|
+
L_BTREE_TRY_INSERT_EXISTS:
|
|
1001
|
+
existing_ptr = load existing_ptr_slot+0 as ptr
|
|
1002
|
+
store out_value_ptr_slot+0, existing_ptr as ptr
|
|
1003
|
+
!existing_ptr
|
|
1004
|
+
!exists
|
|
1005
|
+
!found
|
|
1006
|
+
!out_value_ptr_slot
|
|
1007
|
+
!value
|
|
1008
|
+
!key
|
|
1009
|
+
!map
|
|
1010
|
+
return 0
|
|
1011
|
+
|
|
1012
|
+
L_BTREE_TRY_INSERT_NEW:
|
|
1013
|
+
call @sa_btree_map_insert(&map, &key, value)
|
|
1014
|
+
inserted_found = call @sa_btree_map_get_mut_ptr(&map, &key, &existing_ptr_slot)
|
|
1015
|
+
inserted_ptr = load existing_ptr_slot+0 as ptr
|
|
1016
|
+
store out_value_ptr_slot+0, inserted_ptr as ptr
|
|
1017
|
+
!inserted_ptr
|
|
1018
|
+
!inserted_found
|
|
1019
|
+
!exists
|
|
1020
|
+
!found
|
|
1021
|
+
!out_value_ptr_slot
|
|
1022
|
+
!value
|
|
1023
|
+
!key
|
|
1024
|
+
!map
|
|
1025
|
+
return 1
|
|
1026
|
+
|
|
1027
|
+
@export sa_btree_map_keys_set(&map: ptr) -> ^ptr:
|
|
1028
|
+
L_ENTRY:
|
|
1029
|
+
out_set = call @sa_btree_map_new()
|
|
1030
|
+
entries = load map+BTreeMap_entries as ptr
|
|
1031
|
+
len = load map+BTreeMap_len as u64
|
|
1032
|
+
idx_slot = stack_alloc 8
|
|
1033
|
+
store idx_slot+0, 0 as u64
|
|
1034
|
+
jmp L_BTREE_KEYS_HEAD
|
|
1035
|
+
|
|
1036
|
+
L_BTREE_KEYS_HEAD:
|
|
1037
|
+
idx = load idx_slot+0 as u64
|
|
1038
|
+
done = eq idx, len
|
|
1039
|
+
br done -> L_BTREE_KEYS_DONE, L_BTREE_KEYS_BODY
|
|
1040
|
+
|
|
1041
|
+
L_BTREE_KEYS_BODY:
|
|
1042
|
+
entry_off = mul idx, BTreeMapEntry_SIZE
|
|
1043
|
+
entry = ptr_add entries, entry_off
|
|
1044
|
+
call @sa_btree_map_insert(&out_set, &entry, 1)
|
|
1045
|
+
next_idx = add idx, 1
|
|
1046
|
+
store idx_slot+0, next_idx as u64
|
|
1047
|
+
!next_idx
|
|
1048
|
+
!entry
|
|
1049
|
+
!entry_off
|
|
1050
|
+
!done
|
|
1051
|
+
!idx
|
|
1052
|
+
jmp L_BTREE_KEYS_HEAD
|
|
1053
|
+
|
|
1054
|
+
L_BTREE_KEYS_DONE:
|
|
1055
|
+
!done
|
|
1056
|
+
!idx
|
|
1057
|
+
!len
|
|
1058
|
+
!entries
|
|
1059
|
+
!map
|
|
1060
|
+
return out_set
|
|
1061
|
+
|
|
1062
|
+
@export sa_btree_map_values_vec(&map: ptr) -> ^ptr:
|
|
1063
|
+
L_ENTRY:
|
|
1064
|
+
len = load map+BTreeMap_len as u64
|
|
1065
|
+
out_vec = call @sa_vec_with_capacity(len, 8)
|
|
1066
|
+
entries = load map+BTreeMap_entries as ptr
|
|
1067
|
+
idx_slot = stack_alloc 8
|
|
1068
|
+
store idx_slot+0, 0 as u64
|
|
1069
|
+
jmp L_BTREE_VALUES_HEAD
|
|
1070
|
+
|
|
1071
|
+
L_BTREE_VALUES_HEAD:
|
|
1072
|
+
idx = load idx_slot+0 as u64
|
|
1073
|
+
done = eq idx, len
|
|
1074
|
+
br done -> L_BTREE_VALUES_DONE, L_BTREE_VALUES_BODY
|
|
1075
|
+
|
|
1076
|
+
L_BTREE_VALUES_BODY:
|
|
1077
|
+
entry_off = mul idx, BTreeMapEntry_SIZE
|
|
1078
|
+
entry = ptr_add entries, entry_off
|
|
1079
|
+
value = load entry+BTreeMapEntry_value as u64
|
|
1080
|
+
out_vec = call @sa_vec_push(^out_vec, value, 8)
|
|
1081
|
+
next_idx = add idx, 1
|
|
1082
|
+
store idx_slot+0, next_idx as u64
|
|
1083
|
+
!next_idx
|
|
1084
|
+
!value
|
|
1085
|
+
!entry
|
|
1086
|
+
!entry_off
|
|
1087
|
+
!done
|
|
1088
|
+
!idx
|
|
1089
|
+
jmp L_BTREE_VALUES_HEAD
|
|
1090
|
+
|
|
1091
|
+
L_BTREE_VALUES_DONE:
|
|
1092
|
+
!done
|
|
1093
|
+
!idx
|
|
1094
|
+
!entries
|
|
1095
|
+
!len
|
|
1096
|
+
!map
|
|
1097
|
+
return out_vec
|
|
1098
|
+
|
|
1099
|
+
@export sa_btree_map_value_mut_ptrs_vec(&map: ptr) -> ^ptr:
|
|
1100
|
+
L_ENTRY:
|
|
1101
|
+
len = load map+BTreeMap_len as u64
|
|
1102
|
+
out_vec = call @sa_vec_with_capacity(len, 8)
|
|
1103
|
+
entries = load map+BTreeMap_entries as ptr
|
|
1104
|
+
idx_slot = stack_alloc 8
|
|
1105
|
+
store idx_slot+0, 0 as u64
|
|
1106
|
+
jmp L_BTREE_VALUE_PTRS_HEAD
|
|
1107
|
+
|
|
1108
|
+
L_BTREE_VALUE_PTRS_HEAD:
|
|
1109
|
+
idx = load idx_slot+0 as u64
|
|
1110
|
+
done = eq idx, len
|
|
1111
|
+
br done -> L_BTREE_VALUE_PTRS_DONE, L_BTREE_VALUE_PTRS_BODY
|
|
1112
|
+
|
|
1113
|
+
L_BTREE_VALUE_PTRS_BODY:
|
|
1114
|
+
entry_off = mul idx, BTreeMapEntry_SIZE
|
|
1115
|
+
entry = ptr_add entries, entry_off
|
|
1116
|
+
value_ptr = ptr_add entry, BTreeMapEntry_value
|
|
1117
|
+
value_ptr_bits = bitcast value_ptr as u64
|
|
1118
|
+
out_vec = call @sa_vec_push(^out_vec, value_ptr_bits, 8)
|
|
1119
|
+
next_idx = add idx, 1
|
|
1120
|
+
store idx_slot+0, next_idx as u64
|
|
1121
|
+
!next_idx
|
|
1122
|
+
!value_ptr_bits
|
|
1123
|
+
!value_ptr
|
|
1124
|
+
!entry
|
|
1125
|
+
!entry_off
|
|
1126
|
+
!done
|
|
1127
|
+
!idx
|
|
1128
|
+
jmp L_BTREE_VALUE_PTRS_HEAD
|
|
1129
|
+
|
|
1130
|
+
L_BTREE_VALUE_PTRS_DONE:
|
|
1131
|
+
!done
|
|
1132
|
+
!idx
|
|
1133
|
+
!entries
|
|
1134
|
+
!len
|
|
1135
|
+
!map
|
|
1136
|
+
return out_vec
|
|
1137
|
+
|
|
1138
|
+
@export sa_btree_map_iter_vec(&map: ptr) -> ^ptr:
|
|
1139
|
+
L_ENTRY:
|
|
1140
|
+
len = load map+BTreeMap_len as u64
|
|
1141
|
+
EXPAND NUM_U64_CHECKED_MUL btree_iter_cap_ok, btree_iter_cap, len, 3
|
|
1142
|
+
br btree_iter_cap_ok -> L_BTREE_ITER_CAP_OK, L_BTREE_ITER_CAP_OVERFLOW
|
|
1143
|
+
|
|
1144
|
+
L_BTREE_ITER_CAP_OVERFLOW:
|
|
1145
|
+
panic(2204)
|
|
1146
|
+
|
|
1147
|
+
L_BTREE_ITER_CAP_OK:
|
|
1148
|
+
out_vec = call @sa_vec_with_capacity(btree_iter_cap, 8)
|
|
1149
|
+
entries = load map+BTreeMap_entries as ptr
|
|
1150
|
+
idx_slot = stack_alloc 8
|
|
1151
|
+
store idx_slot+0, 0 as u64
|
|
1152
|
+
jmp L_BTREE_ITER_HEAD
|
|
1153
|
+
|
|
1154
|
+
L_BTREE_ITER_HEAD:
|
|
1155
|
+
idx = load idx_slot+0 as u64
|
|
1156
|
+
done = eq idx, len
|
|
1157
|
+
br done -> L_BTREE_ITER_DONE, L_BTREE_ITER_BODY
|
|
1158
|
+
|
|
1159
|
+
L_BTREE_ITER_BODY:
|
|
1160
|
+
entry_off = mul idx, BTreeMapEntry_SIZE
|
|
1161
|
+
entry = ptr_add entries, entry_off
|
|
1162
|
+
key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
|
|
1163
|
+
key_len = load entry+BTreeMapEntry_key_len as u64
|
|
1164
|
+
value = load entry+BTreeMapEntry_value as u64
|
|
1165
|
+
key_ptr_bits = bitcast key_ptr as u64
|
|
1166
|
+
out_vec = call @sa_vec_push(^out_vec, key_ptr_bits, 8)
|
|
1167
|
+
out_vec = call @sa_vec_push(^out_vec, key_len, 8)
|
|
1168
|
+
out_vec = call @sa_vec_push(^out_vec, value, 8)
|
|
1169
|
+
next_idx = add idx, 1
|
|
1170
|
+
store idx_slot+0, next_idx as u64
|
|
1171
|
+
!next_idx
|
|
1172
|
+
!key_ptr_bits
|
|
1173
|
+
!value
|
|
1174
|
+
!key_len
|
|
1175
|
+
!key_ptr
|
|
1176
|
+
!entry
|
|
1177
|
+
!entry_off
|
|
1178
|
+
!done
|
|
1179
|
+
!idx
|
|
1180
|
+
jmp L_BTREE_ITER_HEAD
|
|
1181
|
+
|
|
1182
|
+
L_BTREE_ITER_DONE:
|
|
1183
|
+
!done
|
|
1184
|
+
!idx
|
|
1185
|
+
!entries
|
|
1186
|
+
!btree_iter_cap_ok
|
|
1187
|
+
!btree_iter_cap
|
|
1188
|
+
!len
|
|
1189
|
+
!map
|
|
1190
|
+
return out_vec
|
|
1191
|
+
|
|
1192
|
+
@export sa_btree_map_iter_mut_ptrs_vec(&map: ptr) -> ^ptr:
|
|
1193
|
+
L_ENTRY:
|
|
1194
|
+
len = load map+BTreeMap_len as u64
|
|
1195
|
+
EXPAND NUM_U64_CHECKED_MUL btree_iter_mut_cap_ok, btree_iter_mut_cap, len, 3
|
|
1196
|
+
br btree_iter_mut_cap_ok -> L_BTREE_ITER_MUT_CAP_OK, L_BTREE_ITER_MUT_CAP_OVERFLOW
|
|
1197
|
+
|
|
1198
|
+
L_BTREE_ITER_MUT_CAP_OVERFLOW:
|
|
1199
|
+
panic(2205)
|
|
1200
|
+
|
|
1201
|
+
L_BTREE_ITER_MUT_CAP_OK:
|
|
1202
|
+
out_vec = call @sa_vec_with_capacity(btree_iter_mut_cap, 8)
|
|
1203
|
+
entries = load map+BTreeMap_entries as ptr
|
|
1204
|
+
idx_slot = stack_alloc 8
|
|
1205
|
+
store idx_slot+0, 0 as u64
|
|
1206
|
+
jmp L_BTREE_ITER_MUT_HEAD
|
|
1207
|
+
|
|
1208
|
+
L_BTREE_ITER_MUT_HEAD:
|
|
1209
|
+
idx = load idx_slot+0 as u64
|
|
1210
|
+
done = eq idx, len
|
|
1211
|
+
br done -> L_BTREE_ITER_MUT_DONE, L_BTREE_ITER_MUT_BODY
|
|
1212
|
+
|
|
1213
|
+
L_BTREE_ITER_MUT_BODY:
|
|
1214
|
+
entry_off = mul idx, BTreeMapEntry_SIZE
|
|
1215
|
+
entry = ptr_add entries, entry_off
|
|
1216
|
+
key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
|
|
1217
|
+
key_len = load entry+BTreeMapEntry_key_len as u64
|
|
1218
|
+
value_ptr = ptr_add entry, BTreeMapEntry_value
|
|
1219
|
+
key_ptr_bits = bitcast key_ptr as u64
|
|
1220
|
+
value_ptr_bits = bitcast value_ptr as u64
|
|
1221
|
+
out_vec = call @sa_vec_push(^out_vec, key_ptr_bits, 8)
|
|
1222
|
+
out_vec = call @sa_vec_push(^out_vec, key_len, 8)
|
|
1223
|
+
out_vec = call @sa_vec_push(^out_vec, value_ptr_bits, 8)
|
|
1224
|
+
next_idx = add idx, 1
|
|
1225
|
+
store idx_slot+0, next_idx as u64
|
|
1226
|
+
!next_idx
|
|
1227
|
+
!value_ptr_bits
|
|
1228
|
+
!key_ptr_bits
|
|
1229
|
+
!value_ptr
|
|
1230
|
+
!key_len
|
|
1231
|
+
!key_ptr
|
|
1232
|
+
!entry
|
|
1233
|
+
!entry_off
|
|
1234
|
+
!done
|
|
1235
|
+
!idx
|
|
1236
|
+
jmp L_BTREE_ITER_MUT_HEAD
|
|
1237
|
+
|
|
1238
|
+
L_BTREE_ITER_MUT_DONE:
|
|
1239
|
+
!done
|
|
1240
|
+
!idx
|
|
1241
|
+
!entries
|
|
1242
|
+
!btree_iter_mut_cap_ok
|
|
1243
|
+
!btree_iter_mut_cap
|
|
1244
|
+
!len
|
|
1245
|
+
!map
|
|
1246
|
+
return out_vec
|
|
1247
|
+
|
|
1248
|
+
@export sa_btree_map_range_mut_ptrs_vec(&map: ptr, &start_key: ptr, &end_key: ptr) -> ^ptr:
|
|
1249
|
+
L_ENTRY:
|
|
1250
|
+
len = load map+BTreeMap_len as u64
|
|
1251
|
+
EXPAND NUM_U64_CHECKED_MUL btree_range_mut_cap_ok, btree_range_mut_cap, len, 3
|
|
1252
|
+
br btree_range_mut_cap_ok -> L_BTREE_RANGE_MUT_CAP_OK, L_BTREE_RANGE_MUT_CAP_OVERFLOW
|
|
1253
|
+
|
|
1254
|
+
L_BTREE_RANGE_MUT_CAP_OVERFLOW:
|
|
1255
|
+
panic(2205)
|
|
1256
|
+
|
|
1257
|
+
L_BTREE_RANGE_MUT_CAP_OK:
|
|
1258
|
+
out_vec = call @sa_vec_with_capacity(btree_range_mut_cap, 8)
|
|
1259
|
+
entries = load map+BTreeMap_entries as ptr
|
|
1260
|
+
idx_slot = stack_alloc 8
|
|
1261
|
+
store idx_slot+0, 0 as u64
|
|
1262
|
+
jmp L_BTREE_RANGE_MUT_HEAD
|
|
1263
|
+
|
|
1264
|
+
L_BTREE_RANGE_MUT_HEAD:
|
|
1265
|
+
idx = load idx_slot+0 as u64
|
|
1266
|
+
done = eq idx, len
|
|
1267
|
+
br done -> L_BTREE_RANGE_MUT_DONE, L_BTREE_RANGE_MUT_BODY
|
|
1268
|
+
|
|
1269
|
+
L_BTREE_RANGE_MUT_BODY:
|
|
1270
|
+
entry_off = mul idx, BTreeMapEntry_SIZE
|
|
1271
|
+
entry = ptr_add entries, entry_off
|
|
1272
|
+
cmp_start = call @btree_map_entry_cmp(&entry, &start_key)
|
|
1273
|
+
in_lower = sge cmp_start, 0
|
|
1274
|
+
br in_lower -> L_BTREE_RANGE_MUT_CHECK_END, L_BTREE_RANGE_MUT_NEXT_SKIP
|
|
1275
|
+
|
|
1276
|
+
L_BTREE_RANGE_MUT_CHECK_END:
|
|
1277
|
+
cmp_end = call @btree_map_entry_cmp(&entry, &end_key)
|
|
1278
|
+
before_end = slt cmp_end, 0
|
|
1279
|
+
br before_end -> L_BTREE_RANGE_MUT_KEEP, L_BTREE_RANGE_MUT_SKIP_END
|
|
1280
|
+
|
|
1281
|
+
L_BTREE_RANGE_MUT_KEEP:
|
|
1282
|
+
key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
|
|
1283
|
+
key_len = load entry+BTreeMapEntry_key_len as u64
|
|
1284
|
+
value_ptr = ptr_add entry, BTreeMapEntry_value
|
|
1285
|
+
key_ptr_bits = bitcast key_ptr as u64
|
|
1286
|
+
value_ptr_bits = bitcast value_ptr as u64
|
|
1287
|
+
out_vec = call @sa_vec_push(^out_vec, key_ptr_bits, 8)
|
|
1288
|
+
out_vec = call @sa_vec_push(^out_vec, key_len, 8)
|
|
1289
|
+
out_vec = call @sa_vec_push(^out_vec, value_ptr_bits, 8)
|
|
1290
|
+
!value_ptr_bits
|
|
1291
|
+
!key_ptr_bits
|
|
1292
|
+
!value_ptr
|
|
1293
|
+
!key_len
|
|
1294
|
+
!key_ptr
|
|
1295
|
+
!before_end
|
|
1296
|
+
!cmp_end
|
|
1297
|
+
!in_lower
|
|
1298
|
+
!cmp_start
|
|
1299
|
+
jmp L_BTREE_RANGE_MUT_NEXT
|
|
1300
|
+
|
|
1301
|
+
L_BTREE_RANGE_MUT_SKIP_END:
|
|
1302
|
+
!before_end
|
|
1303
|
+
!cmp_end
|
|
1304
|
+
!in_lower
|
|
1305
|
+
!cmp_start
|
|
1306
|
+
jmp L_BTREE_RANGE_MUT_NEXT
|
|
1307
|
+
|
|
1308
|
+
L_BTREE_RANGE_MUT_NEXT_SKIP:
|
|
1309
|
+
!in_lower
|
|
1310
|
+
!cmp_start
|
|
1311
|
+
jmp L_BTREE_RANGE_MUT_NEXT
|
|
1312
|
+
|
|
1313
|
+
L_BTREE_RANGE_MUT_NEXT:
|
|
1314
|
+
next_idx = add idx, 1
|
|
1315
|
+
store idx_slot+0, next_idx as u64
|
|
1316
|
+
!next_idx
|
|
1317
|
+
!entry
|
|
1318
|
+
!entry_off
|
|
1319
|
+
!done
|
|
1320
|
+
!idx
|
|
1321
|
+
jmp L_BTREE_RANGE_MUT_HEAD
|
|
1322
|
+
|
|
1323
|
+
L_BTREE_RANGE_MUT_DONE:
|
|
1324
|
+
!done
|
|
1325
|
+
!idx
|
|
1326
|
+
!entries
|
|
1327
|
+
!btree_range_mut_cap_ok
|
|
1328
|
+
!btree_range_mut_cap
|
|
1329
|
+
!len
|
|
1330
|
+
!end_key
|
|
1331
|
+
!start_key
|
|
1332
|
+
!map
|
|
1333
|
+
return out_vec
|
|
1334
|
+
|
|
1335
|
+
@export sa_btree_map_remove_entry(&map: ptr, &key: ptr, &out_key: ptr, &out_value_slot: ptr) -> i32:
|
|
1336
|
+
L_ENTRY:
|
|
1337
|
+
found = call @sa_btree_map_try_get_key_value(&map, &key, &out_key, &out_value_slot)
|
|
1338
|
+
found_nonzero = ne found, 0
|
|
1339
|
+
br found_nonzero -> L_REMOVE_ENTRY_HIT, L_REMOVE_ENTRY_MISS
|
|
1340
|
+
|
|
1341
|
+
L_REMOVE_ENTRY_HIT:
|
|
1342
|
+
removed = call @sa_btree_map_remove(&map, &key)
|
|
1343
|
+
!removed
|
|
1344
|
+
!found_nonzero
|
|
1345
|
+
!found
|
|
1346
|
+
!out_value_slot
|
|
1347
|
+
!out_key
|
|
1348
|
+
!key
|
|
1349
|
+
!map
|
|
1350
|
+
return 1
|
|
1351
|
+
|
|
1352
|
+
L_REMOVE_ENTRY_MISS:
|
|
1353
|
+
!found_nonzero
|
|
1354
|
+
!found
|
|
1355
|
+
!out_value_slot
|
|
1356
|
+
!out_key
|
|
1357
|
+
!key
|
|
1358
|
+
!map
|
|
1359
|
+
return 0
|
|
1360
|
+
|
|
1361
|
+
@export sa_btree_map_pop_first(&map: ptr, &out_key: ptr, &out_value_slot: ptr) -> i32:
|
|
1362
|
+
L_ENTRY:
|
|
1363
|
+
found = call @sa_btree_map_first_key_value(&map, &out_key, &out_value_slot)
|
|
1364
|
+
found_nonzero = ne found, 0
|
|
1365
|
+
br found_nonzero -> L_POP_FIRST_HIT, L_POP_FIRST_MISS
|
|
1366
|
+
|
|
1367
|
+
L_POP_FIRST_HIT:
|
|
1368
|
+
removed = call @sa_btree_map_remove(&map, &out_key)
|
|
1369
|
+
!removed
|
|
1370
|
+
!found_nonzero
|
|
1371
|
+
!found
|
|
1372
|
+
!out_value_slot
|
|
1373
|
+
!out_key
|
|
1374
|
+
!map
|
|
1375
|
+
return 1
|
|
1376
|
+
|
|
1377
|
+
L_POP_FIRST_MISS:
|
|
1378
|
+
!found_nonzero
|
|
1379
|
+
!found
|
|
1380
|
+
!out_value_slot
|
|
1381
|
+
!out_key
|
|
1382
|
+
!map
|
|
1383
|
+
return 0
|
|
1384
|
+
|
|
1385
|
+
@export sa_btree_map_pop_last(&map: ptr, &out_key: ptr, &out_value_slot: ptr) -> i32:
|
|
1386
|
+
L_ENTRY:
|
|
1387
|
+
found = call @sa_btree_map_last_key_value(&map, &out_key, &out_value_slot)
|
|
1388
|
+
found_nonzero = ne found, 0
|
|
1389
|
+
br found_nonzero -> L_POP_LAST_HIT, L_POP_LAST_MISS
|
|
1390
|
+
|
|
1391
|
+
L_POP_LAST_HIT:
|
|
1392
|
+
removed = call @sa_btree_map_remove(&map, &out_key)
|
|
1393
|
+
!removed
|
|
1394
|
+
!found_nonzero
|
|
1395
|
+
!found
|
|
1396
|
+
!out_value_slot
|
|
1397
|
+
!out_key
|
|
1398
|
+
!map
|
|
1399
|
+
return 1
|
|
1400
|
+
|
|
1401
|
+
L_POP_LAST_MISS:
|
|
1402
|
+
!found_nonzero
|
|
1403
|
+
!found
|
|
1404
|
+
!out_value_slot
|
|
1405
|
+
!out_key
|
|
1406
|
+
!map
|
|
1407
|
+
return 0
|
|
1408
|
+
|
|
1409
|
+
@export sa_btree_map_append(&map: ptr, &other: ptr) -> void:
|
|
1410
|
+
L_ENTRY:
|
|
1411
|
+
entries = load other+BTreeMap_entries as ptr
|
|
1412
|
+
len = load other+BTreeMap_len as u64
|
|
1413
|
+
idx_slot = stack_alloc 8
|
|
1414
|
+
store idx_slot+0, 0 as u64
|
|
1415
|
+
jmp L_APPEND_HEAD
|
|
1416
|
+
|
|
1417
|
+
L_APPEND_HEAD:
|
|
1418
|
+
idx = load idx_slot+0 as u64
|
|
1419
|
+
done = eq idx, len
|
|
1420
|
+
br done -> L_APPEND_DONE, L_APPEND_BODY
|
|
1421
|
+
|
|
1422
|
+
L_APPEND_BODY:
|
|
1423
|
+
entry_off = mul idx, BTreeMapEntry_SIZE
|
|
1424
|
+
entry = ptr_add entries, entry_off
|
|
1425
|
+
value = load entry+BTreeMapEntry_value as u64
|
|
1426
|
+
call @sa_btree_map_insert(&map, &entry, value)
|
|
1427
|
+
next_idx = add idx, 1
|
|
1428
|
+
store idx_slot+0, next_idx as u64
|
|
1429
|
+
!next_idx
|
|
1430
|
+
!value
|
|
1431
|
+
!entry
|
|
1432
|
+
!entry_off
|
|
1433
|
+
!done
|
|
1434
|
+
!idx
|
|
1435
|
+
jmp L_APPEND_HEAD
|
|
1436
|
+
|
|
1437
|
+
L_APPEND_DONE:
|
|
1438
|
+
call @sa_btree_map_clear(&other)
|
|
1439
|
+
!done
|
|
1440
|
+
!idx
|
|
1441
|
+
!len
|
|
1442
|
+
!entries
|
|
1443
|
+
!other
|
|
1444
|
+
!map
|
|
1445
|
+
return
|
|
1446
|
+
|
|
1447
|
+
@export sa_btree_map_split_off(&map: ptr, &key: ptr) -> ^ptr:
|
|
1448
|
+
L_ENTRY:
|
|
1449
|
+
out_map = call @sa_btree_map_new()
|
|
1450
|
+
find_index_slot = stack_alloc 8
|
|
1451
|
+
find_found_slot = stack_alloc 8
|
|
1452
|
+
entries = load map+BTreeMap_entries as ptr
|
|
1453
|
+
len = load map+BTreeMap_len as u64
|
|
1454
|
+
call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
|
|
1455
|
+
split_index = load find_index_slot+0 as u64
|
|
1456
|
+
idx_slot = stack_alloc 8
|
|
1457
|
+
store idx_slot+0, split_index as u64
|
|
1458
|
+
jmp L_SPLIT_HEAD
|
|
1459
|
+
|
|
1460
|
+
L_SPLIT_HEAD:
|
|
1461
|
+
idx = load idx_slot+0 as u64
|
|
1462
|
+
done = eq idx, len
|
|
1463
|
+
br done -> L_SPLIT_DONE, L_SPLIT_BODY
|
|
1464
|
+
|
|
1465
|
+
L_SPLIT_BODY:
|
|
1466
|
+
entry_off = mul idx, BTreeMapEntry_SIZE
|
|
1467
|
+
entry = ptr_add entries, entry_off
|
|
1468
|
+
value = load entry+BTreeMapEntry_value as u64
|
|
1469
|
+
call @sa_btree_map_insert(&out_map, &entry, value)
|
|
1470
|
+
store entry+BTreeMapEntry_key_ptr, 0 as ptr
|
|
1471
|
+
store entry+BTreeMapEntry_key_len, 0 as u64
|
|
1472
|
+
store entry+BTreeMapEntry_value, 0 as u64
|
|
1473
|
+
next_idx = add idx, 1
|
|
1474
|
+
store idx_slot+0, next_idx as u64
|
|
1475
|
+
!next_idx
|
|
1476
|
+
!value
|
|
1477
|
+
!entry
|
|
1478
|
+
!entry_off
|
|
1479
|
+
!done
|
|
1480
|
+
!idx
|
|
1481
|
+
jmp L_SPLIT_HEAD
|
|
1482
|
+
|
|
1483
|
+
L_SPLIT_DONE:
|
|
1484
|
+
store map+BTreeMap_len, split_index as u64
|
|
1485
|
+
!done
|
|
1486
|
+
!idx
|
|
1487
|
+
!split_index
|
|
1488
|
+
!len
|
|
1489
|
+
!entries
|
|
1490
|
+
!key
|
|
1491
|
+
!map
|
|
1492
|
+
return out_map
|
|
1493
|
+
|
|
1494
|
+
@export sa_btree_map_range(&map: ptr, &start_key: ptr, &end_key: ptr) -> ^ptr:
|
|
1495
|
+
L_ENTRY:
|
|
1496
|
+
out_map = call @sa_btree_map_new()
|
|
1497
|
+
entries = load map+BTreeMap_entries as ptr
|
|
1498
|
+
len = load map+BTreeMap_len as u64
|
|
1499
|
+
idx_slot = stack_alloc 8
|
|
1500
|
+
store idx_slot+0, 0 as u64
|
|
1501
|
+
jmp L_BTREE_RANGE_HEAD
|
|
1502
|
+
|
|
1503
|
+
L_BTREE_RANGE_HEAD:
|
|
1504
|
+
idx = load idx_slot+0 as u64
|
|
1505
|
+
done = eq idx, len
|
|
1506
|
+
br done -> L_BTREE_RANGE_DONE, L_BTREE_RANGE_BODY
|
|
1507
|
+
|
|
1508
|
+
L_BTREE_RANGE_BODY:
|
|
1509
|
+
entry_off = mul idx, BTreeMapEntry_SIZE
|
|
1510
|
+
entry = ptr_add entries, entry_off
|
|
1511
|
+
cmp_start = call @btree_map_entry_cmp(&entry, &start_key)
|
|
1512
|
+
in_lower = sge cmp_start, 0
|
|
1513
|
+
br in_lower -> L_BTREE_RANGE_CHECK_END, L_BTREE_RANGE_NEXT_SKIP
|
|
1514
|
+
|
|
1515
|
+
L_BTREE_RANGE_CHECK_END:
|
|
1516
|
+
cmp_end = call @btree_map_entry_cmp(&entry, &end_key)
|
|
1517
|
+
before_end = slt cmp_end, 0
|
|
1518
|
+
br before_end -> L_BTREE_RANGE_KEEP, L_BTREE_RANGE_SKIP_END
|
|
1519
|
+
|
|
1520
|
+
L_BTREE_RANGE_KEEP:
|
|
1521
|
+
value = load entry+BTreeMapEntry_value as u64
|
|
1522
|
+
call @sa_btree_map_insert(&out_map, &entry, value)
|
|
1523
|
+
!value
|
|
1524
|
+
!before_end
|
|
1525
|
+
!cmp_end
|
|
1526
|
+
!in_lower
|
|
1527
|
+
!cmp_start
|
|
1528
|
+
jmp L_BTREE_RANGE_NEXT
|
|
1529
|
+
|
|
1530
|
+
L_BTREE_RANGE_SKIP_END:
|
|
1531
|
+
!before_end
|
|
1532
|
+
!cmp_end
|
|
1533
|
+
!in_lower
|
|
1534
|
+
!cmp_start
|
|
1535
|
+
jmp L_BTREE_RANGE_NEXT
|
|
1536
|
+
|
|
1537
|
+
L_BTREE_RANGE_NEXT_SKIP:
|
|
1538
|
+
!in_lower
|
|
1539
|
+
!cmp_start
|
|
1540
|
+
jmp L_BTREE_RANGE_NEXT
|
|
1541
|
+
|
|
1542
|
+
L_BTREE_RANGE_NEXT:
|
|
1543
|
+
next_idx = add idx, 1
|
|
1544
|
+
store idx_slot+0, next_idx as u64
|
|
1545
|
+
!next_idx
|
|
1546
|
+
!entry
|
|
1547
|
+
!entry_off
|
|
1548
|
+
!done
|
|
1549
|
+
!idx
|
|
1550
|
+
jmp L_BTREE_RANGE_HEAD
|
|
1551
|
+
|
|
1552
|
+
L_BTREE_RANGE_DONE:
|
|
1553
|
+
!done
|
|
1554
|
+
!idx
|
|
1555
|
+
!len
|
|
1556
|
+
!entries
|
|
1557
|
+
!end_key
|
|
1558
|
+
!start_key
|
|
1559
|
+
!map
|
|
1560
|
+
return out_map
|
|
1561
|
+
|
|
1562
|
+
[MACRO] BTREE_MAP_NEW %out_map
|
|
1563
|
+
%out_map = call @sa_btree_map_new()
|
|
1564
|
+
[END_MACRO]
|
|
1565
|
+
|
|
1566
|
+
[MACRO] BTREE_MAP_FREE %map_reg
|
|
1567
|
+
call @sa_btree_map_free(^%map_reg)
|
|
1568
|
+
[END_MACRO]
|
|
1569
|
+
|
|
1570
|
+
[MACRO] BTREE_MAP_LEN %out_len, %map_reg
|
|
1571
|
+
%out_len = call @sa_btree_map_len(&%map_reg)
|
|
1572
|
+
[END_MACRO]
|
|
1573
|
+
|
|
1574
|
+
[MACRO] BTREE_MAP_IS_EMPTY %out_flag, %map_reg
|
|
1575
|
+
%out_flag = call @sa_btree_map_is_empty(&%map_reg)
|
|
1576
|
+
[END_MACRO]
|
|
1577
|
+
|
|
1578
|
+
[MACRO] BTREE_MAP_GET %out_value, %map_reg, %key_reg
|
|
1579
|
+
%out_value = call @sa_btree_map_get(&%map_reg, &%key_reg)
|
|
1580
|
+
[END_MACRO]
|
|
1581
|
+
|
|
1582
|
+
[MACRO] BTREE_MAP_TRY_GET %out_ok, %out_value, %map_reg, %key_reg
|
|
1583
|
+
__btree_map_try_get_slot_%out_ok = stack_alloc 8
|
|
1584
|
+
%out_ok = call @sa_btree_map_try_get(&%map_reg, &%key_reg, &__btree_map_try_get_slot_%out_ok)
|
|
1585
|
+
%out_value = load __btree_map_try_get_slot_%out_ok+0 as u64
|
|
1586
|
+
[END_MACRO]
|
|
1587
|
+
|
|
1588
|
+
[MACRO] BTREE_MAP_GET_KEY_VALUE %out_ok, %out_key, %out_value, %map_reg, %key_reg
|
|
1589
|
+
%out_key = alloc Slice_SIZE
|
|
1590
|
+
__btree_map_kv_value_slot_%out_ok = stack_alloc 8
|
|
1591
|
+
%out_ok = call @sa_btree_map_try_get_key_value(&%map_reg, &%key_reg, &%out_key, &__btree_map_kv_value_slot_%out_ok)
|
|
1592
|
+
%out_value = load __btree_map_kv_value_slot_%out_ok+0 as u64
|
|
1593
|
+
[END_MACRO]
|
|
1594
|
+
|
|
1595
|
+
[MACRO] BTREE_MAP_GET_MUT_PTR %out_ok, %out_ptr, %map_reg, %key_reg
|
|
1596
|
+
__btree_map_mut_slot_%out_ok = stack_alloc 8
|
|
1597
|
+
%out_ok = call @sa_btree_map_get_mut_ptr(&%map_reg, &%key_reg, &__btree_map_mut_slot_%out_ok)
|
|
1598
|
+
%out_ptr = load __btree_map_mut_slot_%out_ok+0 as ptr
|
|
1599
|
+
[END_MACRO]
|
|
1600
|
+
|
|
1601
|
+
[MACRO] BTREE_MAP_FIRST_ENTRY_MUT_PTR %out_ok, %out_key, %out_ptr, %map_reg
|
|
1602
|
+
%out_key = alloc Slice_SIZE
|
|
1603
|
+
__btree_map_first_entry_mut_slot_%out_ok = stack_alloc 8
|
|
1604
|
+
%out_ok = call @sa_btree_map_first_entry_mut_ptr(&%map_reg, &%out_key, &__btree_map_first_entry_mut_slot_%out_ok)
|
|
1605
|
+
%out_ptr = load __btree_map_first_entry_mut_slot_%out_ok+0 as ptr
|
|
1606
|
+
[END_MACRO]
|
|
1607
|
+
|
|
1608
|
+
// Rust method-name alias: BTreeMap::first_entry -> mutable value slot + key slice.
|
|
1609
|
+
[MACRO] BTREE_MAP_FIRST_ENTRY_MUT %out_ok, %out_key, %out_ptr, %map_reg
|
|
1610
|
+
EXPAND BTREE_MAP_FIRST_ENTRY_MUT_PTR %out_ok, %out_key, %out_ptr, %map_reg
|
|
1611
|
+
[END_MACRO]
|
|
1612
|
+
|
|
1613
|
+
[MACRO] BTREE_MAP_FIRST_ENTRY %out_ok, %out_key, %out_ptr, %map_reg
|
|
1614
|
+
EXPAND BTREE_MAP_FIRST_ENTRY_MUT_PTR %out_ok, %out_key, %out_ptr, %map_reg
|
|
1615
|
+
[END_MACRO]
|
|
1616
|
+
|
|
1617
|
+
[MACRO] BTREE_MAP_LAST_ENTRY_MUT_PTR %out_ok, %out_key, %out_ptr, %map_reg
|
|
1618
|
+
%out_key = alloc Slice_SIZE
|
|
1619
|
+
__btree_map_last_entry_mut_slot_%out_ok = stack_alloc 8
|
|
1620
|
+
%out_ok = call @sa_btree_map_last_entry_mut_ptr(&%map_reg, &%out_key, &__btree_map_last_entry_mut_slot_%out_ok)
|
|
1621
|
+
%out_ptr = load __btree_map_last_entry_mut_slot_%out_ok+0 as ptr
|
|
1622
|
+
[END_MACRO]
|
|
1623
|
+
|
|
1624
|
+
// Rust method-name alias: BTreeMap::last_entry -> mutable value slot + key slice.
|
|
1625
|
+
[MACRO] BTREE_MAP_LAST_ENTRY_MUT %out_ok, %out_key, %out_ptr, %map_reg
|
|
1626
|
+
EXPAND BTREE_MAP_LAST_ENTRY_MUT_PTR %out_ok, %out_key, %out_ptr, %map_reg
|
|
1627
|
+
[END_MACRO]
|
|
1628
|
+
|
|
1629
|
+
[MACRO] BTREE_MAP_LAST_ENTRY %out_ok, %out_key, %out_ptr, %map_reg
|
|
1630
|
+
EXPAND BTREE_MAP_LAST_ENTRY_MUT_PTR %out_ok, %out_key, %out_ptr, %map_reg
|
|
1631
|
+
[END_MACRO]
|
|
1632
|
+
|
|
1633
|
+
[MACRO] BTREE_MAP_TRY_GET_DISJOINT_MUT_PTRS %out_ok, %out_ptr_a, %out_ptr_b, %map_reg, %key_a, %key_b
|
|
1634
|
+
__btree_map_disjoint_a_slot_%out_ok = stack_alloc 8
|
|
1635
|
+
__btree_map_disjoint_b_slot_%out_ok = stack_alloc 8
|
|
1636
|
+
%out_ok = call @sa_btree_map_try_get_disjoint_mut_ptrs(&%map_reg, &%key_a, &%key_b, &__btree_map_disjoint_a_slot_%out_ok, &__btree_map_disjoint_b_slot_%out_ok)
|
|
1637
|
+
%out_ptr_a = load __btree_map_disjoint_a_slot_%out_ok+0 as ptr
|
|
1638
|
+
%out_ptr_b = load __btree_map_disjoint_b_slot_%out_ok+0 as ptr
|
|
1639
|
+
[END_MACRO]
|
|
1640
|
+
|
|
1641
|
+
// Rust method-name alias: BTreeMap::get_disjoint_mut (pair form).
|
|
1642
|
+
[MACRO] BTREE_MAP_GET_DISJOINT_MUT_PTRS %out_ok, %out_ptr_a, %out_ptr_b, %map_reg, %key_a, %key_b
|
|
1643
|
+
EXPAND BTREE_MAP_TRY_GET_DISJOINT_MUT_PTRS %out_ok, %out_ptr_a, %out_ptr_b, %map_reg, %key_a, %key_b
|
|
1644
|
+
[END_MACRO]
|
|
1645
|
+
|
|
1646
|
+
[MACRO] BTREE_MAP_GET_DISJOINT_MUT %out_ok, %out_ptr_a, %out_ptr_b, %map_reg, %key_a, %key_b
|
|
1647
|
+
EXPAND BTREE_MAP_TRY_GET_DISJOINT_MUT_PTRS %out_ok, %out_ptr_a, %out_ptr_b, %map_reg, %key_a, %key_b
|
|
1648
|
+
[END_MACRO]
|
|
1649
|
+
|
|
1650
|
+
[MACRO] BTREE_MAP_FIRST_KEY_VALUE %out_ok, %out_key, %out_value, %map_reg
|
|
1651
|
+
%out_key = alloc Slice_SIZE
|
|
1652
|
+
__btree_map_first_value_slot_%out_ok = stack_alloc 8
|
|
1653
|
+
%out_ok = call @sa_btree_map_first_key_value(&%map_reg, &%out_key, &__btree_map_first_value_slot_%out_ok)
|
|
1654
|
+
%out_value = load __btree_map_first_value_slot_%out_ok+0 as u64
|
|
1655
|
+
[END_MACRO]
|
|
1656
|
+
|
|
1657
|
+
[MACRO] BTREE_MAP_LAST_KEY_VALUE %out_ok, %out_key, %out_value, %map_reg
|
|
1658
|
+
%out_key = alloc Slice_SIZE
|
|
1659
|
+
__btree_map_last_value_slot_%out_ok = stack_alloc 8
|
|
1660
|
+
%out_ok = call @sa_btree_map_last_key_value(&%map_reg, &%out_key, &__btree_map_last_value_slot_%out_ok)
|
|
1661
|
+
%out_value = load __btree_map_last_value_slot_%out_ok+0 as u64
|
|
1662
|
+
[END_MACRO]
|
|
1663
|
+
|
|
1664
|
+
[MACRO] BTREE_MAP_CONTAINS_KEY %out_flag, %map_reg, %key_reg
|
|
1665
|
+
%out_flag = call @sa_btree_map_contains_key(&%map_reg, &%key_reg)
|
|
1666
|
+
[END_MACRO]
|
|
1667
|
+
|
|
1668
|
+
[MACRO] BTREE_MAP_CLEAR %map_reg
|
|
1669
|
+
call @sa_btree_map_clear(&%map_reg)
|
|
1670
|
+
[END_MACRO]
|
|
1671
|
+
|
|
1672
|
+
[MACRO] DEFAULT_HASHER_WRITE_BTREE_MAP_STR_U64 %hasher, %map_reg
|
|
1673
|
+
call @btree_map_write_hash_str_u64(&%hasher, &%map_reg)
|
|
1674
|
+
[END_MACRO]
|
|
1675
|
+
|
|
1676
|
+
// Rust method-name alias over DEFAULT_HASHER_WRITE_BTREE_MAP_STR_U64.
|
|
1677
|
+
[MACRO] DEFAULT_HASHER_WRITE_BTREE_MAP_STR %hasher, %map_reg
|
|
1678
|
+
EXPAND DEFAULT_HASHER_WRITE_BTREE_MAP_STR_U64 %hasher, %map_reg
|
|
1679
|
+
[END_MACRO]
|
|
1680
|
+
|
|
1681
|
+
[MACRO] BTREE_MAP_HASH_STR_U64 %out_hash, %map_reg
|
|
1682
|
+
__btree_map_hash_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
|
|
1683
|
+
EXPAND DEFAULT_HASHER_NEW __btree_map_hash_hasher_%out_hash
|
|
1684
|
+
EXPAND DEFAULT_HASHER_WRITE_BTREE_MAP_STR_U64 __btree_map_hash_hasher_%out_hash, %map_reg
|
|
1685
|
+
EXPAND DEFAULT_HASHER_FINISH %out_hash, __btree_map_hash_hasher_%out_hash
|
|
1686
|
+
[END_MACRO]
|
|
1687
|
+
|
|
1688
|
+
// Rust method-name alias over BTREE_MAP_HASH_STR_U64.
|
|
1689
|
+
[MACRO] BTREE_MAP_HASH_STR %out_hash, %map_reg
|
|
1690
|
+
EXPAND BTREE_MAP_HASH_STR_U64 %out_hash, %map_reg
|
|
1691
|
+
[END_MACRO]
|
|
1692
|
+
|
|
1693
|
+
// Rust method-name bare alias over the concrete str-key/u64-value hash helper.
|
|
1694
|
+
[MACRO] BTREE_MAP_HASH %out_hash, %map_reg
|
|
1695
|
+
EXPAND BTREE_MAP_HASH_STR_U64 %out_hash, %map_reg
|
|
1696
|
+
[END_MACRO]
|
|
1697
|
+
|
|
1698
|
+
[MACRO] BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP_STR_U64 %out_hash, %builder, %map_reg
|
|
1699
|
+
__build_hash_one_btree_map_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
|
|
1700
|
+
EXPAND BUILD_HASHER_DEFAULT_BUILD __build_hash_one_btree_map_hasher_%out_hash, %builder
|
|
1701
|
+
EXPAND DEFAULT_HASHER_WRITE_BTREE_MAP_STR_U64 __build_hash_one_btree_map_hasher_%out_hash, %map_reg
|
|
1702
|
+
EXPAND DEFAULT_HASHER_FINISH %out_hash, __build_hash_one_btree_map_hasher_%out_hash
|
|
1703
|
+
[END_MACRO]
|
|
1704
|
+
|
|
1705
|
+
// Rust method-name alias over BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP_STR_U64.
|
|
1706
|
+
[MACRO] BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP_STR %out_hash, %builder, %map_reg
|
|
1707
|
+
EXPAND BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP_STR_U64 %out_hash, %builder, %map_reg
|
|
1708
|
+
[END_MACRO]
|
|
1709
|
+
|
|
1710
|
+
// Rust method-name bare alias over BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP_STR_U64.
|
|
1711
|
+
[MACRO] BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP %out_hash, %builder, %map_reg
|
|
1712
|
+
EXPAND BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP_STR_U64 %out_hash, %builder, %map_reg
|
|
1713
|
+
[END_MACRO]
|
|
1714
|
+
|
|
1715
|
+
[MACRO] RANDOM_STATE_HASH_ONE_BTREE_MAP_STR_U64 %out_hash, %state, %map_reg
|
|
1716
|
+
__random_state_hash_one_btree_map_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
|
|
1717
|
+
EXPAND RANDOM_STATE_BUILD __random_state_hash_one_btree_map_hasher_%out_hash, %state
|
|
1718
|
+
EXPAND DEFAULT_HASHER_WRITE_BTREE_MAP_STR_U64 __random_state_hash_one_btree_map_hasher_%out_hash, %map_reg
|
|
1719
|
+
EXPAND DEFAULT_HASHER_FINISH %out_hash, __random_state_hash_one_btree_map_hasher_%out_hash
|
|
1720
|
+
[END_MACRO]
|
|
1721
|
+
|
|
1722
|
+
// Rust method-name alias over RANDOM_STATE_HASH_ONE_BTREE_MAP_STR_U64.
|
|
1723
|
+
[MACRO] RANDOM_STATE_HASH_ONE_BTREE_MAP_STR %out_hash, %state, %map_reg
|
|
1724
|
+
EXPAND RANDOM_STATE_HASH_ONE_BTREE_MAP_STR_U64 %out_hash, %state, %map_reg
|
|
1725
|
+
[END_MACRO]
|
|
1726
|
+
|
|
1727
|
+
// Rust method-name bare alias over RANDOM_STATE_HASH_ONE_BTREE_MAP_STR_U64.
|
|
1728
|
+
[MACRO] RANDOM_STATE_HASH_ONE_BTREE_MAP %out_hash, %state, %map_reg
|
|
1729
|
+
EXPAND RANDOM_STATE_HASH_ONE_BTREE_MAP_STR_U64 %out_hash, %state, %map_reg
|
|
1730
|
+
[END_MACRO]
|
|
1731
|
+
|
|
1732
|
+
[MACRO] BTREE_MAP_RETAIN %out_len, %map_reg, %pred_fn
|
|
1733
|
+
__btree_map_retain_entries_%out_len = load %map_reg+BTreeMap_entries as ptr
|
|
1734
|
+
__btree_map_retain_len_%out_len = load %map_reg+BTreeMap_len as u64
|
|
1735
|
+
__btree_map_retain_read_slot_%out_len = stack_alloc 8
|
|
1736
|
+
__btree_map_retain_write_slot_%out_len = stack_alloc 8
|
|
1737
|
+
store __btree_map_retain_read_slot_%out_len+0, 0 as u64
|
|
1738
|
+
store __btree_map_retain_write_slot_%out_len+0, 0 as u64
|
|
1739
|
+
jmp L_BTREE_MAP_RETAIN_HEAD_%out_len
|
|
1740
|
+
|
|
1741
|
+
L_BTREE_MAP_RETAIN_HEAD_%out_len:
|
|
1742
|
+
__btree_map_retain_read_%out_len = load __btree_map_retain_read_slot_%out_len+0 as u64
|
|
1743
|
+
__btree_map_retain_done_%out_len = eq __btree_map_retain_read_%out_len, __btree_map_retain_len_%out_len
|
|
1744
|
+
br __btree_map_retain_done_%out_len -> L_BTREE_MAP_RETAIN_CLEAR_HEAD_%out_len, L_BTREE_MAP_RETAIN_BODY_%out_len
|
|
1745
|
+
|
|
1746
|
+
L_BTREE_MAP_RETAIN_BODY_%out_len:
|
|
1747
|
+
__btree_map_retain_read_off_%out_len = mul __btree_map_retain_read_%out_len, BTreeMapEntry_SIZE
|
|
1748
|
+
__btree_map_retain_read_entry_%out_len = ptr_add __btree_map_retain_entries_%out_len, __btree_map_retain_read_off_%out_len
|
|
1749
|
+
__btree_map_retain_value_%out_len = load __btree_map_retain_read_entry_%out_len+BTreeMapEntry_value as u64
|
|
1750
|
+
__btree_map_retain_pred_%out_len = call %pred_fn(&__btree_map_retain_read_entry_%out_len, __btree_map_retain_value_%out_len)
|
|
1751
|
+
__btree_map_retain_keep_%out_len = ne __btree_map_retain_pred_%out_len, 0
|
|
1752
|
+
br __btree_map_retain_keep_%out_len -> L_BTREE_MAP_RETAIN_KEEP_%out_len, L_BTREE_MAP_RETAIN_SKIP_%out_len
|
|
1753
|
+
|
|
1754
|
+
L_BTREE_MAP_RETAIN_KEEP_%out_len:
|
|
1755
|
+
__btree_map_retain_write_%out_len = load __btree_map_retain_write_slot_%out_len+0 as u64
|
|
1756
|
+
__btree_map_retain_same_slot_%out_len = eq __btree_map_retain_write_%out_len, __btree_map_retain_read_%out_len
|
|
1757
|
+
br __btree_map_retain_same_slot_%out_len -> L_BTREE_MAP_RETAIN_KEEP_ADVANCE_%out_len, L_BTREE_MAP_RETAIN_COPY_%out_len
|
|
1758
|
+
|
|
1759
|
+
L_BTREE_MAP_RETAIN_COPY_%out_len:
|
|
1760
|
+
__btree_map_retain_write_off_%out_len = mul __btree_map_retain_write_%out_len, BTreeMapEntry_SIZE
|
|
1761
|
+
__btree_map_retain_write_entry_%out_len = ptr_add __btree_map_retain_entries_%out_len, __btree_map_retain_write_off_%out_len
|
|
1762
|
+
__btree_map_retain_key_ptr_%out_len = load __btree_map_retain_read_entry_%out_len+BTreeMapEntry_key_ptr as ptr
|
|
1763
|
+
__btree_map_retain_key_len_%out_len = load __btree_map_retain_read_entry_%out_len+BTreeMapEntry_key_len as u64
|
|
1764
|
+
store __btree_map_retain_write_entry_%out_len+BTreeMapEntry_key_ptr, __btree_map_retain_key_ptr_%out_len as ptr
|
|
1765
|
+
store __btree_map_retain_write_entry_%out_len+BTreeMapEntry_key_len, __btree_map_retain_key_len_%out_len as u64
|
|
1766
|
+
store __btree_map_retain_write_entry_%out_len+BTreeMapEntry_value, __btree_map_retain_value_%out_len as u64
|
|
1767
|
+
!__btree_map_retain_key_len_%out_len
|
|
1768
|
+
!__btree_map_retain_key_ptr_%out_len
|
|
1769
|
+
!__btree_map_retain_write_entry_%out_len
|
|
1770
|
+
!__btree_map_retain_write_off_%out_len
|
|
1771
|
+
jmp L_BTREE_MAP_RETAIN_KEEP_ADVANCE_%out_len
|
|
1772
|
+
|
|
1773
|
+
L_BTREE_MAP_RETAIN_KEEP_ADVANCE_%out_len:
|
|
1774
|
+
__btree_map_retain_next_write_%out_len = add __btree_map_retain_write_%out_len, 1
|
|
1775
|
+
store __btree_map_retain_write_slot_%out_len+0, __btree_map_retain_next_write_%out_len as u64
|
|
1776
|
+
!__btree_map_retain_next_write_%out_len
|
|
1777
|
+
!__btree_map_retain_same_slot_%out_len
|
|
1778
|
+
!__btree_map_retain_write_%out_len
|
|
1779
|
+
jmp L_BTREE_MAP_RETAIN_NEXT_%out_len
|
|
1780
|
+
|
|
1781
|
+
L_BTREE_MAP_RETAIN_SKIP_%out_len:
|
|
1782
|
+
jmp L_BTREE_MAP_RETAIN_NEXT_%out_len
|
|
1783
|
+
|
|
1784
|
+
L_BTREE_MAP_RETAIN_NEXT_%out_len:
|
|
1785
|
+
__btree_map_retain_next_read_%out_len = add __btree_map_retain_read_%out_len, 1
|
|
1786
|
+
store __btree_map_retain_read_slot_%out_len+0, __btree_map_retain_next_read_%out_len as u64
|
|
1787
|
+
!__btree_map_retain_next_read_%out_len
|
|
1788
|
+
!__btree_map_retain_keep_%out_len
|
|
1789
|
+
!__btree_map_retain_pred_%out_len
|
|
1790
|
+
!__btree_map_retain_value_%out_len
|
|
1791
|
+
!__btree_map_retain_read_entry_%out_len
|
|
1792
|
+
!__btree_map_retain_read_off_%out_len
|
|
1793
|
+
!__btree_map_retain_done_%out_len
|
|
1794
|
+
!__btree_map_retain_read_%out_len
|
|
1795
|
+
jmp L_BTREE_MAP_RETAIN_HEAD_%out_len
|
|
1796
|
+
|
|
1797
|
+
L_BTREE_MAP_RETAIN_CLEAR_HEAD_%out_len:
|
|
1798
|
+
__btree_map_retain_clear_slot_%out_len = stack_alloc 8
|
|
1799
|
+
__btree_map_retain_kept_len_%out_len = load __btree_map_retain_write_slot_%out_len+0 as u64
|
|
1800
|
+
store __btree_map_retain_clear_slot_%out_len+0, __btree_map_retain_kept_len_%out_len as u64
|
|
1801
|
+
jmp L_BTREE_MAP_RETAIN_CLEAR_LOOP_%out_len
|
|
1802
|
+
|
|
1803
|
+
L_BTREE_MAP_RETAIN_CLEAR_LOOP_%out_len:
|
|
1804
|
+
__btree_map_retain_clear_idx_%out_len = load __btree_map_retain_clear_slot_%out_len+0 as u64
|
|
1805
|
+
__btree_map_retain_clear_done_%out_len = eq __btree_map_retain_clear_idx_%out_len, __btree_map_retain_len_%out_len
|
|
1806
|
+
br __btree_map_retain_clear_done_%out_len -> L_BTREE_MAP_RETAIN_DONE_%out_len, L_BTREE_MAP_RETAIN_CLEAR_BODY_%out_len
|
|
1807
|
+
|
|
1808
|
+
L_BTREE_MAP_RETAIN_CLEAR_BODY_%out_len:
|
|
1809
|
+
__btree_map_retain_clear_off_%out_len = mul __btree_map_retain_clear_idx_%out_len, BTreeMapEntry_SIZE
|
|
1810
|
+
__btree_map_retain_clear_entry_%out_len = ptr_add __btree_map_retain_entries_%out_len, __btree_map_retain_clear_off_%out_len
|
|
1811
|
+
store __btree_map_retain_clear_entry_%out_len+BTreeMapEntry_key_ptr, 0 as ptr
|
|
1812
|
+
store __btree_map_retain_clear_entry_%out_len+BTreeMapEntry_key_len, 0 as u64
|
|
1813
|
+
store __btree_map_retain_clear_entry_%out_len+BTreeMapEntry_value, 0 as u64
|
|
1814
|
+
__btree_map_retain_next_clear_%out_len = add __btree_map_retain_clear_idx_%out_len, 1
|
|
1815
|
+
store __btree_map_retain_clear_slot_%out_len+0, __btree_map_retain_next_clear_%out_len as u64
|
|
1816
|
+
!__btree_map_retain_next_clear_%out_len
|
|
1817
|
+
!__btree_map_retain_clear_entry_%out_len
|
|
1818
|
+
!__btree_map_retain_clear_off_%out_len
|
|
1819
|
+
!__btree_map_retain_clear_done_%out_len
|
|
1820
|
+
!__btree_map_retain_clear_idx_%out_len
|
|
1821
|
+
jmp L_BTREE_MAP_RETAIN_CLEAR_LOOP_%out_len
|
|
1822
|
+
|
|
1823
|
+
L_BTREE_MAP_RETAIN_DONE_%out_len:
|
|
1824
|
+
%out_len = load __btree_map_retain_write_slot_%out_len+0 as u64
|
|
1825
|
+
store %map_reg+BTreeMap_len, %out_len as u64
|
|
1826
|
+
!__btree_map_retain_clear_done_%out_len
|
|
1827
|
+
!__btree_map_retain_clear_idx_%out_len
|
|
1828
|
+
!__btree_map_retain_kept_len_%out_len
|
|
1829
|
+
!__btree_map_retain_done_%out_len
|
|
1830
|
+
!__btree_map_retain_read_%out_len
|
|
1831
|
+
!__btree_map_retain_len_%out_len
|
|
1832
|
+
!__btree_map_retain_entries_%out_len
|
|
1833
|
+
[END_MACRO]
|
|
1834
|
+
|
|
1835
|
+
[MACRO] BTREE_MAP_EXTRACT_IF %out_len, %out_map, %map_reg, %pred_fn
|
|
1836
|
+
EXPAND BTREE_MAP_NEW %out_map
|
|
1837
|
+
__btree_map_extract_entries_%out_len = load %map_reg+BTreeMap_entries as ptr
|
|
1838
|
+
__btree_map_extract_len_%out_len = load %map_reg+BTreeMap_len as u64
|
|
1839
|
+
__btree_map_extract_read_slot_%out_len = stack_alloc 8
|
|
1840
|
+
__btree_map_extract_write_slot_%out_len = stack_alloc 8
|
|
1841
|
+
store __btree_map_extract_read_slot_%out_len+0, 0 as u64
|
|
1842
|
+
store __btree_map_extract_write_slot_%out_len+0, 0 as u64
|
|
1843
|
+
jmp L_BTREE_MAP_EXTRACT_HEAD_%out_len
|
|
1844
|
+
|
|
1845
|
+
L_BTREE_MAP_EXTRACT_HEAD_%out_len:
|
|
1846
|
+
__btree_map_extract_read_%out_len = load __btree_map_extract_read_slot_%out_len+0 as u64
|
|
1847
|
+
__btree_map_extract_done_%out_len = eq __btree_map_extract_read_%out_len, __btree_map_extract_len_%out_len
|
|
1848
|
+
br __btree_map_extract_done_%out_len -> L_BTREE_MAP_EXTRACT_CLEAR_HEAD_%out_len, L_BTREE_MAP_EXTRACT_BODY_%out_len
|
|
1849
|
+
|
|
1850
|
+
L_BTREE_MAP_EXTRACT_BODY_%out_len:
|
|
1851
|
+
__btree_map_extract_read_off_%out_len = mul __btree_map_extract_read_%out_len, BTreeMapEntry_SIZE
|
|
1852
|
+
__btree_map_extract_read_entry_%out_len = ptr_add __btree_map_extract_entries_%out_len, __btree_map_extract_read_off_%out_len
|
|
1853
|
+
__btree_map_extract_value_ptr_%out_len = ptr_add __btree_map_extract_read_entry_%out_len, BTreeMapEntry_value
|
|
1854
|
+
__btree_map_extract_pred_%out_len = call %pred_fn(&__btree_map_extract_read_entry_%out_len, __btree_map_extract_value_ptr_%out_len)
|
|
1855
|
+
__btree_map_extract_value_%out_len = load __btree_map_extract_read_entry_%out_len+BTreeMapEntry_value as u64
|
|
1856
|
+
__btree_map_extract_take_%out_len = ne __btree_map_extract_pred_%out_len, 0
|
|
1857
|
+
br __btree_map_extract_take_%out_len -> L_BTREE_MAP_EXTRACT_TAKE_%out_len, L_BTREE_MAP_EXTRACT_KEEP_%out_len
|
|
1858
|
+
|
|
1859
|
+
L_BTREE_MAP_EXTRACT_TAKE_%out_len:
|
|
1860
|
+
call @sa_btree_map_insert(&%out_map, &__btree_map_extract_read_entry_%out_len, __btree_map_extract_value_%out_len)
|
|
1861
|
+
jmp L_BTREE_MAP_EXTRACT_NEXT_%out_len
|
|
1862
|
+
|
|
1863
|
+
L_BTREE_MAP_EXTRACT_KEEP_%out_len:
|
|
1864
|
+
__btree_map_extract_write_%out_len = load __btree_map_extract_write_slot_%out_len+0 as u64
|
|
1865
|
+
__btree_map_extract_same_slot_%out_len = eq __btree_map_extract_write_%out_len, __btree_map_extract_read_%out_len
|
|
1866
|
+
br __btree_map_extract_same_slot_%out_len -> L_BTREE_MAP_EXTRACT_KEEP_ADVANCE_%out_len, L_BTREE_MAP_EXTRACT_COPY_%out_len
|
|
1867
|
+
|
|
1868
|
+
L_BTREE_MAP_EXTRACT_COPY_%out_len:
|
|
1869
|
+
__btree_map_extract_write_off_%out_len = mul __btree_map_extract_write_%out_len, BTreeMapEntry_SIZE
|
|
1870
|
+
__btree_map_extract_write_entry_%out_len = ptr_add __btree_map_extract_entries_%out_len, __btree_map_extract_write_off_%out_len
|
|
1871
|
+
__btree_map_extract_key_ptr_%out_len = load __btree_map_extract_read_entry_%out_len+BTreeMapEntry_key_ptr as ptr
|
|
1872
|
+
__btree_map_extract_key_len_%out_len = load __btree_map_extract_read_entry_%out_len+BTreeMapEntry_key_len as u64
|
|
1873
|
+
store __btree_map_extract_write_entry_%out_len+BTreeMapEntry_key_ptr, __btree_map_extract_key_ptr_%out_len as ptr
|
|
1874
|
+
store __btree_map_extract_write_entry_%out_len+BTreeMapEntry_key_len, __btree_map_extract_key_len_%out_len as u64
|
|
1875
|
+
store __btree_map_extract_write_entry_%out_len+BTreeMapEntry_value, __btree_map_extract_value_%out_len as u64
|
|
1876
|
+
!__btree_map_extract_key_len_%out_len
|
|
1877
|
+
!__btree_map_extract_key_ptr_%out_len
|
|
1878
|
+
!__btree_map_extract_write_entry_%out_len
|
|
1879
|
+
!__btree_map_extract_write_off_%out_len
|
|
1880
|
+
jmp L_BTREE_MAP_EXTRACT_KEEP_ADVANCE_%out_len
|
|
1881
|
+
|
|
1882
|
+
L_BTREE_MAP_EXTRACT_KEEP_ADVANCE_%out_len:
|
|
1883
|
+
__btree_map_extract_next_write_%out_len = add __btree_map_extract_write_%out_len, 1
|
|
1884
|
+
store __btree_map_extract_write_slot_%out_len+0, __btree_map_extract_next_write_%out_len as u64
|
|
1885
|
+
!__btree_map_extract_next_write_%out_len
|
|
1886
|
+
!__btree_map_extract_same_slot_%out_len
|
|
1887
|
+
!__btree_map_extract_write_%out_len
|
|
1888
|
+
jmp L_BTREE_MAP_EXTRACT_NEXT_%out_len
|
|
1889
|
+
|
|
1890
|
+
L_BTREE_MAP_EXTRACT_NEXT_%out_len:
|
|
1891
|
+
__btree_map_extract_next_read_%out_len = add __btree_map_extract_read_%out_len, 1
|
|
1892
|
+
store __btree_map_extract_read_slot_%out_len+0, __btree_map_extract_next_read_%out_len as u64
|
|
1893
|
+
!__btree_map_extract_next_read_%out_len
|
|
1894
|
+
!__btree_map_extract_take_%out_len
|
|
1895
|
+
!__btree_map_extract_value_%out_len
|
|
1896
|
+
!__btree_map_extract_pred_%out_len
|
|
1897
|
+
!__btree_map_extract_value_ptr_%out_len
|
|
1898
|
+
!__btree_map_extract_read_entry_%out_len
|
|
1899
|
+
!__btree_map_extract_read_off_%out_len
|
|
1900
|
+
!__btree_map_extract_done_%out_len
|
|
1901
|
+
!__btree_map_extract_read_%out_len
|
|
1902
|
+
jmp L_BTREE_MAP_EXTRACT_HEAD_%out_len
|
|
1903
|
+
|
|
1904
|
+
L_BTREE_MAP_EXTRACT_CLEAR_HEAD_%out_len:
|
|
1905
|
+
__btree_map_extract_clear_slot_%out_len = stack_alloc 8
|
|
1906
|
+
__btree_map_extract_kept_len_%out_len = load __btree_map_extract_write_slot_%out_len+0 as u64
|
|
1907
|
+
store __btree_map_extract_clear_slot_%out_len+0, __btree_map_extract_kept_len_%out_len as u64
|
|
1908
|
+
jmp L_BTREE_MAP_EXTRACT_CLEAR_LOOP_%out_len
|
|
1909
|
+
|
|
1910
|
+
L_BTREE_MAP_EXTRACT_CLEAR_LOOP_%out_len:
|
|
1911
|
+
__btree_map_extract_clear_idx_%out_len = load __btree_map_extract_clear_slot_%out_len+0 as u64
|
|
1912
|
+
__btree_map_extract_clear_done_%out_len = eq __btree_map_extract_clear_idx_%out_len, __btree_map_extract_len_%out_len
|
|
1913
|
+
br __btree_map_extract_clear_done_%out_len -> L_BTREE_MAP_EXTRACT_DONE_%out_len, L_BTREE_MAP_EXTRACT_CLEAR_BODY_%out_len
|
|
1914
|
+
|
|
1915
|
+
L_BTREE_MAP_EXTRACT_CLEAR_BODY_%out_len:
|
|
1916
|
+
__btree_map_extract_clear_off_%out_len = mul __btree_map_extract_clear_idx_%out_len, BTreeMapEntry_SIZE
|
|
1917
|
+
__btree_map_extract_clear_entry_%out_len = ptr_add __btree_map_extract_entries_%out_len, __btree_map_extract_clear_off_%out_len
|
|
1918
|
+
store __btree_map_extract_clear_entry_%out_len+BTreeMapEntry_key_ptr, 0 as ptr
|
|
1919
|
+
store __btree_map_extract_clear_entry_%out_len+BTreeMapEntry_key_len, 0 as u64
|
|
1920
|
+
store __btree_map_extract_clear_entry_%out_len+BTreeMapEntry_value, 0 as u64
|
|
1921
|
+
__btree_map_extract_next_clear_%out_len = add __btree_map_extract_clear_idx_%out_len, 1
|
|
1922
|
+
store __btree_map_extract_clear_slot_%out_len+0, __btree_map_extract_next_clear_%out_len as u64
|
|
1923
|
+
!__btree_map_extract_next_clear_%out_len
|
|
1924
|
+
!__btree_map_extract_clear_entry_%out_len
|
|
1925
|
+
!__btree_map_extract_clear_off_%out_len
|
|
1926
|
+
!__btree_map_extract_clear_done_%out_len
|
|
1927
|
+
!__btree_map_extract_clear_idx_%out_len
|
|
1928
|
+
jmp L_BTREE_MAP_EXTRACT_CLEAR_LOOP_%out_len
|
|
1929
|
+
|
|
1930
|
+
L_BTREE_MAP_EXTRACT_DONE_%out_len:
|
|
1931
|
+
%out_len = load __btree_map_extract_write_slot_%out_len+0 as u64
|
|
1932
|
+
store %map_reg+BTreeMap_len, %out_len as u64
|
|
1933
|
+
!__btree_map_extract_clear_done_%out_len
|
|
1934
|
+
!__btree_map_extract_clear_idx_%out_len
|
|
1935
|
+
!__btree_map_extract_kept_len_%out_len
|
|
1936
|
+
!__btree_map_extract_done_%out_len
|
|
1937
|
+
!__btree_map_extract_read_%out_len
|
|
1938
|
+
!__btree_map_extract_len_%out_len
|
|
1939
|
+
!__btree_map_extract_entries_%out_len
|
|
1940
|
+
[END_MACRO]
|
|
1941
|
+
|
|
1942
|
+
[MACRO] BTREE_MAP_EXTRACT_IF_RANGE %out_len, %out_map, %map_reg, %start_key, %end_key, %pred_fn
|
|
1943
|
+
EXPAND BTREE_MAP_NEW %out_map
|
|
1944
|
+
EXPAND BTREE_MAP_RANGE_MUT_PTRS __btree_map_extract_range_vec_%out_len, %map_reg, %start_key, %end_key
|
|
1945
|
+
__btree_map_extract_range_len_%out_len = call @sa_vec_len(&__btree_map_extract_range_vec_%out_len)
|
|
1946
|
+
__btree_map_extract_range_ptr_%out_len = load __btree_map_extract_range_vec_%out_len+Vec_ptr as ptr
|
|
1947
|
+
__btree_map_extract_range_key_%out_len = stack_alloc Slice_SIZE
|
|
1948
|
+
__btree_map_extract_range_idx_slot_%out_len = stack_alloc 8
|
|
1949
|
+
store __btree_map_extract_range_idx_slot_%out_len+0, 0 as u64
|
|
1950
|
+
jmp L_BTREE_MAP_EXTRACT_RANGE_HEAD_%out_len
|
|
1951
|
+
|
|
1952
|
+
L_BTREE_MAP_EXTRACT_RANGE_HEAD_%out_len:
|
|
1953
|
+
__btree_map_extract_range_idx_%out_len = load __btree_map_extract_range_idx_slot_%out_len+0 as u64
|
|
1954
|
+
__btree_map_extract_range_done_%out_len = eq __btree_map_extract_range_idx_%out_len, __btree_map_extract_range_len_%out_len
|
|
1955
|
+
br __btree_map_extract_range_done_%out_len -> L_BTREE_MAP_EXTRACT_RANGE_REMOVE_INIT_%out_len, L_BTREE_MAP_EXTRACT_RANGE_BODY_%out_len
|
|
1956
|
+
|
|
1957
|
+
L_BTREE_MAP_EXTRACT_RANGE_BODY_%out_len:
|
|
1958
|
+
__btree_map_extract_range_key_idx_%out_len = mul __btree_map_extract_range_idx_%out_len, 8
|
|
1959
|
+
__btree_map_extract_range_key_lane_%out_len = ptr_add __btree_map_extract_range_ptr_%out_len, __btree_map_extract_range_key_idx_%out_len
|
|
1960
|
+
__btree_map_extract_range_key_bits_%out_len = load __btree_map_extract_range_key_lane_%out_len+0 as u64
|
|
1961
|
+
__btree_map_extract_range_key_len_lane_%out_len = ptr_add __btree_map_extract_range_key_lane_%out_len, 8
|
|
1962
|
+
__btree_map_extract_range_key_len_%out_len = load __btree_map_extract_range_key_len_lane_%out_len+0 as u64
|
|
1963
|
+
__btree_map_extract_range_value_lane_%out_len = ptr_add __btree_map_extract_range_key_lane_%out_len, 16
|
|
1964
|
+
__btree_map_extract_range_value_bits_%out_len = load __btree_map_extract_range_value_lane_%out_len+0 as u64
|
|
1965
|
+
__btree_map_extract_range_key_ptr_%out_len = bitcast __btree_map_extract_range_key_bits_%out_len as ptr
|
|
1966
|
+
__btree_map_extract_range_value_ptr_%out_len = bitcast __btree_map_extract_range_value_bits_%out_len as ptr
|
|
1967
|
+
store __btree_map_extract_range_key_%out_len+Slice_ptr, __btree_map_extract_range_key_ptr_%out_len as ptr
|
|
1968
|
+
store __btree_map_extract_range_key_%out_len+Slice_len, __btree_map_extract_range_key_len_%out_len as u64
|
|
1969
|
+
__btree_map_extract_range_pred_%out_len = call %pred_fn(&__btree_map_extract_range_key_%out_len, __btree_map_extract_range_value_ptr_%out_len)
|
|
1970
|
+
__btree_map_extract_range_take_%out_len = ne __btree_map_extract_range_pred_%out_len, 0
|
|
1971
|
+
br __btree_map_extract_range_take_%out_len -> L_BTREE_MAP_EXTRACT_RANGE_TAKE_%out_len, L_BTREE_MAP_EXTRACT_RANGE_NEXT_%out_len
|
|
1972
|
+
|
|
1973
|
+
L_BTREE_MAP_EXTRACT_RANGE_TAKE_%out_len:
|
|
1974
|
+
__btree_map_extract_range_value_%out_len = load __btree_map_extract_range_value_ptr_%out_len+0 as u64
|
|
1975
|
+
call @sa_btree_map_insert(&%out_map, &__btree_map_extract_range_key_%out_len, __btree_map_extract_range_value_%out_len)
|
|
1976
|
+
!__btree_map_extract_range_value_%out_len
|
|
1977
|
+
jmp L_BTREE_MAP_EXTRACT_RANGE_NEXT_%out_len
|
|
1978
|
+
|
|
1979
|
+
L_BTREE_MAP_EXTRACT_RANGE_NEXT_%out_len:
|
|
1980
|
+
__btree_map_extract_range_next_idx_%out_len = add __btree_map_extract_range_idx_%out_len, 3
|
|
1981
|
+
store __btree_map_extract_range_idx_slot_%out_len+0, __btree_map_extract_range_next_idx_%out_len as u64
|
|
1982
|
+
!__btree_map_extract_range_next_idx_%out_len
|
|
1983
|
+
!__btree_map_extract_range_take_%out_len
|
|
1984
|
+
!__btree_map_extract_range_pred_%out_len
|
|
1985
|
+
!__btree_map_extract_range_value_ptr_%out_len
|
|
1986
|
+
!__btree_map_extract_range_key_ptr_%out_len
|
|
1987
|
+
!__btree_map_extract_range_value_bits_%out_len
|
|
1988
|
+
!__btree_map_extract_range_value_lane_%out_len
|
|
1989
|
+
!__btree_map_extract_range_key_len_%out_len
|
|
1990
|
+
!__btree_map_extract_range_key_len_lane_%out_len
|
|
1991
|
+
!__btree_map_extract_range_key_bits_%out_len
|
|
1992
|
+
!__btree_map_extract_range_key_lane_%out_len
|
|
1993
|
+
!__btree_map_extract_range_key_idx_%out_len
|
|
1994
|
+
!__btree_map_extract_range_done_%out_len
|
|
1995
|
+
!__btree_map_extract_range_idx_%out_len
|
|
1996
|
+
jmp L_BTREE_MAP_EXTRACT_RANGE_HEAD_%out_len
|
|
1997
|
+
|
|
1998
|
+
L_BTREE_MAP_EXTRACT_RANGE_REMOVE_INIT_%out_len:
|
|
1999
|
+
call @sa_vec_free(^__btree_map_extract_range_vec_%out_len)
|
|
2000
|
+
__btree_map_extract_range_remove_entries_%out_len = load %out_map+BTreeMap_entries as ptr
|
|
2001
|
+
__btree_map_extract_range_remove_len_%out_len = load %out_map+BTreeMap_len as u64
|
|
2002
|
+
__btree_map_extract_range_remove_slot_%out_len = stack_alloc 8
|
|
2003
|
+
store __btree_map_extract_range_remove_slot_%out_len+0, 0 as u64
|
|
2004
|
+
jmp L_BTREE_MAP_EXTRACT_RANGE_REMOVE_HEAD_%out_len
|
|
2005
|
+
|
|
2006
|
+
L_BTREE_MAP_EXTRACT_RANGE_REMOVE_HEAD_%out_len:
|
|
2007
|
+
__btree_map_extract_range_remove_idx_%out_len = load __btree_map_extract_range_remove_slot_%out_len+0 as u64
|
|
2008
|
+
__btree_map_extract_range_remove_done_%out_len = eq __btree_map_extract_range_remove_idx_%out_len, __btree_map_extract_range_remove_len_%out_len
|
|
2009
|
+
br __btree_map_extract_range_remove_done_%out_len -> L_BTREE_MAP_EXTRACT_RANGE_DONE_%out_len, L_BTREE_MAP_EXTRACT_RANGE_REMOVE_BODY_%out_len
|
|
2010
|
+
|
|
2011
|
+
L_BTREE_MAP_EXTRACT_RANGE_REMOVE_BODY_%out_len:
|
|
2012
|
+
__btree_map_extract_range_remove_off_%out_len = mul __btree_map_extract_range_remove_idx_%out_len, BTreeMapEntry_SIZE
|
|
2013
|
+
__btree_map_extract_range_remove_entry_%out_len = ptr_add __btree_map_extract_range_remove_entries_%out_len, __btree_map_extract_range_remove_off_%out_len
|
|
2014
|
+
__btree_map_extract_range_removed_value_%out_len = call @sa_btree_map_remove(&%map_reg, &__btree_map_extract_range_remove_entry_%out_len)
|
|
2015
|
+
__btree_map_extract_range_remove_next_%out_len = add __btree_map_extract_range_remove_idx_%out_len, 1
|
|
2016
|
+
store __btree_map_extract_range_remove_slot_%out_len+0, __btree_map_extract_range_remove_next_%out_len as u64
|
|
2017
|
+
!__btree_map_extract_range_remove_next_%out_len
|
|
2018
|
+
!__btree_map_extract_range_removed_value_%out_len
|
|
2019
|
+
!__btree_map_extract_range_remove_entry_%out_len
|
|
2020
|
+
!__btree_map_extract_range_remove_off_%out_len
|
|
2021
|
+
!__btree_map_extract_range_remove_done_%out_len
|
|
2022
|
+
!__btree_map_extract_range_remove_idx_%out_len
|
|
2023
|
+
jmp L_BTREE_MAP_EXTRACT_RANGE_REMOVE_HEAD_%out_len
|
|
2024
|
+
|
|
2025
|
+
L_BTREE_MAP_EXTRACT_RANGE_DONE_%out_len:
|
|
2026
|
+
%out_len = load %map_reg+BTreeMap_len as u64
|
|
2027
|
+
!__btree_map_extract_range_remove_done_%out_len
|
|
2028
|
+
!__btree_map_extract_range_remove_idx_%out_len
|
|
2029
|
+
!__btree_map_extract_range_remove_len_%out_len
|
|
2030
|
+
!__btree_map_extract_range_remove_entries_%out_len
|
|
2031
|
+
!__btree_map_extract_range_done_%out_len
|
|
2032
|
+
!__btree_map_extract_range_idx_%out_len
|
|
2033
|
+
!__btree_map_extract_range_ptr_%out_len
|
|
2034
|
+
!__btree_map_extract_range_len_%out_len
|
|
2035
|
+
[END_MACRO]
|
|
2036
|
+
|
|
2037
|
+
[MACRO] BTREE_MAP_REMOVE %out_value, %map_reg, %key_reg
|
|
2038
|
+
%out_value = call @sa_btree_map_remove(&%map_reg, &%key_reg)
|
|
2039
|
+
[END_MACRO]
|
|
2040
|
+
|
|
2041
|
+
[MACRO] BTREE_MAP_REMOVE_ENTRY %out_ok, %out_key, %out_value, %map_reg, %key_reg
|
|
2042
|
+
%out_key = alloc Slice_SIZE
|
|
2043
|
+
__btree_map_remove_value_slot_%out_ok = stack_alloc 8
|
|
2044
|
+
%out_ok = call @sa_btree_map_remove_entry(&%map_reg, &%key_reg, &%out_key, &__btree_map_remove_value_slot_%out_ok)
|
|
2045
|
+
%out_value = load __btree_map_remove_value_slot_%out_ok+0 as u64
|
|
2046
|
+
[END_MACRO]
|
|
2047
|
+
|
|
2048
|
+
[MACRO] BTREE_MAP_INSERT %map_reg, %key_reg, %value
|
|
2049
|
+
call @sa_btree_map_insert(&%map_reg, &%key_reg, %value)
|
|
2050
|
+
[END_MACRO]
|
|
2051
|
+
|
|
2052
|
+
[MACRO] BTREE_MAP_INSERT_OLD %out_replaced, %out_old_value, %map_reg, %key_reg, %value
|
|
2053
|
+
__btree_map_insert_old_slot_%out_replaced = stack_alloc 8
|
|
2054
|
+
%out_replaced = call @sa_btree_map_insert_old(&%map_reg, &%key_reg, %value, &__btree_map_insert_old_slot_%out_replaced)
|
|
2055
|
+
%out_old_value = load __btree_map_insert_old_slot_%out_replaced+0 as u64
|
|
2056
|
+
[END_MACRO]
|
|
2057
|
+
|
|
2058
|
+
[MACRO] BTREE_MAP_TRY_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
|
|
2059
|
+
__btree_map_try_insert_ptr_slot_%out_inserted = stack_alloc 8
|
|
2060
|
+
%out_inserted = call @sa_btree_map_try_insert(&%map_reg, &%key_reg, %value, &__btree_map_try_insert_ptr_slot_%out_inserted)
|
|
2061
|
+
%out_value_ptr = load __btree_map_try_insert_ptr_slot_%out_inserted+0 as ptr
|
|
2062
|
+
[END_MACRO]
|
|
2063
|
+
|
|
2064
|
+
[MACRO] BTREE_MAP_ENTRY_OR_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
|
|
2065
|
+
EXPAND BTREE_MAP_TRY_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
|
|
2066
|
+
[END_MACRO]
|
|
2067
|
+
|
|
2068
|
+
// Rust method-name bare alias for the common entry path (or_insert).
|
|
2069
|
+
[MACRO] BTREE_MAP_ENTRY %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
|
|
2070
|
+
EXPAND BTREE_MAP_ENTRY_OR_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
|
|
2071
|
+
[END_MACRO]
|
|
2072
|
+
|
|
2073
|
+
[MACRO] BTREE_MAP_OR_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
|
|
2074
|
+
EXPAND BTREE_MAP_ENTRY_OR_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
|
|
2075
|
+
[END_MACRO]
|
|
2076
|
+
|
|
2077
|
+
// Concrete entry-style helpers. Default inserted value is 0 for the u64 map.
|
|
2078
|
+
|
|
2079
|
+
[MACRO] BTREE_MAP_ENTRY_OR_DEFAULT %out_inserted, %out_value_ptr, %map_reg, %key_reg
|
|
2080
|
+
EXPAND BTREE_MAP_ENTRY_OR_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, 0
|
|
2081
|
+
[END_MACRO]
|
|
2082
|
+
|
|
2083
|
+
[MACRO] BTREE_MAP_ENTRY_AND_MODIFY %out_ok, %map_reg, %key_reg, %value
|
|
2084
|
+
__btree_and_mod_ptr_slot_%out_ok = stack_alloc 8
|
|
2085
|
+
%out_ok = call @sa_btree_map_get_mut_ptr(&%map_reg, &%key_reg, &__btree_and_mod_ptr_slot_%out_ok)
|
|
2086
|
+
__btree_and_mod_ptr_%out_ok = load __btree_and_mod_ptr_slot_%out_ok+0 as ptr
|
|
2087
|
+
__btree_and_mod_has_%out_ok = eq %out_ok, 1
|
|
2088
|
+
br __btree_and_mod_has_%out_ok -> L_BTREE_MAP_ENTRY_AND_MODIFY_SET_%out_ok, L_BTREE_MAP_ENTRY_AND_MODIFY_SKIP_%out_ok
|
|
2089
|
+
L_BTREE_MAP_ENTRY_AND_MODIFY_SET_%out_ok:
|
|
2090
|
+
store __btree_and_mod_ptr_%out_ok+0, %value as u64
|
|
2091
|
+
!__btree_and_mod_has_%out_ok
|
|
2092
|
+
!__btree_and_mod_ptr_%out_ok
|
|
2093
|
+
jmp L_BTREE_MAP_ENTRY_AND_MODIFY_END_%out_ok
|
|
2094
|
+
L_BTREE_MAP_ENTRY_AND_MODIFY_SKIP_%out_ok:
|
|
2095
|
+
!__btree_and_mod_has_%out_ok
|
|
2096
|
+
!__btree_and_mod_ptr_%out_ok
|
|
2097
|
+
jmp L_BTREE_MAP_ENTRY_AND_MODIFY_END_%out_ok
|
|
2098
|
+
L_BTREE_MAP_ENTRY_AND_MODIFY_END_%out_ok:
|
|
2099
|
+
[END_MACRO]
|
|
2100
|
+
|
|
2101
|
+
[MACRO] BTREE_MAP_KEYS %out_set, %map_reg
|
|
2102
|
+
%out_set = call @sa_btree_map_keys_set(&%map_reg)
|
|
2103
|
+
[END_MACRO]
|
|
2104
|
+
|
|
2105
|
+
[MACRO] BTREE_MAP_VALUES %out_vec, %map_reg
|
|
2106
|
+
%out_vec = call @sa_btree_map_values_vec(&%map_reg)
|
|
2107
|
+
[END_MACRO]
|
|
2108
|
+
|
|
2109
|
+
[MACRO] BTREE_MAP_INTO_KEYS %out_set, %map_reg
|
|
2110
|
+
EXPAND BTREE_MAP_KEYS %out_set, %map_reg
|
|
2111
|
+
EXPAND BTREE_MAP_CLEAR %map_reg
|
|
2112
|
+
[END_MACRO]
|
|
2113
|
+
|
|
2114
|
+
[MACRO] BTREE_MAP_INTO_VALUES %out_vec, %map_reg
|
|
2115
|
+
EXPAND BTREE_MAP_VALUES %out_vec, %map_reg
|
|
2116
|
+
EXPAND BTREE_MAP_CLEAR %map_reg
|
|
2117
|
+
[END_MACRO]
|
|
2118
|
+
|
|
2119
|
+
[MACRO] BTREE_MAP_VALUES_MUT_PTRS %out_vec, %map_reg
|
|
2120
|
+
%out_vec = call @sa_btree_map_value_mut_ptrs_vec(&%map_reg)
|
|
2121
|
+
[END_MACRO]
|
|
2122
|
+
|
|
2123
|
+
[MACRO] BTREE_MAP_VALUES_MUT %out_vec, %map_reg
|
|
2124
|
+
EXPAND BTREE_MAP_VALUES_MUT_PTRS %out_vec, %map_reg
|
|
2125
|
+
[END_MACRO]
|
|
2126
|
+
|
|
2127
|
+
[MACRO] BTREE_MAP_ITER %out_vec, %map_reg
|
|
2128
|
+
%out_vec = call @sa_btree_map_iter_vec(&%map_reg)
|
|
2129
|
+
[END_MACRO]
|
|
2130
|
+
|
|
2131
|
+
[MACRO] BTREE_MAP_ITER_MUT_PTRS %out_vec, %map_reg
|
|
2132
|
+
%out_vec = call @sa_btree_map_iter_mut_ptrs_vec(&%map_reg)
|
|
2133
|
+
[END_MACRO]
|
|
2134
|
+
|
|
2135
|
+
// Rust method-name alias: BTreeMap::iter_mut (eager raw value-slot pointer materialization).
|
|
2136
|
+
[MACRO] BTREE_MAP_ITER_MUT %out_vec, %map_reg
|
|
2137
|
+
EXPAND BTREE_MAP_ITER_MUT_PTRS %out_vec, %map_reg
|
|
2138
|
+
[END_MACRO]
|
|
2139
|
+
|
|
2140
|
+
[MACRO] BTREE_MAP_REF_INTO_ITER %out_vec, %map_reg
|
|
2141
|
+
EXPAND BTREE_MAP_ITER %out_vec, %map_reg
|
|
2142
|
+
[END_MACRO]
|
|
2143
|
+
|
|
2144
|
+
[MACRO] BTREE_MAP_MUT_REF_INTO_ITER %out_vec, %map_reg
|
|
2145
|
+
EXPAND BTREE_MAP_ITER_MUT_PTRS %out_vec, %map_reg
|
|
2146
|
+
[END_MACRO]
|
|
2147
|
+
|
|
2148
|
+
[MACRO] BTREE_MAP_INTO_ITER %out_vec, %map_reg
|
|
2149
|
+
EXPAND BTREE_MAP_ITER %out_vec, %map_reg
|
|
2150
|
+
EXPAND BTREE_MAP_CLEAR %map_reg
|
|
2151
|
+
[END_MACRO]
|
|
2152
|
+
|
|
2153
|
+
[MACRO] BTREE_MAP_POP_FIRST %out_ok, %out_key, %out_value, %map_reg
|
|
2154
|
+
%out_key = alloc Slice_SIZE
|
|
2155
|
+
__btree_map_pop_first_value_slot_%out_ok = stack_alloc 8
|
|
2156
|
+
%out_ok = call @sa_btree_map_pop_first(&%map_reg, &%out_key, &__btree_map_pop_first_value_slot_%out_ok)
|
|
2157
|
+
%out_value = load __btree_map_pop_first_value_slot_%out_ok+0 as u64
|
|
2158
|
+
[END_MACRO]
|
|
2159
|
+
|
|
2160
|
+
[MACRO] BTREE_MAP_POP_LAST %out_ok, %out_key, %out_value, %map_reg
|
|
2161
|
+
%out_key = alloc Slice_SIZE
|
|
2162
|
+
__btree_map_pop_last_value_slot_%out_ok = stack_alloc 8
|
|
2163
|
+
%out_ok = call @sa_btree_map_pop_last(&%map_reg, &%out_key, &__btree_map_pop_last_value_slot_%out_ok)
|
|
2164
|
+
%out_value = load __btree_map_pop_last_value_slot_%out_ok+0 as u64
|
|
2165
|
+
[END_MACRO]
|
|
2166
|
+
|
|
2167
|
+
[MACRO] BTREE_MAP_APPEND %map_reg, %other_map
|
|
2168
|
+
call @sa_btree_map_append(&%map_reg, &%other_map)
|
|
2169
|
+
[END_MACRO]
|
|
2170
|
+
|
|
2171
|
+
[MACRO] BTREE_MAP_SPLIT_OFF %out_map, %map_reg, %key_reg
|
|
2172
|
+
%out_map = call @sa_btree_map_split_off(&%map_reg, &%key_reg)
|
|
2173
|
+
[END_MACRO]
|
|
2174
|
+
|
|
2175
|
+
[MACRO] BTREE_MAP_RANGE %out_map, %map_reg, %start_key, %end_key
|
|
2176
|
+
%out_map = call @sa_btree_map_range(&%map_reg, &%start_key, &%end_key)
|
|
2177
|
+
[END_MACRO]
|
|
2178
|
+
|
|
2179
|
+
[MACRO] BTREE_MAP_RANGE_MUT_PTRS %out_vec, %map_reg, %start_key, %end_key
|
|
2180
|
+
%out_vec = call @sa_btree_map_range_mut_ptrs_vec(&%map_reg, &%start_key, &%end_key)
|
|
2181
|
+
[END_MACRO]
|
|
2182
|
+
|
|
2183
|
+
// Rust method-name alias: BTreeMap::range_mut (eager raw-pointer materialization).
|
|
2184
|
+
[MACRO] BTREE_MAP_RANGE_MUT %out_vec, %map_reg, %start_key, %end_key
|
|
2185
|
+
EXPAND BTREE_MAP_RANGE_MUT_PTRS %out_vec, %map_reg, %start_key, %end_key
|
|
2186
|
+
[END_MACRO]
|
|
2187
|
+
|
|
2188
|
+
[MACRO] BTREE_MAP_LIT1 %out_map, %key1, %value1
|
|
2189
|
+
EXPAND BTREE_MAP_NEW %out_map
|
|
2190
|
+
EXPAND BTREE_MAP_INSERT %out_map, %key1, %value1
|
|
2191
|
+
[END_MACRO]
|
|
2192
|
+
|
|
2193
|
+
[MACRO] BTREE_MAP_LIT2 %out_map, %key1, %value1, %key2, %value2
|
|
2194
|
+
EXPAND BTREE_MAP_NEW %out_map
|
|
2195
|
+
EXPAND BTREE_MAP_INSERT %out_map, %key1, %value1
|
|
2196
|
+
EXPAND BTREE_MAP_INSERT %out_map, %key2, %value2
|
|
2197
|
+
[END_MACRO]
|
|
2198
|
+
|
|
2199
|
+
[MACRO] BTREE_MAP_LIT3 %out_map, %key1, %value1, %key2, %value2, %key3, %value3
|
|
2200
|
+
EXPAND BTREE_MAP_NEW %out_map
|
|
2201
|
+
EXPAND BTREE_MAP_INSERT %out_map, %key1, %value1
|
|
2202
|
+
EXPAND BTREE_MAP_INSERT %out_map, %key2, %value2
|
|
2203
|
+
EXPAND BTREE_MAP_INSERT %out_map, %key3, %value3
|
|
2204
|
+
[END_MACRO]
|
|
2205
|
+
|
|
2206
|
+
// Rust Default-style empty BTreeMap constructor alias.
|
|
2207
|
+
|
|
2208
|
+
[MACRO] BTREE_MAP_DEFAULT %out_map
|
|
2209
|
+
EXPAND BTREE_MAP_NEW %out_map
|
|
2210
|
+
[END_MACRO]
|