diff --git a/internal/native/avx/native_amd64.s b/internal/native/avx/native_amd64.s index 617832f..392f765 100644 --- a/internal/native/avx/native_amd64.s +++ b/internal/native/avx/native_amd64.s @@ -291,7 +291,7 @@ LBB2_5: LONG $0x4fdc6941; WORD $0x1293; BYTE $0x00 // imull $1217359, %r12d, %ebx MOVQ R12, AX SHLQ $4, AX - LONG $0x250d8d48; WORD $0x0075; BYTE $0x00 // leaq $29989(%rip), %rcx /* _DOUBLE_POW5_INV_SPLIT(%rip) */ + LONG $0x940d8d48; WORD $0x0075; BYTE $0x00 // leaq $30100(%rip), %rcx /* _DOUBLE_POW5_INV_SPLIT(%rip) */ MOVQ R8, DI ORQ $2, DI MOVQ 0(AX)(CX*1), R10 @@ -378,7 +378,7 @@ LBB2_12: SHRL $19, BX MOVLQSX AX, SI SHLQ $4, SI - LONG $0x50158d4c; WORD $0x0089; BYTE $0x00 // leaq $35152(%rip), %r10 /* _DOUBLE_POW5_SPLIT(%rip) */ + LONG $0xbf158d4c; WORD $0x0089; BYTE $0x00 // leaq $35263(%rip), %r10 /* _DOUBLE_POW5_SPLIT(%rip) */ MOVQ R8, DI ORQ $2, DI MOVQ 0(SI)(R10*1), R14 @@ -791,7 +791,7 @@ LBB2_61: LEAQ 1(R13), BX MOVQ BX, SI MOVL R15, DX - LONG $0x003ec3e8; BYTE $0x00 // callq _print_mantissa + LONG $0x003f32e8; BYTE $0x00 // callq _print_mantissa MOVB 1(R13), AX MOVB AX, 0(R13) MOVL $1, AX @@ -820,7 +820,7 @@ LBB2_66: LEAL 0(CX)(CX*1), AX LEAL 0(AX)(AX*4), AX SUBL AX, R14 - LONG $0x22058d48; WORD $0x0098; BYTE $0x00 // leaq $38946(%rip), %rax /* _Digits(%rip) */ + LONG $0x91058d48; WORD $0x0098; BYTE $0x00 // leaq $39057(%rip), %rax /* _Digits(%rip) */ MOVWLZX 0(AX)(CX*2), AX MOVL BX, CX MOVW AX, 0(R13)(CX*1) @@ -856,7 +856,7 @@ LBB2_70: CMPL R14, $10 JL LBB2_85 MOVLQSX R14, AX - LONG $0xb40d8d48; WORD $0x0097; BYTE $0x00 // leaq $38836(%rip), %rcx /* _Digits(%rip) */ + LONG $0x230d8d48; WORD $0x0098; BYTE $0x00 // leaq $38947(%rip), %rcx /* _Digits(%rip) */ MOVWLZX 0(CX)(AX*2), AX MOVL BX, CX MOVW AX, 0(R13)(CX*1) @@ -875,7 +875,7 @@ LBB2_74: MOVL BX, SI ADDQ -64(BP), SI MOVL R15, DX - LONG $0x003dbfe8; BYTE $0x00 // callq _print_mantissa + LONG $0x003e2ee8; BYTE $0x00 // callq _print_mantissa TESTL R13, R13 JE LBB2_78 LEAL 0(R13)(BX*1), AX @@ -1079,7 +1079,7 @@ LBB2_105: MOVQ R13, SI MOVL R15, DX WORD $0xf8c5; BYTE $0x77 // vzeroupper - LONG $0x003aade8; BYTE $0x00 // callq _print_mantissa + LONG $0x003b1ce8; BYTE $0x00 // callq _print_mantissa ADDL BX, R15 MOVL R15, BX @@ -1172,7 +1172,7 @@ _u64toa: ADDQ AX, AX CMPL SI, $1000 JB LBB4_3 - LONG $0x760d8d48; WORD $0x0093; BYTE $0x00 // leaq $37750(%rip), %rcx /* _Digits(%rip) */ + LONG $0xe50d8d48; WORD $0x0093; BYTE $0x00 // leaq $37861(%rip), %rcx /* _Digits(%rip) */ MOVB 0(DX)(CX*1), CX MOVB CX, 0(DI) MOVL $1, CX @@ -1186,14 +1186,14 @@ LBB4_3: LBB4_4: MOVWLZX DX, DX ORQ $1, DX - LONG $0x55358d48; WORD $0x0093; BYTE $0x00 // leaq $37717(%rip), %rsi /* _Digits(%rip) */ + LONG $0xc4358d48; WORD $0x0093; BYTE $0x00 // leaq $37828(%rip), %rsi /* _Digits(%rip) */ MOVB 0(DX)(SI*1), DX MOVL CX, SI INCL CX MOVB DX, 0(DI)(SI*1) LBB4_6: - LONG $0x44158d48; WORD $0x0093; BYTE $0x00 // leaq $37700(%rip), %rdx /* _Digits(%rip) */ + LONG $0xb3158d48; WORD $0x0093; BYTE $0x00 // leaq $37811(%rip), %rdx /* _Digits(%rip) */ MOVB 0(AX)(DX*1), DX MOVL CX, SI INCL CX @@ -1202,7 +1202,7 @@ LBB4_6: LBB4_7: MOVWLZX AX, AX ORQ $1, AX - LONG $0x2c158d48; WORD $0x0093; BYTE $0x00 // leaq $37676(%rip), %rdx /* _Digits(%rip) */ + LONG $0x9b158d48; WORD $0x0093; BYTE $0x00 // leaq $37787(%rip), %rdx /* _Digits(%rip) */ MOVB 0(AX)(DX*1), AX MOVL CX, DX INCL CX @@ -1249,7 +1249,7 @@ LBB4_8: ADDQ R11, R11 CMPL SI, $10000000 JB LBB4_11 - LONG $0x95058d48; WORD $0x0092; BYTE $0x00 // leaq $37525(%rip), %rax /* _Digits(%rip) */ + LONG $0x04058d48; WORD $0x0093; BYTE $0x00 // leaq $37636(%rip), %rax /* _Digits(%rip) */ MOVB 0(R10)(AX*1), AX MOVB AX, 0(DI) MOVL $1, CX @@ -1263,14 +1263,14 @@ LBB4_11: LBB4_12: MOVL R10, AX ORQ $1, AX - LONG $0x70358d48; WORD $0x0092; BYTE $0x00 // leaq $37488(%rip), %rsi /* _Digits(%rip) */ + LONG $0xdf358d48; WORD $0x0092; BYTE $0x00 // leaq $37599(%rip), %rsi /* _Digits(%rip) */ MOVB 0(AX)(SI*1), AX MOVL CX, SI INCL CX MOVB AX, 0(DI)(SI*1) LBB4_14: - LONG $0x5f058d48; WORD $0x0092; BYTE $0x00 // leaq $37471(%rip), %rax /* _Digits(%rip) */ + LONG $0xce058d48; WORD $0x0092; BYTE $0x00 // leaq $37582(%rip), %rax /* _Digits(%rip) */ MOVB 0(R9)(AX*1), AX MOVL CX, SI INCL CX @@ -1279,7 +1279,7 @@ LBB4_14: LBB4_15: MOVWLZX R9, AX ORQ $1, AX - LONG $0x45358d48; WORD $0x0092; BYTE $0x00 // leaq $37445(%rip), %rsi /* _Digits(%rip) */ + LONG $0xb4358d48; WORD $0x0092; BYTE $0x00 // leaq $37556(%rip), %rsi /* _Digits(%rip) */ MOVB 0(AX)(SI*1), AX MOVL CX, DX MOVB AX, 0(DX)(DI*1) @@ -1361,7 +1361,7 @@ LBB4_16: MOVL $16, CX SUBL AX, CX SHLQ $4, AX - LONG $0xba158d48; WORD $0x0091; BYTE $0x00 // leaq $37306(%rip), %rdx /* _VecShiftShuffles(%rip) */ + LONG $0x29158d48; WORD $0x0092; BYTE $0x00 // leaq $37417(%rip), %rdx /* _VecShiftShuffles(%rip) */ LONG $0x0071e2c4; WORD $0x1004 // vpshufb (%rax,%rdx), %xmm1, %xmm0 LONG $0x077ffac5 // vmovdqu %xmm0, (%rdi) MOVL CX, AX @@ -1387,7 +1387,7 @@ LBB4_20: CMPL DX, $99 JA LBB4_22 MOVL DX, AX - LONG $0x9d0d8d48; WORD $0x0090; BYTE $0x00 // leaq $37021(%rip), %rcx /* _Digits(%rip) */ + LONG $0x0c0d8d48; WORD $0x0091; BYTE $0x00 // leaq $37132(%rip), %rcx /* _Digits(%rip) */ MOVB 0(CX)(AX*2), DX MOVB 1(CX)(AX*2), AX MOVB DX, 0(DI) @@ -1412,7 +1412,7 @@ LBB4_22: WORD $0xc96b; BYTE $0x64 // imull $100, %ecx, %ecx SUBL CX, AX MOVWLZX AX, AX - LONG $0x4c0d8d48; WORD $0x0090; BYTE $0x00 // leaq $36940(%rip), %rcx /* _Digits(%rip) */ + LONG $0xbb0d8d48; WORD $0x0090; BYTE $0x00 // leaq $37051(%rip), %rcx /* _Digits(%rip) */ MOVB 0(CX)(AX*2), DX MOVB 1(CX)(AX*2), AX MOVB DX, 1(DI) @@ -1424,7 +1424,7 @@ LBB4_24: WORD $0xc86b; BYTE $0x64 // imull $100, %eax, %ecx SUBL CX, DX MOVWLZX AX, AX - LONG $0x29058d4c; WORD $0x0090; BYTE $0x00 // leaq $36905(%rip), %r8 /* _Digits(%rip) */ + LONG $0x98058d4c; WORD $0x0090; BYTE $0x00 // leaq $37016(%rip), %r8 /* _Digits(%rip) */ MOVB 0(R8)(AX*2), CX MOVB 1(R8)(AX*2), AX MOVB CX, 0(DI) @@ -1509,8 +1509,8 @@ _quote: SUBQ $32, SP MOVQ DX, R10 TESTB $1, R8 - LONG $0x2b058d48; WORD $0x0090; BYTE $0x00 // leaq $36907(%rip), %rax /* __SingleQuoteTab(%rip) */ - LONG $0x24158d48; WORD $0x00a0; BYTE $0x00 // leaq $40996(%rip), %rdx /* __DoubleQuoteTab(%rip) */ + LONG $0x9a058d48; WORD $0x0090; BYTE $0x00 // leaq $37018(%rip), %rax /* __SingleQuoteTab(%rip) */ + LONG $0x93158d48; WORD $0x00a0; BYTE $0x00 // leaq $41107(%rip), %rdx /* __DoubleQuoteTab(%rip) */ LONG $0xd0440f48 // cmoveq %rax, %rdx MOVQ R10, R8 MOVQ DI, AX @@ -1600,7 +1600,7 @@ LBB5_10: TESTQ R10, R10 MOVQ -48(BP), CX MOVQ -56(BP), DI - LONG $0xd92d8d4c; WORD $0x008e; BYTE $0x00 // leaq $36569(%rip), %r13 /* __SingleQuoteTab(%rip) */ + LONG $0x482d8d4c; WORD $0x008f; BYTE $0x00 // leaq $36680(%rip), %r13 /* __SingleQuoteTab(%rip) */ JLE LBB5_39 LBB5_35: @@ -1867,7 +1867,7 @@ _unquote: MOVQ R8, -72(BP) MOVL R8, R10 ANDL $1, R10 - LONG $0xfa058d4c; WORD $0x00ab; BYTE $0x00 // leaq $44026(%rip), %r8 /* __UnquoteTab(%rip) */ + LONG $0x69058d4c; WORD $0x00ac; BYTE $0x00 // leaq $44137(%rip), %r8 /* __UnquoteTab(%rip) */ QUAD $0xffffffb2056ffac5 // vmovdqu $-78(%rip), %xmm0 /* LCPI6_0(%rip) */ MOVQ DI, R9 MOVQ SI, R13 @@ -2550,7 +2550,7 @@ _html_escape: QUAD $0xffffff92156ffac5 // vmovdqu $-110(%rip), %xmm2 /* LCPI7_2(%rip) */ QUAD $0xffffff9a1d6ffac5 // vmovdqu $-102(%rip), %xmm3 /* LCPI7_3(%rip) */ MOVQ $5764607797912141824, R14 - LONG $0x5e3d8d4c; WORD $0x00a4; BYTE $0x00 // leaq $42078(%rip), %r15 /* __HtmlQuoteTab(%rip) */ + LONG $0xcd3d8d4c; WORD $0x00a4; BYTE $0x00 // leaq $42189(%rip), %r15 /* __HtmlQuoteTab(%rip) */ MOVQ $12884901889, DI MOVQ -64(BP), AX MOVQ -48(BP), R10 @@ -2885,7 +2885,7 @@ LBB8_5: SHLQ CX, DI MOVL AX, CX SHLQ $4, CX - LONG $0xe93d8d4c; WORD $0x0028; BYTE $0x00 // leaq $10473(%rip), %r15 /* _POW10_M128_TAB(%rip) */ + LONG $0x583d8d4c; WORD $0x0029; BYTE $0x00 // leaq $10584(%rip), %r15 /* _POW10_M128_TAB(%rip) */ MOVQ DI, AX MULQ 8(CX)(R15*1) MOVQ AX, R11 @@ -3008,7 +3008,7 @@ LBB9_7: NEGL BX MOVQ R12, DI MOVL BX, SI - LONG $0x002634e8; BYTE $0x00 // callq _right_shift + LONG $0x0026a3e8; BYTE $0x00 // callq _right_shift LBB9_8: ADDL R14, R15 @@ -3021,7 +3021,7 @@ LBB9_9: CMPL AX, $8 JG LBB9_11 MOVL AX, AX - LONG $0xe50d8d48; WORD $0x0052; BYTE $0x00 // leaq $21221(%rip), %rcx /* _POW_TAB(%rip) */ + LONG $0x540d8d48; WORD $0x0053; BYTE $0x00 // leaq $21332(%rip), %rcx /* _POW_TAB(%rip) */ MOVL 0(CX)(AX*4), R14 LBB9_11: @@ -3039,7 +3039,7 @@ LBB9_11: LBB9_15: MOVQ R12, DI MOVL $60, SI - LONG $0x0025e2e8; BYTE $0x00 // callq _right_shift + LONG $0x002651e8; BYTE $0x00 // callq _right_shift LEAL 60(BX), AX CMPL BX, $-120 MOVL AX, BX @@ -3053,7 +3053,7 @@ LBB9_16: LBB9_17: MOVQ R12, DI MOVL $60, SI - LONG $0x002454e8; BYTE $0x00 // callq _left_shift + LONG $0x0024c3e8; BYTE $0x00 // callq _left_shift LEAL -60(BX), SI CMPL BX, $120 MOVL SI, BX @@ -3065,12 +3065,12 @@ LBB9_18: LBB9_19: MOVQ R12, DI - LONG $0x00243ee8; BYTE $0x00 // callq _left_shift + LONG $0x0024ade8; BYTE $0x00 // callq _left_shift JMP LBB9_8 LBB9_20: MOVQ R12, DI - LONG $0x002431e8; BYTE $0x00 // callq _left_shift + LONG $0x0024a0e8; BYTE $0x00 // callq _left_shift LBB9_21: SUBL R14, R15 @@ -3093,7 +3093,7 @@ LBB9_25: LBB9_26: NEGL AX WORD $0x9848 // cltq - LONG $0x3f0d8d48; WORD $0x0052; BYTE $0x00 // leaq $21055(%rip), %rcx /* _POW_TAB(%rip) */ + LONG $0xae0d8d48; WORD $0x0052; BYTE $0x00 // leaq $21166(%rip), %rcx /* _POW_TAB(%rip) */ MOVL 0(CX)(AX*4), R14 LBB9_27: @@ -3111,7 +3111,7 @@ LBB9_27: LBB9_32: MOVQ R12, DI MOVL $60, SI - LONG $0x0023cce8; BYTE $0x00 // callq _left_shift + LONG $0x00243be8; BYTE $0x00 // callq _left_shift LEAL -60(BX), SI CMPL BX, $120 MOVL SI, BX @@ -3126,7 +3126,7 @@ LBB9_33: LBB9_34: MOVQ R12, DI MOVL $60, SI - LONG $0x002519e8; BYTE $0x00 // callq _right_shift + LONG $0x002588e8; BYTE $0x00 // callq _right_shift LEAL 60(BX), AX CMPL BX, $-120 MOVL AX, BX @@ -3136,7 +3136,7 @@ LBB9_35: NEGL BX MOVQ R12, DI MOVL BX, SI - LONG $0x002503e8; BYTE $0x00 // callq _right_shift + LONG $0x002572e8; BYTE $0x00 // callq _right_shift JMP LBB9_21 LBB9_36: @@ -3152,7 +3152,7 @@ LBB9_36: LBB9_40: MOVQ R12, DI MOVL $60, SI - LONG $0x0024cce8; BYTE $0x00 // callq _right_shift + LONG $0x00253be8; BYTE $0x00 // callq _right_shift ADDL $60, R15 CMPL R15, $-120 JL LBB9_40 @@ -3178,7 +3178,7 @@ LBB9_46: NEGL R15 MOVQ R12, DI MOVL R15, SI - LONG $0x002486e8; BYTE $0x00 // callq _right_shift + LONG $0x0024f5e8; BYTE $0x00 // callq _right_shift MOVL $-1022, R14 LBB9_47: @@ -3186,7 +3186,7 @@ LBB9_47: JE LBB9_49 MOVQ R12, DI MOVL $53, SI - LONG $0x0022fce8; BYTE $0x00 // callq _left_shift + LONG $0x00236be8; BYTE $0x00 // callq _left_shift LBB9_49: MOVLQSX 20(R12), R8 @@ -4787,7 +4787,7 @@ LBB15_71: CMPL DI, $23 JL LBB15_81 MOVLQSX DI, AX - LONG $0x5a0d8d48; WORD $0x00b4; BYTE $0x00 // leaq $46170(%rip), %rcx /* _P10_TAB(%rip) */ + LONG $0xc90d8d48; WORD $0x00b4; BYTE $0x00 // leaq $46281(%rip), %rcx /* _P10_TAB(%rip) */ QUAD $0xffff50c18459fbc5; BYTE $0xff // vmulsd $-176(%rcx,%rax,8), %xmm0, %xmm0 LONG $0x4511fbc5; BYTE $0xd0 // vmovsd %xmm0, $-48(%rbp) MOVL $22, AX @@ -4805,7 +4805,7 @@ LBB15_77: JB LBB15_60 NEGL DI MOVLQSX DI, AX - LONG $0x180d8d48; WORD $0x00b4; BYTE $0x00 // leaq $46104(%rip), %rcx /* _P10_TAB(%rip) */ + LONG $0x870d8d48; WORD $0x00b4; BYTE $0x00 // leaq $46215(%rip), %rcx /* _P10_TAB(%rip) */ LONG $0x045efbc5; BYTE $0xc1 // vdivsd (%rcx,%rax,8), %xmm0, %xmm0 JMP LBB15_65 @@ -4837,7 +4837,7 @@ LBB15_82: LONG $0xc82ef9c5 // vucomisd %xmm0, %xmm1 JA LBB15_60 MOVL AX, AX - LONG $0x9f0d8d48; WORD $0x00b3; BYTE $0x00 // leaq $45983(%rip), %rcx /* _P10_TAB(%rip) */ + LONG $0x0e0d8d48; WORD $0x00b4; BYTE $0x00 // leaq $46094(%rip), %rcx /* _P10_TAB(%rip) */ LONG $0x0459fbc5; BYTE $0xc1 // vmulsd (%rcx,%rax,8), %xmm0, %xmm0 JMP LBB15_65 @@ -5772,45 +5772,48 @@ _skip_number: WORD $0x8948; BYTE $0xe5 // movq %rsp, %rbp WORD $0x5741 // pushq %r15 WORD $0x5641 // pushq %r14 + WORD $0x5541 // pushq %r13 WORD $0x5441 // pushq %r12 BYTE $0x53 // pushq %rbx TESTQ SI, SI - JE LBB24_32 + JE LBB24_34 CMPB 0(DI), $48 JNE LBB24_5 - MOVL $1, AX + MOVL $1, DX CMPQ SI, $1 - JE LBB24_48 - MOVB 1(DI), CX - ADDB $-46, CX - CMPB CX, $55 - JA LBB24_48 - MOVBLZX CX, CX - MOVQ $36028797027352577, DX - BTQ CX, DX - JAE LBB24_48 + JE LBB24_52 + MOVB 1(DI), AX + ADDB $-46, AX + CMPB AX, $55 + JA LBB24_52 + MOVBLZX AX, AX + MOVQ $36028797027352577, CX + BTQ AX, CX + JAE LBB24_52 LBB24_5: - CMPQ SI, $15 - JBE LBB24_52 - MOVQ SI, R11 - ANDQ $-16, R11 - ADDQ DI, R11 - MOVQ $-1, R10 - QUAD $0xffffff1f056f7ac5 // vmovdqu $-225(%rip), %xmm8 /* LCPI24_0(%rip) */ - QUAD $0xffffff270d6f7ac5 // vmovdqu $-217(%rip), %xmm9 /* LCPI24_1(%rip) */ - QUAD $0xffffff2f156f7ac5 // vmovdqu $-209(%rip), %xmm10 /* LCPI24_2(%rip) */ - QUAD $0xffffff371d6f7ac5 // vmovdqu $-201(%rip), %xmm11 /* LCPI24_3(%rip) */ - QUAD $0xffffff3f256ffac5 // vmovdqu $-193(%rip), %xmm4 /* LCPI24_4(%rip) */ - QUAD $0xffffff472d6ffac5 // vmovdqu $-185(%rip), %xmm5 /* LCPI24_5(%rip) */ - QUAD $0xffffff4f356ffac5 // vmovdqu $-177(%rip), %xmm6 /* LCPI24_6(%rip) */ - MOVL $4294967295, R14 - MOVQ $-1, R8 + CMPQ SI, $16 + JB LBB24_57 + LEAQ -16(SI), R11 + MOVQ R11, AX + ANDQ $-16, AX + LEAQ 16(AX)(DI*1), R10 + ANDL $15, R11 MOVQ $-1, R9 - MOVQ DI, DX + QUAD $0xffffff15056f7ac5 // vmovdqu $-235(%rip), %xmm8 /* LCPI24_0(%rip) */ + QUAD $0xffffff1d0d6f7ac5 // vmovdqu $-227(%rip), %xmm9 /* LCPI24_1(%rip) */ + QUAD $0xffffff25156f7ac5 // vmovdqu $-219(%rip), %xmm10 /* LCPI24_2(%rip) */ + QUAD $0xffffff2d1d6f7ac5 // vmovdqu $-211(%rip), %xmm11 /* LCPI24_3(%rip) */ + QUAD $0xffffff35256ffac5 // vmovdqu $-203(%rip), %xmm4 /* LCPI24_4(%rip) */ + QUAD $0xffffff3d2d6ffac5 // vmovdqu $-195(%rip), %xmm5 /* LCPI24_5(%rip) */ + QUAD $0xffffff45356ffac5 // vmovdqu $-187(%rip), %xmm6 /* LCPI24_6(%rip) */ + MOVL $4294967295, R14 + MOVQ $-1, AX + MOVQ $-1, R8 + MOVQ DI, R15 LBB24_7: - LONG $0x3a6ffac5 // vmovdqu (%rdx), %xmm7 + LONG $0x6f7ac1c4; BYTE $0x3f // vmovdqu (%r15), %xmm7 LONG $0x6441c1c4; BYTE $0xc0 // vpcmpgtb %xmm8, %xmm7, %xmm0 LONG $0xcf64b1c5 // vpcmpgtb %xmm7, %xmm9, %xmm1 LONG $0xc1dbf9c5 // vpand %xmm1, %xmm0, %xmm0 @@ -5823,9 +5826,9 @@ LBB24_7: LONG $0xdfebe9c5 // vpor %xmm7, %xmm2, %xmm3 LONG $0xc0ebf1c5 // vpor %xmm0, %xmm1, %xmm0 LONG $0xc0ebe1c5 // vpor %xmm0, %xmm3, %xmm0 - LONG $0xc7d7f9c5 // vpmovmskb %xmm7, %eax - LONG $0xe2d779c5 // vpmovmskb %xmm2, %r12d - LONG $0xf9d779c5 // vpmovmskb %xmm1, %r15d + LONG $0xd7d7f9c5 // vpmovmskb %xmm7, %edx + LONG $0xead779c5 // vpmovmskb %xmm2, %r13d + LONG $0xe1d779c5 // vpmovmskb %xmm1, %r12d LONG $0xc8d7f9c5 // vpmovmskb %xmm0, %ecx XORQ R14, CX BSFQ CX, CX @@ -5834,242 +5837,277 @@ LBB24_7: MOVL $-1, BX SHLL CX, BX NOTL BX - ANDL BX, AX - ANDL BX, R12 - ANDL R15, BX - MOVL BX, R15 + ANDL BX, DX + ANDL BX, R13 + ANDL R12, BX + MOVL BX, R12 LBB24_9: - LEAL -1(AX), BX - ANDL AX, BX - JNE LBB24_46 + LEAL -1(DX), BX + ANDL DX, BX + JNE LBB24_50 + LEAL -1(R13), BX + ANDL R13, BX + JNE LBB24_50 LEAL -1(R12), BX ANDL R12, BX - JNE LBB24_46 - LEAL -1(R15), BX - ANDL R15, BX - JNE LBB24_46 - TESTL AX, AX + JNE LBB24_50 + TESTL DX, DX JE LBB24_15 - MOVQ DX, BX + MOVQ R15, BX SUBQ DI, BX - BSFL AX, AX - ADDQ BX, AX - CMPQ R9, $-1 - JNE LBB24_47 - MOVQ AX, R9 + BSFL DX, DX + ADDQ BX, DX + CMPQ R8, $-1 + JNE LBB24_51 + MOVQ DX, R8 LBB24_15: - TESTL R12, R12 + TESTL R13, R13 JE LBB24_18 - MOVQ DX, BX + MOVQ R15, BX SUBQ DI, BX - BSFL R12, AX - ADDQ BX, AX - CMPQ R8, $-1 - JNE LBB24_47 - MOVQ AX, R8 + BSFL R13, DX + ADDQ BX, DX + CMPQ AX, $-1 + JNE LBB24_51 + MOVQ DX, AX LBB24_18: - TESTL R15, R15 + TESTL R12, R12 JE LBB24_21 - MOVQ DX, BX + MOVQ R15, BX SUBQ DI, BX - BSFL R15, AX - ADDQ BX, AX - CMPQ R10, $-1 - JNE LBB24_47 - MOVQ AX, R10 + BSFL R12, DX + ADDQ BX, DX + CMPQ R9, $-1 + JNE LBB24_51 + MOVQ DX, R9 LBB24_21: - CMPL CX, $16 - JNE LBB24_33 - ADDQ $16, DX - ADDQ $-16, SI - CMPQ SI, $15 - JA LBB24_7 - -LBB24_23: - LONG $0x040d8d48; WORD $0x0001; BYTE $0x00 // leaq $260(%rip), %rcx /* LJTI24_0(%rip) */ + CMPL CX, $16 + JNE LBB24_35 + ADDQ $16, R15 + ADDQ $-16, SI + CMPQ SI, $15 + JA LBB24_7 + TESTQ R11, R11 + JE LBB24_36 LBB24_24: - MOVQ R11, DX - MOVBLSX 0(R11), AX - ADDL $-43, AX - CMPL AX, $58 - JA LBB24_34 - LEAQ 1(DX), R11 - MOVLQSX 0(CX)(AX*4), AX - ADDQ CX, AX - JMP AX + LEAQ 0(R10)(R11*1), CX + LONG $0x5b358d48; WORD $0x0001; BYTE $0x00 // leaq $347(%rip), %rsi /* LJTI24_0(%rip) */ + JMP LBB24_26 + +LBB24_25: + MOVQ BX, R10 + DECQ R11 + JE LBB24_54 LBB24_26: - MOVQ R11, AX - SUBQ DI, AX - CMPQ R10, $-1 - JNE LBB24_51 - DECQ AX - MOVQ AX, R10 - JMP LBB24_24 + MOVBLSX 0(R10), DX + ADDL $-43, DX + CMPL DX, $58 + JA LBB24_36 + LEAQ 1(R10), BX + MOVLQSX 0(SI)(DX*4), DX + ADDQ SI, DX + JMP DX LBB24_28: - MOVQ R11, AX - SUBQ DI, AX - CMPQ R8, $-1 - JNE LBB24_51 - DECQ AX - MOVQ AX, R8 - JMP LBB24_24 + MOVQ BX, DX + SUBQ DI, DX + CMPQ R9, $-1 + JNE LBB24_58 + DECQ DX + MOVQ DX, R9 + JMP LBB24_25 LBB24_30: - MOVQ R11, AX - SUBQ DI, AX - CMPQ R9, $-1 - JNE LBB24_51 - DECQ AX - MOVQ AX, R9 - JMP LBB24_24 + MOVQ BX, DX + SUBQ DI, DX + CMPQ AX, $-1 + JNE LBB24_58 + DECQ DX + MOVQ DX, AX + JMP LBB24_25 LBB24_32: - MOVQ $-1, AX - JMP LBB24_48 - -LBB24_33: - ADDQ CX, DX + MOVQ BX, DX + SUBQ DI, DX + CMPQ R8, $-1 + JNE LBB24_58 + DECQ DX + MOVQ DX, R8 + JMP LBB24_25 LBB24_34: - MOVQ $-1, AX - TESTQ R10, R10 - JE LBB24_48 + MOVQ $-1, AX + JMP LBB24_53 + +LBB24_35: + ADDQ CX, R15 + MOVQ R15, R10 + +LBB24_36: + MOVQ $-1, DX + TESTQ AX, AX + JE LBB24_52 + +LBB24_37: TESTQ R9, R9 - JE LBB24_48 - TESTQ R10, R10 - JLE LBB24_39 - LEAQ -1(R10), AX - CMPQ R8, AX - JE LBB24_39 - NOTQ R10 - MOVQ R10, AX - JMP LBB24_48 - -LBB24_39: - MOVQ R9, AX - ORQ R8, AX - CMPQ R9, R8 - JL LBB24_42 - TESTQ AX, AX - JS LBB24_42 - NOTQ R9 - MOVQ R9, AX - JMP LBB24_48 - -LBB24_42: - LEAQ -1(R8), CX + JE LBB24_52 + TESTQ R8, R8 + JE LBB24_52 + SUBQ DI, R10 + LEAQ -1(R10), CX + CMPQ AX, CX + JE LBB24_45 + CMPQ R8, CX + JE LBB24_45 CMPQ R9, CX - JNE LBB24_45 - TESTQ AX, AX - JS LBB24_45 - NOTQ R8 - MOVQ R8, AX - JMP LBB24_48 + JE LBB24_45 + TESTQ R9, R9 + JLE LBB24_46 + LEAQ -1(R9), CX + CMPQ AX, CX + JE LBB24_46 + NOTQ R9 + MOVQ R9, DX + MOVQ R9, AX + JMP LBB24_53 LBB24_45: - SUBQ DI, DX - MOVQ DX, AX - JMP LBB24_48 + NEGQ R10 + MOVQ R10, DX + MOVQ R10, AX + JMP LBB24_53 LBB24_46: - SUBQ DI, DX - BSFL BX, AX - ADDQ DX, AX + MOVQ R8, CX + ORQ AX, CX + CMPQ R8, AX + JL LBB24_49 + TESTQ CX, CX + JS LBB24_49 + NOTQ R8 + MOVQ R8, DX + MOVQ R8, AX + JMP LBB24_53 -LBB24_47: - NOTQ AX +LBB24_49: + TESTQ CX, CX + LEAQ -1(AX), CX + NOTQ AX + LONG $0xc2480f49 // cmovsq %r10, %rax + CMPQ R8, CX + LONG $0xc2450f49 // cmovneq %r10, %rax + JMP LBB24_53 -LBB24_48: +LBB24_50: + SUBQ DI, R15 + BSFL BX, DX + ADDQ R15, DX + +LBB24_51: + NOTQ DX + +LBB24_52: + MOVQ DX, AX + +LBB24_53: BYTE $0x5b // popq %rbx WORD $0x5c41 // popq %r12 + WORD $0x5d41 // popq %r13 WORD $0x5e41 // popq %r14 WORD $0x5f41 // popq %r15 BYTE $0x5d // popq %rbp RET -LBB24_51: - NEGQ AX - JMP LBB24_48 +LBB24_54: + MOVQ CX, R10 + MOVQ $-1, DX + TESTQ AX, AX + JNE LBB24_37 + JMP LBB24_52 -LBB24_52: - MOVQ $-1, R10 +LBB24_58: + NEGQ DX + JMP LBB24_52 + +LBB24_57: MOVQ $-1, R8 + MOVQ DI, R10 + MOVQ SI, R11 + MOVQ $-1, AX MOVQ $-1, R9 - MOVQ DI, R11 - JMP LBB24_23 + JMP LBB24_24 -// .set L24_0_set_26, LBB24_26-LJTI24_0 -// .set L24_0_set_34, LBB24_34-LJTI24_0 -// .set L24_0_set_30, LBB24_30-LJTI24_0 -// .set L24_0_set_24, LBB24_24-LJTI24_0 // .set L24_0_set_28, LBB24_28-LJTI24_0 +// .set L24_0_set_36, LBB24_36-LJTI24_0 +// .set L24_0_set_32, LBB24_32-LJTI24_0 +// .set L24_0_set_25, LBB24_25-LJTI24_0 +// .set L24_0_set_30, LBB24_30-LJTI24_0 LJTI24_0: - LONG $0xffffff18 // .long L24_0_set_26 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff18 // .long L24_0_set_26 - LONG $0xffffff48 // .long L24_0_set_30 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xfffffefc // .long L24_0_set_24 - LONG $0xfffffefc // .long L24_0_set_24 - LONG $0xfffffefc // .long L24_0_set_24 - LONG $0xfffffefc // .long L24_0_set_24 - LONG $0xfffffefc // .long L24_0_set_24 - LONG $0xfffffefc // .long L24_0_set_24 - LONG $0xfffffefc // .long L24_0_set_24 - LONG $0xfffffefc // .long L24_0_set_24 - LONG $0xfffffefc // .long L24_0_set_24 - LONG $0xfffffefc // .long L24_0_set_24 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff30 // .long L24_0_set_28 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff6c // .long L24_0_set_34 - LONG $0xffffff30 // .long L24_0_set_28 + LONG $0xfffffecc // .long L24_0_set_28 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xfffffecc // .long L24_0_set_28 + LONG $0xfffffefc // .long L24_0_set_32 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xfffffea7 // .long L24_0_set_25 + LONG $0xfffffea7 // .long L24_0_set_25 + LONG $0xfffffea7 // .long L24_0_set_25 + LONG $0xfffffea7 // .long L24_0_set_25 + LONG $0xfffffea7 // .long L24_0_set_25 + LONG $0xfffffea7 // .long L24_0_set_25 + LONG $0xfffffea7 // .long L24_0_set_25 + LONG $0xfffffea7 // .long L24_0_set_25 + LONG $0xfffffea7 // .long L24_0_set_25 + LONG $0xfffffea7 // .long L24_0_set_25 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xfffffee4 // .long L24_0_set_30 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xffffff26 // .long L24_0_set_36 + LONG $0xfffffee4 // .long L24_0_set_30 _skip_positive: BYTE $0x55 // pushq %rbp @@ -6086,7 +6124,7 @@ _skip_positive: MOVQ 8(DI), SI SUBQ BX, SI MOVQ AX, DI - LONG $0xfffc27e8; BYTE $0xff // callq _skip_number + LONG $0xfffbb8e8; BYTE $0xff // callq _skip_number MOVQ $-2, CX MOVQ $-2, DX SUBQ AX, DX @@ -10798,7 +10836,7 @@ TEXT ·__skip_array(SB), NOSPLIT | NOFRAME, $0 - 32 _entry: MOVQ (TLS), R14 - LEAQ -136(SP), R12 + LEAQ -144(SP), R12 CMPQ R12, 16(R14) JBE _stack_grow @@ -10819,7 +10857,7 @@ TEXT ·__skip_object(SB), NOSPLIT | NOFRAME, $0 - 32 _entry: MOVQ (TLS), R14 - LEAQ -136(SP), R12 + LEAQ -144(SP), R12 CMPQ R12, 16(R14) JBE _stack_grow @@ -10840,7 +10878,7 @@ TEXT ·__skip_one(SB), NOSPLIT | NOFRAME, $0 - 32 _entry: MOVQ (TLS), R14 - LEAQ -136(SP), R12 + LEAQ -144(SP), R12 CMPQ R12, 16(R14) JBE _stack_grow diff --git a/internal/native/avx/native_amd64_test.go b/internal/native/avx/native_amd64_test.go index 4c4d25c..ce29445 100644 --- a/internal/native/avx/native_amd64_test.go +++ b/internal/native/avx/native_amd64_test.go @@ -495,6 +495,18 @@ func TestNative_SkipOne(t *testing.T) { assert.Equal(t, 41, q) } +func TestNative_SkipOne_Error(t *testing.T) { + for _, s := range([]string{ + "-", "+", "0.", "0. ", "+1", "0.0e ", "9e+", "0e-", + "tru", "fals", "nul", "trux", "fals ", + `"asdf`, `"\\\"`, + }) { + p := 0 + q := __skip_one(&s, &p, &types.StateMachine{}) + assert.True(t, q < 0) + } +} + func TestNative_SkipArray(t *testing.T) { p := 0 s := `null, true, false, 1, 2.0, -3, {"asdf": "wqer"}],` diff --git a/internal/native/avx/native_subr_amd64.go b/internal/native/avx/native_subr_amd64.go index 1c9b02a..443a46c 100644 --- a/internal/native/avx/native_subr_amd64.go +++ b/internal/native/avx/native_subr_amd64.go @@ -34,9 +34,9 @@ const ( _stack__lspace = 8 _stack__lzero = 8 _stack__quote = 80 - _stack__skip_array = 136 - _stack__skip_object = 136 - _stack__skip_one = 136 + _stack__skip_array = 144 + _stack__skip_object = 144 + _stack__skip_one = 144 _stack__u64toa = 8 _stack__unquote = 88 _stack__value = 400 diff --git a/internal/native/avx2/native_amd64.s b/internal/native/avx2/native_amd64.s index 4b1230d..efe8685 100644 --- a/internal/native/avx2/native_amd64.s +++ b/internal/native/avx2/native_amd64.s @@ -350,7 +350,7 @@ LBB2_5: LONG $0x4fdc6941; WORD $0x1293; BYTE $0x00 // imull $1217359, %r12d, %ebx MOVQ R12, AX SHLQ $4, AX - LONG $0x740d8d48; WORD $0x0085; BYTE $0x00 // leaq $34164(%rip), %rcx /* _DOUBLE_POW5_INV_SPLIT(%rip) */ + LONG $0xf00d8d48; WORD $0x0085; BYTE $0x00 // leaq $34288(%rip), %rcx /* _DOUBLE_POW5_INV_SPLIT(%rip) */ MOVQ R8, DI ORQ $2, DI MOVQ 0(AX)(CX*1), R10 @@ -437,7 +437,7 @@ LBB2_12: SHRL $19, BX MOVLQSX AX, SI SHLQ $4, SI - LONG $0x9f158d4c; WORD $0x0099; BYTE $0x00 // leaq $39327(%rip), %r10 /* _DOUBLE_POW5_SPLIT(%rip) */ + LONG $0x1b158d4c; WORD $0x009a; BYTE $0x00 // leaq $39451(%rip), %r10 /* _DOUBLE_POW5_SPLIT(%rip) */ MOVQ R8, DI ORQ $2, DI MOVQ 0(SI)(R10*1), R14 @@ -850,7 +850,7 @@ LBB2_61: LEAQ 1(R13), BX MOVQ BX, SI MOVL R15, DX - LONG $0x004f12e8; BYTE $0x00 // callq _print_mantissa + LONG $0x004f8ee8; BYTE $0x00 // callq _print_mantissa MOVB 1(R13), AX MOVB AX, 0(R13) MOVL $1, AX @@ -879,7 +879,7 @@ LBB2_66: LEAL 0(CX)(CX*1), AX LEAL 0(AX)(AX*4), AX SUBL AX, R14 - LONG $0x71058d48; WORD $0x00a8; BYTE $0x00 // leaq $43121(%rip), %rax /* _Digits(%rip) */ + LONG $0xed058d48; WORD $0x00a8; BYTE $0x00 // leaq $43245(%rip), %rax /* _Digits(%rip) */ MOVWLZX 0(AX)(CX*2), AX MOVL BX, CX MOVW AX, 0(R13)(CX*1) @@ -915,7 +915,7 @@ LBB2_70: CMPL R14, $10 JL LBB2_85 MOVLQSX R14, AX - LONG $0x030d8d48; WORD $0x00a8; BYTE $0x00 // leaq $43011(%rip), %rcx /* _Digits(%rip) */ + LONG $0x7f0d8d48; WORD $0x00a8; BYTE $0x00 // leaq $43135(%rip), %rcx /* _Digits(%rip) */ MOVWLZX 0(CX)(AX*2), AX MOVL BX, CX MOVW AX, 0(R13)(CX*1) @@ -934,7 +934,7 @@ LBB2_74: MOVL BX, SI ADDQ -64(BP), SI MOVL R15, DX - LONG $0x004e0ee8; BYTE $0x00 // callq _print_mantissa + LONG $0x004e8ae8; BYTE $0x00 // callq _print_mantissa TESTL R13, R13 JE LBB2_78 LEAL 0(R13)(BX*1), AX @@ -1138,7 +1138,7 @@ LBB2_105: MOVQ R13, SI MOVL R15, DX WORD $0xf8c5; BYTE $0x77 // vzeroupper - LONG $0x004afce8; BYTE $0x00 // callq _print_mantissa + LONG $0x004b78e8; BYTE $0x00 // callq _print_mantissa ADDL BX, R15 MOVL R15, BX @@ -1231,7 +1231,7 @@ _u64toa: ADDQ AX, AX CMPL SI, $1000 JB LBB4_3 - LONG $0xc50d8d48; WORD $0x00a3; BYTE $0x00 // leaq $41925(%rip), %rcx /* _Digits(%rip) */ + LONG $0x410d8d48; WORD $0x00a4; BYTE $0x00 // leaq $42049(%rip), %rcx /* _Digits(%rip) */ MOVB 0(DX)(CX*1), CX MOVB CX, 0(DI) MOVL $1, CX @@ -1245,14 +1245,14 @@ LBB4_3: LBB4_4: MOVWLZX DX, DX ORQ $1, DX - LONG $0xa4358d48; WORD $0x00a3; BYTE $0x00 // leaq $41892(%rip), %rsi /* _Digits(%rip) */ + LONG $0x20358d48; WORD $0x00a4; BYTE $0x00 // leaq $42016(%rip), %rsi /* _Digits(%rip) */ MOVB 0(DX)(SI*1), DX MOVL CX, SI INCL CX MOVB DX, 0(DI)(SI*1) LBB4_6: - LONG $0x93158d48; WORD $0x00a3; BYTE $0x00 // leaq $41875(%rip), %rdx /* _Digits(%rip) */ + LONG $0x0f158d48; WORD $0x00a4; BYTE $0x00 // leaq $41999(%rip), %rdx /* _Digits(%rip) */ MOVB 0(AX)(DX*1), DX MOVL CX, SI INCL CX @@ -1261,7 +1261,7 @@ LBB4_6: LBB4_7: MOVWLZX AX, AX ORQ $1, AX - LONG $0x7b158d48; WORD $0x00a3; BYTE $0x00 // leaq $41851(%rip), %rdx /* _Digits(%rip) */ + LONG $0xf7158d48; WORD $0x00a3; BYTE $0x00 // leaq $41975(%rip), %rdx /* _Digits(%rip) */ MOVB 0(AX)(DX*1), AX MOVL CX, DX INCL CX @@ -1308,7 +1308,7 @@ LBB4_8: ADDQ R11, R11 CMPL SI, $10000000 JB LBB4_11 - LONG $0xe4058d48; WORD $0x00a2; BYTE $0x00 // leaq $41700(%rip), %rax /* _Digits(%rip) */ + LONG $0x60058d48; WORD $0x00a3; BYTE $0x00 // leaq $41824(%rip), %rax /* _Digits(%rip) */ MOVB 0(R10)(AX*1), AX MOVB AX, 0(DI) MOVL $1, CX @@ -1322,14 +1322,14 @@ LBB4_11: LBB4_12: MOVL R10, AX ORQ $1, AX - LONG $0xbf358d48; WORD $0x00a2; BYTE $0x00 // leaq $41663(%rip), %rsi /* _Digits(%rip) */ + LONG $0x3b358d48; WORD $0x00a3; BYTE $0x00 // leaq $41787(%rip), %rsi /* _Digits(%rip) */ MOVB 0(AX)(SI*1), AX MOVL CX, SI INCL CX MOVB AX, 0(DI)(SI*1) LBB4_14: - LONG $0xae058d48; WORD $0x00a2; BYTE $0x00 // leaq $41646(%rip), %rax /* _Digits(%rip) */ + LONG $0x2a058d48; WORD $0x00a3; BYTE $0x00 // leaq $41770(%rip), %rax /* _Digits(%rip) */ MOVB 0(R9)(AX*1), AX MOVL CX, SI INCL CX @@ -1338,7 +1338,7 @@ LBB4_14: LBB4_15: MOVWLZX R9, AX ORQ $1, AX - LONG $0x94358d48; WORD $0x00a2; BYTE $0x00 // leaq $41620(%rip), %rsi /* _Digits(%rip) */ + LONG $0x10358d48; WORD $0x00a3; BYTE $0x00 // leaq $41744(%rip), %rsi /* _Digits(%rip) */ MOVB 0(AX)(SI*1), AX MOVL CX, DX MOVB AX, 0(DX)(DI*1) @@ -1420,7 +1420,7 @@ LBB4_16: MOVL $16, CX SUBL AX, CX SHLQ $4, AX - LONG $0x07158d48; WORD $0x00a2; BYTE $0x00 // leaq $41479(%rip), %rdx /* _VecShiftShuffles(%rip) */ + LONG $0x83158d48; WORD $0x00a2; BYTE $0x00 // leaq $41603(%rip), %rdx /* _VecShiftShuffles(%rip) */ LONG $0x0071e2c4; WORD $0x1004 // vpshufb (%rax,%rdx), %xmm1, %xmm0 LONG $0x077ffac5 // vmovdqu %xmm0, (%rdi) MOVL CX, AX @@ -1446,7 +1446,7 @@ LBB4_20: CMPL DX, $99 JA LBB4_22 MOVL DX, AX - LONG $0xea0d8d48; WORD $0x00a0; BYTE $0x00 // leaq $41194(%rip), %rcx /* _Digits(%rip) */ + LONG $0x660d8d48; WORD $0x00a1; BYTE $0x00 // leaq $41318(%rip), %rcx /* _Digits(%rip) */ MOVB 0(CX)(AX*2), DX MOVB 1(CX)(AX*2), AX MOVB DX, 0(DI) @@ -1471,7 +1471,7 @@ LBB4_22: WORD $0xc96b; BYTE $0x64 // imull $100, %ecx, %ecx SUBL CX, AX MOVWLZX AX, AX - LONG $0x990d8d48; WORD $0x00a0; BYTE $0x00 // leaq $41113(%rip), %rcx /* _Digits(%rip) */ + LONG $0x150d8d48; WORD $0x00a1; BYTE $0x00 // leaq $41237(%rip), %rcx /* _Digits(%rip) */ MOVB 0(CX)(AX*2), DX MOVB 1(CX)(AX*2), AX MOVB DX, 1(DI) @@ -1483,7 +1483,7 @@ LBB4_24: WORD $0xc86b; BYTE $0x64 // imull $100, %eax, %ecx SUBL CX, DX MOVWLZX AX, AX - LONG $0x76058d4c; WORD $0x00a0; BYTE $0x00 // leaq $41078(%rip), %r8 /* _Digits(%rip) */ + LONG $0xf2058d4c; WORD $0x00a0; BYTE $0x00 // leaq $41202(%rip), %r8 /* _Digits(%rip) */ MOVB 0(R8)(AX*2), CX MOVB 1(R8)(AX*2), AX MOVB CX, 0(DI) @@ -1580,8 +1580,8 @@ _quote: SUBQ $16, SP MOVQ CX, R15 TESTB $1, R8 - LONG $0x16058d48; WORD $0x00a0; BYTE $0x00 // leaq $40982(%rip), %rax /* __SingleQuoteTab(%rip) */ - LONG $0x0f158d4c; WORD $0x00b0; BYTE $0x00 // leaq $45071(%rip), %r10 /* __DoubleQuoteTab(%rip) */ + LONG $0x92058d48; WORD $0x00a0; BYTE $0x00 // leaq $41106(%rip), %rax /* __SingleQuoteTab(%rip) */ + LONG $0x8b158d4c; WORD $0x00b0; BYTE $0x00 // leaq $45195(%rip), %r10 /* __DoubleQuoteTab(%rip) */ LONG $0xd0440f4c // cmoveq %rax, %r10 MOVQ DX, R8 MOVQ DI, AX @@ -1790,7 +1790,7 @@ LBB5_25: LBB5_26: TESTQ BX, BX MOVQ -48(BP), R15 - LONG $0xda0d8d4c; WORD $0x009c; BYTE $0x00 // leaq $40154(%rip), %r9 /* __SingleQuoteTab(%rip) */ + LONG $0x560d8d4c; WORD $0x009d; BYTE $0x00 // leaq $40278(%rip), %r9 /* __SingleQuoteTab(%rip) */ JLE LBB5_31 TESTQ SI, SI JLE LBB5_31 @@ -2289,7 +2289,7 @@ LBB6_24: LBB6_26: ADDQ BX, AX MOVBLZX -1(R9), CX - LONG $0xa61d8d48; WORD $0x00b7; BYTE $0x00 // leaq $47014(%rip), %rbx /* __UnquoteTab(%rip) */ + LONG $0x221d8d48; WORD $0x00b8; BYTE $0x00 // leaq $47138(%rip), %rbx /* __UnquoteTab(%rip) */ MOVB 0(CX)(BX*1), BX CMPB BX, $-1 JE LBB6_29 @@ -2877,7 +2877,7 @@ _html_escape: QUAD $0xffffff260d6f7ec5 // vmovdqu $-218(%rip), %ymm9 /* LCPI7_1(%rip) */ QUAD $0xffffff3e156f7ec5 // vmovdqu $-194(%rip), %ymm10 /* LCPI7_2(%rip) */ QUAD $0xffffff56356ffec5 // vmovdqu $-170(%rip), %ymm6 /* LCPI7_3(%rip) */ - LONG $0x751d8d4c; WORD $0x00b0; BYTE $0x00 // leaq $45173(%rip), %r11 /* __HtmlQuoteTab(%rip) */ + LONG $0xf11d8d4c; WORD $0x00b0; BYTE $0x00 // leaq $45297(%rip), %r11 /* __HtmlQuoteTab(%rip) */ MOVQ DI, AX MOVQ -48(BP), R12 JMP LBB7_2 @@ -3094,7 +3094,7 @@ LBB7_50: NEGQ SI SBBQ R9, R9 XORQ R13, R9 - LONG $0x4b1d8d4c; WORD $0x00ad; BYTE $0x00 // leaq $44363(%rip), %r11 /* __HtmlQuoteTab(%rip) */ + LONG $0xc71d8d4c; WORD $0x00ad; BYTE $0x00 // leaq $44487(%rip), %r11 /* __HtmlQuoteTab(%rip) */ TESTQ R9, R9 JNS LBB7_78 JMP LBB7_77 @@ -3130,7 +3130,7 @@ LBB7_34: SUBQ AX, R9 ADDQ R13, R9 NOTQ R9 - LONG $0xf01d8d4c; WORD $0x00ac; BYTE $0x00 // leaq $44272(%rip), %r11 /* __HtmlQuoteTab(%rip) */ + LONG $0x6c1d8d4c; WORD $0x00ad; BYTE $0x00 // leaq $44396(%rip), %r11 /* __HtmlQuoteTab(%rip) */ TESTQ R9, R9 JNS LBB7_78 JMP LBB7_77 @@ -3140,7 +3140,7 @@ LBB7_40: SUBQ AX, R13 BSFL CX, R9 ADDQ R13, R9 - LONG $0xce1d8d4c; WORD $0x00ac; BYTE $0x00 // leaq $44238(%rip), %r11 /* __HtmlQuoteTab(%rip) */ + LONG $0x4a1d8d4c; WORD $0x00ad; BYTE $0x00 // leaq $44362(%rip), %r11 /* __HtmlQuoteTab(%rip) */ TESTQ R9, R9 JNS LBB7_78 JMP LBB7_77 @@ -3178,7 +3178,7 @@ LBB7_22: LBB7_74: MOVQ R13, R9 - LONG $0x7b1d8d4c; WORD $0x00ac; BYTE $0x00 // leaq $44155(%rip), %r11 /* __HtmlQuoteTab(%rip) */ + LONG $0xf71d8d4c; WORD $0x00ac; BYTE $0x00 // leaq $44279(%rip), %r11 /* __HtmlQuoteTab(%rip) */ TESTQ R9, R9 JNS LBB7_78 JMP LBB7_77 @@ -3228,7 +3228,7 @@ LBB7_52: LEAQ 8(R13), R9 ADDQ $8, R8 LEAQ -8(R15), SI - LONG $0xd91d8d4c; WORD $0x00ab; BYTE $0x00 // leaq $43993(%rip), %r11 /* __HtmlQuoteTab(%rip) */ + LONG $0x551d8d4c; WORD $0x00ac; BYTE $0x00 // leaq $44117(%rip), %r11 /* __HtmlQuoteTab(%rip) */ CMPQ SI, $4 JAE LBB7_56 JMP LBB7_57 @@ -3262,7 +3262,7 @@ LBB7_71: ADDQ R13, R11 NOTQ R11 MOVQ R11, R9 - LONG $0x8a1d8d4c; WORD $0x00ab; BYTE $0x00 // leaq $43914(%rip), %r11 /* __HtmlQuoteTab(%rip) */ + LONG $0x061d8d4c; WORD $0x00ac; BYTE $0x00 // leaq $44038(%rip), %r11 /* __HtmlQuoteTab(%rip) */ TESTQ R9, R9 JNS LBB7_78 JMP LBB7_77 @@ -3274,7 +3274,7 @@ LBB7_73: LBB7_53: MOVQ R13, R9 MOVQ R15, SI - LONG $0x6b1d8d4c; WORD $0x00ab; BYTE $0x00 // leaq $43883(%rip), %r11 /* __HtmlQuoteTab(%rip) */ + LONG $0xe71d8d4c; WORD $0x00ab; BYTE $0x00 // leaq $44007(%rip), %r11 /* __HtmlQuoteTab(%rip) */ CMPQ SI, $4 JB LBB7_57 @@ -3438,7 +3438,7 @@ LBB8_5: SHLQ CX, DI MOVL AX, CX SHLQ $4, CX - LONG $0xde3d8d4c; WORD $0x0031; BYTE $0x00 // leaq $12766(%rip), %r15 /* _POW10_M128_TAB(%rip) */ + LONG $0x5a3d8d4c; WORD $0x0032; BYTE $0x00 // leaq $12890(%rip), %r15 /* _POW10_M128_TAB(%rip) */ MOVQ DI, AX MULQ 8(CX)(R15*1) MOVQ AX, R11 @@ -3570,14 +3570,14 @@ LBB9_5: MOVQ R13, -48(BP) JLE LBB9_20 XORL R15, R15 - LONG $0xcd2d8d4c; WORD $0x005b; BYTE $0x00 // leaq $23501(%rip), %r13 /* _POW_TAB(%rip) */ + LONG $0x492d8d4c; WORD $0x005c; BYTE $0x00 // leaq $23625(%rip), %r13 /* _POW_TAB(%rip) */ JMP LBB9_9 LBB9_7: NEGL BX MOVQ R12, DI MOVL BX, SI - LONG $0x002eeae8; BYTE $0x00 // callq _right_shift + LONG $0x002f66e8; BYTE $0x00 // callq _right_shift LBB9_8: ADDL R14, R15 @@ -3607,7 +3607,7 @@ LBB9_11: LBB9_15: MOVQ R12, DI MOVL $60, SI - LONG $0x002ea2e8; BYTE $0x00 // callq _right_shift + LONG $0x002f1ee8; BYTE $0x00 // callq _right_shift LEAL 60(BX), AX CMPL BX, $-120 MOVL AX, BX @@ -3621,7 +3621,7 @@ LBB9_16: LBB9_17: MOVQ R12, DI MOVL $60, SI - LONG $0x002d14e8; BYTE $0x00 // callq _left_shift + LONG $0x002d90e8; BYTE $0x00 // callq _left_shift LEAL -60(BX), SI CMPL BX, $120 MOVL SI, BX @@ -3633,16 +3633,16 @@ LBB9_18: LBB9_19: MOVQ R12, DI - LONG $0x002cfee8; BYTE $0x00 // callq _left_shift + LONG $0x002d7ae8; BYTE $0x00 // callq _left_shift JMP LBB9_8 LBB9_20: - LONG $0x39358d4c; WORD $0x005b; BYTE $0x00 // leaq $23353(%rip), %r14 /* _POW_TAB(%rip) */ + LONG $0xb5358d4c; WORD $0x005b; BYTE $0x00 // leaq $23477(%rip), %r14 /* _POW_TAB(%rip) */ JMP LBB9_23 LBB9_21: MOVQ R12, DI - LONG $0x002cebe8; BYTE $0x00 // callq _left_shift + LONG $0x002d67e8; BYTE $0x00 // callq _left_shift LBB9_22: SUBL R13, R15 @@ -3682,7 +3682,7 @@ LBB9_28: LBB9_33: MOVQ R12, DI MOVL $60, SI - LONG $0x002c90e8; BYTE $0x00 // callq _left_shift + LONG $0x002d0ce8; BYTE $0x00 // callq _left_shift LEAL -60(BX), SI CMPL BX, $120 MOVL SI, BX @@ -3697,7 +3697,7 @@ LBB9_34: LBB9_35: MOVQ R12, DI MOVL $60, SI - LONG $0x002ddde8; BYTE $0x00 // callq _right_shift + LONG $0x002e59e8; BYTE $0x00 // callq _right_shift LEAL 60(BX), AX CMPL BX, $-120 MOVL AX, BX @@ -3707,7 +3707,7 @@ LBB9_36: NEGL BX MOVQ R12, DI MOVL BX, SI - LONG $0x002dc7e8; BYTE $0x00 // callq _right_shift + LONG $0x002e43e8; BYTE $0x00 // callq _right_shift JMP LBB9_22 LBB9_37: @@ -3724,7 +3724,7 @@ LBB9_37: LBB9_41: MOVQ R12, DI MOVL $60, SI - LONG $0x002d86e8; BYTE $0x00 // callq _right_shift + LONG $0x002e02e8; BYTE $0x00 // callq _right_shift ADDL $60, R15 CMPL R15, $-120 JL LBB9_41 @@ -3751,7 +3751,7 @@ LBB9_47: NEGL R15 MOVQ R12, DI MOVL R15, SI - LONG $0x002d36e8; BYTE $0x00 // callq _right_shift + LONG $0x002db2e8; BYTE $0x00 // callq _right_shift MOVL $-1022, R14 LBB9_48: @@ -3759,7 +3759,7 @@ LBB9_48: JE LBB9_50 MOVQ R12, DI MOVL $53, SI - LONG $0x002bace8; BYTE $0x00 // callq _left_shift + LONG $0x002c28e8; BYTE $0x00 // callq _left_shift LBB9_50: MOVLQSX 20(R12), R10 @@ -5467,7 +5467,7 @@ LBB14_71: CMPL DI, $23 JL LBB14_81 MOVLQSX DI, AX - LONG $0xf50d8d48; WORD $0x00ba; BYTE $0x00 // leaq $47861(%rip), %rcx /* _P10_TAB(%rip) */ + LONG $0x710d8d48; WORD $0x00bb; BYTE $0x00 // leaq $47985(%rip), %rcx /* _P10_TAB(%rip) */ QUAD $0xffff50c18459fbc5; BYTE $0xff // vmulsd $-176(%rcx,%rax,8), %xmm0, %xmm0 LONG $0x4511fbc5; BYTE $0xd0 // vmovsd %xmm0, $-48(%rbp) MOVL $22, AX @@ -5485,7 +5485,7 @@ LBB14_77: JB LBB14_60 NEGL DI MOVLQSX DI, AX - LONG $0xb30d8d48; WORD $0x00ba; BYTE $0x00 // leaq $47795(%rip), %rcx /* _P10_TAB(%rip) */ + LONG $0x2f0d8d48; WORD $0x00bb; BYTE $0x00 // leaq $47919(%rip), %rcx /* _P10_TAB(%rip) */ LONG $0x045efbc5; BYTE $0xc1 // vdivsd (%rcx,%rax,8), %xmm0, %xmm0 JMP LBB14_65 @@ -5517,7 +5517,7 @@ LBB14_82: LONG $0xc82ef9c5 // vucomisd %xmm0, %xmm1 JA LBB14_60 MOVL AX, AX - LONG $0x3a0d8d48; WORD $0x00ba; BYTE $0x00 // leaq $47674(%rip), %rcx /* _P10_TAB(%rip) */ + LONG $0xb60d8d48; WORD $0x00ba; BYTE $0x00 // leaq $47798(%rip), %rcx /* _P10_TAB(%rip) */ LONG $0x0459fbc5; BYTE $0xc1 // vmulsd (%rcx,%rax,8), %xmm0, %xmm0 JMP LBB14_65 @@ -6764,33 +6764,34 @@ _skip_number: WORD $0x8948; BYTE $0xe5 // movq %rsp, %rbp WORD $0x5741 // pushq %r15 WORD $0x5641 // pushq %r14 + WORD $0x5541 // pushq %r13 WORD $0x5441 // pushq %r12 BYTE $0x53 // pushq %rbx TESTQ SI, SI - JE LBB23_51 + JE LBB23_53 CMPB 0(DI), $48 JNE LBB23_5 - MOVL $1, AX + MOVL $1, DX CMPQ SI, $1 - JE LBB23_70 - MOVB 1(DI), CX - ADDB $-46, CX - CMPB CX, $55 - JA LBB23_70 - MOVBLZX CX, CX - MOVQ $36028797027352577, DX - BTQ CX, DX - JAE LBB23_70 + JE LBB23_73 + MOVB 1(DI), AX + ADDB $-46, AX + CMPB AX, $55 + JA LBB23_73 + MOVBLZX AX, AX + MOVQ $36028797027352577, CX + BTQ AX, CX + JAE LBB23_73 LBB23_5: CMPQ SI, $32 - JB LBB23_74 - LEAQ -32(SI), R14 - MOVQ R14, AX + JB LBB23_76 + LEAQ -32(SI), R11 + MOVQ R11, AX ANDQ $-32, AX - LEAQ 32(AX)(DI*1), R11 - ANDL $31, R14 - MOVQ $-1, R10 + LEAQ 32(AX)(DI*1), R10 + ANDL $31, R11 + MOVQ $-1, R9 QUAD $0xfffffe35056ffec5 // vmovdqu $-459(%rip), %ymm0 /* LCPI23_0(%rip) */ QUAD $0xfffffe4d0d6ffec5 // vmovdqu $-435(%rip), %ymm1 /* LCPI23_1(%rip) */ QUAD $0xfffffe65156ffec5 // vmovdqu $-411(%rip), %ymm2 /* LCPI23_2(%rip) */ @@ -6798,109 +6799,111 @@ LBB23_5: QUAD $0xfffffe95256ffec5 // vmovdqu $-363(%rip), %ymm4 /* LCPI23_4(%rip) */ QUAD $0xfffffead2d6ffec5 // vmovdqu $-339(%rip), %ymm5 /* LCPI23_5(%rip) */ QUAD $0xfffffec5356ffec5 // vmovdqu $-315(%rip), %ymm6 /* LCPI23_6(%rip) */ + MOVQ $-1, AX MOVQ $-1, R8 - MOVQ $-1, R9 - MOVQ DI, R12 + MOVQ DI, R14 LBB23_7: - LONG $0x6f7ec1c4; WORD $0x243c // vmovdqu (%r12), %ymm7 - LONG $0xc06445c5 // vpcmpgtb %ymm0, %ymm7, %ymm8 - LONG $0xcf6475c5 // vpcmpgtb %ymm7, %ymm1, %ymm9 - LONG $0xdb3d41c4; BYTE $0xc1 // vpand %ymm9, %ymm8, %ymm8 - LONG $0xca7445c5 // vpcmpeqb %ymm2, %ymm7, %ymm9 - LONG $0xd37445c5 // vpcmpeqb %ymm3, %ymm7, %ymm10 - LONG $0xeb2d41c4; BYTE $0xc9 // vpor %ymm9, %ymm10, %ymm9 - LONG $0xd4eb45c5 // vpor %ymm4, %ymm7, %ymm10 - LONG $0xd6742dc5 // vpcmpeqb %ymm6, %ymm10, %ymm10 - LONG $0xfd74c5c5 // vpcmpeqb %ymm5, %ymm7, %ymm7 - LONG $0xc7d7fdc5 // vpmovmskb %ymm7, %eax - LONG $0xd77dc1c4; BYTE $0xda // vpmovmskb %ymm10, %ebx - LONG $0xd77d41c4; BYTE $0xf9 // vpmovmskb %ymm9, %r15d - LONG $0xffebadc5 // vpor %ymm7, %ymm10, %ymm7 - LONG $0xeb3541c4; BYTE $0xc0 // vpor %ymm8, %ymm9, %ymm8 - LONG $0xffebbdc5 // vpor %ymm7, %ymm8, %ymm7 - LONG $0xcfd7fdc5 // vpmovmskb %ymm7, %ecx + LONG $0x6f7ec1c4; BYTE $0x3e // vmovdqu (%r14), %ymm7 + LONG $0xc06445c5 // vpcmpgtb %ymm0, %ymm7, %ymm8 + LONG $0xcf6475c5 // vpcmpgtb %ymm7, %ymm1, %ymm9 + LONG $0xdb3d41c4; BYTE $0xc1 // vpand %ymm9, %ymm8, %ymm8 + LONG $0xca7445c5 // vpcmpeqb %ymm2, %ymm7, %ymm9 + LONG $0xd37445c5 // vpcmpeqb %ymm3, %ymm7, %ymm10 + LONG $0xeb2d41c4; BYTE $0xc9 // vpor %ymm9, %ymm10, %ymm9 + LONG $0xd4eb45c5 // vpor %ymm4, %ymm7, %ymm10 + LONG $0xd6742dc5 // vpcmpeqb %ymm6, %ymm10, %ymm10 + LONG $0xfd74c5c5 // vpcmpeqb %ymm5, %ymm7, %ymm7 + LONG $0xd7d7fdc5 // vpmovmskb %ymm7, %edx + LONG $0xd77d41c4; BYTE $0xe2 // vpmovmskb %ymm10, %r12d + LONG $0xd77d41c4; BYTE $0xf9 // vpmovmskb %ymm9, %r15d + LONG $0xffebadc5 // vpor %ymm7, %ymm10, %ymm7 + LONG $0xeb3541c4; BYTE $0xc0 // vpor %ymm8, %ymm9, %ymm8 + LONG $0xffebbdc5 // vpor %ymm7, %ymm8, %ymm7 + LONG $0xcfd7fdc5 // vpmovmskb %ymm7, %ecx NOTQ CX BSFQ CX, CX CMPL CX, $32 JE LBB23_9 - MOVL $-1, DX - SHLL CX, DX - NOTL DX - ANDL DX, AX - ANDL DX, BX - ANDL R15, DX - MOVL DX, R15 + MOVL $-1, BX + SHLL CX, BX + NOTL BX + ANDL BX, DX + ANDL BX, R12 + ANDL R15, BX + MOVL BX, R15 LBB23_9: - LEAL -1(AX), DX - ANDL AX, DX - JNE LBB23_66 - LEAL -1(BX), DX - ANDL BX, DX - JNE LBB23_66 - LEAL -1(R15), DX - ANDL R15, DX - JNE LBB23_66 - TESTL AX, AX + LEAL -1(DX), BX + ANDL DX, BX + JNE LBB23_70 + LEAL -1(R12), BX + ANDL R12, BX + JNE LBB23_70 + LEAL -1(R15), BX + ANDL R15, BX + JNE LBB23_70 + TESTL DX, DX JE LBB23_15 - MOVQ R12, DX - SUBQ DI, DX - BSFL AX, AX - ADDQ DX, AX - CMPQ R9, $-1 - JNE LBB23_69 - MOVQ AX, R9 + MOVQ R14, BX + SUBQ DI, BX + BSFL DX, DX + ADDQ BX, DX + CMPQ R8, $-1 + JNE LBB23_72 + MOVQ DX, R8 LBB23_15: - TESTL BX, BX + TESTL R12, R12 JE LBB23_18 - MOVQ R12, DX - SUBQ DI, DX - BSFL BX, AX - ADDQ DX, AX - CMPQ R8, $-1 - JNE LBB23_69 - MOVQ AX, R8 + MOVQ R14, BX + SUBQ DI, BX + BSFL R12, DX + ADDQ BX, DX + CMPQ AX, $-1 + JNE LBB23_72 + MOVQ DX, AX LBB23_18: TESTL R15, R15 JE LBB23_21 - MOVQ R12, DX - SUBQ DI, DX - BSFL R15, AX - ADDQ DX, AX - CMPQ R10, $-1 - JNE LBB23_69 - MOVQ AX, R10 + MOVQ R14, BX + SUBQ DI, BX + BSFL R15, DX + ADDQ BX, DX + CMPQ R9, $-1 + JNE LBB23_72 + MOVQ DX, R9 LBB23_21: CMPL CX, $32 - JNE LBB23_52 - ADDQ $32, R12 + JNE LBB23_54 + ADDQ $32, R14 ADDQ $-32, SI CMPQ SI, $31 JA LBB23_7 WORD $0xf8c5; BYTE $0x77 // vzeroupper - MOVQ R14, SI - CMPQ SI, $15 - JBE LBB23_42 + MOVQ R11, SI + CMPQ SI, $16 + JB LBB23_42 LBB23_24: - MOVQ SI, R14 - ANDQ $-16, R14 - ADDQ R11, R14 - QUAD $0xfffffdb1056f7ac5 // vmovdqu $-591(%rip), %xmm8 /* LCPI23_7(%rip) */ - QUAD $0xfffffdb90d6f7ac5 // vmovdqu $-583(%rip), %xmm9 /* LCPI23_8(%rip) */ - QUAD $0xfffffdc1156f7ac5 // vmovdqu $-575(%rip), %xmm10 /* LCPI23_9(%rip) */ - QUAD $0xfffffdc91d6f7ac5 // vmovdqu $-567(%rip), %xmm11 /* LCPI23_10(%rip) */ - QUAD $0xfffffdd1256ffac5 // vmovdqu $-559(%rip), %xmm4 /* LCPI23_11(%rip) */ - QUAD $0xfffffdd92d6ffac5 // vmovdqu $-551(%rip), %xmm5 /* LCPI23_12(%rip) */ - QUAD $0xfffffde1356ffac5 // vmovdqu $-543(%rip), %xmm6 /* LCPI23_13(%rip) */ + LEAQ -16(SI), R14 + MOVQ R14, CX + ANDQ $-16, CX + LEAQ 16(CX)(R10*1), R11 + ANDL $15, R14 + QUAD $0xfffffda2056f7ac5 // vmovdqu $-606(%rip), %xmm8 /* LCPI23_7(%rip) */ + QUAD $0xfffffdaa0d6f7ac5 // vmovdqu $-598(%rip), %xmm9 /* LCPI23_8(%rip) */ + QUAD $0xfffffdb2156f7ac5 // vmovdqu $-590(%rip), %xmm10 /* LCPI23_9(%rip) */ + QUAD $0xfffffdba1d6f7ac5 // vmovdqu $-582(%rip), %xmm11 /* LCPI23_10(%rip) */ + QUAD $0xfffffdc2256ffac5 // vmovdqu $-574(%rip), %xmm4 /* LCPI23_11(%rip) */ + QUAD $0xfffffdca2d6ffac5 // vmovdqu $-566(%rip), %xmm5 /* LCPI23_12(%rip) */ + QUAD $0xfffffdd2356ffac5 // vmovdqu $-558(%rip), %xmm6 /* LCPI23_13(%rip) */ MOVL $4294967295, R15 LBB23_25: - LONG $0x6f7ac1c4; BYTE $0x3b // vmovdqu (%r11), %xmm7 + LONG $0x6f7ac1c4; BYTE $0x3a // vmovdqu (%r10), %xmm7 LONG $0x6441c1c4; BYTE $0xc0 // vpcmpgtb %xmm8, %xmm7, %xmm0 LONG $0xcf64b1c5 // vpcmpgtb %xmm7, %xmm9, %xmm1 LONG $0xc1dbf9c5 // vpand %xmm1, %xmm0, %xmm0 @@ -6913,274 +6916,306 @@ LBB23_25: LONG $0xdfebe9c5 // vpor %xmm7, %xmm2, %xmm3 LONG $0xc0ebf1c5 // vpor %xmm0, %xmm1, %xmm0 LONG $0xc0ebe1c5 // vpor %xmm0, %xmm3, %xmm0 - LONG $0xc7d7f9c5 // vpmovmskb %xmm7, %eax - LONG $0xdad7f9c5 // vpmovmskb %xmm2, %ebx + LONG $0xd7d7f9c5 // vpmovmskb %xmm7, %edx + LONG $0xead779c5 // vpmovmskb %xmm2, %r13d LONG $0xe1d779c5 // vpmovmskb %xmm1, %r12d LONG $0xc8d7f9c5 // vpmovmskb %xmm0, %ecx XORQ R15, CX BSFQ CX, CX CMPL CX, $16 JE LBB23_27 - MOVL $-1, DX - SHLL CX, DX - NOTL DX - ANDL DX, AX - ANDL DX, BX - ANDL R12, DX - MOVL DX, R12 + MOVL $-1, BX + SHLL CX, BX + NOTL BX + ANDL BX, DX + ANDL BX, R13 + ANDL R12, BX + MOVL BX, R12 LBB23_27: - LEAL -1(AX), DX - ANDL AX, DX - JNE LBB23_68 - LEAL -1(BX), DX - ANDL BX, DX - JNE LBB23_68 - LEAL -1(R12), DX - ANDL R12, DX - JNE LBB23_68 - TESTL AX, AX + LEAL -1(DX), BX + ANDL DX, BX + JNE LBB23_71 + LEAL -1(R13), BX + ANDL R13, BX + JNE LBB23_71 + LEAL -1(R12), BX + ANDL R12, BX + JNE LBB23_71 + TESTL DX, DX JE LBB23_33 - MOVQ R11, DX - SUBQ DI, DX - BSFL AX, AX - ADDQ DX, AX - CMPQ R9, $-1 - JNE LBB23_69 - MOVQ AX, R9 + MOVQ R10, BX + SUBQ DI, BX + BSFL DX, DX + ADDQ BX, DX + CMPQ R8, $-1 + JNE LBB23_72 + MOVQ DX, R8 LBB23_33: - TESTL BX, BX + TESTL R13, R13 JE LBB23_36 - MOVQ R11, DX - SUBQ DI, DX - BSFL BX, AX - ADDQ DX, AX - CMPQ R8, $-1 - JNE LBB23_69 - MOVQ AX, R8 + MOVQ R10, BX + SUBQ DI, BX + BSFL R13, DX + ADDQ BX, DX + CMPQ AX, $-1 + JNE LBB23_72 + MOVQ DX, AX LBB23_36: TESTL R12, R12 JE LBB23_39 - MOVQ R11, DX - SUBQ DI, DX - BSFL R12, AX - ADDQ DX, AX - CMPQ R10, $-1 - JNE LBB23_69 - MOVQ AX, R10 + MOVQ R10, BX + SUBQ DI, BX + BSFL R12, DX + ADDQ BX, DX + CMPQ R9, $-1 + JNE LBB23_72 + MOVQ DX, R9 LBB23_39: CMPL CX, $16 - JNE LBB23_61 - ADDQ $16, R11 + JNE LBB23_55 + ADDQ $16, R10 ADDQ $-16, SI CMPQ SI, $15 JA LBB23_25 - MOVQ R14, R11 + MOVQ R14, SI + MOVQ R11, R10 LBB23_42: - LONG $0x370d8d48; WORD $0x0001; BYTE $0x00 // leaq $311(%rip), %rcx /* LJTI23_0(%rip) */ + TESTQ SI, SI + JE LBB23_56 + LEAQ 0(R10)(SI*1), R11 + LONG $0x8f1d8d48; WORD $0x0001; BYTE $0x00 // leaq $399(%rip), %rbx /* LJTI23_0(%rip) */ + JMP LBB23_45 -LBB23_43: - MOVQ R11, R12 - MOVBLSX 0(R11), AX - ADDL $-43, AX - CMPL AX, $58 - JA LBB23_53 - LEAQ 1(R12), R11 - MOVLQSX 0(CX)(AX*4), AX - ADDQ CX, AX - JMP AX +LBB23_44: + MOVQ CX, R10 + DECQ SI + JE LBB23_75 LBB23_45: - MOVQ R11, AX - SUBQ DI, AX - CMPQ R10, $-1 - JNE LBB23_73 - DECQ AX - MOVQ AX, R10 - JMP LBB23_43 + MOVBLSX 0(R10), DX + ADDL $-43, DX + CMPL DX, $58 + JA LBB23_56 + LEAQ 1(R10), CX + MOVLQSX 0(BX)(DX*4), DX + ADDQ BX, DX + JMP DX LBB23_47: - MOVQ R11, AX - SUBQ DI, AX - CMPQ R8, $-1 - JNE LBB23_73 - DECQ AX - MOVQ AX, R8 - JMP LBB23_43 + MOVQ CX, DX + SUBQ DI, DX + CMPQ R9, $-1 + JNE LBB23_79 + DECQ DX + MOVQ DX, R9 + JMP LBB23_44 LBB23_49: - MOVQ R11, AX - SUBQ DI, AX - CMPQ R9, $-1 - JNE LBB23_73 - DECQ AX - MOVQ AX, R9 - JMP LBB23_43 + MOVQ CX, DX + SUBQ DI, DX + CMPQ AX, $-1 + JNE LBB23_79 + DECQ DX + MOVQ DX, AX + JMP LBB23_44 LBB23_51: - MOVQ $-1, AX - JMP LBB23_70 - -LBB23_52: - ADDQ CX, R12 - WORD $0xf8c5; BYTE $0x77 // vzeroupper + MOVQ CX, DX + SUBQ DI, DX + CMPQ R8, $-1 + JNE LBB23_79 + DECQ DX + MOVQ DX, R8 + JMP LBB23_44 LBB23_53: - MOVQ $-1, AX - TESTQ R10, R10 - JE LBB23_70 + MOVQ $-1, AX + JMP LBB23_74 LBB23_54: + ADDQ CX, R14 + WORD $0xf8c5; BYTE $0x77 // vzeroupper + MOVQ R14, R10 + MOVQ $-1, DX + TESTQ AX, AX + JNE LBB23_57 + JMP LBB23_73 + +LBB23_55: + ADDQ CX, R10 + +LBB23_56: + MOVQ $-1, DX + TESTQ AX, AX + JE LBB23_73 + +LBB23_57: TESTQ R9, R9 - JE LBB23_70 - TESTQ R10, R10 - JLE LBB23_58 - LEAQ -1(R10), AX - CMPQ R8, AX - JE LBB23_58 - NOTQ R10 - MOVQ R10, AX - JMP LBB23_70 - -LBB23_58: - MOVQ R9, AX - ORQ R8, AX - CMPQ R9, R8 - JL LBB23_62 - TESTQ AX, AX - JS LBB23_62 - NOTQ R9 - MOVQ R9, AX - JMP LBB23_70 - -LBB23_61: - ADDQ CX, R11 - MOVQ R11, R12 - MOVQ $-1, AX - TESTQ R10, R10 - JNE LBB23_54 - JMP LBB23_70 - -LBB23_62: - LEAQ -1(R8), CX + JE LBB23_73 + TESTQ R8, R8 + JE LBB23_73 + SUBQ DI, R10 + LEAQ -1(R10), CX + CMPQ AX, CX + JE LBB23_65 + CMPQ R8, CX + JE LBB23_65 CMPQ R9, CX - JNE LBB23_65 - TESTQ AX, AX - JS LBB23_65 - NOTQ R8 - MOVQ R8, AX - JMP LBB23_70 + JE LBB23_65 + TESTQ R9, R9 + JLE LBB23_66 + LEAQ -1(R9), CX + CMPQ AX, CX + JE LBB23_66 + NOTQ R9 + MOVQ R9, DX + MOVQ R9, AX + JMP LBB23_74 LBB23_65: - SUBQ DI, R12 - MOVQ R12, AX - JMP LBB23_70 + NEGQ R10 + MOVQ R10, DX + MOVQ R10, AX + JMP LBB23_74 LBB23_66: - SUBQ DI, R12 - BSFL DX, AX - ADDQ R12, AX - JMP LBB23_69 - -LBB23_68: - SUBQ DI, R11 - BSFL DX, AX - ADDQ R11, AX + MOVQ R8, CX + ORQ AX, CX + CMPQ R8, AX + JL LBB23_69 + TESTQ CX, CX + JS LBB23_69 + NOTQ R8 + MOVQ R8, DX + MOVQ R8, AX + JMP LBB23_74 LBB23_69: - NOTQ AX + TESTQ CX, CX + LEAQ -1(AX), CX + NOTQ AX + LONG $0xc2480f49 // cmovsq %r10, %rax + CMPQ R8, CX + LONG $0xc2450f49 // cmovneq %r10, %rax + JMP LBB23_74 LBB23_70: + SUBQ DI, R14 + BSFL BX, DX + ADDQ R14, DX + JMP LBB23_72 + +LBB23_71: + SUBQ DI, R10 + BSFL BX, DX + ADDQ R10, DX + +LBB23_72: + NOTQ DX + +LBB23_73: + MOVQ DX, AX + +LBB23_74: BYTE $0x5b // popq %rbx WORD $0x5c41 // popq %r12 + WORD $0x5d41 // popq %r13 WORD $0x5e41 // popq %r14 WORD $0x5f41 // popq %r15 BYTE $0x5d // popq %rbp WORD $0xf8c5; BYTE $0x77 // vzeroupper RET -LBB23_73: - NEGQ AX - JMP LBB23_70 +LBB23_75: + MOVQ R11, R10 + MOVQ $-1, DX + TESTQ AX, AX + JNE LBB23_57 + JMP LBB23_73 -LBB23_74: - MOVQ $-1, R10 - MOVQ $-1, R8 +LBB23_79: + NEGQ DX + JMP LBB23_73 + +LBB23_76: MOVQ $-1, R9 - MOVQ DI, R11 - CMPQ SI, $15 - JA LBB23_24 + MOVQ $-1, AX + MOVQ $-1, R8 + MOVQ DI, R10 + CMPQ SI, $16 + JAE LBB23_24 JMP LBB23_42 -// .set L23_0_set_45, LBB23_45-LJTI23_0 -// .set L23_0_set_53, LBB23_53-LJTI23_0 -// .set L23_0_set_49, LBB23_49-LJTI23_0 -// .set L23_0_set_43, LBB23_43-LJTI23_0 // .set L23_0_set_47, LBB23_47-LJTI23_0 +// .set L23_0_set_56, LBB23_56-LJTI23_0 +// .set L23_0_set_51, LBB23_51-LJTI23_0 +// .set L23_0_set_44, LBB23_44-LJTI23_0 +// .set L23_0_set_49, LBB23_49-LJTI23_0 LJTI23_0: - LONG $0xfffffee6 // .long L23_0_set_45 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xfffffee6 // .long L23_0_set_45 - LONG $0xffffff16 // .long L23_0_set_49 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xfffffec9 // .long L23_0_set_43 - LONG $0xfffffec9 // .long L23_0_set_43 - LONG $0xfffffec9 // .long L23_0_set_43 - LONG $0xfffffec9 // .long L23_0_set_43 - LONG $0xfffffec9 // .long L23_0_set_43 - LONG $0xfffffec9 // .long L23_0_set_43 - LONG $0xfffffec9 // .long L23_0_set_43 - LONG $0xfffffec9 // .long L23_0_set_43 - LONG $0xfffffec9 // .long L23_0_set_43 - LONG $0xfffffec9 // .long L23_0_set_43 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xfffffefe // .long L23_0_set_47 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xffffff40 // .long L23_0_set_53 - LONG $0xfffffefe // .long L23_0_set_47 + LONG $0xfffffe98 // .long L23_0_set_47 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xfffffe98 // .long L23_0_set_47 + LONG $0xfffffec8 // .long L23_0_set_51 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xfffffe73 // .long L23_0_set_44 + LONG $0xfffffe73 // .long L23_0_set_44 + LONG $0xfffffe73 // .long L23_0_set_44 + LONG $0xfffffe73 // .long L23_0_set_44 + LONG $0xfffffe73 // .long L23_0_set_44 + LONG $0xfffffe73 // .long L23_0_set_44 + LONG $0xfffffe73 // .long L23_0_set_44 + LONG $0xfffffe73 // .long L23_0_set_44 + LONG $0xfffffe73 // .long L23_0_set_44 + LONG $0xfffffe73 // .long L23_0_set_44 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xfffffeb0 // .long L23_0_set_49 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xffffff09 // .long L23_0_set_56 + LONG $0xfffffeb0 // .long L23_0_set_49 _skip_positive: BYTE $0x55 // pushq %rbp @@ -7195,7 +7230,7 @@ _skip_positive: MOVQ 8(DI), SI SUBQ BX, SI MOVQ AX, DI - LONG $0xfffa9ce8; BYTE $0xff // callq _skip_number + LONG $0xfffa20e8; BYTE $0xff // callq _skip_number TESTQ AX, AX JS LBB24_1 MOVQ 0(R14), CX @@ -11910,7 +11945,7 @@ TEXT ·__skip_array(SB), NOSPLIT | NOFRAME, $0 - 32 _entry: MOVQ (TLS), R14 - LEAQ -128(SP), R12 + LEAQ -136(SP), R12 CMPQ R12, 16(R14) JBE _stack_grow @@ -11931,7 +11966,7 @@ TEXT ·__skip_object(SB), NOSPLIT | NOFRAME, $0 - 32 _entry: MOVQ (TLS), R14 - LEAQ -128(SP), R12 + LEAQ -136(SP), R12 CMPQ R12, 16(R14) JBE _stack_grow @@ -11952,7 +11987,7 @@ TEXT ·__skip_one(SB), NOSPLIT | NOFRAME, $0 - 32 _entry: MOVQ (TLS), R14 - LEAQ -128(SP), R12 + LEAQ -136(SP), R12 CMPQ R12, 16(R14) JBE _stack_grow diff --git a/internal/native/avx2/native_amd64_test.go b/internal/native/avx2/native_amd64_test.go index 49ba2c4..ecd4ca1 100644 --- a/internal/native/avx2/native_amd64_test.go +++ b/internal/native/avx2/native_amd64_test.go @@ -495,6 +495,18 @@ func TestNative_SkipOne(t *testing.T) { assert.Equal(t, 41, q) } +func TestNative_SkipOne_Error(t *testing.T) { + for _, s := range([]string{ + "-", "+", "0.", "0. ", "+1", "0.0e ", "9e+", "0e-", + "tru", "fals", "nul", "trux", "fals ", + `"asdf`, `"\\\"`, + }) { + p := 0 + q := __skip_one(&s, &p, &types.StateMachine{}) + assert.True(t, q < 0) + } +} + func TestNative_SkipArray(t *testing.T) { p := 0 s := `null, true, false, 1, 2.0, -3, {"asdf": "wqer"}],` diff --git a/internal/native/avx2/native_subr_amd64.go b/internal/native/avx2/native_subr_amd64.go index 90a1923..3b40bb5 100644 --- a/internal/native/avx2/native_subr_amd64.go +++ b/internal/native/avx2/native_subr_amd64.go @@ -34,9 +34,9 @@ const ( _stack__lspace = 8 _stack__lzero = 8 _stack__quote = 64 - _stack__skip_array = 128 - _stack__skip_object = 128 - _stack__skip_one = 128 + _stack__skip_array = 136 + _stack__skip_object = 136 + _stack__skip_one = 136 _stack__u64toa = 8 _stack__unquote = 72 _stack__value = 392 diff --git a/internal/native/native_amd64_test.tmpl b/internal/native/native_amd64_test.tmpl index 28cffd2..cdadddd 100644 --- a/internal/native/native_amd64_test.tmpl +++ b/internal/native/native_amd64_test.tmpl @@ -493,6 +493,18 @@ func TestNative_SkipOne(t *testing.T) { assert.Equal(t, 41, q) } +func TestNative_SkipOne_Error(t *testing.T) { + for _, s := range([]string{ + "-", "+", "0.", "0. ", "+1", "0.0e ", "9e+", "0e-", + "tru", "fals", "nul", "trux", "fals ", + `"asdf`, `"\\\"`, + }) { + p := 0 + q := __skip_one(&s, &p, &types.StateMachine{}) + assert.True(t, q < 0) + } +} + func TestNative_SkipArray(t *testing.T) { p := 0 s := `null, true, false, 1, 2.0, -3, {"asdf": "wqer"}],` diff --git a/native/scanning.c b/native/scanning.c index 8589d44..3efe419 100644 --- a/native/scanning.c +++ b/native/scanning.c @@ -1019,7 +1019,7 @@ static inline long skip_number(const char *sp, size_t nb) { } /* remaining bytes, do with scalar code */ - while (likely(--nb >= 0)) { + while (likely(nb-- > 0)) { switch (*sp++) { case '0' : /* fallthrough */ case '1' : /* fallthrough */ @@ -1039,10 +1039,11 @@ static inline long skip_number(const char *sp, size_t nb) { default : sp--; goto check_index; } } - check_index: - if (di == 0 || si == 0) { + if (di == 0 || si == 0 || ei == 0) { return -1; + } else if (di == sp - ss - 1|| si == sp - ss - 1 || ei == sp - ss - 1) { + return -(sp - ss); } else if (si > 0 && ei != si - 1) { return -si - 1; } else if (di >= 0 && ei >= 0 && di > ei - 1) {