@salang/sa 0.1.2 → 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 +19 -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,1120 @@
|
|
|
1
|
+
// Concrete LinkedList<u64> facade over heap nodes.
|
|
2
|
+
// Models supportable Rust LinkedList push/pop/front/back/len/clear/append/contains.
|
|
3
|
+
@import "linked_list.sal"
|
|
4
|
+
@import "../vec.sa"
|
|
5
|
+
@import "../core/slice.sal"
|
|
6
|
+
|
|
7
|
+
@sa_linked_list_new() -> ^ptr:
|
|
8
|
+
L_ENTRY:
|
|
9
|
+
list = alloc LinkedList_SIZE
|
|
10
|
+
null_ptr = 0 as ptr
|
|
11
|
+
store list+LinkedList_head, null_ptr as ptr
|
|
12
|
+
store list+LinkedList_tail, null_ptr as ptr
|
|
13
|
+
store list+LinkedList_len, 0 as u64
|
|
14
|
+
!null_ptr
|
|
15
|
+
return list
|
|
16
|
+
|
|
17
|
+
@sa_linked_list_clear(&list: ptr) -> void:
|
|
18
|
+
L_CLEAR_HEAD:
|
|
19
|
+
head = load list+LinkedList_head as ptr
|
|
20
|
+
null_ptr = 0 as ptr
|
|
21
|
+
done = eq head, null_ptr
|
|
22
|
+
br done -> L_CLEAR_DONE, L_CLEAR_BODY
|
|
23
|
+
L_CLEAR_BODY:
|
|
24
|
+
next = load head+LinkedListNode_next as ptr
|
|
25
|
+
!head
|
|
26
|
+
store list+LinkedList_head, next as ptr
|
|
27
|
+
!next
|
|
28
|
+
!done
|
|
29
|
+
!null_ptr
|
|
30
|
+
jmp L_CLEAR_HEAD
|
|
31
|
+
L_CLEAR_DONE:
|
|
32
|
+
null2 = 0 as ptr
|
|
33
|
+
store list+LinkedList_head, null2 as ptr
|
|
34
|
+
store list+LinkedList_tail, null2 as ptr
|
|
35
|
+
store list+LinkedList_len, 0 as u64
|
|
36
|
+
!null2
|
|
37
|
+
!done
|
|
38
|
+
!null_ptr
|
|
39
|
+
!head
|
|
40
|
+
return
|
|
41
|
+
|
|
42
|
+
@sa_linked_list_free(^list: ptr) -> void:
|
|
43
|
+
L_ENTRY:
|
|
44
|
+
call @sa_linked_list_clear(&list)
|
|
45
|
+
!list
|
|
46
|
+
return
|
|
47
|
+
|
|
48
|
+
@sa_linked_list_push_front(&list: ptr, value: u64) -> void:
|
|
49
|
+
L_ENTRY:
|
|
50
|
+
node = alloc LinkedListNode_SIZE
|
|
51
|
+
null_ptr = 0 as ptr
|
|
52
|
+
store node+LinkedListNode_prev, null_ptr as ptr
|
|
53
|
+
store node+LinkedListNode_value, value as u64
|
|
54
|
+
old_head = load list+LinkedList_head as ptr
|
|
55
|
+
store node+LinkedListNode_next, old_head as ptr
|
|
56
|
+
empty = eq old_head, null_ptr
|
|
57
|
+
br empty -> L_PF_EMPTY, L_PF_LINK
|
|
58
|
+
L_PF_LINK:
|
|
59
|
+
store old_head+LinkedListNode_prev, node as ptr
|
|
60
|
+
jmp L_PF_STORE
|
|
61
|
+
L_PF_EMPTY:
|
|
62
|
+
store list+LinkedList_tail, node as ptr
|
|
63
|
+
jmp L_PF_STORE
|
|
64
|
+
L_PF_STORE:
|
|
65
|
+
store list+LinkedList_head, node as ptr
|
|
66
|
+
len = load list+LinkedList_len as u64
|
|
67
|
+
next_len = add len, 1
|
|
68
|
+
store list+LinkedList_len, next_len as u64
|
|
69
|
+
!next_len
|
|
70
|
+
!len
|
|
71
|
+
!empty
|
|
72
|
+
!old_head
|
|
73
|
+
!null_ptr
|
|
74
|
+
!node
|
|
75
|
+
!value
|
|
76
|
+
return
|
|
77
|
+
|
|
78
|
+
@sa_linked_list_push_back(&list: ptr, value: u64) -> void:
|
|
79
|
+
L_ENTRY:
|
|
80
|
+
node = alloc LinkedListNode_SIZE
|
|
81
|
+
null_ptr = 0 as ptr
|
|
82
|
+
store node+LinkedListNode_next, null_ptr as ptr
|
|
83
|
+
store node+LinkedListNode_value, value as u64
|
|
84
|
+
old_tail = load list+LinkedList_tail as ptr
|
|
85
|
+
store node+LinkedListNode_prev, old_tail as ptr
|
|
86
|
+
empty = eq old_tail, null_ptr
|
|
87
|
+
br empty -> L_PB_EMPTY, L_PB_LINK
|
|
88
|
+
L_PB_LINK:
|
|
89
|
+
store old_tail+LinkedListNode_next, node as ptr
|
|
90
|
+
jmp L_PB_STORE
|
|
91
|
+
L_PB_EMPTY:
|
|
92
|
+
store list+LinkedList_head, node as ptr
|
|
93
|
+
jmp L_PB_STORE
|
|
94
|
+
L_PB_STORE:
|
|
95
|
+
store list+LinkedList_tail, node as ptr
|
|
96
|
+
len = load list+LinkedList_len as u64
|
|
97
|
+
next_len = add len, 1
|
|
98
|
+
store list+LinkedList_len, next_len as u64
|
|
99
|
+
!next_len
|
|
100
|
+
!len
|
|
101
|
+
!empty
|
|
102
|
+
!old_tail
|
|
103
|
+
!null_ptr
|
|
104
|
+
!node
|
|
105
|
+
!value
|
|
106
|
+
return
|
|
107
|
+
|
|
108
|
+
@sa_linked_list_try_pop_front(&list: ptr, &out_value: ptr) -> i32:
|
|
109
|
+
L_ENTRY:
|
|
110
|
+
head = load list+LinkedList_head as ptr
|
|
111
|
+
null_ptr = 0 as ptr
|
|
112
|
+
empty = eq head, null_ptr
|
|
113
|
+
br empty -> L_POPF_EMPTY, L_POPF_BODY
|
|
114
|
+
L_POPF_BODY:
|
|
115
|
+
value = load head+LinkedListNode_value as u64
|
|
116
|
+
store out_value+0, value as u64
|
|
117
|
+
next = load head+LinkedListNode_next as ptr
|
|
118
|
+
store list+LinkedList_head, next as ptr
|
|
119
|
+
was_last = eq next, null_ptr
|
|
120
|
+
br was_last -> L_POPF_LAST, L_POPF_RELINK
|
|
121
|
+
L_POPF_RELINK:
|
|
122
|
+
store next+LinkedListNode_prev, null_ptr as ptr
|
|
123
|
+
jmp L_POPF_LEN
|
|
124
|
+
L_POPF_LAST:
|
|
125
|
+
store list+LinkedList_tail, null_ptr as ptr
|
|
126
|
+
jmp L_POPF_LEN
|
|
127
|
+
L_POPF_LEN:
|
|
128
|
+
!head
|
|
129
|
+
len = load list+LinkedList_len as u64
|
|
130
|
+
next_len = sub len, 1
|
|
131
|
+
store list+LinkedList_len, next_len as u64
|
|
132
|
+
!next_len
|
|
133
|
+
!len
|
|
134
|
+
!was_last
|
|
135
|
+
!next
|
|
136
|
+
!value
|
|
137
|
+
!empty
|
|
138
|
+
!null_ptr
|
|
139
|
+
!out_value
|
|
140
|
+
return 1
|
|
141
|
+
L_POPF_EMPTY:
|
|
142
|
+
store out_value+0, 0 as u64
|
|
143
|
+
!empty
|
|
144
|
+
!null_ptr
|
|
145
|
+
!head
|
|
146
|
+
!out_value
|
|
147
|
+
return 0
|
|
148
|
+
|
|
149
|
+
@sa_linked_list_try_pop_back(&list: ptr, &out_value: ptr) -> i32:
|
|
150
|
+
L_ENTRY:
|
|
151
|
+
tail = load list+LinkedList_tail as ptr
|
|
152
|
+
null_ptr = 0 as ptr
|
|
153
|
+
empty = eq tail, null_ptr
|
|
154
|
+
br empty -> L_POPB_EMPTY, L_POPB_BODY
|
|
155
|
+
L_POPB_BODY:
|
|
156
|
+
value = load tail+LinkedListNode_value as u64
|
|
157
|
+
store out_value+0, value as u64
|
|
158
|
+
prev = load tail+LinkedListNode_prev as ptr
|
|
159
|
+
store list+LinkedList_tail, prev as ptr
|
|
160
|
+
was_last = eq prev, null_ptr
|
|
161
|
+
br was_last -> L_POPB_LAST, L_POPB_RELINK
|
|
162
|
+
L_POPB_RELINK:
|
|
163
|
+
store prev+LinkedListNode_next, null_ptr as ptr
|
|
164
|
+
jmp L_POPB_LEN
|
|
165
|
+
L_POPB_LAST:
|
|
166
|
+
store list+LinkedList_head, null_ptr as ptr
|
|
167
|
+
jmp L_POPB_LEN
|
|
168
|
+
L_POPB_LEN:
|
|
169
|
+
!tail
|
|
170
|
+
len = load list+LinkedList_len as u64
|
|
171
|
+
next_len = sub len, 1
|
|
172
|
+
store list+LinkedList_len, next_len as u64
|
|
173
|
+
!next_len
|
|
174
|
+
!len
|
|
175
|
+
!was_last
|
|
176
|
+
!prev
|
|
177
|
+
!value
|
|
178
|
+
!empty
|
|
179
|
+
!null_ptr
|
|
180
|
+
!out_value
|
|
181
|
+
return 1
|
|
182
|
+
L_POPB_EMPTY:
|
|
183
|
+
store out_value+0, 0 as u64
|
|
184
|
+
!empty
|
|
185
|
+
!null_ptr
|
|
186
|
+
!tail
|
|
187
|
+
!out_value
|
|
188
|
+
return 0
|
|
189
|
+
|
|
190
|
+
@sa_linked_list_try_front(&list: ptr, &out_value: ptr) -> i32:
|
|
191
|
+
L_ENTRY:
|
|
192
|
+
head = load list+LinkedList_head as ptr
|
|
193
|
+
null_ptr = 0 as ptr
|
|
194
|
+
empty = eq head, null_ptr
|
|
195
|
+
br empty -> L_FRONT_EMPTY, L_FRONT_OK
|
|
196
|
+
L_FRONT_OK:
|
|
197
|
+
value = load head+LinkedListNode_value as u64
|
|
198
|
+
store out_value+0, value as u64
|
|
199
|
+
!value
|
|
200
|
+
!empty
|
|
201
|
+
!null_ptr
|
|
202
|
+
!head
|
|
203
|
+
!out_value
|
|
204
|
+
return 1
|
|
205
|
+
L_FRONT_EMPTY:
|
|
206
|
+
store out_value+0, 0 as u64
|
|
207
|
+
!empty
|
|
208
|
+
!null_ptr
|
|
209
|
+
!head
|
|
210
|
+
!out_value
|
|
211
|
+
return 0
|
|
212
|
+
|
|
213
|
+
@sa_linked_list_try_back(&list: ptr, &out_value: ptr) -> i32:
|
|
214
|
+
L_ENTRY:
|
|
215
|
+
tail = load list+LinkedList_tail as ptr
|
|
216
|
+
null_ptr = 0 as ptr
|
|
217
|
+
empty = eq tail, null_ptr
|
|
218
|
+
br empty -> L_BACK_EMPTY, L_BACK_OK
|
|
219
|
+
L_BACK_OK:
|
|
220
|
+
value = load tail+LinkedListNode_value as u64
|
|
221
|
+
store out_value+0, value as u64
|
|
222
|
+
!value
|
|
223
|
+
!empty
|
|
224
|
+
!null_ptr
|
|
225
|
+
!tail
|
|
226
|
+
!out_value
|
|
227
|
+
return 1
|
|
228
|
+
L_BACK_EMPTY:
|
|
229
|
+
store out_value+0, 0 as u64
|
|
230
|
+
!empty
|
|
231
|
+
!null_ptr
|
|
232
|
+
!tail
|
|
233
|
+
!out_value
|
|
234
|
+
return 0
|
|
235
|
+
|
|
236
|
+
@sa_linked_list_contains(&list: ptr, needle: u64) -> i32:
|
|
237
|
+
L_ENTRY:
|
|
238
|
+
node_slot = stack_alloc 8
|
|
239
|
+
head = load list+LinkedList_head as ptr
|
|
240
|
+
store node_slot+0, head as ptr
|
|
241
|
+
!head
|
|
242
|
+
jmp L_CONTAINS_HEAD
|
|
243
|
+
L_CONTAINS_HEAD:
|
|
244
|
+
node = load node_slot+0 as ptr
|
|
245
|
+
null_ptr = 0 as ptr
|
|
246
|
+
done = eq node, null_ptr
|
|
247
|
+
br done -> L_CONTAINS_MISS, L_CONTAINS_BODY
|
|
248
|
+
L_CONTAINS_BODY:
|
|
249
|
+
val = load node+LinkedListNode_value as u64
|
|
250
|
+
hit = eq val, needle
|
|
251
|
+
br hit -> L_CONTAINS_HIT, L_CONTAINS_NEXT
|
|
252
|
+
L_CONTAINS_HIT:
|
|
253
|
+
!hit
|
|
254
|
+
!val
|
|
255
|
+
!null_ptr
|
|
256
|
+
!done
|
|
257
|
+
!node
|
|
258
|
+
!needle
|
|
259
|
+
return 1
|
|
260
|
+
L_CONTAINS_NEXT:
|
|
261
|
+
next = load node+LinkedListNode_next as ptr
|
|
262
|
+
store node_slot+0, next as ptr
|
|
263
|
+
!next
|
|
264
|
+
!hit
|
|
265
|
+
!val
|
|
266
|
+
!null_ptr
|
|
267
|
+
!done
|
|
268
|
+
!node
|
|
269
|
+
jmp L_CONTAINS_HEAD
|
|
270
|
+
L_CONTAINS_MISS:
|
|
271
|
+
!done
|
|
272
|
+
!null_ptr
|
|
273
|
+
!node
|
|
274
|
+
!needle
|
|
275
|
+
return 0
|
|
276
|
+
|
|
277
|
+
@sa_linked_list_append(&list: ptr, &other: ptr) -> void:
|
|
278
|
+
L_APPEND_HEAD:
|
|
279
|
+
value_slot = stack_alloc 8
|
|
280
|
+
ok = call @sa_linked_list_try_pop_front(&other, &value_slot)
|
|
281
|
+
br ok -> L_APPEND_BODY, L_APPEND_DONE
|
|
282
|
+
L_APPEND_BODY:
|
|
283
|
+
value = load value_slot+0 as u64
|
|
284
|
+
call @sa_linked_list_push_back(&list, value)
|
|
285
|
+
!value
|
|
286
|
+
!ok
|
|
287
|
+
jmp L_APPEND_HEAD
|
|
288
|
+
L_APPEND_DONE:
|
|
289
|
+
!ok
|
|
290
|
+
return
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
@sa_linked_list_try_remove(&list: ptr, index: u64, &out_value: ptr) -> i32:
|
|
294
|
+
L_ENTRY:
|
|
295
|
+
len = load list+LinkedList_len as u64
|
|
296
|
+
oob = uge index, len
|
|
297
|
+
br oob -> L_REM_OOB, L_REM_SCAN
|
|
298
|
+
L_REM_OOB:
|
|
299
|
+
store out_value+0, 0 as u64
|
|
300
|
+
!oob
|
|
301
|
+
!len
|
|
302
|
+
!out_value
|
|
303
|
+
!index
|
|
304
|
+
return 0
|
|
305
|
+
L_REM_SCAN:
|
|
306
|
+
node_slot = stack_alloc 8
|
|
307
|
+
idx_slot = stack_alloc 8
|
|
308
|
+
head = load list+LinkedList_head as ptr
|
|
309
|
+
store node_slot+0, head as ptr
|
|
310
|
+
store idx_slot+0, 0 as u64
|
|
311
|
+
!head
|
|
312
|
+
jmp L_REM_HEAD
|
|
313
|
+
L_REM_HEAD:
|
|
314
|
+
node = load node_slot+0 as ptr
|
|
315
|
+
i = load idx_slot+0 as u64
|
|
316
|
+
hit = eq i, index
|
|
317
|
+
br hit -> L_REM_HIT, L_REM_NEXT
|
|
318
|
+
L_REM_NEXT:
|
|
319
|
+
next = load node+LinkedListNode_next as ptr
|
|
320
|
+
store node_slot+0, next as ptr
|
|
321
|
+
ni = add i, 1
|
|
322
|
+
store idx_slot+0, ni as u64
|
|
323
|
+
!ni
|
|
324
|
+
!next
|
|
325
|
+
!hit
|
|
326
|
+
!i
|
|
327
|
+
!node
|
|
328
|
+
jmp L_REM_HEAD
|
|
329
|
+
L_REM_HIT:
|
|
330
|
+
value = load node+LinkedListNode_value as u64
|
|
331
|
+
store out_value+0, value as u64
|
|
332
|
+
prev = load node+LinkedListNode_prev as ptr
|
|
333
|
+
next2 = load node+LinkedListNode_next as ptr
|
|
334
|
+
null_ptr = 0 as ptr
|
|
335
|
+
prev_null = eq prev, null_ptr
|
|
336
|
+
br prev_null -> L_REM_NO_PREV, L_REM_HAS_PREV
|
|
337
|
+
L_REM_HAS_PREV:
|
|
338
|
+
store prev+LinkedListNode_next, next2 as ptr
|
|
339
|
+
jmp L_REM_NEXT_LINK
|
|
340
|
+
L_REM_NO_PREV:
|
|
341
|
+
store list+LinkedList_head, next2 as ptr
|
|
342
|
+
jmp L_REM_NEXT_LINK
|
|
343
|
+
L_REM_NEXT_LINK:
|
|
344
|
+
next_null = eq next2, null_ptr
|
|
345
|
+
br next_null -> L_REM_NO_NEXT, L_REM_HAS_NEXT
|
|
346
|
+
L_REM_HAS_NEXT:
|
|
347
|
+
store next2+LinkedListNode_prev, prev as ptr
|
|
348
|
+
jmp L_REM_LEN
|
|
349
|
+
L_REM_NO_NEXT:
|
|
350
|
+
store list+LinkedList_tail, prev as ptr
|
|
351
|
+
jmp L_REM_LEN
|
|
352
|
+
L_REM_LEN:
|
|
353
|
+
!node
|
|
354
|
+
len2 = load list+LinkedList_len as u64
|
|
355
|
+
nlen = sub len2, 1
|
|
356
|
+
store list+LinkedList_len, nlen as u64
|
|
357
|
+
!nlen
|
|
358
|
+
!len2
|
|
359
|
+
!next_null
|
|
360
|
+
!prev_null
|
|
361
|
+
!null_ptr
|
|
362
|
+
!next2
|
|
363
|
+
!prev
|
|
364
|
+
!value
|
|
365
|
+
!hit
|
|
366
|
+
!i
|
|
367
|
+
!oob
|
|
368
|
+
!len
|
|
369
|
+
!out_value
|
|
370
|
+
!index
|
|
371
|
+
return 1
|
|
372
|
+
|
|
373
|
+
@sa_linked_list_split_off(&list: ptr, at: u64) -> ^ptr:
|
|
374
|
+
L_ENTRY:
|
|
375
|
+
out = call @sa_linked_list_new()
|
|
376
|
+
len = load list+LinkedList_len as u64
|
|
377
|
+
// if at >= len, return empty out
|
|
378
|
+
ge = uge at, len
|
|
379
|
+
br ge -> L_SPLIT_DONE, L_SPLIT_LOOP_INIT
|
|
380
|
+
L_SPLIT_LOOP_INIT:
|
|
381
|
+
// pop from `at` to end into out by first advancing to at via pops into temp then re-push?
|
|
382
|
+
// Simpler: while len > at: pop_back from list, push_front to out (preserves order)
|
|
383
|
+
jmp L_SPLIT_LOOP
|
|
384
|
+
L_SPLIT_LOOP:
|
|
385
|
+
cur_len = load list+LinkedList_len as u64
|
|
386
|
+
done = ule cur_len, at
|
|
387
|
+
br done -> L_SPLIT_DONE, L_SPLIT_BODY
|
|
388
|
+
L_SPLIT_BODY:
|
|
389
|
+
slot = stack_alloc 8
|
|
390
|
+
ok = call @sa_linked_list_try_pop_back(&list, &slot)
|
|
391
|
+
val = load slot+0 as u64
|
|
392
|
+
call @sa_linked_list_push_front(&out, val)
|
|
393
|
+
!val
|
|
394
|
+
!ok
|
|
395
|
+
!done
|
|
396
|
+
!cur_len
|
|
397
|
+
jmp L_SPLIT_LOOP
|
|
398
|
+
L_SPLIT_DONE:
|
|
399
|
+
!ge
|
|
400
|
+
!len
|
|
401
|
+
!at
|
|
402
|
+
return out
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
@sa_linked_list_to_vec(&list: ptr) -> ^ptr:
|
|
406
|
+
L_ENTRY:
|
|
407
|
+
len = load list+LinkedList_len as u64
|
|
408
|
+
out = call @sa_vec_with_capacity(len, 8)
|
|
409
|
+
node_slot = stack_alloc 8
|
|
410
|
+
head = load list+LinkedList_head as ptr
|
|
411
|
+
store node_slot+0, head as ptr
|
|
412
|
+
!head
|
|
413
|
+
!len
|
|
414
|
+
jmp L_TO_VEC_HEAD
|
|
415
|
+
L_TO_VEC_HEAD:
|
|
416
|
+
node = load node_slot+0 as ptr
|
|
417
|
+
null_ptr = 0 as ptr
|
|
418
|
+
done = eq node, null_ptr
|
|
419
|
+
br done -> L_TO_VEC_DONE, L_TO_VEC_BODY
|
|
420
|
+
L_TO_VEC_BODY:
|
|
421
|
+
val = load node+LinkedListNode_value as u64
|
|
422
|
+
out = call @sa_vec_push(^out, val, 8)
|
|
423
|
+
next = load node+LinkedListNode_next as ptr
|
|
424
|
+
store node_slot+0, next as ptr
|
|
425
|
+
!next
|
|
426
|
+
!val
|
|
427
|
+
!null_ptr
|
|
428
|
+
!done
|
|
429
|
+
!node
|
|
430
|
+
jmp L_TO_VEC_HEAD
|
|
431
|
+
L_TO_VEC_DONE:
|
|
432
|
+
!done
|
|
433
|
+
!null_ptr
|
|
434
|
+
!node
|
|
435
|
+
return out
|
|
436
|
+
|
|
437
|
+
@sa_linked_list_from_slice(&slice: ptr) -> ^ptr:
|
|
438
|
+
L_ENTRY:
|
|
439
|
+
list = call @sa_linked_list_new()
|
|
440
|
+
len = load slice+Slice_len as u64
|
|
441
|
+
ptr = load slice+Slice_ptr as ptr
|
|
442
|
+
idx_slot = stack_alloc 8
|
|
443
|
+
store idx_slot+0, 0 as u64
|
|
444
|
+
jmp L_FROM_HEAD
|
|
445
|
+
L_FROM_HEAD:
|
|
446
|
+
i = load idx_slot+0 as u64
|
|
447
|
+
done = eq i, len
|
|
448
|
+
br done -> L_FROM_DONE, L_FROM_BODY
|
|
449
|
+
L_FROM_BODY:
|
|
450
|
+
off = mul i, 8
|
|
451
|
+
p = ptr_add ptr, off
|
|
452
|
+
val = load p+0 as u64
|
|
453
|
+
call @sa_linked_list_push_back(&list, val)
|
|
454
|
+
ni = add i, 1
|
|
455
|
+
store idx_slot+0, ni as u64
|
|
456
|
+
!ni
|
|
457
|
+
!val
|
|
458
|
+
!p
|
|
459
|
+
!off
|
|
460
|
+
!done
|
|
461
|
+
!i
|
|
462
|
+
jmp L_FROM_HEAD
|
|
463
|
+
L_FROM_DONE:
|
|
464
|
+
!done
|
|
465
|
+
!i
|
|
466
|
+
!ptr
|
|
467
|
+
!len
|
|
468
|
+
!slice
|
|
469
|
+
return list
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
@sa_linked_list_try_get(&list: ptr, index: u64, &out_value: ptr) -> i32:
|
|
474
|
+
L_ENTRY:
|
|
475
|
+
len = load list+LinkedList_len as u64
|
|
476
|
+
oob = uge index, len
|
|
477
|
+
br oob -> L_GET_OOB, L_GET_SCAN
|
|
478
|
+
L_GET_OOB:
|
|
479
|
+
store out_value+0, 0 as u64
|
|
480
|
+
!oob
|
|
481
|
+
!len
|
|
482
|
+
!out_value
|
|
483
|
+
!index
|
|
484
|
+
return 0
|
|
485
|
+
L_GET_SCAN:
|
|
486
|
+
node_slot = stack_alloc 8
|
|
487
|
+
idx_slot = stack_alloc 8
|
|
488
|
+
head = load list+LinkedList_head as ptr
|
|
489
|
+
store node_slot+0, head as ptr
|
|
490
|
+
store idx_slot+0, 0 as u64
|
|
491
|
+
!head
|
|
492
|
+
jmp L_GET_HEAD
|
|
493
|
+
L_GET_HEAD:
|
|
494
|
+
node = load node_slot+0 as ptr
|
|
495
|
+
i = load idx_slot+0 as u64
|
|
496
|
+
hit = eq i, index
|
|
497
|
+
br hit -> L_GET_HIT, L_GET_NEXT
|
|
498
|
+
L_GET_NEXT:
|
|
499
|
+
next = load node+LinkedListNode_next as ptr
|
|
500
|
+
store node_slot+0, next as ptr
|
|
501
|
+
ni = add i, 1
|
|
502
|
+
store idx_slot+0, ni as u64
|
|
503
|
+
!ni
|
|
504
|
+
!next
|
|
505
|
+
!hit
|
|
506
|
+
!i
|
|
507
|
+
!node
|
|
508
|
+
jmp L_GET_HEAD
|
|
509
|
+
L_GET_HIT:
|
|
510
|
+
value = load node+LinkedListNode_value as u64
|
|
511
|
+
store out_value+0, value as u64
|
|
512
|
+
!value
|
|
513
|
+
!hit
|
|
514
|
+
!i
|
|
515
|
+
!node
|
|
516
|
+
!oob
|
|
517
|
+
!len
|
|
518
|
+
!out_value
|
|
519
|
+
!index
|
|
520
|
+
return 1
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
@sa_linked_list_try_set(&list: ptr, index: u64, value: u64) -> i32:
|
|
524
|
+
L_ENTRY:
|
|
525
|
+
len = load list+LinkedList_len as u64
|
|
526
|
+
oob = uge index, len
|
|
527
|
+
br oob -> L_SET_OOB, L_SET_SCAN
|
|
528
|
+
L_SET_OOB:
|
|
529
|
+
!oob
|
|
530
|
+
!len
|
|
531
|
+
!value
|
|
532
|
+
!index
|
|
533
|
+
return 0
|
|
534
|
+
L_SET_SCAN:
|
|
535
|
+
node_slot = stack_alloc 8
|
|
536
|
+
idx_slot = stack_alloc 8
|
|
537
|
+
head = load list+LinkedList_head as ptr
|
|
538
|
+
store node_slot+0, head as ptr
|
|
539
|
+
store idx_slot+0, 0 as u64
|
|
540
|
+
!head
|
|
541
|
+
jmp L_SET_HEAD
|
|
542
|
+
L_SET_HEAD:
|
|
543
|
+
node = load node_slot+0 as ptr
|
|
544
|
+
i = load idx_slot+0 as u64
|
|
545
|
+
hit = eq i, index
|
|
546
|
+
br hit -> L_SET_HIT, L_SET_NEXT
|
|
547
|
+
L_SET_NEXT:
|
|
548
|
+
next = load node+LinkedListNode_next as ptr
|
|
549
|
+
store node_slot+0, next as ptr
|
|
550
|
+
ni = add i, 1
|
|
551
|
+
store idx_slot+0, ni as u64
|
|
552
|
+
!ni
|
|
553
|
+
!next
|
|
554
|
+
!hit
|
|
555
|
+
!i
|
|
556
|
+
!node
|
|
557
|
+
jmp L_SET_HEAD
|
|
558
|
+
L_SET_HIT:
|
|
559
|
+
store node+LinkedListNode_value, value as u64
|
|
560
|
+
!hit
|
|
561
|
+
!i
|
|
562
|
+
!node
|
|
563
|
+
!oob
|
|
564
|
+
!len
|
|
565
|
+
!value
|
|
566
|
+
!index
|
|
567
|
+
return 1
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
@sa_linked_list_reverse(&list: ptr) -> void:
|
|
571
|
+
L_ENTRY:
|
|
572
|
+
// swap head/tail and swap each node prev/next
|
|
573
|
+
head = load list+LinkedList_head as ptr
|
|
574
|
+
tail = load list+LinkedList_tail as ptr
|
|
575
|
+
store list+LinkedList_head, tail as ptr
|
|
576
|
+
store list+LinkedList_tail, head as ptr
|
|
577
|
+
node_slot = stack_alloc 8
|
|
578
|
+
store node_slot+0, head as ptr
|
|
579
|
+
!head
|
|
580
|
+
!tail
|
|
581
|
+
jmp L_REV_HEAD
|
|
582
|
+
L_REV_HEAD:
|
|
583
|
+
node = load node_slot+0 as ptr
|
|
584
|
+
null_ptr = 0 as ptr
|
|
585
|
+
done = eq node, null_ptr
|
|
586
|
+
br done -> L_REV_DONE, L_REV_BODY
|
|
587
|
+
L_REV_BODY:
|
|
588
|
+
prev = load node+LinkedListNode_prev as ptr
|
|
589
|
+
next = load node+LinkedListNode_next as ptr
|
|
590
|
+
store node+LinkedListNode_prev, next as ptr
|
|
591
|
+
store node+LinkedListNode_next, prev as ptr
|
|
592
|
+
// continue along original next (now in prev)
|
|
593
|
+
store node_slot+0, next as ptr
|
|
594
|
+
!prev
|
|
595
|
+
!next
|
|
596
|
+
!null_ptr
|
|
597
|
+
!done
|
|
598
|
+
!node
|
|
599
|
+
jmp L_REV_HEAD
|
|
600
|
+
L_REV_DONE:
|
|
601
|
+
!done
|
|
602
|
+
!null_ptr
|
|
603
|
+
!node
|
|
604
|
+
return
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
@sa_linked_list_insert_after(&list: ptr, node: ptr, value: u64) -> void:
|
|
608
|
+
L_ENTRY:
|
|
609
|
+
new_node = alloc LinkedListNode_SIZE
|
|
610
|
+
next = load node+LinkedListNode_next as ptr
|
|
611
|
+
store new_node+LinkedListNode_value, value as u64
|
|
612
|
+
store new_node+LinkedListNode_prev, node as ptr
|
|
613
|
+
store new_node+LinkedListNode_next, next as ptr
|
|
614
|
+
store node+LinkedListNode_next, new_node as ptr
|
|
615
|
+
null_ptr = 0 as ptr
|
|
616
|
+
next_null = eq next, null_ptr
|
|
617
|
+
br next_null -> L_INS_TAIL, L_INS_MID
|
|
618
|
+
L_INS_MID:
|
|
619
|
+
store next+LinkedListNode_prev, new_node as ptr
|
|
620
|
+
jmp L_INS_LEN
|
|
621
|
+
L_INS_TAIL:
|
|
622
|
+
store list+LinkedList_tail, new_node as ptr
|
|
623
|
+
jmp L_INS_LEN
|
|
624
|
+
L_INS_LEN:
|
|
625
|
+
len = load list+LinkedList_len as u64
|
|
626
|
+
nlen = add len, 1
|
|
627
|
+
store list+LinkedList_len, nlen as u64
|
|
628
|
+
!nlen
|
|
629
|
+
!len
|
|
630
|
+
!next_null
|
|
631
|
+
!null_ptr
|
|
632
|
+
!next
|
|
633
|
+
!new_node
|
|
634
|
+
!value
|
|
635
|
+
!node
|
|
636
|
+
return
|
|
637
|
+
|
|
638
|
+
@sa_linked_list_insert_before(&list: ptr, node: ptr, value: u64) -> void:
|
|
639
|
+
L_ENTRY:
|
|
640
|
+
new_node = alloc LinkedListNode_SIZE
|
|
641
|
+
prev = load node+LinkedListNode_prev as ptr
|
|
642
|
+
store new_node+LinkedListNode_value, value as u64
|
|
643
|
+
store new_node+LinkedListNode_next, node as ptr
|
|
644
|
+
store new_node+LinkedListNode_prev, prev as ptr
|
|
645
|
+
store node+LinkedListNode_prev, new_node as ptr
|
|
646
|
+
null_ptr = 0 as ptr
|
|
647
|
+
prev_null = eq prev, null_ptr
|
|
648
|
+
br prev_null -> L_INB_HEAD, L_INB_MID
|
|
649
|
+
L_INB_MID:
|
|
650
|
+
store prev+LinkedListNode_next, new_node as ptr
|
|
651
|
+
jmp L_INB_LEN
|
|
652
|
+
L_INB_HEAD:
|
|
653
|
+
store list+LinkedList_head, new_node as ptr
|
|
654
|
+
jmp L_INB_LEN
|
|
655
|
+
L_INB_LEN:
|
|
656
|
+
len = load list+LinkedList_len as u64
|
|
657
|
+
nlen = add len, 1
|
|
658
|
+
store list+LinkedList_len, nlen as u64
|
|
659
|
+
!nlen
|
|
660
|
+
!len
|
|
661
|
+
!prev_null
|
|
662
|
+
!null_ptr
|
|
663
|
+
!prev
|
|
664
|
+
!new_node
|
|
665
|
+
!value
|
|
666
|
+
!node
|
|
667
|
+
return
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
@sa_linked_list_clone(&list: ptr) -> ^ptr:
|
|
671
|
+
L_ENTRY:
|
|
672
|
+
out = call @sa_linked_list_new()
|
|
673
|
+
node_slot = stack_alloc 8
|
|
674
|
+
head = load list+LinkedList_head as ptr
|
|
675
|
+
store node_slot+0, head as ptr
|
|
676
|
+
!head
|
|
677
|
+
jmp L_CL_HEAD
|
|
678
|
+
L_CL_HEAD:
|
|
679
|
+
node = load node_slot+0 as ptr
|
|
680
|
+
null_ptr = 0 as ptr
|
|
681
|
+
done = eq node, null_ptr
|
|
682
|
+
br done -> L_CL_DONE, L_CL_BODY
|
|
683
|
+
L_CL_BODY:
|
|
684
|
+
val = load node+LinkedListNode_value as u64
|
|
685
|
+
call @sa_linked_list_push_back(&out, val)
|
|
686
|
+
next = load node+LinkedListNode_next as ptr
|
|
687
|
+
store node_slot+0, next as ptr
|
|
688
|
+
!next
|
|
689
|
+
!val
|
|
690
|
+
!null_ptr
|
|
691
|
+
!done
|
|
692
|
+
!node
|
|
693
|
+
jmp L_CL_HEAD
|
|
694
|
+
L_CL_DONE:
|
|
695
|
+
!done
|
|
696
|
+
!null_ptr
|
|
697
|
+
!node
|
|
698
|
+
!list
|
|
699
|
+
return out
|
|
700
|
+
|
|
701
|
+
@sa_linked_list_eq(&left: ptr, &right: ptr) -> i32:
|
|
702
|
+
L_ENTRY:
|
|
703
|
+
llen = load left+LinkedList_len as u64
|
|
704
|
+
rlen = load right+LinkedList_len as u64
|
|
705
|
+
same_len = eq llen, rlen
|
|
706
|
+
br same_len -> L_EQ_SCAN, L_EQ_NO
|
|
707
|
+
L_EQ_NO:
|
|
708
|
+
!left
|
|
709
|
+
!right
|
|
710
|
+
!same_len
|
|
711
|
+
!rlen
|
|
712
|
+
!llen
|
|
713
|
+
return 0
|
|
714
|
+
L_EQ_SCAN:
|
|
715
|
+
ln_slot = stack_alloc 8
|
|
716
|
+
rn_slot = stack_alloc 8
|
|
717
|
+
lh = load left+LinkedList_head as ptr
|
|
718
|
+
rh = load right+LinkedList_head as ptr
|
|
719
|
+
store ln_slot+0, lh as ptr
|
|
720
|
+
store rn_slot+0, rh as ptr
|
|
721
|
+
!lh
|
|
722
|
+
!rh
|
|
723
|
+
!same_len
|
|
724
|
+
!rlen
|
|
725
|
+
!llen
|
|
726
|
+
jmp L_EQ_HEAD
|
|
727
|
+
L_EQ_HEAD:
|
|
728
|
+
ln = load ln_slot+0 as ptr
|
|
729
|
+
rn = load rn_slot+0 as ptr
|
|
730
|
+
null_ptr = 0 as ptr
|
|
731
|
+
done = eq ln, null_ptr
|
|
732
|
+
br done -> L_EQ_YES, L_EQ_BODY
|
|
733
|
+
L_EQ_BODY:
|
|
734
|
+
lv = load ln+LinkedListNode_value as u64
|
|
735
|
+
rv = load rn+LinkedListNode_value as u64
|
|
736
|
+
same = eq lv, rv
|
|
737
|
+
br same -> L_EQ_NEXT, L_EQ_NO2
|
|
738
|
+
L_EQ_NEXT:
|
|
739
|
+
lnext = load ln+LinkedListNode_next as ptr
|
|
740
|
+
rnext = load rn+LinkedListNode_next as ptr
|
|
741
|
+
store ln_slot+0, lnext as ptr
|
|
742
|
+
store rn_slot+0, rnext as ptr
|
|
743
|
+
!lnext
|
|
744
|
+
!rnext
|
|
745
|
+
!same
|
|
746
|
+
!lv
|
|
747
|
+
!rv
|
|
748
|
+
!null_ptr
|
|
749
|
+
!done
|
|
750
|
+
!ln
|
|
751
|
+
!rn
|
|
752
|
+
jmp L_EQ_HEAD
|
|
753
|
+
L_EQ_NO2:
|
|
754
|
+
!left
|
|
755
|
+
!right
|
|
756
|
+
!same
|
|
757
|
+
!lv
|
|
758
|
+
!rv
|
|
759
|
+
!null_ptr
|
|
760
|
+
!done
|
|
761
|
+
!ln
|
|
762
|
+
!rn
|
|
763
|
+
return 0
|
|
764
|
+
L_EQ_YES:
|
|
765
|
+
!left
|
|
766
|
+
!right
|
|
767
|
+
!null_ptr
|
|
768
|
+
!done
|
|
769
|
+
!ln
|
|
770
|
+
!rn
|
|
771
|
+
return 1
|
|
772
|
+
|
|
773
|
+
[MACRO] LINKED_LIST_NEW %out_list
|
|
774
|
+
%out_list = call @sa_linked_list_new()
|
|
775
|
+
[END_MACRO]
|
|
776
|
+
|
|
777
|
+
[MACRO] LINKED_LIST_DEFAULT %out_list
|
|
778
|
+
EXPAND LINKED_LIST_NEW %out_list
|
|
779
|
+
[END_MACRO]
|
|
780
|
+
|
|
781
|
+
[MACRO] LINKED_LIST_LEN %out_len, %list_reg
|
|
782
|
+
%out_len = load %list_reg+LinkedList_len as u64
|
|
783
|
+
[END_MACRO]
|
|
784
|
+
|
|
785
|
+
[MACRO] LINKED_LIST_IS_EMPTY %out_bool, %list_reg
|
|
786
|
+
__ll_len_%out_bool = load %list_reg+LinkedList_len as u64
|
|
787
|
+
%out_bool = eq __ll_len_%out_bool, 0
|
|
788
|
+
!__ll_len_%out_bool
|
|
789
|
+
[END_MACRO]
|
|
790
|
+
|
|
791
|
+
[MACRO] LINKED_LIST_CLEAR %list_reg
|
|
792
|
+
call @sa_linked_list_clear(&%list_reg)
|
|
793
|
+
[END_MACRO]
|
|
794
|
+
|
|
795
|
+
[MACRO] LINKED_LIST_FREE %list_reg
|
|
796
|
+
call @sa_linked_list_free(^%list_reg)
|
|
797
|
+
[END_MACRO]
|
|
798
|
+
|
|
799
|
+
[MACRO] LINKED_LIST_PUSH_FRONT %list_reg, %value
|
|
800
|
+
call @sa_linked_list_push_front(&%list_reg, %value)
|
|
801
|
+
[END_MACRO]
|
|
802
|
+
|
|
803
|
+
[MACRO] LINKED_LIST_PUSH_BACK %list_reg, %value
|
|
804
|
+
call @sa_linked_list_push_back(&%list_reg, %value)
|
|
805
|
+
[END_MACRO]
|
|
806
|
+
|
|
807
|
+
[MACRO] LINKED_LIST_TRY_POP_FRONT %out_ok, %out_value, %list_reg
|
|
808
|
+
__ll_popf_slot_%out_ok = stack_alloc 8
|
|
809
|
+
%out_ok = call @sa_linked_list_try_pop_front(&%list_reg, &__ll_popf_slot_%out_ok)
|
|
810
|
+
%out_value = load __ll_popf_slot_%out_ok+0 as u64
|
|
811
|
+
[END_MACRO]
|
|
812
|
+
|
|
813
|
+
[MACRO] LINKED_LIST_POP_FRONT %out_ok, %out_value, %list_reg
|
|
814
|
+
EXPAND LINKED_LIST_TRY_POP_FRONT %out_ok, %out_value, %list_reg
|
|
815
|
+
[END_MACRO]
|
|
816
|
+
|
|
817
|
+
[MACRO] LINKED_LIST_TRY_POP_BACK %out_ok, %out_value, %list_reg
|
|
818
|
+
__ll_popb_slot_%out_ok = stack_alloc 8
|
|
819
|
+
%out_ok = call @sa_linked_list_try_pop_back(&%list_reg, &__ll_popb_slot_%out_ok)
|
|
820
|
+
%out_value = load __ll_popb_slot_%out_ok+0 as u64
|
|
821
|
+
[END_MACRO]
|
|
822
|
+
|
|
823
|
+
[MACRO] LINKED_LIST_POP_BACK %out_ok, %out_value, %list_reg
|
|
824
|
+
EXPAND LINKED_LIST_TRY_POP_BACK %out_ok, %out_value, %list_reg
|
|
825
|
+
[END_MACRO]
|
|
826
|
+
|
|
827
|
+
[MACRO] LINKED_LIST_TRY_FRONT %out_ok, %out_value, %list_reg
|
|
828
|
+
__ll_front_slot_%out_ok = stack_alloc 8
|
|
829
|
+
%out_ok = call @sa_linked_list_try_front(&%list_reg, &__ll_front_slot_%out_ok)
|
|
830
|
+
%out_value = load __ll_front_slot_%out_ok+0 as u64
|
|
831
|
+
[END_MACRO]
|
|
832
|
+
|
|
833
|
+
[MACRO] LINKED_LIST_FRONT %out_ok, %out_value, %list_reg
|
|
834
|
+
EXPAND LINKED_LIST_TRY_FRONT %out_ok, %out_value, %list_reg
|
|
835
|
+
[END_MACRO]
|
|
836
|
+
|
|
837
|
+
[MACRO] LINKED_LIST_TRY_BACK %out_ok, %out_value, %list_reg
|
|
838
|
+
__ll_back_slot_%out_ok = stack_alloc 8
|
|
839
|
+
%out_ok = call @sa_linked_list_try_back(&%list_reg, &__ll_back_slot_%out_ok)
|
|
840
|
+
%out_value = load __ll_back_slot_%out_ok+0 as u64
|
|
841
|
+
[END_MACRO]
|
|
842
|
+
|
|
843
|
+
[MACRO] LINKED_LIST_BACK %out_ok, %out_value, %list_reg
|
|
844
|
+
EXPAND LINKED_LIST_TRY_BACK %out_ok, %out_value, %list_reg
|
|
845
|
+
[END_MACRO]
|
|
846
|
+
|
|
847
|
+
[MACRO] LINKED_LIST_CONTAINS_U64 %out_bool, %list_reg, %needle
|
|
848
|
+
%out_bool = call @sa_linked_list_contains(&%list_reg, %needle)
|
|
849
|
+
[END_MACRO]
|
|
850
|
+
|
|
851
|
+
[MACRO] LINKED_LIST_CONTAINS %out_bool, %list_reg, %needle
|
|
852
|
+
EXPAND LINKED_LIST_CONTAINS_U64 %out_bool, %list_reg, %needle
|
|
853
|
+
[END_MACRO]
|
|
854
|
+
|
|
855
|
+
[MACRO] LINKED_LIST_APPEND %list_reg, %other_list
|
|
856
|
+
call @sa_linked_list_append(&%list_reg, &%other_list)
|
|
857
|
+
[END_MACRO]
|
|
858
|
+
|
|
859
|
+
[MACRO] LINKED_LIST_TRY_REMOVE %out_ok, %out_value, %list_reg, %index
|
|
860
|
+
__ll_rem_slot_%out_ok = stack_alloc 8
|
|
861
|
+
%out_ok = call @sa_linked_list_try_remove(&%list_reg, %index, &__ll_rem_slot_%out_ok)
|
|
862
|
+
%out_value = load __ll_rem_slot_%out_ok+0 as u64
|
|
863
|
+
[END_MACRO]
|
|
864
|
+
|
|
865
|
+
[MACRO] LINKED_LIST_REMOVE %out_ok, %out_value, %list_reg, %index
|
|
866
|
+
EXPAND LINKED_LIST_TRY_REMOVE %out_ok, %out_value, %list_reg, %index
|
|
867
|
+
[END_MACRO]
|
|
868
|
+
|
|
869
|
+
[MACRO] LINKED_LIST_SPLIT_OFF %out_list, %list_reg, %at
|
|
870
|
+
%out_list = call @sa_linked_list_split_off(&%list_reg, %at)
|
|
871
|
+
[END_MACRO]
|
|
872
|
+
|
|
873
|
+
[MACRO] LINKED_LIST_TO_VEC %out_vec, %list_reg
|
|
874
|
+
%out_vec = call @sa_linked_list_to_vec(&%list_reg)
|
|
875
|
+
[END_MACRO]
|
|
876
|
+
|
|
877
|
+
[MACRO] LINKED_LIST_FROM_SLICE %out_list, %slice_reg
|
|
878
|
+
%out_list = call @sa_linked_list_from_slice(&%slice_reg)
|
|
879
|
+
[END_MACRO]
|
|
880
|
+
|
|
881
|
+
[MACRO] LINKED_LIST_FROM_VEC %out_list, %vec_reg
|
|
882
|
+
EXPAND VEC_AS_SLICE __ll_fv_slice_%out_list, %vec_reg
|
|
883
|
+
EXPAND LINKED_LIST_FROM_SLICE %out_list, __ll_fv_slice_%out_list
|
|
884
|
+
!__ll_fv_slice_%out_list
|
|
885
|
+
[END_MACRO]
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
[MACRO] LINKED_LIST_RETAIN %out_len, %list_reg, %pred_fn
|
|
889
|
+
EXPAND LINKED_LIST_NEW __ll_ret_keep_%out_len
|
|
890
|
+
jmp L_LL_RET_HEAD_%out_len
|
|
891
|
+
L_LL_RET_HEAD_%out_len:
|
|
892
|
+
EXPAND LINKED_LIST_TRY_POP_FRONT __ll_ret_ok_%out_len, __ll_ret_val_%out_len, %list_reg
|
|
893
|
+
br __ll_ret_ok_%out_len -> L_LL_RET_BODY_%out_len, L_LL_RET_DONE_%out_len
|
|
894
|
+
L_LL_RET_BODY_%out_len:
|
|
895
|
+
__ll_ret_keep_flag_%out_len = call %pred_fn(__ll_ret_val_%out_len)
|
|
896
|
+
__ll_ret_keep_it_%out_len = ne __ll_ret_keep_flag_%out_len, 0
|
|
897
|
+
br __ll_ret_keep_it_%out_len -> L_LL_RET_KEEP_%out_len, L_LL_RET_DROP_%out_len
|
|
898
|
+
L_LL_RET_KEEP_%out_len:
|
|
899
|
+
EXPAND LINKED_LIST_PUSH_BACK __ll_ret_keep_%out_len, __ll_ret_val_%out_len
|
|
900
|
+
jmp L_LL_RET_NEXT_%out_len
|
|
901
|
+
L_LL_RET_DROP_%out_len:
|
|
902
|
+
jmp L_LL_RET_NEXT_%out_len
|
|
903
|
+
L_LL_RET_NEXT_%out_len:
|
|
904
|
+
!__ll_ret_keep_it_%out_len
|
|
905
|
+
!__ll_ret_keep_flag_%out_len
|
|
906
|
+
!__ll_ret_val_%out_len
|
|
907
|
+
!__ll_ret_ok_%out_len
|
|
908
|
+
jmp L_LL_RET_HEAD_%out_len
|
|
909
|
+
L_LL_RET_DONE_%out_len:
|
|
910
|
+
EXPAND LINKED_LIST_APPEND %list_reg, __ll_ret_keep_%out_len
|
|
911
|
+
EXPAND LINKED_LIST_LEN %out_len, %list_reg
|
|
912
|
+
!__ll_ret_val_%out_len
|
|
913
|
+
!__ll_ret_ok_%out_len
|
|
914
|
+
!__ll_ret_keep_%out_len
|
|
915
|
+
[END_MACRO]
|
|
916
|
+
|
|
917
|
+
[MACRO] LINKED_LIST_TRY_GET %out_ok, %out_value, %list_reg, %index
|
|
918
|
+
__ll_get_slot_%out_ok = stack_alloc 8
|
|
919
|
+
%out_ok = call @sa_linked_list_try_get(&%list_reg, %index, &__ll_get_slot_%out_ok)
|
|
920
|
+
%out_value = load __ll_get_slot_%out_ok+0 as u64
|
|
921
|
+
[END_MACRO]
|
|
922
|
+
|
|
923
|
+
[MACRO] LINKED_LIST_GET %out_ok, %out_value, %list_reg, %index
|
|
924
|
+
EXPAND LINKED_LIST_TRY_GET %out_ok, %out_value, %list_reg, %index
|
|
925
|
+
[END_MACRO]
|
|
926
|
+
|
|
927
|
+
[MACRO] LINKED_LIST_TRY_SET %out_ok, %list_reg, %index, %value
|
|
928
|
+
%out_ok = call @sa_linked_list_try_set(&%list_reg, %index, %value)
|
|
929
|
+
[END_MACRO]
|
|
930
|
+
|
|
931
|
+
[MACRO] LINKED_LIST_SET %out_ok, %list_reg, %index, %value
|
|
932
|
+
EXPAND LINKED_LIST_TRY_SET %out_ok, %list_reg, %index, %value
|
|
933
|
+
[END_MACRO]
|
|
934
|
+
|
|
935
|
+
[MACRO] LINKED_LIST_REVERSE %list_reg
|
|
936
|
+
call @sa_linked_list_reverse(&%list_reg)
|
|
937
|
+
[END_MACRO]
|
|
938
|
+
|
|
939
|
+
[MACRO] LINKED_LIST_DRAIN %out_vec, %list_reg
|
|
940
|
+
EXPAND LINKED_LIST_TO_VEC %out_vec, %list_reg
|
|
941
|
+
EXPAND LINKED_LIST_CLEAR %list_reg
|
|
942
|
+
[END_MACRO]
|
|
943
|
+
|
|
944
|
+
[MACRO] LINKED_LIST_POP_FRONT_IF %out_ok, %out_value, %list_reg, %pred_fn
|
|
945
|
+
EXPAND LINKED_LIST_TRY_FRONT __ll_pfi_fok_%out_ok, __ll_pfi_fval_%out_ok, %list_reg
|
|
946
|
+
br __ll_pfi_fok_%out_ok -> L_LL_PFI_CHECK_%out_ok, L_LL_PFI_EMPTY_%out_ok
|
|
947
|
+
L_LL_PFI_CHECK_%out_ok:
|
|
948
|
+
__ll_pfi_pred_%out_ok = call %pred_fn(__ll_pfi_fval_%out_ok)
|
|
949
|
+
__ll_pfi_take_%out_ok = ne __ll_pfi_pred_%out_ok, 0
|
|
950
|
+
br __ll_pfi_take_%out_ok -> L_LL_PFI_TAKE_%out_ok, L_LL_PFI_KEEP_%out_ok
|
|
951
|
+
L_LL_PFI_TAKE_%out_ok:
|
|
952
|
+
EXPAND LINKED_LIST_TRY_POP_FRONT %out_ok, %out_value, %list_reg
|
|
953
|
+
!__ll_pfi_take_%out_ok
|
|
954
|
+
!__ll_pfi_pred_%out_ok
|
|
955
|
+
!__ll_pfi_fval_%out_ok
|
|
956
|
+
!__ll_pfi_fok_%out_ok
|
|
957
|
+
jmp L_LL_PFI_END_%out_ok
|
|
958
|
+
L_LL_PFI_KEEP_%out_ok:
|
|
959
|
+
%out_ok = 0
|
|
960
|
+
%out_value = 0
|
|
961
|
+
!__ll_pfi_take_%out_ok
|
|
962
|
+
!__ll_pfi_pred_%out_ok
|
|
963
|
+
!__ll_pfi_fval_%out_ok
|
|
964
|
+
!__ll_pfi_fok_%out_ok
|
|
965
|
+
jmp L_LL_PFI_END_%out_ok
|
|
966
|
+
L_LL_PFI_EMPTY_%out_ok:
|
|
967
|
+
%out_ok = 0
|
|
968
|
+
%out_value = 0
|
|
969
|
+
!__ll_pfi_fval_%out_ok
|
|
970
|
+
!__ll_pfi_fok_%out_ok
|
|
971
|
+
L_LL_PFI_END_%out_ok:
|
|
972
|
+
[END_MACRO]
|
|
973
|
+
|
|
974
|
+
[MACRO] LINKED_LIST_POP_BACK_IF %out_ok, %out_value, %list_reg, %pred_fn
|
|
975
|
+
EXPAND LINKED_LIST_TRY_BACK __ll_pbi_bok_%out_ok, __ll_pbi_bval_%out_ok, %list_reg
|
|
976
|
+
br __ll_pbi_bok_%out_ok -> L_LL_PBI_CHECK_%out_ok, L_LL_PBI_EMPTY_%out_ok
|
|
977
|
+
L_LL_PBI_CHECK_%out_ok:
|
|
978
|
+
__ll_pbi_pred_%out_ok = call %pred_fn(__ll_pbi_bval_%out_ok)
|
|
979
|
+
__ll_pbi_take_%out_ok = ne __ll_pbi_pred_%out_ok, 0
|
|
980
|
+
br __ll_pbi_take_%out_ok -> L_LL_PBI_TAKE_%out_ok, L_LL_PBI_KEEP_%out_ok
|
|
981
|
+
L_LL_PBI_TAKE_%out_ok:
|
|
982
|
+
EXPAND LINKED_LIST_TRY_POP_BACK %out_ok, %out_value, %list_reg
|
|
983
|
+
!__ll_pbi_take_%out_ok
|
|
984
|
+
!__ll_pbi_pred_%out_ok
|
|
985
|
+
!__ll_pbi_bval_%out_ok
|
|
986
|
+
!__ll_pbi_bok_%out_ok
|
|
987
|
+
jmp L_LL_PBI_END_%out_ok
|
|
988
|
+
L_LL_PBI_KEEP_%out_ok:
|
|
989
|
+
%out_ok = 0
|
|
990
|
+
%out_value = 0
|
|
991
|
+
!__ll_pbi_take_%out_ok
|
|
992
|
+
!__ll_pbi_pred_%out_ok
|
|
993
|
+
!__ll_pbi_bval_%out_ok
|
|
994
|
+
!__ll_pbi_bok_%out_ok
|
|
995
|
+
jmp L_LL_PBI_END_%out_ok
|
|
996
|
+
L_LL_PBI_EMPTY_%out_ok:
|
|
997
|
+
%out_ok = 0
|
|
998
|
+
%out_value = 0
|
|
999
|
+
!__ll_pbi_bval_%out_ok
|
|
1000
|
+
!__ll_pbi_bok_%out_ok
|
|
1001
|
+
L_LL_PBI_END_%out_ok:
|
|
1002
|
+
[END_MACRO]
|
|
1003
|
+
|
|
1004
|
+
// Cursor-style raw node pointers (not Rust Cursor safety).
|
|
1005
|
+
[MACRO] LINKED_LIST_CURSOR_FRONT %out_ok, %out_node, %list_reg
|
|
1006
|
+
%out_node = load %list_reg+LinkedList_head as ptr
|
|
1007
|
+
__ll_cf_null_%out_ok = 0 as ptr
|
|
1008
|
+
%out_ok = ne %out_node, __ll_cf_null_%out_ok
|
|
1009
|
+
!__ll_cf_null_%out_ok
|
|
1010
|
+
[END_MACRO]
|
|
1011
|
+
|
|
1012
|
+
[MACRO] LINKED_LIST_CURSOR_BACK %out_ok, %out_node, %list_reg
|
|
1013
|
+
%out_node = load %list_reg+LinkedList_tail as ptr
|
|
1014
|
+
__ll_cb_null_%out_ok = 0 as ptr
|
|
1015
|
+
%out_ok = ne %out_node, __ll_cb_null_%out_ok
|
|
1016
|
+
!__ll_cb_null_%out_ok
|
|
1017
|
+
[END_MACRO]
|
|
1018
|
+
|
|
1019
|
+
[MACRO] LINKED_LIST_CURSOR_NEXT %out_ok, %out_node, %node_reg
|
|
1020
|
+
%out_node = load %node_reg+LinkedListNode_next as ptr
|
|
1021
|
+
__ll_cn_null_%out_ok = 0 as ptr
|
|
1022
|
+
%out_ok = ne %out_node, __ll_cn_null_%out_ok
|
|
1023
|
+
!__ll_cn_null_%out_ok
|
|
1024
|
+
[END_MACRO]
|
|
1025
|
+
|
|
1026
|
+
[MACRO] LINKED_LIST_CURSOR_PREV %out_ok, %out_node, %node_reg
|
|
1027
|
+
%out_node = load %node_reg+LinkedListNode_prev as ptr
|
|
1028
|
+
__ll_cp_null_%out_ok = 0 as ptr
|
|
1029
|
+
%out_ok = ne %out_node, __ll_cp_null_%out_ok
|
|
1030
|
+
!__ll_cp_null_%out_ok
|
|
1031
|
+
[END_MACRO]
|
|
1032
|
+
|
|
1033
|
+
[MACRO] LINKED_LIST_CURSOR_VALUE %out_value, %node_reg
|
|
1034
|
+
%out_value = load %node_reg+LinkedListNode_value as u64
|
|
1035
|
+
[END_MACRO]
|
|
1036
|
+
|
|
1037
|
+
[MACRO] LINKED_LIST_CURSOR_SET_VALUE %node_reg, %value
|
|
1038
|
+
store %node_reg+LinkedListNode_value, %value as u64
|
|
1039
|
+
[END_MACRO]
|
|
1040
|
+
|
|
1041
|
+
[MACRO] LINKED_LIST_EXTRACT_IF %out_len, %out_list, %list_reg, %pred_fn
|
|
1042
|
+
EXPAND LINKED_LIST_NEW %out_list
|
|
1043
|
+
EXPAND LINKED_LIST_NEW __ll_ei_keep_%out_len
|
|
1044
|
+
jmp L_LL_EI_HEAD_%out_len
|
|
1045
|
+
L_LL_EI_HEAD_%out_len:
|
|
1046
|
+
EXPAND LINKED_LIST_TRY_POP_FRONT __ll_ei_ok_%out_len, __ll_ei_val_%out_len, %list_reg
|
|
1047
|
+
br __ll_ei_ok_%out_len -> L_LL_EI_BODY_%out_len, L_LL_EI_DONE_%out_len
|
|
1048
|
+
L_LL_EI_BODY_%out_len:
|
|
1049
|
+
__ll_ei_pred_%out_len = call %pred_fn(__ll_ei_val_%out_len)
|
|
1050
|
+
__ll_ei_take_%out_len = ne __ll_ei_pred_%out_len, 0
|
|
1051
|
+
br __ll_ei_take_%out_len -> L_LL_EI_TAKE_%out_len, L_LL_EI_KEEP_%out_len
|
|
1052
|
+
L_LL_EI_TAKE_%out_len:
|
|
1053
|
+
EXPAND LINKED_LIST_PUSH_BACK %out_list, __ll_ei_val_%out_len
|
|
1054
|
+
jmp L_LL_EI_NEXT_%out_len
|
|
1055
|
+
L_LL_EI_KEEP_%out_len:
|
|
1056
|
+
EXPAND LINKED_LIST_PUSH_BACK __ll_ei_keep_%out_len, __ll_ei_val_%out_len
|
|
1057
|
+
jmp L_LL_EI_NEXT_%out_len
|
|
1058
|
+
L_LL_EI_NEXT_%out_len:
|
|
1059
|
+
!__ll_ei_take_%out_len
|
|
1060
|
+
!__ll_ei_pred_%out_len
|
|
1061
|
+
!__ll_ei_val_%out_len
|
|
1062
|
+
!__ll_ei_ok_%out_len
|
|
1063
|
+
jmp L_LL_EI_HEAD_%out_len
|
|
1064
|
+
L_LL_EI_DONE_%out_len:
|
|
1065
|
+
EXPAND LINKED_LIST_APPEND %list_reg, __ll_ei_keep_%out_len
|
|
1066
|
+
EXPAND LINKED_LIST_LEN %out_len, %out_list
|
|
1067
|
+
!__ll_ei_val_%out_len
|
|
1068
|
+
!__ll_ei_ok_%out_len
|
|
1069
|
+
!__ll_ei_keep_%out_len
|
|
1070
|
+
[END_MACRO]
|
|
1071
|
+
|
|
1072
|
+
[MACRO] LINKED_LIST_FROM_ARRAY %out_list, %array_ptr, %length
|
|
1073
|
+
EXPAND LINKED_LIST_NEW %out_list
|
|
1074
|
+
__ll_fa_i_slot_%out_list = stack_alloc 8
|
|
1075
|
+
store __ll_fa_i_slot_%out_list+0, 0 as u64
|
|
1076
|
+
jmp L_LL_FA_HEAD_%out_list
|
|
1077
|
+
L_LL_FA_HEAD_%out_list:
|
|
1078
|
+
__ll_fa_i_%out_list = load __ll_fa_i_slot_%out_list+0 as u64
|
|
1079
|
+
__ll_fa_done_%out_list = eq __ll_fa_i_%out_list, %length
|
|
1080
|
+
br __ll_fa_done_%out_list -> L_LL_FA_DONE_%out_list, L_LL_FA_BODY_%out_list
|
|
1081
|
+
L_LL_FA_BODY_%out_list:
|
|
1082
|
+
__ll_fa_off_%out_list = mul __ll_fa_i_%out_list, 8
|
|
1083
|
+
__ll_fa_ptr_%out_list = ptr_add %array_ptr, __ll_fa_off_%out_list
|
|
1084
|
+
__ll_fa_val_%out_list = load __ll_fa_ptr_%out_list+0 as u64
|
|
1085
|
+
EXPAND LINKED_LIST_PUSH_BACK %out_list, __ll_fa_val_%out_list
|
|
1086
|
+
__ll_fa_ni_%out_list = add __ll_fa_i_%out_list, 1
|
|
1087
|
+
store __ll_fa_i_slot_%out_list+0, __ll_fa_ni_%out_list as u64
|
|
1088
|
+
!__ll_fa_ni_%out_list
|
|
1089
|
+
!__ll_fa_val_%out_list
|
|
1090
|
+
!__ll_fa_ptr_%out_list
|
|
1091
|
+
!__ll_fa_off_%out_list
|
|
1092
|
+
!__ll_fa_done_%out_list
|
|
1093
|
+
!__ll_fa_i_%out_list
|
|
1094
|
+
jmp L_LL_FA_HEAD_%out_list
|
|
1095
|
+
L_LL_FA_DONE_%out_list:
|
|
1096
|
+
!__ll_fa_done_%out_list
|
|
1097
|
+
!__ll_fa_i_%out_list
|
|
1098
|
+
[END_MACRO]
|
|
1099
|
+
|
|
1100
|
+
[MACRO] LINKED_LIST_INSERT_AFTER %list_reg, %node_reg, %value
|
|
1101
|
+
call @sa_linked_list_insert_after(&%list_reg, %node_reg, %value)
|
|
1102
|
+
[END_MACRO]
|
|
1103
|
+
|
|
1104
|
+
[MACRO] LINKED_LIST_INSERT_BEFORE %list_reg, %node_reg, %value
|
|
1105
|
+
call @sa_linked_list_insert_before(&%list_reg, %node_reg, %value)
|
|
1106
|
+
[END_MACRO]
|
|
1107
|
+
|
|
1108
|
+
[MACRO] LINKED_LIST_CLONE %out_list, %list_reg
|
|
1109
|
+
%out_list = call @sa_linked_list_clone(&%list_reg)
|
|
1110
|
+
[END_MACRO]
|
|
1111
|
+
|
|
1112
|
+
[MACRO] LINKED_LIST_EQ %out_bool, %left_list, %right_list
|
|
1113
|
+
%out_bool = call @sa_linked_list_eq(&%left_list, &%right_list)
|
|
1114
|
+
[END_MACRO]
|
|
1115
|
+
|
|
1116
|
+
[MACRO] LINKED_LIST_NE %out_bool, %left_list, %right_list
|
|
1117
|
+
__ll_ne_eq_%out_bool = call @sa_linked_list_eq(&%left_list, &%right_list)
|
|
1118
|
+
%out_bool = eq __ll_ne_eq_%out_bool, 0
|
|
1119
|
+
!__ll_ne_eq_%out_bool
|
|
1120
|
+
[END_MACRO]
|