// File: /workspace/github_cpp_makefile_star2_O2/lemire[P]validateutf8-experiments/src/generic/validator.h
// Function: fastvalidate::error_code fastvalidate::westmere::lookup3::validate<fastvalidate::westmere::lookup3::utf8_checker>(char const*, unsigned long)
error_code validate(const char * input, size_t length) {
    checker c{};
    buf_block_reader<64> reader(input, length);
    while (reader.has_full_block()) {
      simd::simd8x64<uint8_t> in(reader.full_block());
      c.check_next_input(in);
      reader.advance();
    }

    if (likely(reader.has_remainder())) {
      uint8_t block[64]{};
      reader.get_remainder(block);
      simd::simd8x64<uint8_t> in(block);
      c.check_next_input(in);
      reader.advance();
    }
    c.check_eof();
    return c.errors();
  }

// Assembly:
pushq %rbx
subq $0xb0, %rsp
movq %rsi, %rdx
movq %rdi, %rsi
xorl %eax, %eax
movq %rdx, %rcx
subq $0x40, %rcx
cmovbq %rax, %rcx
pxor %xmm0, %xmm0
movdqa 0x3662(%rip), %xmm12    # 0x8670
movdqa 0x3539(%rip), %xmm13    # 0x8550
movdqa 0x3510(%rip), %xmm14    # 0x8530
movdqa 0x3517(%rip), %xmm15    # 0x8540
pushq $0x10
popq %rdi
movdqa 0x368c(%rip), %xmm1     # 0x86c0
pxor %xmm11, %xmm11
pxor %xmm9, %xmm9
pxor %xmm6, %xmm6
cmpq %rcx, %rax
jae 0x5212
movdqu (%rsi,%rax), %xmm3
movdqu 0x10(%rsi,%rax), %xmm4
movdqu 0x20(%rsi,%rax), %xmm5
movdqu 0x30(%rsi,%rax), %xmm2
movdqa %xmm4, 0x40(%rsp)
movdqa %xmm5, 0x50(%rsp)
movdqa %xmm2, 0x60(%rsp)
por %xmm3, %xmm4
por %xmm2, %xmm5
por %xmm4, %xmm5
pmovmskb %xmm5, %r8d
testl %r8d, %r8d
jne 0x5095
por %xmm6, %xmm11
addq $0x40, %rax
jmp 0x5042
movdqa %xmm3, %xmm4
palignr $0xf, %xmm9, %xmm4      # xmm4 = xmm9[15],xmm4[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movdqa %xmm3, %xmm5
psrlw $0x4, %xmm5
pand %xmm12, %xmm5
movdqa %xmm13, %xmm6
pshufb %xmm5, %xmm6
movdqa %xmm4, %xmm5
psrlw $0x4, %xmm5
pand %xmm12, %xmm5
movdqa %xmm14, %xmm7
pshufb %xmm5, %xmm7
movdqa %xmm3, %xmm5
pmaxsb %xmm4, %xmm5
pand %xmm12, %xmm4
movdqa %xmm15, %xmm8
pshufb %xmm4, %xmm8
pand %xmm6, %xmm8
pand %xmm7, %xmm8
movdqa %xmm3, %xmm4
palignr $0xe, %xmm9, %xmm4      # xmm4 = xmm9[14,15],xmm4[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
movdqa %xmm3, %xmm6
palignr $0xd, %xmm9, %xmm6      # xmm6 = xmm9[13,14,15],xmm6[0,1,2,3,4,5,6,7,8,9,10,11,12]
movdqa 0x356f(%rip), %xmm7     # 0x8680
pcmpgtb %xmm5, %xmm7
psubusb 0x3583(%rip), %xmm4     # 0x86a0
psubusb 0x358b(%rip), %xmm6     # 0x86b0
por %xmm4, %xmm6
pcmpgtb %xmm0, %xmm6
pxor %xmm7, %xmm6
por %xmm8, %xmm11
por %xmm6, %xmm11
movq %rdi, %r8
cmpq $0x40, %r8
je 0x5200
movdqa 0x30(%rsp,%r8), %xmm6
movdqa %xmm6, %xmm4
palignr $0xf, %xmm3, %xmm4      # xmm4 = xmm3[15],xmm4[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movdqa %xmm6, %xmm5
movdqa %xmm6, %xmm8
palignr $0xe, %xmm3, %xmm8      # xmm8 = xmm3[14,15],xmm8[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
movdqa %xmm6, %xmm7
palignr $0xd, %xmm3, %xmm7      # xmm7 = xmm3[13,14,15],xmm7[0,1,2,3,4,5,6,7,8,9,10,11,12]
movdqa %xmm6, %xmm3
psrlw $0x4, %xmm6
pand %xmm12, %xmm6
movdqa %xmm13, %xmm9
pshufb %xmm6, %xmm9
movdqa %xmm4, %xmm6
psrlw $0x4, %xmm6
pand %xmm12, %xmm6
movdqa %xmm14, %xmm10
pshufb %xmm6, %xmm10
pmaxsb %xmm4, %xmm5
pand %xmm12, %xmm4
movdqa %xmm15, %xmm6
pshufb %xmm4, %xmm6
pand %xmm9, %xmm6
pand %xmm10, %xmm6
movdqa 0x34b5(%rip), %xmm4     # 0x8680
pcmpgtb %xmm5, %xmm4
psubusb 0x34c8(%rip), %xmm8     # 0x86a0
psubusb 0x34d0(%rip), %xmm7     # 0x86b0
por %xmm8, %xmm7
pcmpgtb %xmm0, %xmm7
pxor %xmm4, %xmm7
por %xmm6, %xmm11
por %xmm7, %xmm11
addq $0x10, %r8
jmp 0x513e
movdqa %xmm2, %xmm6
psubusb %xmm1, %xmm6
movdqa %xmm2, %xmm9
jmp 0x508f
subq %rax, %rdx
jbe 0x529e
movdqa %xmm6, 0x20(%rsp)
movdqa %xmm9, 0x10(%rsp)
movdqa %xmm11, (%rsp)
movaps 0x341b(%rip), %xmm0     # 0x8650
leaq 0x70(%rsp), %rbx
movaps %xmm0, 0x30(%rbx)
movaps %xmm0, 0x20(%rbx)
movaps %xmm0, 0x10(%rbx)
movaps %xmm0, (%rbx)
addq %rax, %rsi
movq %rbx, %rdi
callq 0x2100
movdqa (%rbx), %xmm1
movdqa 0x10(%rbx), %xmm2
movdqa 0x20(%rbx), %xmm3
movdqa 0x30(%rbx), %xmm0
movdqa %xmm2, 0x40(%rsp)
movdqa %xmm3, 0x50(%rsp)
movdqa %xmm0, 0x60(%rsp)
por %xmm1, %xmm2
por %xmm0, %xmm3
por %xmm2, %xmm3
pmovmskb %xmm3, %eax
testl %eax, %eax
jne 0x52b7
movdqa (%rsp), %xmm11
movdqa 0x20(%rsp), %xmm6
por %xmm6, %xmm11
por %xmm6, %xmm11
xorl %eax, %eax
ptest %xmm11, %xmm11
setne %al
addq $0xb0, %rsp
popq %rbx
retq
movdqa %xmm1, %xmm2
movdqa 0x10(%rsp), %xmm7
palignr $0xf, %xmm7, %xmm2      # xmm2 = xmm7[15],xmm2[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movdqa %xmm1, %xmm3
psrlw $0x4, %xmm3
movdqa 0x3397(%rip), %xmm10    # 0x8670
pand %xmm10, %xmm3
movdqa 0x3269(%rip), %xmm12    # 0x8550
movdqa %xmm12, %xmm4
pshufb %xmm3, %xmm4
movdqa %xmm2, %xmm3
psrlw $0x4, %xmm3
pand %xmm10, %xmm3
movdqa 0x3228(%rip), %xmm13    # 0x8530
movdqa %xmm13, %xmm5
pshufb %xmm3, %xmm5
movdqa %xmm1, %xmm3
pmaxsb %xmm2, %xmm3
pand %xmm10, %xmm2
movdqa 0x3217(%rip), %xmm14    # 0x8540
movdqa %xmm14, %xmm6
pshufb %xmm2, %xmm6
pand %xmm4, %xmm6
pand %xmm5, %xmm6
movdqa %xmm1, %xmm2
palignr $0xe, %xmm7, %xmm2      # xmm2 = xmm7[14,15],xmm2[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
movdqa %xmm1, %xmm4
palignr $0xd, %xmm7, %xmm4      # xmm4 = xmm7[13,14,15],xmm4[0,1,2,3,4,5,6,7,8,9,10,11,12]
movdqa 0x3329(%rip), %xmm5     # 0x8680
psubusb 0x3341(%rip), %xmm2     # 0x86a0
psubusb 0x3349(%rip), %xmm4     # 0x86b0
pcmpgtb %xmm3, %xmm5
por %xmm2, %xmm4
pxor %xmm2, %xmm2
pcmpgtb %xmm2, %xmm4
pxor %xmm5, %xmm4
movdqa (%rsp), %xmm11
por %xmm6, %xmm11
por %xmm4, %xmm11
pushq $0x10
popq %rax
cmpq $0x40, %rax
je 0x544b
movdqa 0x30(%rsp,%rax), %xmm5
movdqa %xmm5, %xmm3
palignr $0xf, %xmm1, %xmm3      # xmm3 = xmm1[15],xmm3[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movdqa %xmm5, %xmm4
movdqa %xmm5, %xmm7
palignr $0xe, %xmm1, %xmm7      # xmm7 = xmm1[14,15],xmm7[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
movdqa %xmm5, %xmm6
palignr $0xd, %xmm1, %xmm6      # xmm6 = xmm1[13,14,15],xmm6[0,1,2,3,4,5,6,7,8,9,10,11,12]
movdqa %xmm5, %xmm1
psrlw $0x4, %xmm5
pand %xmm10, %xmm5
movdqa %xmm12, %xmm8
pshufb %xmm5, %xmm8
movdqa %xmm3, %xmm5
psrlw $0x4, %xmm5
pand %xmm10, %xmm5
movdqa %xmm13, %xmm9
pshufb %xmm5, %xmm9
pmaxsb %xmm3, %xmm4
pand %xmm10, %xmm3
movdqa %xmm14, %xmm5
pshufb %xmm3, %xmm5
pand %xmm8, %xmm5
pand %xmm9, %xmm5
movdqa 0x3268(%rip), %xmm3     # 0x8680
pcmpgtb %xmm4, %xmm3
psubusb 0x327c(%rip), %xmm7     # 0x86a0
psubusb 0x3284(%rip), %xmm6     # 0x86b0
por %xmm7, %xmm6
pcmpgtb %xmm2, %xmm6
pxor %xmm3, %xmm6
por %xmm5, %xmm11
por %xmm6, %xmm11
addq $0x10, %rax
jmp 0x538e
psubusb 0x326d(%rip), %xmm0     # 0x86c0
movdqa %xmm0, %xmm6
jmp 0x529e