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