1
2
3
18
19 package decoder
20
21 import (
22 `encoding/json`
23 `fmt`
24 `reflect`
25
26 `github.com/bytedance/sonic/internal/jit`
27 `github.com/bytedance/sonic/internal/native`
28 `github.com/bytedance/sonic/internal/native/types`
29 `github.com/twitchyliquid64/golang-asm/obj`
30 )
31
32
42
43 const (
44 _VD_args = 8
45 _VD_fargs = 64
46 _VD_saves = 40
47 _VD_locals = 88
48 )
49
50 const (
51 _VD_offs = _VD_fargs + _VD_saves + _VD_locals
52 _VD_size = _VD_offs + 8
53 )
54
55 var (
56 _VAR_ss = _VAR_ss_Vt
57 _VAR_df = jit.Ptr(_SP, _VD_fargs + _VD_saves)
58 )
59
60 var (
61 _VAR_ss_Vt = jit.Ptr(_SP, _VD_fargs + _VD_saves + 8)
62 _VAR_ss_Dv = jit.Ptr(_SP, _VD_fargs + _VD_saves + 16)
63 _VAR_ss_Iv = jit.Ptr(_SP, _VD_fargs + _VD_saves + 24)
64 _VAR_ss_Ep = jit.Ptr(_SP, _VD_fargs + _VD_saves + 32)
65 _VAR_ss_Db = jit.Ptr(_SP, _VD_fargs + _VD_saves + 40)
66 _VAR_ss_Dc = jit.Ptr(_SP, _VD_fargs + _VD_saves + 48)
67 )
68
69 var (
70 _VAR_cs_LR = jit.Ptr(_SP, _VD_fargs + _VD_saves + 56)
71 _VAR_cs_p = jit.Ptr(_SP, _VD_fargs + _VD_saves + 64)
72 _VAR_cs_n = jit.Ptr(_SP, _VD_fargs + _VD_saves + 72)
73 _VAR_cs_d = jit.Ptr(_SP, _VD_fargs + _VD_saves + 80)
74 )
75
76 type _ValueDecoder struct {
77 jit.BaseAssembler
78 }
79
80 func (self *_ValueDecoder) build() uintptr {
81 self.Init(self.compile)
82 return *(*uintptr)(self.Load("decode_value", _VD_size, _VD_args, argPtrs_generic, localPtrs_generic))
83 }
84
85
86
87 func (self *_ValueDecoder) save(r ...obj.Addr) {
88 for i, v := range r {
89 if i > _VD_saves / 8 - 1 {
90 panic("too many registers to save")
91 } else {
92 self.Emit("MOVQ", v, jit.Ptr(_SP, _VD_fargs + int64(i) * 8))
93 }
94 }
95 }
96
97 func (self *_ValueDecoder) load(r ...obj.Addr) {
98 for i, v := range r {
99 if i > _VD_saves / 8 - 1 {
100 panic("too many registers to load")
101 } else {
102 self.Emit("MOVQ", jit.Ptr(_SP, _VD_fargs + int64(i) * 8), v)
103 }
104 }
105 }
106
107 func (self *_ValueDecoder) call(fn obj.Addr) {
108 self.Emit("MOVQ", fn, _AX)
109 self.Rjmp("CALL", _AX)
110 }
111
112 func (self *_ValueDecoder) call_go(fn obj.Addr) {
113 self.save(_REG_go...)
114 self.call(fn)
115 self.load(_REG_go...)
116 }
117
118
119
120 const (
121 _S_val = iota + 1
122 _S_arr
123 _S_arr_0
124 _S_obj
125 _S_obj_0
126 _S_obj_delim
127 _S_obj_sep
128 )
129
130 const (
131 _S_omask_key = (1 << _S_obj_0) | (1 << _S_obj_sep)
132 _S_omask_end = (1 << _S_obj_0) | (1 << _S_obj)
133 _S_vmask = (1 << _S_val) | (1 << _S_arr_0)
134 )
135
136 const (
137 _A_init_len = 1
138 _A_init_cap = 16
139 )
140
141 const (
142 _ST_Sp = 0
143 _ST_Vt = _PtrBytes
144 _ST_Vp = _PtrBytes * (types.MAX_RECURSE + 1)
145 )
146
147 var (
148 _V_true = jit.Imm(int64(pbool(true)))
149 _V_false = jit.Imm(int64(pbool(false)))
150 _F_value = jit.Imm(int64(native.S_value))
151 )
152
153 var (
154 _V_max = jit.Imm(int64(types.V_MAX))
155 _E_eof = jit.Imm(int64(types.ERR_EOF))
156 _E_invalid = jit.Imm(int64(types.ERR_INVALID_CHAR))
157 _E_recurse = jit.Imm(int64(types.ERR_RECURSE_EXCEED_MAX))
158 )
159
160 var (
161 _F_convTslice = jit.Func(convTslice)
162 _F_convTstring = jit.Func(convTstring)
163 _F_invalid_vtype = jit.Func(invalid_vtype)
164 )
165
166 var (
167 _T_map = jit.Type(reflect.TypeOf((map[string]interface{})(nil)))
168 _T_bool = jit.Type(reflect.TypeOf(false))
169 _T_int64 = jit.Type(reflect.TypeOf(int64(0)))
170 _T_eface = jit.Type(reflect.TypeOf((*interface{})(nil)).Elem())
171 _T_slice = jit.Type(reflect.TypeOf(([]interface{})(nil)))
172 _T_string = jit.Type(reflect.TypeOf(""))
173 _T_number = jit.Type(reflect.TypeOf(json.Number("")))
174 _T_float64 = jit.Type(reflect.TypeOf(float64(0)))
175 )
176
177 var _R_tab = map[int]string {
178 '[': "_decode_V_ARRAY",
179 '{': "_decode_V_OBJECT",
180 ':': "_decode_V_KEY_SEP",
181 ',': "_decode_V_ELEM_SEP",
182 ']': "_decode_V_ARRAY_END",
183 '}': "_decode_V_OBJECT_END",
184 }
185
186 func (self *_ValueDecoder) compile() {
187 self.Emit("SUBQ", jit.Imm(_VD_size), _SP)
188 self.Emit("MOVQ", _BP, jit.Ptr(_SP, _VD_offs))
189 self.Emit("LEAQ", jit.Ptr(_SP, _VD_offs), _BP)
190
191
192 self.Emit("XORL", _CX, _CX)
193 self.Emit("MOVQ", _DF, _VAR_df)
194
195 self.Emit("MOVQ", jit.Imm(_MaxDigitNums), _VAR_ss_Dc)
196 self.Emit("LEAQ", jit.Ptr(_ST, _DbufOffset), _AX)
197 self.Emit("MOVQ", _AX, _VAR_ss_Db)
198
199 self.Emit("ADDQ", jit.Imm(_FsmOffset), _ST)
200 self.Emit("MOVQ", _CX, jit.Ptr(_ST, _ST_Sp))
201 self.WriteRecNotAX(0, _VP, jit.Ptr(_ST, _ST_Vp), false)
202 self.Emit("MOVQ", jit.Imm(_S_val), jit.Ptr(_ST, _ST_Vt))
203 self.Sjmp("JMP" , "_next")
204
205
206 self.Link("_set_value")
207 self.Emit("MOVL" , jit.Imm(_S_vmask), _DX)
208 self.Emit("MOVQ" , jit.Ptr(_ST, _ST_Sp), _CX)
209 self.Emit("MOVQ" , jit.Sib(_ST, _CX, 8, _ST_Vt), _AX)
210 self.Emit("BTQ" , _AX, _DX)
211 self.Sjmp("JNC" , "_vtype_error")
212 self.Emit("XORL" , _SI, _SI)
213 self.Emit("SUBQ" , jit.Imm(1), jit.Ptr(_ST, _ST_Sp))
214 self.Emit("XCHGQ", jit.Sib(_ST, _CX, 8, _ST_Vp), _SI)
215 self.Emit("MOVQ" , _R8, jit.Ptr(_SI, 0))
216 self.WriteRecNotAX(1, _R9, jit.Ptr(_SI, 8), false)
217
218
219 self.Link("_next")
220 self.Emit("MOVQ" , jit.Ptr(_ST, _ST_Sp), _AX)
221 self.Emit("TESTQ", _AX, _AX)
222 self.Sjmp("JS" , "_return")
223
224
225 self.Emit("CMPQ" , _IC, _IL)
226 self.Sjmp("JAE" , "_decode_V_EOF")
227 self.Emit("MOVBQZX", jit.Sib(_IP, _IC, 1, 0), _AX)
228 self.Emit("MOVQ" , jit.Imm(_BM_space), _DX)
229 self.Emit("CMPQ" , _AX, jit.Imm(' '))
230 self.Sjmp("JA" , "_decode_fast")
231 self.Emit("BTQ" , _AX, _DX)
232 self.Sjmp("JNC" , "_decode_fast")
233 self.Emit("ADDQ" , jit.Imm(1), _IC)
234
235
236 for i := 0; i < 3; i++ {
237 self.Emit("CMPQ" , _IC, _IL)
238 self.Sjmp("JAE" , "_decode_V_EOF")
239 self.Emit("MOVBQZX", jit.Sib(_IP, _IC, 1, 0), _AX)
240 self.Emit("CMPQ" , _AX, jit.Imm(' '))
241 self.Sjmp("JA" , "_decode_fast")
242 self.Emit("BTQ" , _AX, _DX)
243 self.Sjmp("JNC" , "_decode_fast")
244 self.Emit("ADDQ" , jit.Imm(1), _IC)
245 }
246
247
248 self.Emit("CMPQ" , _IC, _IL)
249 self.Sjmp("JAE" , "_decode_V_EOF")
250 self.Emit("MOVBQZX", jit.Sib(_IP, _IC, 1, 0), _AX)
251
252
253 self.Link("_decode_fast")
254 self.Byte(0x48, 0x8d, 0x3d)
255 self.Sref("_decode_tab", 4)
256 self.Emit("MOVLQSX", jit.Sib(_DI, _AX, 4, 0), _AX)
257 self.Emit("TESTQ" , _AX, _AX)
258 self.Sjmp("JZ" , "_decode_native")
259 self.Emit("ADDQ" , jit.Imm(1), _IC)
260 self.Emit("ADDQ" , _DI, _AX)
261 self.Rjmp("JMP" , _AX)
262
263
264 self.Link("_decode_native")
265 self.Emit("MOVQ", _IP, _DI)
266 self.Emit("MOVQ", _IL, _SI)
267 self.Emit("MOVQ", _IC, _DX)
268 self.Emit("LEAQ", _VAR_ss, _CX)
269 self.Emit("MOVQ", _VAR_df, _R8)
270 self.Emit("BTSQ", jit.Imm(_F_allow_control), _R8)
271 self.call(_F_value)
272 self.Emit("MOVQ", _AX, _IC)
273
274
275 self.Emit("MOVQ" , _VAR_ss_Vt, _AX)
276 self.Emit("TESTQ", _AX, _AX)
277 self.Sjmp("JS" , "_parsing_error")
278 self.Sjmp("JZ" , "_invalid_vtype")
279 self.Emit("CMPQ" , _AX, _V_max)
280 self.Sjmp("JA" , "_invalid_vtype")
281
282
283 self.Byte(0x48, 0x8d, 0x3d)
284 self.Sref("_switch_table", 4)
285 self.Emit("MOVLQSX", jit.Sib(_DI, _AX, 4, -4), _AX)
286 self.Emit("ADDQ" , _DI, _AX)
287 self.Rjmp("JMP" , _AX)
288
289
290 self.Link("_decode_V_EOF")
291 self.Emit("MOVL", _E_eof, _EP)
292 self.Sjmp("JMP" , "_error")
293
294
295 self.Link("_decode_V_NULL")
296 self.Emit("XORL", _R8, _R8)
297 self.Emit("XORL", _R9, _R9)
298 self.Emit("LEAQ", jit.Ptr(_IC, -4), _DI)
299 self.Sjmp("JMP" , "_set_value")
300
301
302 self.Link("_decode_V_TRUE")
303 self.Emit("MOVQ", _T_bool, _R8)
304
305 self.Emit("MOVQ", _V_true, _R9)
306 self.Emit("LEAQ", jit.Ptr(_IC, -4), _DI)
307 self.Sjmp("JMP" , "_set_value")
308
309
310 self.Link("_decode_V_FALSE")
311 self.Emit("MOVQ", _T_bool, _R8)
312 self.Emit("MOVQ", _V_false, _R9)
313 self.Emit("LEAQ", jit.Ptr(_IC, -5), _DI)
314 self.Sjmp("JMP" , "_set_value")
315
316
317 self.Link("_decode_V_ARRAY")
318 self.Emit("MOVL", jit.Imm(_S_vmask), _DX)
319 self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX)
320 self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vt), _AX)
321 self.Emit("BTQ" , _AX, _DX)
322 self.Sjmp("JNC" , "_invalid_char")
323
324
325 self.Emit("MOVQ", _T_eface, _AX)
326 self.Emit("MOVQ", _AX, jit.Ptr(_SP, 0))
327 self.Emit("MOVQ", jit.Imm(_A_init_len), jit.Ptr(_SP, 8))
328 self.Emit("MOVQ", jit.Imm(_A_init_cap), jit.Ptr(_SP, 16))
329 self.call_go(_F_makeslice)
330 self.Emit("MOVQ", jit.Ptr(_SP, 24), _DX)
331
332
333 self.Emit("MOVQ", _DX, jit.Ptr(_SP, 0))
334 self.Emit("MOVQ", jit.Imm(_A_init_len), jit.Ptr(_SP, 8))
335 self.Emit("MOVQ", jit.Imm(_A_init_cap), jit.Ptr(_SP, 16))
336 self.call_go(_F_convTslice)
337 self.Emit("MOVQ", jit.Ptr(_SP, 24), _R8)
338
339
340 self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX)
341 self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vp), _SI)
342 self.Emit("MOVQ", jit.Imm(_S_arr), jit.Sib(_ST, _CX, 8, _ST_Vt))
343 self.Emit("MOVQ", _T_slice, _AX)
344 self.Emit("MOVQ", _AX, jit.Ptr(_SI, 0))
345 self.WriteRecNotAX(2, _R8, jit.Ptr(_SI, 8), false)
346
347
348 self.Emit("ADDQ", jit.Imm(1), _CX)
349 self.Emit("CMPQ", _CX, jit.Imm(types.MAX_RECURSE))
350 self.Sjmp("JAE" , "_stack_overflow")
351 self.Emit("MOVQ", jit.Ptr(_R8, 0), _AX)
352 self.Emit("MOVQ", _CX, jit.Ptr(_ST, _ST_Sp))
353 self.WritePtrAX(3, jit.Sib(_ST, _CX, 8, _ST_Vp), false)
354 self.Emit("MOVQ", jit.Imm(_S_arr_0), jit.Sib(_ST, _CX, 8, _ST_Vt))
355 self.Sjmp("JMP" , "_next")
356
357
358 self.Link("_decode_V_OBJECT")
359 self.Emit("MOVL", jit.Imm(_S_vmask), _DX)
360 self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX)
361 self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vt), _AX)
362 self.Emit("BTQ" , _AX, _DX)
363 self.Sjmp("JNC" , "_invalid_char")
364 self.call_go(_F_makemap_small)
365 self.Emit("MOVQ", jit.Ptr(_SP, 0), _AX)
366 self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX)
367 self.Emit("MOVQ", jit.Imm(_S_obj_0), jit.Sib(_ST, _CX, 8, _ST_Vt))
368 self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vp), _SI)
369 self.Emit("MOVQ", _T_map, _DX)
370 self.Emit("MOVQ", _DX, jit.Ptr(_SI, 0))
371 self.WritePtrAX(4, jit.Ptr(_SI, 8), false)
372 self.Sjmp("JMP" , "_next")
373
374
375 self.Link("_decode_V_STRING")
376 self.Emit("MOVQ", _VAR_ss_Iv, _CX)
377 self.Emit("MOVQ", _IC, _AX)
378 self.Emit("SUBQ", _CX, _AX)
379
380
381 self.Emit("CMPQ", _VAR_ss_Ep, jit.Imm(-1))
382 self.Sjmp("JNE" , "_unquote")
383 self.Emit("SUBQ", jit.Imm(1), _AX)
384 self.Emit("LEAQ", jit.Sib(_IP, _CX, 1, 0), _R8)
385 self.Byte(0x48, 0x8d, 0x3d)
386 self.Sref("_copy_string_end", 4)
387 self.Emit("BTQ", jit.Imm(_F_copy_string), _VAR_df)
388 self.Sjmp("JC", "copy_string")
389 self.Link("_copy_string_end")
390 self.Emit("XORL", _DX, _DX)
391
392 self.Link("_noescape")
393 self.Emit("MOVL", jit.Imm(_S_omask_key), _DI)
394 self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX)
395 self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vt), _SI)
396 self.Emit("BTQ" , _SI, _DI)
397 self.Sjmp("JC" , "_object_key")
398
399
400 self.Emit("TESTQ", _DX, _DX)
401 self.Sjmp("JNZ" , "_packed_str")
402 self.Emit("MOVQ" , _R8, jit.Ptr(_SP, 0))
403 self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 8))
404 self.call_go(_F_convTstring)
405 self.Emit("MOVQ" , jit.Ptr(_SP, 16), _R9)
406
407
408 self.Link("_packed_str")
409 self.Emit("MOVQ", _T_string, _R8)
410 self.Emit("MOVQ", _VAR_ss_Iv, _DI)
411 self.Emit("SUBQ", jit.Imm(1), _DI)
412 self.Sjmp("JMP" , "_set_value")
413
414
415 self.Link("_object_key")
416 self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX)
417 self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vp), _SI)
418 self.Emit("MOVQ", jit.Ptr(_SI, 8), _SI)
419
420
421 self.Emit("ADDQ", jit.Imm(1), _CX)
422 self.Emit("CMPQ", _CX, jit.Imm(types.MAX_RECURSE))
423 self.Sjmp("JAE" , "_stack_overflow")
424 self.Emit("MOVQ", _CX, jit.Ptr(_ST, _ST_Sp))
425 self.Emit("MOVQ", jit.Imm(_S_obj_delim), jit.Sib(_ST, _CX, 8, _ST_Vt))
426
427
428 self.Emit("MOVQ", _T_map, _DX)
429 self.Emit("MOVQ", _DX, jit.Ptr(_SP, 0))
430 self.Emit("MOVQ", _SI, jit.Ptr(_SP, 8))
431 self.Emit("MOVQ", _R8, jit.Ptr(_SP, 16))
432 self.Emit("MOVQ", _AX, jit.Ptr(_SP, 24))
433 self.call_go(_F_mapassign_faststr)
434 self.Emit("MOVQ", jit.Ptr(_SP, 32), _AX)
435
436
437 self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX)
438 self.WritePtrAX(6, jit.Sib(_ST, _CX, 8, _ST_Vp), false)
439 self.Sjmp("JMP" , "_next")
440
441
442 self.Link("_unquote")
443 self.Emit("ADDQ", jit.Imm(15), _AX)
444 self.Emit("MOVQ", _T_byte, _CX)
445 self.Emit("MOVQ", _AX, jit.Ptr(_SP, 0))
446 self.Emit("MOVQ", _CX, jit.Ptr(_SP, 8))
447 self.Emit("MOVB", jit.Imm(0), jit.Ptr(_SP, 16))
448 self.call_go(_F_mallocgc)
449 self.Emit("MOVQ", jit.Ptr(_SP, 24), _R9)
450
451
452 self.Emit("MOVQ" , _VAR_ss_Iv, _CX)
453 self.Emit("LEAQ" , jit.Sib(_IP, _CX, 1, 0), _DI)
454 self.Emit("NEGQ" , _CX)
455 self.Emit("LEAQ" , jit.Sib(_IC, _CX, 1, -1), _SI)
456 self.Emit("LEAQ" , jit.Ptr(_R9, 16), _DX)
457 self.Emit("LEAQ" , _VAR_ss_Ep, _CX)
458 self.Emit("XORL" , _R8, _R8)
459 self.Emit("BTQ" , jit.Imm(_F_disable_urc), _VAR_df)
460 self.Emit("SETCC", _R8)
461 self.Emit("SHLQ" , jit.Imm(types.B_UNICODE_REPLACE), _R8)
462
463
464 self.save(_R9)
465 self.call(_F_unquote)
466 self.load(_R9)
467
468
469 self.Emit("TESTQ", _AX, _AX)
470 self.Sjmp("JS" , "_unquote_error")
471 self.Emit("MOVL" , jit.Imm(1), _DX)
472 self.Emit("LEAQ" , jit.Ptr(_R9, 16), _R8)
473 self.Emit("MOVQ" , _R8, jit.Ptr(_R9, 0))
474 self.Emit("MOVQ" , _AX, jit.Ptr(_R9, 8))
475 self.Sjmp("JMP" , "_noescape")
476
477
478 self.Link("_decode_V_DOUBLE")
479 self.Emit("BTQ" , jit.Imm(_F_use_number), _VAR_df)
480 self.Sjmp("JC" , "_use_number")
481 self.Emit("MOVSD", _VAR_ss_Dv, _X0)
482 self.Sjmp("JMP" , "_use_float64")
483
484
485 self.Link("_decode_V_INTEGER")
486 self.Emit("BTQ" , jit.Imm(_F_use_number), _VAR_df)
487 self.Sjmp("JC" , "_use_number")
488 self.Emit("BTQ" , jit.Imm(_F_use_int64), _VAR_df)
489 self.Sjmp("JC" , "_use_int64")
490 self.Emit("MOVQ" , _VAR_ss_Iv, _AX)
491 self.Emit("CVTSQ2SD", _AX, _X0)
492
493
494 self.Link("_use_float64")
495 self.Emit("MOVSD", _X0, jit.Ptr(_SP, 0))
496 self.call_go(_F_convT64)
497 self.Emit("MOVQ" , _T_float64, _R8)
498 self.Emit("MOVQ" , jit.Ptr(_SP, 8), _R9)
499 self.Emit("MOVQ" , _VAR_ss_Ep, _DI)
500 self.Sjmp("JMP" , "_set_value")
501
502
503 self.Link("_use_number")
504 self.Emit("MOVQ", _VAR_ss_Ep, _AX)
505 self.Emit("LEAQ", jit.Sib(_IP, _AX, 1, 0), _SI)
506 self.Emit("MOVQ", _IC, _CX)
507 self.Emit("SUBQ", _AX, _CX)
508 self.Emit("MOVQ", _SI, jit.Ptr(_SP, 0))
509 self.Emit("MOVQ", _CX, jit.Ptr(_SP, 8))
510 self.call_go(_F_convTstring)
511 self.Emit("MOVQ", _T_number, _R8)
512 self.Emit("MOVQ", jit.Ptr(_SP, 16), _R9)
513 self.Emit("MOVQ", _VAR_ss_Ep, _DI)
514 self.Sjmp("JMP" , "_set_value")
515
516
517 self.Link("_use_int64")
518 self.Emit("MOVQ", _VAR_ss_Iv, _AX)
519 self.Emit("MOVQ", _AX, jit.Ptr(_SP, 0))
520 self.call_go(_F_convT64)
521 self.Emit("MOVQ", _T_int64, _R8)
522 self.Emit("MOVQ", jit.Ptr(_SP, 8), _R9)
523 self.Emit("MOVQ", _VAR_ss_Ep, _DI)
524 self.Sjmp("JMP" , "_set_value")
525
526
527 self.Link("_decode_V_KEY_SEP")
528
529 self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX)
530 self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vt), _AX)
531 self.Emit("CMPQ", _AX, jit.Imm(_S_obj_delim))
532 self.Sjmp("JNE" , "_invalid_char")
533 self.Emit("MOVQ", jit.Imm(_S_val), jit.Sib(_ST, _CX, 8, _ST_Vt))
534 self.Emit("MOVQ", jit.Imm(_S_obj), jit.Sib(_ST, _CX, 8, _ST_Vt - 8))
535 self.Sjmp("JMP" , "_next")
536
537
538 self.Link("_decode_V_ELEM_SEP")
539 self.Emit("MOVQ" , jit.Ptr(_ST, _ST_Sp), _CX)
540 self.Emit("MOVQ" , jit.Sib(_ST, _CX, 8, _ST_Vt), _AX)
541 self.Emit("CMPQ" , _AX, jit.Imm(_S_arr))
542 self.Sjmp("JE" , "_array_sep")
543 self.Emit("CMPQ" , _AX, jit.Imm(_S_obj))
544 self.Sjmp("JNE" , "_invalid_char")
545 self.Emit("MOVQ" , jit.Imm(_S_obj_sep), jit.Sib(_ST, _CX, 8, _ST_Vt))
546 self.Sjmp("JMP" , "_next")
547
548
549 self.Link("_array_sep")
550 self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vp), _SI)
551 self.Emit("MOVQ", jit.Ptr(_SI, 8), _SI)
552 self.Emit("MOVQ", jit.Ptr(_SI, 8), _DX)
553 self.Emit("CMPQ", _DX, jit.Ptr(_SI, 16))
554 self.Sjmp("JAE" , "_array_more")
555
556
557 self.Link("_array_append")
558 self.Emit("ADDQ", jit.Imm(1), jit.Ptr(_SI, 8))
559 self.Emit("MOVQ", jit.Ptr(_SI, 0), _SI)
560 self.Emit("ADDQ", jit.Imm(1), _CX)
561 self.Emit("CMPQ", _CX, jit.Imm(types.MAX_RECURSE))
562 self.Sjmp("JAE" , "_stack_overflow")
563 self.Emit("SHLQ", jit.Imm(1), _DX)
564 self.Emit("LEAQ", jit.Sib(_SI, _DX, 8, 0), _SI)
565 self.Emit("MOVQ", _CX, jit.Ptr(_ST, _ST_Sp))
566 self.WriteRecNotAX(7 , _SI, jit.Sib(_ST, _CX, 8, _ST_Vp), false)
567 self.Emit("MOVQ", jit.Imm(_S_val), jit.Sib(_ST, _CX, 8, _ST_Vt))
568 self.Sjmp("JMP" , "_next")
569
570
571 self.Link("_decode_V_ARRAY_END")
572 self.Emit("XORL", _DX, _DX)
573 self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX)
574 self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vt), _AX)
575 self.Emit("CMPQ", _AX, jit.Imm(_S_arr_0))
576 self.Sjmp("JE" , "_first_item")
577 self.Emit("CMPQ", _AX, jit.Imm(_S_arr))
578 self.Sjmp("JNE" , "_invalid_char")
579 self.Emit("SUBQ", jit.Imm(1), jit.Ptr(_ST, _ST_Sp))
580 self.Emit("MOVQ", _DX, jit.Sib(_ST, _CX, 8, _ST_Vp))
581 self.Sjmp("JMP" , "_next")
582
583
584 self.Link("_first_item")
585 self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX)
586 self.Emit("SUBQ", jit.Imm(2), jit.Ptr(_ST, _ST_Sp))
587 self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vp - 8), _SI)
588 self.Emit("MOVQ", jit.Ptr(_SI, 8), _SI)
589 self.Emit("MOVQ", _DX, jit.Sib(_ST, _CX, 8, _ST_Vp - 8))
590 self.Emit("MOVQ", _DX, jit.Sib(_ST, _CX, 8, _ST_Vp))
591 self.Emit("MOVQ", _DX, jit.Ptr(_SI, 8))
592 self.Sjmp("JMP" , "_next")
593
594
595 self.Link("_decode_V_OBJECT_END")
596 self.Emit("MOVL", jit.Imm(_S_omask_end), _DX)
597 self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX)
598 self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vt), _AX)
599 self.Emit("BTQ" , _AX, _DX)
600 self.Sjmp("JNC" , "_invalid_char")
601 self.Emit("XORL", _AX, _AX)
602 self.Emit("SUBQ", jit.Imm(1), jit.Ptr(_ST, _ST_Sp))
603 self.Emit("MOVQ", _AX, jit.Sib(_ST, _CX, 8, _ST_Vp))
604 self.Sjmp("JMP" , "_next")
605
606
607 self.Link("_return")
608 self.Emit("XORL", _EP, _EP)
609 self.Emit("MOVQ", _EP, jit.Ptr(_ST, _ST_Vp))
610 self.Link("_epilogue")
611 self.Emit("SUBQ", jit.Imm(_FsmOffset), _ST)
612 self.Emit("MOVQ", jit.Ptr(_SP, _VD_offs), _BP)
613 self.Emit("ADDQ", jit.Imm(_VD_size), _SP)
614 self.Emit("RET")
615
616
617 self.Link("_array_more")
618 self.Emit("MOVQ" , _T_eface, _AX)
619 self.Emit("MOVOU", jit.Ptr(_SI, 0), _X0)
620 self.Emit("MOVQ" , jit.Ptr(_SI, 16), _DX)
621 self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 0))
622 self.Emit("MOVOU", _X0, jit.Ptr(_SP, 8))
623 self.Emit("MOVQ" , _DX, jit.Ptr(_SP, 24))
624 self.Emit("SHLQ" , jit.Imm(1), _DX)
625 self.Emit("MOVQ" , _DX, jit.Ptr(_SP, 32))
626 self.call_go(_F_growslice)
627 self.Emit("MOVQ" , jit.Ptr(_SP, 40), _DI)
628 self.Emit("MOVQ" , jit.Ptr(_SP, 48), _DX)
629 self.Emit("MOVQ" , jit.Ptr(_SP, 56), _AX)
630
631
632 self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX)
633 self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vp), _SI)
634 self.Emit("MOVQ", jit.Ptr(_SI, 8), _SI)
635 self.Emit("MOVQ", _DX, jit.Ptr(_SI, 8))
636 self.Emit("MOVQ", _AX, jit.Ptr(_SI, 16))
637 self.WriteRecNotAX(8 , _DI, jit.Ptr(_SI, 0), false)
638 self.Sjmp("JMP" , "_array_append")
639
640
641 self.Link("copy_string")
642
643 self.Emit("MOVQ", _R8, _VAR_cs_p)
644 self.Emit("MOVQ", _AX, _VAR_cs_n)
645 self.Emit("MOVQ", _DI, _VAR_cs_LR)
646 self.Emit("MOVQ", _T_byte, _R8)
647 self.Emit("MOVQ", _R8, jit.Ptr(_SP, 0))
648 self.Emit("MOVQ", _AX, jit.Ptr(_SP, 8))
649 self.Emit("MOVQ", _AX, jit.Ptr(_SP, 16))
650 self.call_go(_F_makeslice)
651 self.Emit("MOVQ", jit.Ptr(_SP, 24), _R8)
652 self.Emit("MOVQ", _R8, _VAR_cs_d)
653 self.Emit("MOVQ", _R8, jit.Ptr(_SP, 0))
654 self.Emit("MOVQ", _VAR_cs_p, _R8)
655 self.Emit("MOVQ", _R8, jit.Ptr(_SP, 8))
656 self.Emit("MOVQ", _VAR_cs_n, _AX)
657 self.Emit("MOVQ", _AX, jit.Ptr(_SP, 16))
658 self.call_go(_F_memmove)
659 self.Emit("MOVQ", _VAR_cs_d, _R8)
660 self.Emit("MOVQ", _VAR_cs_n, _AX)
661 self.Emit("MOVQ", _VAR_cs_LR, _DI)
662
663 self.Rjmp("JMP", _DI)
664
665
666 self.Link("_stack_overflow")
667 self.Emit("MOVL" , _E_recurse, _EP)
668 self.Sjmp("JMP" , "_error")
669 self.Link("_vtype_error")
670 self.Emit("MOVQ" , _DI, _IC)
671 self.Emit("MOVL" , _E_invalid, _EP)
672 self.Sjmp("JMP" , "_error")
673 self.Link("_invalid_char")
674 self.Emit("SUBQ" , jit.Imm(1), _IC)
675 self.Emit("MOVL" , _E_invalid, _EP)
676 self.Sjmp("JMP" , "_error")
677 self.Link("_unquote_error")
678 self.Emit("MOVQ" , _VAR_ss_Iv, _IC)
679 self.Emit("SUBQ" , jit.Imm(1), _IC)
680 self.Link("_parsing_error")
681 self.Emit("NEGQ" , _AX)
682 self.Emit("MOVQ" , _AX, _EP)
683 self.Link("_error")
684 self.Emit("PXOR" , _X0, _X0)
685 self.Emit("MOVOU", _X0, jit.Ptr(_VP, 0))
686 self.Sjmp("JMP" , "_epilogue")
687
688
689 self.Link("_invalid_vtype")
690 self.Emit("MOVQ", _AX, jit.Ptr(_SP, 0))
691 self.call(_F_invalid_vtype)
692 self.Emit("UD2")
693
694
695 self.Link("_switch_table")
696 self.Sref("_decode_V_EOF", 0)
697 self.Sref("_decode_V_NULL", -4)
698 self.Sref("_decode_V_TRUE", -8)
699 self.Sref("_decode_V_FALSE", -12)
700 self.Sref("_decode_V_ARRAY", -16)
701 self.Sref("_decode_V_OBJECT", -20)
702 self.Sref("_decode_V_STRING", -24)
703 self.Sref("_decode_V_DOUBLE", -28)
704 self.Sref("_decode_V_INTEGER", -32)
705 self.Sref("_decode_V_KEY_SEP", -36)
706 self.Sref("_decode_V_ELEM_SEP", -40)
707 self.Sref("_decode_V_ARRAY_END", -44)
708 self.Sref("_decode_V_OBJECT_END", -48)
709
710
711 self.Link("_decode_tab")
712 self.Sref("_decode_V_EOF", 0)
713
714
715 for i := 1; i < 256; i++ {
716 if to, ok := _R_tab[i]; ok {
717 self.Sref(to, -int64(i) * 4)
718 } else {
719 self.Byte(0x00, 0x00, 0x00, 0x00)
720 }
721 }
722 }
723
724
725
726 var (
727 _subr_decode_value = new(_ValueDecoder).build()
728 )
729
730
731 func invalid_vtype(vt types.ValueType) {
732 throw(fmt.Sprintf("invalid value type: %d", vt))
733 }
734
View as plain text