2
0
Fork 0
mirror of https://github.com/ii64/sonic.git synced 2026-06-21 00:46:43 +08:00

fix: parse min int64 number to float when UseInt64()

This commit is contained in:
liuqiang 2021-07-29 18:02:01 +08:00 committed by Oxygen
parent 83208b7ac4
commit ebac0a347a
6 changed files with 397 additions and 265 deletions

View file

@ -283,7 +283,7 @@ LBB2_8:
LONG $0x4fdd6941; WORD $0x1293; BYTE $0x00 // imull $1217359, %r13d, %ebx
MOVQ R13, AX
SHLQ $4, AX
LONG $0x750d8d48; WORD $0x0070; BYTE $0x00 // leaq $28789(%rip), %rcx /* _DOUBLE_POW5_INV_SPLIT(%rip) */
LONG $0x9f0d8d48; WORD $0x0070; BYTE $0x00 // leaq $28831(%rip), %rcx /* _DOUBLE_POW5_INV_SPLIT(%rip) */
MOVQ R8, DI
ORQ $2, DI
MOVQ 0(AX)(CX*1), R10
@ -371,7 +371,7 @@ LBB2_15:
SHRL $19, DI
MOVLQSX AX, SI
SHLQ $4, SI
LONG $0x9d0d8d4c; WORD $0x0084; BYTE $0x00 // leaq $33949(%rip), %r9 /* _DOUBLE_POW5_SPLIT(%rip) */
LONG $0xc70d8d4c; WORD $0x0084; BYTE $0x00 // leaq $33991(%rip), %r9 /* _DOUBLE_POW5_SPLIT(%rip) */
MOVQ R8, BX
ORQ $2, BX
MOVQ 0(SI)(R9*1), R15
@ -774,7 +774,7 @@ LBB2_65:
LEAQ 1(R13), BX
MOVQ BX, SI
MOVL R15, DX
LONG $0x0039b0e8; BYTE $0x00 // callq _print_mantissa
LONG $0x0039dae8; BYTE $0x00 // callq _print_mantissa
MOVB 1(R13), AX
MOVB AX, 0(R13)
MOVL $1, CX
@ -803,7 +803,7 @@ LBB2_70:
LEAL 0(DX)(DX*1), CX
LEAL 0(CX)(CX*4), CX
SUBL CX, AX
LONG $0x930d8d48; WORD $0x0093; BYTE $0x00 // leaq $37779(%rip), %rcx /* _Digits(%rip) */
LONG $0xbd0d8d48; WORD $0x0093; BYTE $0x00 // leaq $37821(%rip), %rcx /* _Digits(%rip) */
MOVWLZX 0(CX)(DX*2), CX
MOVL BX, DX
MOVW CX, 0(R13)(DX*1)
@ -827,7 +827,7 @@ LBB2_73:
MOVL BX, SI
ADDQ R13, SI
MOVL R15, DX
LONG $0x00390ce8; BYTE $0x00 // callq _print_mantissa
LONG $0x003936e8; BYTE $0x00 // callq _print_mantissa
TESTL R12, R12
JE LBB2_84
LEAL 0(R12)(BX*1), AX
@ -858,7 +858,7 @@ LBB2_78:
CMPL AX, $10
JL LBB2_86
WORD $0x9848 // cltq
LONG $0xea0d8d48; WORD $0x0092; BYTE $0x00 // leaq $37610(%rip), %rcx /* _Digits(%rip) */
LONG $0x140d8d48; WORD $0x0093; BYTE $0x00 // leaq $37652(%rip), %rcx /* _Digits(%rip) */
MOVWLZX 0(CX)(AX*2), AX
MOVL BX, CX
MOVW AX, 0(R13)(CX*1)
@ -1060,7 +1060,7 @@ LBB2_109:
ADDQ R13, SI
MOVL R15, DX
WORD $0xf8c5; BYTE $0x77 // vzeroupper
LONG $0x003592e8; BYTE $0x00 // callq _print_mantissa
LONG $0x0035bce8; BYTE $0x00 // callq _print_mantissa
ADDL BX, R15
MOVL R15, BX
@ -1142,7 +1142,7 @@ _u64toa:
ADDQ AX, AX
CMPL SI, $1000
JB LBB4_3
LONG $0x0d0d8d48; WORD $0x008f; BYTE $0x00 // leaq $36621(%rip), %rcx /* _Digits(%rip) */
LONG $0x370d8d48; WORD $0x008f; BYTE $0x00 // leaq $36663(%rip), %rcx /* _Digits(%rip) */
MOVB 0(DX)(CX*1), CX
MOVB CX, 0(DI)
MOVL $1, CX
@ -1156,14 +1156,14 @@ LBB4_3:
LBB4_4:
MOVWLZX DX, DX
ORQ $1, DX
LONG $0xec358d48; WORD $0x008e; BYTE $0x00 // leaq $36588(%rip), %rsi /* _Digits(%rip) */
LONG $0x16358d48; WORD $0x008f; BYTE $0x00 // leaq $36630(%rip), %rsi /* _Digits(%rip) */
MOVB 0(DX)(SI*1), DX
MOVL CX, SI
INCL CX
MOVB DX, 0(DI)(SI*1)
LBB4_6:
LONG $0xdb158d48; WORD $0x008e; BYTE $0x00 // leaq $36571(%rip), %rdx /* _Digits(%rip) */
LONG $0x05158d48; WORD $0x008f; BYTE $0x00 // leaq $36613(%rip), %rdx /* _Digits(%rip) */
MOVB 0(AX)(DX*1), DX
MOVL CX, SI
INCL CX
@ -1172,7 +1172,7 @@ LBB4_6:
LBB4_7:
MOVWLZX AX, AX
ORQ $1, AX
LONG $0xc3158d48; WORD $0x008e; BYTE $0x00 // leaq $36547(%rip), %rdx /* _Digits(%rip) */
LONG $0xed158d48; WORD $0x008e; BYTE $0x00 // leaq $36589(%rip), %rdx /* _Digits(%rip) */
MOVB 0(AX)(DX*1), AX
MOVL CX, DX
INCL CX
@ -1219,7 +1219,7 @@ LBB4_8:
ADDQ R11, R11
CMPL SI, $10000000
JB LBB4_11
LONG $0x2c058d48; WORD $0x008e; BYTE $0x00 // leaq $36396(%rip), %rax /* _Digits(%rip) */
LONG $0x56058d48; WORD $0x008e; BYTE $0x00 // leaq $36438(%rip), %rax /* _Digits(%rip) */
MOVB 0(R10)(AX*1), AX
MOVB AX, 0(DI)
MOVL $1, CX
@ -1233,14 +1233,14 @@ LBB4_11:
LBB4_12:
MOVL R10, AX
ORQ $1, AX
LONG $0x07358d48; WORD $0x008e; BYTE $0x00 // leaq $36359(%rip), %rsi /* _Digits(%rip) */
LONG $0x31358d48; WORD $0x008e; BYTE $0x00 // leaq $36401(%rip), %rsi /* _Digits(%rip) */
MOVB 0(AX)(SI*1), AX
MOVL CX, SI
INCL CX
MOVB AX, 0(DI)(SI*1)
LBB4_14:
LONG $0xf6058d48; WORD $0x008d; BYTE $0x00 // leaq $36342(%rip), %rax /* _Digits(%rip) */
LONG $0x20058d48; WORD $0x008e; BYTE $0x00 // leaq $36384(%rip), %rax /* _Digits(%rip) */
MOVB 0(R9)(AX*1), AX
MOVL CX, SI
INCL CX
@ -1249,7 +1249,7 @@ LBB4_14:
LBB4_15:
MOVWLZX R9, AX
ORQ $1, AX
LONG $0xdc358d48; WORD $0x008d; BYTE $0x00 // leaq $36316(%rip), %rsi /* _Digits(%rip) */
LONG $0x06358d48; WORD $0x008e; BYTE $0x00 // leaq $36358(%rip), %rsi /* _Digits(%rip) */
MOVB 0(AX)(SI*1), AX
MOVL CX, DX
MOVB AX, 0(DI)(DX*1)
@ -1331,7 +1331,7 @@ LBB4_16:
MOVL $16, CX
SUBL AX, CX
SHLQ $4, AX
LONG $0x51158d48; WORD $0x008d; BYTE $0x00 // leaq $36177(%rip), %rdx /* _VecShiftShuffles(%rip) */
LONG $0x7b158d48; WORD $0x008d; BYTE $0x00 // leaq $36219(%rip), %rdx /* _VecShiftShuffles(%rip) */
LONG $0x0071e2c4; WORD $0x1004 // vpshufb (%rax,%rdx), %xmm1, %xmm0
LONG $0x077ffac5 // vmovdqu %xmm0, (%rdi)
MOVL CX, AX
@ -1357,7 +1357,7 @@ LBB4_20:
CMPL DX, $99
JA LBB4_22
MOVL DX, AX
LONG $0x340d8d48; WORD $0x008c; BYTE $0x00 // leaq $35892(%rip), %rcx /* _Digits(%rip) */
LONG $0x5e0d8d48; WORD $0x008c; BYTE $0x00 // leaq $35934(%rip), %rcx /* _Digits(%rip) */
MOVB 0(CX)(AX*2), DX
MOVB 1(CX)(AX*2), AX
MOVB DX, 0(DI)
@ -1382,7 +1382,7 @@ LBB4_22:
WORD $0xc96b; BYTE $0x64 // imull $100, %ecx, %ecx
SUBL CX, AX
MOVWLZX AX, AX
LONG $0xe30d8d48; WORD $0x008b; BYTE $0x00 // leaq $35811(%rip), %rcx /* _Digits(%rip) */
LONG $0x0d0d8d48; WORD $0x008c; BYTE $0x00 // leaq $35853(%rip), %rcx /* _Digits(%rip) */
MOVB 0(CX)(AX*2), DX
MOVB 1(CX)(AX*2), AX
MOVB DX, 1(DI)
@ -1394,7 +1394,7 @@ LBB4_24:
WORD $0xc86b; BYTE $0x64 // imull $100, %eax, %ecx
SUBL CX, DX
MOVWLZX AX, AX
LONG $0xc0058d4c; WORD $0x008b; BYTE $0x00 // leaq $35776(%rip), %r8 /* _Digits(%rip) */
LONG $0xea058d4c; WORD $0x008b; BYTE $0x00 // leaq $35818(%rip), %r8 /* _Digits(%rip) */
MOVB 0(R8)(AX*2), CX
MOVB 1(R8)(AX*2), AX
MOVB CX, 0(DI)
@ -1480,8 +1480,8 @@ _quote:
MOVQ CX, R10
MOVQ DX, CX
TESTB $1, R8
LONG $0xbf058d48; WORD $0x008b; BYTE $0x00 // leaq $35775(%rip), %rax /* __SingleQuoteTab(%rip) */
LONG $0xb8158d48; WORD $0x009b; BYTE $0x00 // leaq $39864(%rip), %rdx /* __DoubleQuoteTab(%rip) */
LONG $0xe9058d48; WORD $0x008b; BYTE $0x00 // leaq $35817(%rip), %rax /* __SingleQuoteTab(%rip) */
LONG $0xe2158d48; WORD $0x009b; BYTE $0x00 // leaq $39906(%rip), %rdx /* __DoubleQuoteTab(%rip) */
LONG $0xd0440f48 // cmoveq %rax, %rdx
MOVQ CX, R8
MOVQ DI, AX
@ -1589,7 +1589,7 @@ LBB5_14:
TESTQ R10, R10
MOVQ -48(BP), CX
MOVQ -56(BP), DI
LONG $0x442d8d4c; WORD $0x008a; BYTE $0x00 // leaq $35396(%rip), %r13 /* __SingleQuoteTab(%rip) */
LONG $0x6e2d8d4c; WORD $0x008a; BYTE $0x00 // leaq $35438(%rip), %r13 /* __SingleQuoteTab(%rip) */
JLE LBB5_29
LBB5_16:
@ -1851,7 +1851,7 @@ _unquote:
MOVQ R8, -56(BP)
MOVL R8, R10
ANDL $1, R10
LONG $0xb1058d4c; WORD $0x00a7; BYTE $0x00 // leaq $42929(%rip), %r8 /* __UnquoteTab(%rip) */
LONG $0xdb058d4c; WORD $0x00a7; BYTE $0x00 // leaq $42971(%rip), %r8 /* __UnquoteTab(%rip) */
QUAD $0xffffffb5056ffac5 // vmovdqu $-75(%rip), %xmm0 /* LCPI6_0(%rip) */
MOVQ DI, R9
MOVQ SI, R14
@ -2375,14 +2375,14 @@ _atof_eisel_lemire64:
MOVL DX, R15
MOVQ DI, BX
MOVQ CX, -48(BP)
LONG $0x002747e8; BYTE $0x00 // callq _count_len_u64
LONG $0x002771e8; BYTE $0x00 // callq _count_len_u64
MOVL AX, R8
MOVL AX, CX
NEGL CX
SHLQ CX, BX
MOVL R14, CX
SHLQ $4, CX
LONG $0x6d0d8d4c; WORD $0x002a; BYTE $0x00 // leaq $10861(%rip), %r9 /* _POW10_M128_TAB(%rip) */
LONG $0x970d8d4c; WORD $0x002a; BYTE $0x00 // leaq $10903(%rip), %r9 /* _POW10_M128_TAB(%rip) */
MOVQ BX, AX
MULQ 8(CX)(R9*1)
MOVQ AX, R10
@ -2502,7 +2502,7 @@ LBB8_5:
MOVQ BX, -48(BP)
JLE LBB8_12
XORL R12, R12
LONG $0x68358d4c; WORD $0x0054; BYTE $0x00 // leaq $21608(%rip), %r14 /* _POW_TAB(%rip) */
LONG $0x92358d4c; WORD $0x0054; BYTE $0x00 // leaq $21650(%rip), %r14 /* _POW_TAB(%rip) */
JMP LBB8_8
LBB8_10:
@ -2514,7 +2514,7 @@ LBB8_10:
LBB8_11:
MOVQ R15, DI
MOVL BX, SI
LONG $0x002762e8; BYTE $0x00 // callq _right_shift
LONG $0x00278ce8; BYTE $0x00 // callq _right_shift
LBB8_7:
ADDL BX, R12
@ -2531,7 +2531,7 @@ LBB8_8:
JMP LBB8_7
LBB8_12:
LONG $0x21358d4c; WORD $0x0054; BYTE $0x00 // leaq $21537(%rip), %r14 /* _POW_TAB(%rip) */
LONG $0x4b358d4c; WORD $0x0054; BYTE $0x00 // leaq $21579(%rip), %r14 /* _POW_TAB(%rip) */
JMP LBB8_14
LBB8_18:
@ -2542,7 +2542,7 @@ LBB8_18:
LBB8_20:
MOVQ R15, DI
MOVL BX, SI
LONG $0x002598e8; BYTE $0x00 // callq _left_shift
LONG $0x0025c2e8; BYTE $0x00 // callq _left_shift
MOVL 804(R15), AX
LBB8_13:
@ -2582,7 +2582,7 @@ LBB8_21:
LBB8_25:
MOVQ R15, DI
MOVL $60, SI
LONG $0x0026b4e8; BYTE $0x00 // callq _right_shift
LONG $0x0026dee8; BYTE $0x00 // callq _right_shift
ADDL $60, R12
CMPL R12, $-120
JL LBB8_25
@ -2608,7 +2608,7 @@ LBB8_31:
NEGL R12
MOVQ R15, DI
MOVL R12, SI
LONG $0x00266ee8; BYTE $0x00 // callq _right_shift
LONG $0x002698e8; BYTE $0x00 // callq _right_shift
MOVL $-1022, R14
LBB8_32:
@ -2616,7 +2616,7 @@ LBB8_32:
JE LBB8_34
MOVQ R15, DI
MOVL $53, SI
LONG $0x0024cde8; BYTE $0x00 // callq _left_shift
LONG $0x0024f7e8; BYTE $0x00 // callq _left_shift
LBB8_34:
MOVL 804(R15), AX
@ -4043,7 +4043,7 @@ LBB13_47:
JE LBB13_51
MOVL $1, R9
CMPB SI, $43
JNE LBB13_74
JNE LBB13_86
LBB13_51:
ADDQ $2, DX
@ -4054,7 +4054,7 @@ LBB13_51:
SETEQ AX
LEAL -1(AX)(AX*1), R9
MOVB 0(CX)(DX*1), SI
JMP LBB13_75
JMP LBB13_87
LBB13_53:
MOVQ R15, 0(R14)
@ -4076,79 +4076,34 @@ LBB13_57:
JE LBB13_63
LBB13_59:
TESTQ R12, R12
JS LBB13_62
TESTL BX, BX
JNE LBB13_62
MOVLQSX -60(BP), AX
IMULQ AX, R12
MOVQ R12, 16(R13)
LONG $0x2af3c1c4; BYTE $0xc4 // vcvtsi2sd %r12, %xmm1, %xmm0
JMP LBB13_91
TESTQ R12, R12
JNS LBB13_74
MOVQ R12, CX
ANDQ AX, CX
MOVQ $-9223372036854775808, DX
CMPQ CX, DX
JE LBB13_74
LBB13_62:
MOVQ $8, 0(R13)
JMP LBB13_63
LBB13_56:
MOVL $1, -44(BP)
TESTB R9, R9
JE LBB13_63
JMP LBB13_59
LBB13_74:
MOVQ AX, DX
LBB13_75:
LEAL -48(SI), AX
CMPB AX, $9
JA LBB13_5
XORL DI, DI
CMPQ DX, R15
JAE LBB13_93
CMPB AX, $9
JA LBB13_93
LEAQ -1(R15), R10
XORL DI, DI
LBB13_79:
MOVL DI, AX
CMPL DI, $10000
LEAL 0(AX)(AX*4), DI
MOVBLZX SI, SI
LEAL -48(SI)(DI*2), DI
WORD $0x4d0f; BYTE $0xf8 // cmovgel %eax, %edi
CMPQ R10, DX
JE LBB13_92
MOVBLZX 1(CX)(DX*1), SI
INCQ DX
LEAL -48(SI), AX
CMPB AX, $10
JB LBB13_79
JMP LBB13_93
LBB13_92:
MOVQ R15, DX
LBB13_93:
IMULL R9, DI
ADDL DI, BX
MOVQ DX, R15
LBB13_63:
MOVQ $0, -56(BP)
MOVQ $0, -72(BP)
MOVQ R12, AX
SHRQ $52, AX
JNE LBB13_85
JNE LBB13_79
LONG $0x6ef9c1c4; BYTE $0xc4 // vmovq %r12, %xmm0
QUAD $0xfffffc7f0562f9c5 // vpunpckldq $-897(%rip), %xmm0, %xmm0 /* LCPI13_0(%rip) */
QUAD $0xfffffc87055cf9c5 // vsubpd $-889(%rip), %xmm0, %xmm0 /* LCPI13_1(%rip) */
QUAD $0xfffffcd80562f9c5 // vpunpckldq $-808(%rip), %xmm0, %xmm0 /* LCPI13_0(%rip) */
QUAD $0xfffffce0055cf9c5 // vsubpd $-800(%rip), %xmm0, %xmm0 /* LCPI13_1(%rip) */
LONG $0x0579e3c4; WORD $0x01c8 // vpermilpd $1, %xmm0, %xmm1
LONG $0xc058f3c5 // vaddsd %xmm0, %xmm1, %xmm0
TESTB R8, R8
JE LBB13_66
QUAD $0xfffffc800557f9c5 // vxorpd $-896(%rip), %xmm0, %xmm0 /* LCPI13_2(%rip) */
QUAD $0xfffffcd90557f9c5 // vxorpd $-807(%rip), %xmm0, %xmm0 /* LCPI13_2(%rip) */
LBB13_66:
MOVQ $0, -56(BP)
@ -4160,84 +4115,136 @@ LBB13_66:
CMPL AX, $36
JA LBB13_72
CMPL BX, $23
JL LBB13_81
JL LBB13_75
LEAL -22(BX), AX
LONG $0x630d8d48; WORD $0x014e; BYTE $0x00 // leaq $85603(%rip), %rcx /* _P10_TAB(%rip) */
LONG $0xe60d8d48; WORD $0x014e; BYTE $0x00 // leaq $85734(%rip), %rcx /* _P10_TAB(%rip) */
LONG $0x0459fbc5; BYTE $0xc1 // vmulsd (%rcx,%rax,8), %xmm0, %xmm0
MOVL $22, AX
JMP LBB13_82
JMP LBB13_76
LBB13_71:
LONG $0x4511fbc5; BYTE $0xc8 // vmovsd %xmm0, $-56(%rbp)
JMP LBB13_91
JMP LBB13_85
LBB13_56:
MOVL $1, -44(BP)
TESTB R9, R9
JE LBB13_63
JMP LBB13_59
LBB13_72:
CMPL BX, $-22
JB LBB13_85
JB LBB13_79
NEGL BX
LONG $0x3f058d48; WORD $0x014e; BYTE $0x00 // leaq $85567(%rip), %rax /* _P10_TAB(%rip) */
LONG $0xad058d48; WORD $0x014e; BYTE $0x00 // leaq $85677(%rip), %rax /* _P10_TAB(%rip) */
LONG $0x045efbc5; BYTE $0xd8 // vdivsd (%rax,%rbx,8), %xmm0, %xmm0
LONG $0x4511fbc5; BYTE $0xc8 // vmovsd %xmm0, $-56(%rbp)
JMP LBB13_91
JMP LBB13_85
LBB13_81:
LBB13_74:
IMULQ AX, R12
MOVQ R12, 16(R13)
LONG $0x2af3c1c4; BYTE $0xc4 // vcvtsi2sd %r12, %xmm1, %xmm0
JMP LBB13_85
LBB13_75:
MOVL BX, AX
LBB13_82:
QUAD $0xfffffc2b052ef9c5 // vucomisd $-981(%rip), %xmm0 /* LCPI13_3(%rip) */
JA LBB13_85
QUAD $0xfffffc290d10fbc5 // vmovsd $-983(%rip), %xmm1 /* LCPI13_4(%rip) */
LBB13_76:
QUAD $0xfffffc5d052ef9c5 // vucomisd $-931(%rip), %xmm0 /* LCPI13_3(%rip) */
JA LBB13_79
QUAD $0xfffffc5b0d10fbc5 // vmovsd $-933(%rip), %xmm1 /* LCPI13_4(%rip) */
LONG $0xc82ef9c5 // vucomisd %xmm0, %xmm1
JA LBB13_85
JA LBB13_79
MOVL AX, AX
LONG $0x0d0d8d48; WORD $0x014e; BYTE $0x00 // leaq $85517(%rip), %rcx /* _P10_TAB(%rip) */
LONG $0x690d8d48; WORD $0x014e; BYTE $0x00 // leaq $85609(%rip), %rcx /* _P10_TAB(%rip) */
LONG $0x0459fbc5; BYTE $0xc1 // vmulsd (%rcx,%rax,8), %xmm0, %xmm0
LONG $0x4511fbc5; BYTE $0xc8 // vmovsd %xmm0, $-56(%rbp)
JMP LBB13_91
JMP LBB13_85
LBB13_85:
LBB13_79:
MOVQ R11, -80(BP)
LEAQ -56(BP), CX
MOVQ R12, DI
MOVL BX, SI
MOVL -60(BP), DX
LONG $0xffead0e8; BYTE $0xff // callq _atof_eisel_lemire64
LONG $0xffeb02e8; BYTE $0xff // callq _atof_eisel_lemire64
TESTL AX, AX
JE LBB13_89
JE LBB13_83
CMPL -44(BP), $0
JE LBB13_90
JE LBB13_84
INCQ R12
LEAQ -72(BP), CX
MOVQ R12, DI
MOVL BX, SI
MOVL -60(BP), DX
LONG $0xffeab2e8; BYTE $0xff // callq _atof_eisel_lemire64
LONG $0xffeae4e8; BYTE $0xff // callq _atof_eisel_lemire64
TESTL AX, AX
JE LBB13_89
JE LBB13_83
LONG $0x4d10fbc5; BYTE $0xb8 // vmovsd $-72(%rbp), %xmm1
LONG $0x4510fbc5; BYTE $0xc8 // vmovsd $-56(%rbp), %xmm0
LONG $0xc82ef9c5 // vucomisd %xmm0, %xmm1
JNE LBB13_89
JNP LBB13_91
JNE LBB13_83
JNP LBB13_85
LBB13_89:
LBB13_83:
MOVQ -88(BP), CX
MOVQ 0(CX), DI
MOVQ -80(BP), AX
ADDQ AX, DI
MOVL 8(CX), SI
SUBL AX, SI
LONG $0xffef0ee8; BYTE $0xff // callq _atof_native_decimal
JMP LBB13_91
LONG $0xffef40e8; BYTE $0xff // callq _atof_native_decimal
JMP LBB13_85
LBB13_90:
LBB13_84:
LONG $0x4510fbc5; BYTE $0xc8 // vmovsd $-56(%rbp), %xmm0
LBB13_91:
LBB13_85:
LONG $0x117bc1c4; WORD $0x0845 // vmovsd %xmm0, $8(%r13)
MOVQ R15, 0(R14)
JMP LBB13_54
LBB13_86:
MOVQ AX, DX
LBB13_87:
LEAL -48(SI), AX
CMPB AX, $9
JA LBB13_5
XORL DI, DI
CMPQ DX, R15
JAE LBB13_94
CMPB AX, $9
JA LBB13_94
LEAQ -1(R15), R10
XORL DI, DI
LBB13_91:
MOVL DI, AX
CMPL DI, $10000
LEAL 0(AX)(AX*4), DI
MOVBLZX SI, SI
LEAL -48(SI)(DI*2), DI
WORD $0x4d0f; BYTE $0xf8 // cmovgel %eax, %edi
CMPQ R10, DX
JE LBB13_93
MOVBLZX 1(CX)(DX*1), SI
INCQ DX
LEAL -48(SI), AX
CMPB AX, $10
JB LBB13_91
JMP LBB13_94
LBB13_93:
MOVQ R15, DX
LBB13_94:
IMULL R9, DI
ADDL DI, BX
MOVQ DX, R15
JMP LBB13_63
_vsigned:
BYTE $0x55 // pushq %rbp
WORD $0x8948; BYTE $0xe5 // movq %rsp, %rbp
@ -4760,7 +4767,7 @@ LBB17_58:
MOVQ 8(AX), SI
MOVQ R12, DX
LEAQ -72(BP), CX
LONG $0xfff2fce8; BYTE $0xff // callq _advance_string
LONG $0xfff2d2e8; BYTE $0xff // callq _advance_string
MOVQ AX, CX
TESTQ AX, AX
JS LBB17_93
@ -4850,7 +4857,7 @@ LBB17_70:
MOVQ 8(AX), SI
MOVQ R12, DX
LEAQ -72(BP), CX
LONG $0xfff1aee8; BYTE $0xff // callq _advance_string
LONG $0xfff184e8; BYTE $0xff // callq _advance_string
MOVQ AX, CX
TESTQ AX, AX
JS LBB17_93
@ -5239,7 +5246,7 @@ _skip_string:
MOVQ 8(R15), SI
LEAQ -32(BP), CX
MOVQ BX, DX
LONG $0xffecc9e8; BYTE $0xff // callq _advance_string
LONG $0xffec9fe8; BYTE $0xff // callq _advance_string
TESTQ AX, AX
JS LBB20_2
DECQ BX
@ -12659,7 +12666,7 @@ TEXT ·__skip_array(SB), NOSPLIT, $0 - 32
MOVQ s+0(FP), DI
MOVQ p+8(FP), SI
MOVQ m+16(FP), DX
CALL ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+15896(SB) // _skip_array
CALL ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+15938(SB) // _skip_array
MOVQ AX, ret+24(FP)
RET
@ -12667,7 +12674,7 @@ TEXT ·__skip_object(SB), NOSPLIT, $0 - 32
MOVQ s+0(FP), DI
MOVQ p+8(FP), SI
MOVQ m+16(FP), DX
CALL ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+15931(SB) // _skip_object
CALL ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+15973(SB) // _skip_object
MOVQ AX, ret+24(FP)
RET
@ -12675,7 +12682,7 @@ TEXT ·__skip_one(SB), NOSPLIT, $0 - 32
MOVQ s+0(FP), DI
MOVQ p+8(FP), SI
MOVQ m+16(FP), DX
CALL ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+13574(SB) // _skip_one
CALL ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+13616(SB) // _skip_one
MOVQ AX, ret+24(FP)
RET
@ -12717,7 +12724,7 @@ TEXT ·__vsigned(SB), NOSPLIT, $0 - 24
MOVQ s+0(FP), DI
MOVQ p+8(FP), SI
MOVQ v+16(FP), DX
LEAQ ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+13024(SB), AX // _vsigned
LEAQ ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+13066(SB), AX // _vsigned
JMP AX
TEXT ·__vstring(SB), NOSPLIT, $0 - 24
@ -12731,5 +12738,5 @@ TEXT ·__vunsigned(SB), NOSPLIT, $0 - 24
MOVQ s+0(FP), DI
MOVQ p+8(FP), SI
MOVQ v+16(FP), DX
LEAQ ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+13301(SB), AX // _vunsigned
LEAQ ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+13343(SB), AX // _vunsigned
JMP AX

