-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlibcf.asm
271 lines (242 loc) · 4.16 KB
/
libcf.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
default rel
bits 64
%macro copy 3
; rcx = size , rsi = srcptr , rdi = destptr
; change this to some kind of simd copy in the future
; masking makes doing this easy in parallel
mov rcx, %3
xor rbx, rbx
%%loop: mov rax, [%1+rbx*8]
mov [%2+rbx*8], rax
inc rbx
dec rcx
jnz %%loop
%endmacro
%macro primframe 1
mov qword [framearray+frameindex], 1
lea rax, [%1]
mov qword [framearray+frameindex+8], rax
%endmacro
%macro popframe 2
mov %1, [rbp]
shl %1, 1
sar %1, 1
add %1, framearray
sub rbp, 8
mov %2, [%1]
add %1, 8
%endmacro
%macro pushcont 1
lea rax, [%1]
push rax
%endmacro
%macro prepnum 1
shl %1, 2
sar %1, 2
%endmacro
%define hasharr r15
%define framearray r14
; it's worth noting that r13 has addressing limitations, making index the best fit.
%define frameindex r13 ; we might also just call this frameoff and ignore scaling
%define dwframeindex r13d ; we might also just call this frameoff and ignore scaling
%define phi64 11400714819323198485
%define framesize 0x80
%define allocframe add frameindex, framesize
%macro qtag 2
mov %2, 1<<63
or %1, %2
%endmacro
%macro pushquot 3
primframe %1
mov %2, frameindex
qtag %2, %3
allocframe
%endmacro
%macro seqhash 2
mov rcx, %2
xor rbx, rbx
; mov eax, $2
%%loop: mov rdx, phi64
imul rdx, [%1+rbx*8]
; crc32 rax, rdx
xor rax, rdx
shl rax, 2
inc rbx
dec rcx
jnz %%loop
%endmacro
%macro copyshift 3
mov %1, %2
shr %1, %3
%endmacro
%macro hashsrch 2
copyshift ebx, e%1, 0x13 ; log2(32+qword[3]-page[10]*cnt[6])
jmp %%start
%%loop: add ebx, 8
and ebx, 0x7ffff
%%start:mov rdx, [hasharr+rbx]
test edx, edx
setz %2
cmp edx, e%1
setz cl
or cl, %2
test cl, 1
jz %%loop
shr rdx, 32
; rbx has index or rdx has frame index
%endmacro
section .text
global init
global load
; we can't quote numbers atm
init: push framearray
push frameindex
mov framearray, rdi
mov frameindex, 0
allocframe
pushquot dup, rdx, rcx
pushquot swap, rdx, rcx
pushquot pop, rdx, rcx
pushquot quote, rdx, rcx
pushquot cat, rdx, rcx
pushquot app, rdx, rcx
pushquot add, rdx, rcx
allocframe
mov rax, frameindex
pop frameindex
pop framearray
ret
load: push rbx
push framearray
push frameindex
push hasharr
push r12
push rbp
mov framearray, [rdx]
mov frameindex, [rdx+8]
mov hasharr, [rdx+16]
mov rbp, [rdx+24]
push rdx
pushcont .end
cmp rsi, 0
jz .end
lea rsi, [rsi*8]
sub rsp, rsi
add rsi, rdi
mov r10, rsp
.loop: mov rax, [rdi]
mov [r10], rax
add rdi, 8
add r10, 8
cmp rsi, rdi
jne .loop
jmp decode
.end: mov rax, rbp
pop rdx
mov [rdx+8], frameindex
pop rbp
pop r12
pop hasharr
pop frameindex
pop framearray
pop rbx
ret
add: mov rax, [rbp]
prepnum rax
sub rbp, 8
mov rbx, [rbp]
prepnum rbx
add rax, rbx
mov [rbp], rax
jmp decode
quote:
popframe r12, r11
mov r11, 1
xor rax, rax
seqhash r12, r11
shr rax, 32
hashsrch ax, r10b
add rbp, 8
cmp r10b, 1
je .comp
mov rbx, 1<<63
or rdx, rbx
mov [rbp], rdx
jmp decode
.comp: allocframe
mov rdx, frameindex
shl rdx, 32
or rdx, rax
mov [hasharr+rbx], rdx
mov rax, 1<<63
mov rdx, frameindex
or rdx, rax
mov [rbp], rdx
lea rdx, [framearray+frameindex]
mov qword [rdx], 1
add rdx, 8
mov rax, [r12]
mov [rdx], rax
jmp decode
cat: popframe r12, r11
popframe r8, r9
xor rax, rax
seqhash r8, r9
seqhash r12, r11
shr rax, 32
hashsrch ax, r10b ; rcx = bool , rdx =
cmp r10b, 1
je .comp
add rbp, 8
mov rbx, 1<<63
or rdx, rbx
mov [rbp], rdx
jmp decode
.comp:
allocframe
add rbp, 8
mov rdx, frameindex
shl rdx, 32
or rdx, rax
mov [hasharr+rbx], rdx
mov rax, 1<<63
mov rdx, frameindex
or rdx, rax
mov [rbp], rdx
lea rcx, [r9+r11]
lea rdx, [framearray+frameindex]
mov [rdx], rcx
add rdx, 8
copy r8, rdx, r9
lea rdi, [rdx+r9*8]
copy r12, rdi, r11
jmp decode
app:
popframe rsi, rcx
lea rax, [rcx*8]
sub rsp, rax
mov rdi, rsp
copy rsi, rdi, rcx
jmp decode
dcdlup: pop rax
mov rbx, rax
shl rax, 1
sar rax, 1
; checking second bit of tag
cmp rax, 0
cmovns rax, rbx
add rbp, 8
mov [rbp], rax
decode: cmp qword [rsp], 0
js dcdlup
ret
dup: mov rax, [rbp]
add rbp, 8
mov qword [rbp], rax
jmp decode
swap: mov rax, qword [rbp-8]
xchg rax, qword [rbp]
mov qword [rbp-8], rax
jmp decode
pop: sub rbp, 8
jmp decode