View file

@ -19,16 +19,16 @@ var (
_subr__lspace = **(**uintptr)(unsafe.Pointer(&_func__base)) + 238
_subr__lzero = **(**uintptr)(unsafe.Pointer(&_func__base)) + 0
_subr__quote = **(**uintptr)(unsafe.Pointer(&_func__base)) + 4854
_subr__skip_array = **(**uintptr)(unsafe.Pointer(&_func__base)) + 15896
_subr__skip_object = **(**uintptr)(unsafe.Pointer(&_func__base)) + 15931
_subr__skip_one = **(**uintptr)(unsafe.Pointer(&_func__base)) + 13574
_subr__skip_array = **(**uintptr)(unsafe.Pointer(&_func__base)) + 15938
_subr__skip_object = **(**uintptr)(unsafe.Pointer(&_func__base)) + 15973
_subr__skip_one = **(**uintptr)(unsafe.Pointer(&_func__base)) + 13616
_subr__u64toa = **(**uintptr)(unsafe.Pointer(&_func__base)) + 3634
_subr__unquote = **(**uintptr)(unsafe.Pointer(&_func__base)) + 5875
_subr__value = **(**uintptr)(unsafe.Pointer(&_func__base)) + 9329
_subr__vnumber = **(**uintptr)(unsafe.Pointer(&_func__base)) + 11904
_subr__vsigned = **(**uintptr)(unsafe.Pointer(&_func__base)) + 13024
_subr__vsigned = **(**uintptr)(unsafe.Pointer(&_func__base)) + 13066
_subr__vstring = **(**uintptr)(unsafe.Pointer(&_func__base)) + 10935
_subr__vunsigned = **(**uintptr)(unsafe.Pointer(&_func__base)) + 13301
_subr__vunsigned = **(**uintptr)(unsafe.Pointer(&_func__base)) + 13343
)
var (

View file

@ -335,7 +335,7 @@ LBB2_8:
LONG $0x4fdd6941; WORD $0x1293; BYTE $0x00 // imull $1217359, %r13d, %ebx
MOVQ R13, AX
SHLQ $4, AX
LONG $0x1b0d8d48; WORD $0x007b; BYTE $0x00 // leaq $31515(%rip), %rcx /* _DOUBLE_POW5_INV_SPLIT(%rip) */
LONG $0x450d8d48; WORD $0x007b; BYTE $0x00 // leaq $31557(%rip), %rcx /* _DOUBLE_POW5_INV_SPLIT(%rip) */
MOVQ R8, DI
ORQ $2, DI
MOVQ 0(AX)(CX*1), R10
@ -423,7 +423,7 @@ LBB2_15:
SHRL $19, DI
MOVLQSX AX, SI
SHLQ $4, SI
LONG $0x430d8d4c; WORD $0x008f; BYTE $0x00 // leaq $36675(%rip), %r9 /* _DOUBLE_POW5_SPLIT(%rip) */
LONG $0x6d0d8d4c; WORD $0x008f; BYTE $0x00 // leaq $36717(%rip), %r9 /* _DOUBLE_POW5_SPLIT(%rip) */
MOVQ R8, BX
ORQ $2, BX
MOVQ 0(SI)(R9*1), R15
@ -826,7 +826,7 @@ LBB2_65:
LEAQ 1(R13), BX
MOVQ BX, SI
MOVL R15, DX
LONG $0x004456e8; BYTE $0x00 // callq _print_mantissa
LONG $0x004480e8; BYTE $0x00 // callq _print_mantissa
MOVB 1(R13), AX
MOVB AX, 0(R13)
MOVL $1, CX
@ -855,7 +855,7 @@ LBB2_70:
LEAL 0(DX)(DX*1), CX
LEAL 0(CX)(CX*4), CX
SUBL CX, AX
LONG $0x390d8d48; WORD $0x009e; BYTE $0x00 // leaq $40505(%rip), %rcx /* _Digits(%rip) */
LONG $0x630d8d48; WORD $0x009e; BYTE $0x00 // leaq $40547(%rip), %rcx /* _Digits(%rip) */
MOVWLZX 0(CX)(DX*2), CX
MOVL BX, DX
MOVW CX, 0(R13)(DX*1)
@ -879,7 +879,7 @@ LBB2_73:
MOVL BX, SI
ADDQ R13, SI
MOVL R15, DX
LONG $0x0043b2e8; BYTE $0x00 // callq _print_mantissa
LONG $0x0043dce8; BYTE $0x00 // callq _print_mantissa
TESTL R12, R12
JE LBB2_84
LEAL 0(R12)(BX*1), AX
@ -910,7 +910,7 @@ LBB2_78:
CMPL AX, $10
JL LBB2_86
WORD $0x9848 // cltq
LONG $0x900d8d48; WORD $0x009d; BYTE $0x00 // leaq $40336(%rip), %rcx /* _Digits(%rip) */
LONG $0xba0d8d48; WORD $0x009d; BYTE $0x00 // leaq $40378(%rip), %rcx /* _Digits(%rip) */
MOVWLZX 0(CX)(AX*2), AX
MOVL BX, CX
MOVW AX, 0(R13)(CX*1)
@ -1112,7 +1112,7 @@ LBB2_109:
ADDQ R13, SI
MOVL R15, DX
WORD $0xf8c5; BYTE $0x77 // vzeroupper
LONG $0x004038e8; BYTE $0x00 // callq _print_mantissa
LONG $0x004062e8; BYTE $0x00 // callq _print_mantissa
ADDL BX, R15
MOVL R15, BX
@ -1194,7 +1194,7 @@ _u64toa:
ADDQ AX, AX
CMPL SI, $1000
JB LBB4_3
LONG $0xb30d8d48; WORD $0x0099; BYTE $0x00 // leaq $39347(%rip), %rcx /* _Digits(%rip) */
LONG $0xdd0d8d48; WORD $0x0099; BYTE $0x00 // leaq $39389(%rip), %rcx /* _Digits(%rip) */
MOVB 0(DX)(CX*1), CX
MOVB CX, 0(DI)
MOVL $1, CX
@ -1208,14 +1208,14 @@ LBB4_3:
LBB4_4:
MOVWLZX DX, DX
ORQ $1, DX
LONG $0x92358d48; WORD $0x0099; BYTE $0x00 // leaq $39314(%rip), %rsi /* _Digits(%rip) */
LONG $0xbc358d48; WORD $0x0099; BYTE $0x00 // leaq $39356(%rip), %rsi /* _Digits(%rip) */
MOVB 0(DX)(SI*1), DX
MOVL CX, SI
INCL CX
MOVB DX, 0(DI)(SI*1)
LBB4_6:
LONG $0x81158d48; WORD $0x0099; BYTE $0x00 // leaq $39297(%rip), %rdx /* _Digits(%rip) */
LONG $0xab158d48; WORD $0x0099; BYTE $0x00 // leaq $39339(%rip), %rdx /* _Digits(%rip) */
MOVB 0(AX)(DX*1), DX
MOVL CX, SI
INCL CX
@ -1224,7 +1224,7 @@ LBB4_6:
LBB4_7:
MOVWLZX AX, AX
ORQ $1, AX
LONG $0x69158d48; WORD $0x0099; BYTE $0x00 // leaq $39273(%rip), %rdx /* _Digits(%rip) */
LONG $0x93158d48; WORD $0x0099; BYTE $0x00 // leaq $39315(%rip), %rdx /* _Digits(%rip) */
MOVB 0(AX)(DX*1), AX
MOVL CX, DX
INCL CX
@ -1271,7 +1271,7 @@ LBB4_8:
ADDQ R11, R11
CMPL SI, $10000000
JB LBB4_11
LONG $0xd2058d48; WORD $0x0098; BYTE $0x00 // leaq $39122(%rip), %rax /* _Digits(%rip) */
LONG $0xfc058d48; WORD $0x0098; BYTE $0x00 // leaq $39164(%rip), %rax /* _Digits(%rip) */
MOVB 0(R10)(AX*1), AX
MOVB AX, 0(DI)
MOVL $1, CX
@ -1285,14 +1285,14 @@ LBB4_11:
LBB4_12:
MOVL R10, AX
ORQ $1, AX
LONG $0xad358d48; WORD $0x0098; BYTE $0x00 // leaq $39085(%rip), %rsi /* _Digits(%rip) */
LONG $0xd7358d48; WORD $0x0098; BYTE $0x00 // leaq $39127(%rip), %rsi /* _Digits(%rip) */
MOVB 0(AX)(SI*1), AX
MOVL CX, SI
INCL CX
MOVB AX, 0(DI)(SI*1)
LBB4_14:
LONG $0x9c058d48; WORD $0x0098; BYTE $0x00 // leaq $39068(%rip), %rax /* _Digits(%rip) */
LONG $0xc6058d48; WORD $0x0098; BYTE $0x00 // leaq $39110(%rip), %rax /* _Digits(%rip) */
MOVB 0(R9)(AX*1), AX
MOVL CX, SI
INCL CX
@ -1301,7 +1301,7 @@ LBB4_14:
LBB4_15:
MOVWLZX R9, AX
ORQ $1, AX
LONG $0x82358d48; WORD $0x0098; BYTE $0x00 // leaq $39042(%rip), %rsi /* _Digits(%rip) */
LONG $0xac358d48; WORD $0x0098; BYTE $0x00 // leaq $39084(%rip), %rsi /* _Digits(%rip) */
MOVB 0(AX)(SI*1), AX
MOVL CX, DX
MOVB AX, 0(DI)(DX*1)
@ -1383,7 +1383,7 @@ LBB4_16:
MOVL $16, CX
SUBL AX, CX
SHLQ $4, AX
LONG $0xf5158d48; WORD $0x0097; BYTE $0x00 // leaq $38901(%rip), %rdx /* _VecShiftShuffles(%rip) */
LONG $0x1f158d48; WORD $0x0098; BYTE $0x00 // leaq $38943(%rip), %rdx /* _VecShiftShuffles(%rip) */
LONG $0x0071e2c4; WORD $0x1004 // vpshufb (%rax,%rdx), %xmm1, %xmm0
LONG $0x077ffac5 // vmovdqu %xmm0, (%rdi)
MOVL CX, AX
@ -1409,7 +1409,7 @@ LBB4_20:
CMPL DX, $99
JA LBB4_22
MOVL DX, AX
LONG $0xd80d8d48; WORD $0x0096; BYTE $0x00 // leaq $38616(%rip), %rcx /* _Digits(%rip) */
LONG $0x020d8d48; WORD $0x0097; BYTE $0x00 // leaq $38658(%rip), %rcx /* _Digits(%rip) */
MOVB 0(CX)(AX*2), DX
MOVB 1(CX)(AX*2), AX
MOVB DX, 0(DI)
@ -1434,7 +1434,7 @@ LBB4_22:
WORD $0xc96b; BYTE $0x64 // imull $100, %ecx, %ecx
SUBL CX, AX
MOVWLZX AX, AX
LONG $0x870d8d48; WORD $0x0096; BYTE $0x00 // leaq $38535(%rip), %rcx /* _Digits(%rip) */
LONG $0xb10d8d48; WORD $0x0096; BYTE $0x00 // leaq $38577(%rip), %rcx /* _Digits(%rip) */
MOVB 0(CX)(AX*2), DX
MOVB 1(CX)(AX*2), AX
MOVB DX, 1(DI)
@ -1446,7 +1446,7 @@ LBB4_24:
WORD $0xc86b; BYTE $0x64 // imull $100, %eax, %ecx
SUBL CX, DX
MOVWLZX AX, AX
LONG $0x64058d4c; WORD $0x0096; BYTE $0x00 // leaq $38500(%rip), %r8 /* _Digits(%rip) */
LONG $0x8e058d4c; WORD $0x0096; BYTE $0x00 // leaq $38542(%rip), %r8 /* _Digits(%rip) */
MOVB 0(R8)(AX*2), CX
MOVB 1(R8)(AX*2), AX
MOVB CX, 0(DI)
@ -1544,8 +1544,8 @@ _quote:
MOVQ CX, R14
MOVQ DI, R12
TESTB $1, R8
LONG $0x01058d48; WORD $0x0096; BYTE $0x00 // leaq $38401(%rip), %rax /* __SingleQuoteTab(%rip) */
LONG $0xfa158d4c; WORD $0x00a5; BYTE $0x00 // leaq $42490(%rip), %r10 /* __DoubleQuoteTab(%rip) */
LONG $0x2b058d48; WORD $0x0096; BYTE $0x00 // leaq $38443(%rip), %rax /* __SingleQuoteTab(%rip) */
LONG $0x24158d4c; WORD $0x00a6; BYTE $0x00 // leaq $42532(%rip), %r10 /* __DoubleQuoteTab(%rip) */
LONG $0xd0440f4c // cmoveq %rax, %r10
MOVQ DX, R8
MOVQ DI, AX
@ -1770,7 +1770,7 @@ LBB5_26:
LBB5_27:
TESTQ CX, CX
MOVQ BX, R14
LONG $0xa00d8d4c; WORD $0x0092; BYTE $0x00 // leaq $37536(%rip), %r9 /* __SingleQuoteTab(%rip) */
LONG $0xca0d8d4c; WORD $0x0092; BYTE $0x00 // leaq $37578(%rip), %r9 /* __SingleQuoteTab(%rip) */
JLE LBB5_60
MOVQ SI, DX
TESTQ SI, SI
@ -2282,7 +2282,7 @@ LBB6_20:
LBB6_34:
ADDQ BX, AX
MOVBLZX -1(R9), CX
LONG $0x521d8d48; WORD $0x00ad; BYTE $0x00 // leaq $44370(%rip), %rbx /* __UnquoteTab(%rip) */
LONG $0x7c1d8d48; WORD $0x00ad; BYTE $0x00 // leaq $44412(%rip), %rbx /* __UnquoteTab(%rip) */
MOVB 0(CX)(BX*1), CX
CMPB CX, $-1
JE LBB6_38
@ -2701,14 +2701,14 @@ _atof_eisel_lemire64:
MOVL DX, R15
MOVQ DI, BX
MOVQ CX, -48(BP)
LONG $0x002ddbe8; BYTE $0x00 // callq _count_len_u64
LONG $0x002e05e8; BYTE $0x00 // callq _count_len_u64
MOVL AX, R8
MOVL AX, CX
NEGL CX
SHLQ CX, BX
MOVL R14, CX
SHLQ $4, CX
LONG $0x010d8d4c; WORD $0x0031; BYTE $0x00 // leaq $12545(%rip), %r9 /* _POW10_M128_TAB(%rip) */
LONG $0x2b0d8d4c; WORD $0x0031; BYTE $0x00 // leaq $12587(%rip), %r9 /* _POW10_M128_TAB(%rip) */
MOVQ BX, AX
MULQ 8(CX)(R9*1)
MOVQ AX, R10
@ -2843,7 +2843,7 @@ LBB8_5:
MOVQ BX, -48(BP)
JLE LBB8_12
XORL R12, R12
LONG $0xc4358d4c; WORD $0x005a; BYTE $0x00 // leaq $23236(%rip), %r14 /* _POW_TAB(%rip) */
LONG $0xee358d4c; WORD $0x005a; BYTE $0x00 // leaq $23278(%rip), %r14 /* _POW_TAB(%rip) */
JMP LBB8_8
LBB8_10:
@ -2855,7 +2855,7 @@ LBB8_10:
LBB8_11:
MOVQ R15, DI
MOVL BX, SI
LONG $0x002dbee8; BYTE $0x00 // callq _right_shift
LONG $0x002de8e8; BYTE $0x00 // callq _right_shift
LBB8_7:
ADDL BX, R12
@ -2872,7 +2872,7 @@ LBB8_8:
JMP LBB8_7
LBB8_12:
LONG $0x7d358d4c; WORD $0x005a; BYTE $0x00 // leaq $23165(%rip), %r14 /* _POW_TAB(%rip) */
LONG $0xa7358d4c; WORD $0x005a; BYTE $0x00 // leaq $23207(%rip), %r14 /* _POW_TAB(%rip) */
JMP LBB8_14
LBB8_18:
@ -2883,7 +2883,7 @@ LBB8_18:
LBB8_20:
MOVQ R15, DI
MOVL BX, SI
LONG $0x002bf4e8; BYTE $0x00 // callq _left_shift
LONG $0x002c1ee8; BYTE $0x00 // callq _left_shift
MOVL 804(R15), AX
LBB8_13:
@ -2923,7 +2923,7 @@ LBB8_21:
LBB8_25:
MOVQ R15, DI
MOVL $60, SI
LONG $0x002d10e8; BYTE $0x00 // callq _right_shift
LONG $0x002d3ae8; BYTE $0x00 // callq _right_shift
ADDL $60, R12
CMPL R12, $-120
JL LBB8_25
@ -2949,7 +2949,7 @@ LBB8_31:
NEGL R12
MOVQ R15, DI
MOVL R12, SI
LONG $0x002ccae8; BYTE $0x00 // callq _right_shift
LONG $0x002cf4e8; BYTE $0x00 // callq _right_shift
MOVL $-1022, R14
LBB8_32:
@ -2957,7 +2957,7 @@ LBB8_32:
JE LBB8_34
MOVQ R15, DI
MOVL $53, SI
LONG $0x002b29e8; BYTE $0x00 // callq _left_shift
LONG $0x002b53e8; BYTE $0x00 // callq _left_shift
LBB8_34:
MOVL 804(R15), AX
@ -4510,7 +4510,7 @@ LBB13_47:
JE LBB13_51
MOVL $1, R9
CMPB SI, $43
JNE LBB13_74
JNE LBB13_86
LBB13_51:
ADDQ $2, DX
@ -4521,7 +4521,7 @@ LBB13_51:
SETEQ AX
LEAL -1(AX)(AX*1), R9
MOVB 0(CX)(DX*1), SI
JMP LBB13_75
JMP LBB13_87
LBB13_53:
MOVQ R15, 0(R14)
@ -4543,79 +4543,34 @@ LBB13_57:
JE LBB13_63
LBB13_59:
TESTQ R12, R12
JS LBB13_62
TESTL BX, BX
JNE LBB13_62
MOVLQSX -60(BP), AX
IMULQ AX, R12
MOVQ R12, 16(R13)
LONG $0x2af3c1c4; BYTE $0xc4 // vcvtsi2sd %r12, %xmm1, %xmm0
JMP LBB13_91
TESTQ R12, R12
JNS LBB13_74
MOVQ R12, CX
ANDQ AX, CX
MOVQ $-9223372036854775808, DX
CMPQ CX, DX
JE LBB13_74
LBB13_62:
MOVQ $8, 0(R13)
JMP LBB13_63
LBB13_56:
MOVL $1, -44(BP)
TESTB R9, R9
JE LBB13_63
JMP LBB13_59
LBB13_74:
MOVQ AX, DX
LBB13_75:
LEAL -48(SI), AX
CMPB AX, $9
JA LBB13_5
XORL DI, DI
CMPQ DX, R15
JAE LBB13_93
CMPB AX, $9
JA LBB13_93
LEAQ -1(R15), R10
XORL DI, DI
LBB13_79:
MOVL DI, AX
CMPL DI, $10000
LEAL 0(AX)(AX*4), DI
MOVBLZX SI, SI
LEAL -48(SI)(DI*2), DI
WORD $0x4d0f; BYTE $0xf8 // cmovgel %eax, %edi
CMPQ R10, DX
JE LBB13_92
MOVBLZX 1(CX)(DX*1), SI
INCQ DX
LEAL -48(SI), AX
CMPB AX, $10
JB LBB13_79
JMP LBB13_93
LBB13_92:
MOVQ R15, DX
LBB13_93:
IMULL R9, DI
ADDL DI, BX
MOVQ DX, R15
LBB13_63:
MOVQ $0, -56(BP)
MOVQ $0, -72(BP)
MOVQ R12, AX
SHRQ $52, AX
JNE LBB13_85
JNE LBB13_79
LONG $0x6ef9c1c4; BYTE $0xc4 // vmovq %r12, %xmm0
QUAD $0xfffffc7f0562f9c5 // vpunpckldq $-897(%rip), %xmm0, %xmm0 /* LCPI13_0(%rip) */
QUAD $0xfffffc87055cf9c5 // vsubpd $-889(%rip), %xmm0, %xmm0 /* LCPI13_1(%rip) */
QUAD $0xfffffcd80562f9c5 // vpunpckldq $-808(%rip), %xmm0, %xmm0 /* LCPI13_0(%rip) */
QUAD $0xfffffce0055cf9c5 // vsubpd $-800(%rip), %xmm0, %xmm0 /* LCPI13_1(%rip) */
LONG $0x0579e3c4; WORD $0x01c8 // vpermilpd $1, %xmm0, %xmm1
LONG $0xc058f3c5 // vaddsd %xmm0, %xmm1, %xmm0
TESTB R8, R8
JE LBB13_66
QUAD $0xfffffc800557f9c5 // vxorpd $-896(%rip), %xmm0, %xmm0 /* LCPI13_2(%rip) */
QUAD $0xfffffcd90557f9c5 // vxorpd $-807(%rip), %xmm0, %xmm0 /* LCPI13_2(%rip) */
LBB13_66:
MOVQ $0, -56(BP)
@ -4627,84 +4582,136 @@ LBB13_66:
CMPL AX, $36
JA LBB13_72
CMPL BX, $23
JL LBB13_81
JL LBB13_75
LEAL -22(BX), AX
LONG $0x6b0d8d48; WORD $0x0152; BYTE $0x00 // leaq $86635(%rip), %rcx /* _P10_TAB(%rip) */
LONG $0xee0d8d48; WORD $0x0152; BYTE $0x00 // leaq $86766(%rip), %rcx /* _P10_TAB(%rip) */
LONG $0x0459fbc5; BYTE $0xc1 // vmulsd (%rcx,%rax,8), %xmm0, %xmm0
MOVL $22, AX
JMP LBB13_82
JMP LBB13_76
LBB13_71:
LONG $0x4511fbc5; BYTE $0xc8 // vmovsd %xmm0, $-56(%rbp)
JMP LBB13_91
JMP LBB13_85
LBB13_56:
MOVL $1, -44(BP)
TESTB R9, R9
JE LBB13_63
JMP LBB13_59
LBB13_72:
CMPL BX, $-22
JB LBB13_85
JB LBB13_79
NEGL BX
LONG $0x47058d48; WORD $0x0152; BYTE $0x00 // leaq $86599(%rip), %rax /* _P10_TAB(%rip) */
LONG $0xb5058d48; WORD $0x0152; BYTE $0x00 // leaq $86709(%rip), %rax /* _P10_TAB(%rip) */
LONG $0x045efbc5; BYTE $0xd8 // vdivsd (%rax,%rbx,8), %xmm0, %xmm0
LONG $0x4511fbc5; BYTE $0xc8 // vmovsd %xmm0, $-56(%rbp)
JMP LBB13_91
JMP LBB13_85
LBB13_81:
LBB13_74:
IMULQ AX, R12
MOVQ R12, 16(R13)
LONG $0x2af3c1c4; BYTE $0xc4 // vcvtsi2sd %r12, %xmm1, %xmm0
JMP LBB13_85
LBB13_75:
MOVL BX, AX
LBB13_82:
QUAD $0xfffffc2b052ef9c5 // vucomisd $-981(%rip), %xmm0 /* LCPI13_3(%rip) */
JA LBB13_85
QUAD $0xfffffc290d10fbc5 // vmovsd $-983(%rip), %xmm1 /* LCPI13_4(%rip) */
LBB13_76:
QUAD $0xfffffc5d052ef9c5 // vucomisd $-931(%rip), %xmm0 /* LCPI13_3(%rip) */
JA LBB13_79
QUAD $0xfffffc5b0d10fbc5 // vmovsd $-933(%rip), %xmm1 /* LCPI13_4(%rip) */
LONG $0xc82ef9c5 // vucomisd %xmm0, %xmm1
JA LBB13_85
JA LBB13_79
MOVL AX, AX
LONG $0x150d8d48; WORD $0x0152; BYTE $0x00 // leaq $86549(%rip), %rcx /* _P10_TAB(%rip) */
LONG $0x710d8d48; WORD $0x0152; BYTE $0x00 // leaq $86641(%rip), %rcx /* _P10_TAB(%rip) */
LONG $0x0459fbc5; BYTE $0xc1 // vmulsd (%rcx,%rax,8), %xmm0, %xmm0
LONG $0x4511fbc5; BYTE $0xc8 // vmovsd %xmm0, $-56(%rbp)
JMP LBB13_91
JMP LBB13_85
LBB13_85:
LBB13_79:
MOVQ R11, -80(BP)
LEAQ -56(BP), CX
MOVQ R12, DI
MOVL BX, SI
MOVL -60(BP), DX
LONG $0xffe844e8; BYTE $0xff // callq _atof_eisel_lemire64
LONG $0xffe876e8; BYTE $0xff // callq _atof_eisel_lemire64
TESTL AX, AX
JE LBB13_89
JE LBB13_83
CMPL -44(BP), $0
JE LBB13_90
JE LBB13_84
INCQ R12
LEAQ -72(BP), CX
MOVQ R12, DI
MOVL BX, SI
MOVL -60(BP), DX
LONG $0xffe826e8; BYTE $0xff // callq _atof_eisel_lemire64
LONG $0xffe858e8; BYTE $0xff // callq _atof_eisel_lemire64
TESTL AX, AX
JE LBB13_89
JE LBB13_83
LONG $0x4d10fbc5; BYTE $0xb8 // vmovsd $-72(%rbp), %xmm1
LONG $0x4510fbc5; BYTE $0xc8 // vmovsd $-56(%rbp), %xmm0
LONG $0xc82ef9c5 // vucomisd %xmm0, %xmm1
JNE LBB13_89
JNP LBB13_91
JNE LBB13_83
JNP LBB13_85
LBB13_89:
LBB13_83:
MOVQ -88(BP), CX
MOVQ 0(CX), DI
MOVQ -80(BP), AX
ADDQ AX, DI
MOVL 8(CX), SI
SUBL AX, SI
LONG $0xffee99e8; BYTE $0xff // callq _atof_native_decimal
JMP LBB13_91
LONG $0xffeecbe8; BYTE $0xff // callq _atof_native_decimal
JMP LBB13_85
LBB13_90:
LBB13_84:
LONG $0x4510fbc5; BYTE $0xc8 // vmovsd $-56(%rbp), %xmm0
LBB13_91:
LBB13_85:
LONG $0x117bc1c4; WORD $0x0845 // vmovsd %xmm0, $8(%r13)
MOVQ R15, 0(R14)
JMP LBB13_54
LBB13_86:
MOVQ AX, DX
LBB13_87:
LEAL -48(SI), AX
CMPB AX, $9
JA LBB13_5
XORL DI, DI
CMPQ DX, R15
JAE LBB13_94
CMPB AX, $9
JA LBB13_94
LEAQ -1(R15), R10
XORL DI, DI
LBB13_91:
MOVL DI, AX
CMPL DI, $10000
LEAL 0(AX)(AX*4), DI
MOVBLZX SI, SI
LEAL -48(SI)(DI*2), DI
WORD $0x4d0f; BYTE $0xf8 // cmovgel %eax, %edi
CMPQ R10, DX
JE LBB13_93
MOVBLZX 1(CX)(DX*1), SI
INCQ DX
LEAL -48(SI), AX
CMPB AX, $10
JB LBB13_91
JMP LBB13_94
LBB13_93:
MOVQ R15, DX
LBB13_94:
IMULL R9, DI
ADDL DI, BX
MOVQ DX, R15
JMP LBB13_63
_vsigned:
BYTE $0x55 // pushq %rbp
WORD $0x8948; BYTE $0xe5 // movq %rsp, %rbp
@ -5277,7 +5284,7 @@ LBB17_64:
LEAQ -56(BP), CX
MOVQ R10, R15
WORD $0xf8c5; BYTE $0x77 // vzeroupper
LONG $0xfff28ae8; BYTE $0xff // callq _advance_string
LONG $0xfff260e8; BYTE $0xff // callq _advance_string
MOVQ AX, BX
TESTQ AX, AX
JS LBB17_103
@ -5388,7 +5395,7 @@ LBB17_81:
LEAQ -56(BP), CX
MOVQ R10, R15
WORD $0xf8c5; BYTE $0x77 // vzeroupper
LONG $0xfff0d0e8; BYTE $0xff // callq _advance_string
LONG $0xfff0a6e8; BYTE $0xff // callq _advance_string
MOVQ AX, BX
TESTQ AX, AX
JS LBB17_103
@ -5811,7 +5818,7 @@ _skip_string:
MOVQ 8(R15), SI
LEAQ -32(BP), CX
MOVQ BX, DX
LONG $0xffeb7fe8; BYTE $0xff // callq _advance_string
LONG $0xffeb55e8; BYTE $0xff // callq _advance_string
TESTQ AX, AX
JS LBB20_2
DECQ BX
@ -13360,7 +13367,7 @@ TEXT ·__skip_array(SB), NOSPLIT, $0 - 32
MOVQ s+0(FP), DI
MOVQ p+8(FP), SI
MOVQ m+16(FP), DX
CALL ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+18316(SB) // _skip_array
CALL ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+18358(SB) // _skip_array
MOVQ AX, ret+24(FP)
RET
@ -13368,7 +13375,7 @@ TEXT ·__skip_object(SB), NOSPLIT, $0 - 32
MOVQ s+0(FP), DI
MOVQ p+8(FP), SI
MOVQ m+16(FP), DX
CALL ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+18351(SB) // _skip_object
CALL ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+18393(SB) // _skip_object
MOVQ AX, ret+24(FP)
RET
@ -13376,7 +13383,7 @@ TEXT ·__skip_one(SB), NOSPLIT, $0 - 32
MOVQ s+0(FP), DI
MOVQ p+8(FP), SI
MOVQ m+16(FP), DX
CALL ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+15516(SB) // _skip_one
CALL ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+15558(SB) // _skip_one
MOVQ AX, ret+24(FP)
RET
@ -13418,7 +13425,7 @@ TEXT ·__vsigned(SB), NOSPLIT, $0 - 24
MOVQ s+0(FP), DI
MOVQ p+8(FP), SI
MOVQ v+16(FP), DX
LEAQ ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+14966(SB), AX // _vsigned
LEAQ ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+15008(SB), AX // _vsigned
JMP AX
TEXT ·__vstring(SB), NOSPLIT, $0 - 24
@ -13432,5 +13439,5 @@ TEXT ·__vunsigned(SB), NOSPLIT, $0 - 24
MOVQ s+0(FP), DI
MOVQ p+8(FP), SI
MOVQ v+16(FP), DX
LEAQ ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+15243(SB), AX // _vunsigned
LEAQ ·___asm2asm_compiled_code__DO_NOT_CALL_THIS_SYMBOL___+15285(SB), AX // _vunsigned
JMP AX

View file

@ -19,16 +19,16 @@ var (
_subr__lspace = **(**uintptr)(unsafe.Pointer(&_func__base)) + 366
_subr__lzero = **(**uintptr)(unsafe.Pointer(&_func__base)) + 0
_subr__quote = **(**uintptr)(unsafe.Pointer(&_func__base)) + 5202
_subr__skip_array = **(**uintptr)(unsafe.Pointer(&_func__base)) + 18316
_subr__skip_object = **(**uintptr)(unsafe.Pointer(&_func__base)) + 18351
_subr__skip_one = **(**uintptr)(unsafe.Pointer(&_func__base)) + 15516
_subr__skip_array = **(**uintptr)(unsafe.Pointer(&_func__base)) + 18358
_subr__skip_object = **(**uintptr)(unsafe.Pointer(&_func__base)) + 18393
_subr__skip_one = **(**uintptr)(unsafe.Pointer(&_func__base)) + 15558
_subr__u64toa = **(**uintptr)(unsafe.Pointer(&_func__base)) + 3882
_subr__unquote = **(**uintptr)(unsafe.Pointer(&_func__base)) + 7039
_subr__value = **(**uintptr)(unsafe.Pointer(&_func__base)) + 11282
_subr__vnumber = **(**uintptr)(unsafe.Pointer(&_func__base)) + 13846
_subr__vsigned = **(**uintptr)(unsafe.Pointer(&_func__base)) + 14966
_subr__vsigned = **(**uintptr)(unsafe.Pointer(&_func__base)) + 15008
_subr__vstring = **(**uintptr)(unsafe.Pointer(&_func__base)) + 12993
_subr__vunsigned = **(**uintptr)(unsafe.Pointer(&_func__base)) + 15243
_subr__vunsigned = **(**uintptr)(unsafe.Pointer(&_func__base)) + 15285
)
var (

View file

@ -545,13 +545,17 @@ static inline double parse_float64(uint64_t man, int exp, int sgn, int trunc, co
return atof_native_decimal(src->buf + idx, src->len - idx);
}
static bool inline is_overflow(uint64_t man, int sgn, int exp10) {
return exp10 != 0 ||
((man >> 63) == 1 && ((uint64_t)sgn & man) != (1ull << 63));
}
void vnumber(const GoString *src, long *p, JsonState *ret) {
int dig;
int sgn = 1;
uint64_t man = 0; // mantissa for double (float64)
int man_nd = 0; // # digits of mantissa, 10^19 fits uint64_t
int exp10 = 0; // man * exp10 represents the true value
int exp10 = 0; // val = sgn * man * 10 ^ exp10
int trunc = 0;
/* initial buffer pointers */
@ -631,10 +635,10 @@ void vnumber(const GoString *src, long *p, JsonState *ret) {
}
if (ret->vt == V_INTEGER) {
if ( exp10 == 0 && (man >> 63) == 0) {
if (!is_overflow(man, sgn, exp10)) {
ret->iv = (int64_t)man * sgn;
ret->dv = (double)(ret->iv);
} else { // integer overflow
} else {
set_vt(V_DOUBLE)
}
}

114
use_number_test.go Normal file
View file

@ -0,0 +1,114 @@
/*
* Copyright 2021 ByteDance Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sonic
import (
"encoding/json"
"reflect"
"testing"
"github.com/bytedance/sonic/decoder"
)
type useInt64Test struct {
in string
out int64
}
type useFloatTest struct {
in string
out float64
}
var useinttest = []useInt64Test{
// int64
{"0", 0},
{"1", 1},
{"-1", -1},
{"100", 100},
{"-9223372036854775807", -9223372036854775807},
{"-9223372036854775808", -9223372036854775808}, //min int64
{"9223372036854775807", 9223372036854775807}, //max int64
{"9223372036854775806", 9223372036854775806},
}
var usefloattest = []useFloatTest{
// float64
{"-9223372036854775809", -9223372036854775809}, // int64 overflow
{"9223372036854775808", 9223372036854775808}, // int64 overflow
{"1e2", 1e2},
{"1e-20", 1e-20},
{"1.0", 1},
}
func TestUseInt64(t *testing.T) {
for i, tt := range useinttest {
var sout interface{}
dc := decoder.NewDecoder(tt.in)
dc.UseInt64()
serr := dc.Decode(&sout)
if !reflect.DeepEqual(sout, tt.out) {
t.Errorf("Test %d, %#v\ngot:\n %#v\nexp:\n %#v\n", i, tt.in, sout, tt.in)
}
if serr != nil {
t.Errorf("Test %d, %#v\ngot:\n %#v\nexp:\n nil\n", i, tt, serr)
}
}
for i, tt := range usefloattest {
var sout interface{}
dc := decoder.NewDecoder(tt.in)
dc.UseInt64()
//the input string is not int64, still return float64
serr := dc.Decode(&sout)
if !reflect.DeepEqual(sout, tt.out) {
t.Errorf("Test %d, %#v\ngot:\n %#v\nexp:\n %#v\n", i, tt.in, sout, tt.in)
}
if serr != nil {
t.Errorf("Test %d, %#v\ngot:\n %#v\nexp:\n nil\n", i, tt, serr)
}
}
}
func TestUseNumber(t *testing.T) {
for i, tt := range useinttest {
var sout interface{}
dc := decoder.NewDecoder(tt.in)
dc.UseNumber()
serr := dc.Decode(&sout)
if !reflect.DeepEqual(sout, json.Number(tt.in)) {
t.Errorf("Test %d, %#v\ngot:\n %#v\nexp:\n %#v\n", i, tt.in, sout, tt.out)
}
if serr != nil {
t.Errorf("Test %d, %#v\ngot:\n %#v\nexp:\n nil\n", i, tt, serr)
}
}
for i, tt := range usefloattest {
var sout interface{}
dc := decoder.NewDecoder(tt.in)
dc.UseNumber()
serr := dc.Decode(&sout)
if !reflect.DeepEqual(sout, json.Number(tt.in)) {
t.Errorf("Test %d, %#v\ngot:\n %#v\nexp:\n %#v\n", i, tt.in, sout, tt.out)
}
if serr != nil {
t.Errorf("Test %d, %#v\ngot:\n %#v\nexp:\n nil\n", i, tt, serr)
}
}
}