// File: /workspace/github_cpp_makefile_star2_O1/lemire[P]validateutf8-experiments/src/generic/validator.h
// Function: fastvalidate::error_code fastvalidate::westmere::lookup2::validate<fastvalidate::westmere::lookup2::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
ja 0x3b09
pxor %xmm7, %xmm7
pxor %xmm3, %xmm3
pxor %xmm15, %xmm15
subq %rax, %rdx
jbe 0x3af1
movdqa %xmm15, 0x10(%rsp)
movdqa %xmm7, 0x60(%rsp)
movdqa %xmm3, (%rsp)
movaps 0x4c45(%rip), %xmm0     # 0x86c0
leaq 0x70(%rsp), %rbx
movaps %xmm0, (%rbx)
movaps %xmm0, 0x10(%rbx)
movaps %xmm0, 0x20(%rbx)
movaps %xmm0, 0x30(%rbx)
addq %rax, %rsi
movq %rbx, %rdi
callq 0x20f0
movdqa (%rbx), %xmm7
movdqa 0x10(%rbx), %xmm1
movdqa 0x20(%rbx), %xmm2
movdqa 0x30(%rbx), %xmm0
movdqa %xmm7, 0x20(%rsp)
movdqa %xmm1, 0x30(%rsp)
movdqa %xmm2, 0x40(%rsp)
movdqa %xmm0, 0x50(%rsp)
por %xmm7, %xmm1
por %xmm0, %xmm2
por %xmm1, %xmm2
ptest 0x4b76(%rip), %xmm2     # 0x8650
jne 0x3da1
movdqa (%rsp), %xmm3
movdqa 0x10(%rsp), %xmm15
por %xmm15, %xmm3
por %xmm15, %xmm3
xorl %eax, %eax
ptest %xmm3, %xmm3
setne %al
addq $0xb0, %rsp
popq %rbx
retq
pushq $0x10
popq %rdi
pxor %xmm0, %xmm0
xorl %eax, %eax
movdqa 0x4b36(%rip), %xmm1     # 0x8650
movdqa 0x4b3e(%rip), %xmm6     # 0x8660
movdqa 0x49d6(%rip), %xmm4     # 0x8500
movdqa 0x49de(%rip), %xmm2     # 0x8510
movdqa 0x4b35(%rip), %xmm8     # 0x8670
movdqa 0x4b3c(%rip), %xmm10    # 0x8680
movdqa 0x4b43(%rip), %xmm9     # 0x8690
pxor %xmm15, %xmm15
pxor %xmm7, %xmm7
pxor %xmm3, %xmm3
movdqu (%rsi,%rax), %xmm12
movdqu 0x10(%rsi,%rax), %xmm13
movdqu 0x20(%rsi,%rax), %xmm14
movdqu 0x30(%rsi,%rax), %xmm11
movdqa %xmm12, 0x20(%rsp)
movdqa %xmm13, 0x30(%rsp)
movdqa %xmm14, 0x40(%rsp)
movdqa %xmm11, 0x50(%rsp)
por %xmm12, %xmm13
por %xmm11, %xmm14
por %xmm13, %xmm14
ptest %xmm1, %xmm14
jne 0x3bbb
por %xmm15, %xmm3
addq $0x40, %rax
cmpq %rcx, %rax
jb 0x3b5a
jmp 0x3a59
movdqa %xmm12, %xmm13
palignr $0xf, %xmm7, %xmm13     # xmm13 = xmm7[15],xmm13[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movdqa %xmm13, 0x10(%rsp)
movdqa %xmm12, %xmm14
psrlw $0x4, %xmm14
pand %xmm6, %xmm14
movdqa %xmm4, %xmm15
pshufb %xmm14, %xmm15
movdqa %xmm13, %xmm14
psrlw $0x4, %xmm14
pand %xmm6, %xmm14
movdqa %xmm2, %xmm5
pshufb %xmm14, %xmm5
movdqa %xmm13, %xmm14
pand %xmm6, %xmm14
movdqa 0x490a(%rip), %xmm13    # 0x8520
pshufb %xmm14, %xmm13
pand %xmm15, %xmm13
pand %xmm5, %xmm13
movdqa %xmm12, %xmm14
palignr $0xe, %xmm7, %xmm14     # xmm14 = xmm7[14,15],xmm14[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
movdqa %xmm8, (%rsp)
movdqa (%rsp), %xmm15
pcmpgtb %xmm12, %xmm15
movdqa %xmm15, (%rsp)
palignr $0xd, %xmm7, %xmm12     # xmm12 = xmm7[13,14,15],xmm12[0,1,2,3,4,5,6,7,8,9,10,11,12]
movdqa 0x10(%rsp), %xmm7
psubusb %xmm10, %xmm7
psubusb %xmm9, %xmm14
por %xmm7, %xmm14
psubusb 0x4a32(%rip), %xmm12    # 0x86a0
por %xmm14, %xmm12
pcmpgtb %xmm0, %xmm12
pxor (%rsp), %xmm12
por %xmm13, %xmm3
por %xmm12, %xmm3
movq %rdi, %r8
movdqa %xmm10, %xmm9
movdqa 0x10(%rsp,%r8), %xmm14
movdqa 0x20(%rsp,%r8), %xmm12
movdqa %xmm12, %xmm13
palignr $0xf, %xmm14, %xmm13    # xmm13 = xmm14[15],xmm13[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movdqa %xmm12, %xmm15
psrlw $0x4, %xmm15
pand %xmm6, %xmm15
movdqa %xmm3, %xmm0
movdqa %xmm4, %xmm3
pshufb %xmm15, %xmm3
movdqa %xmm13, %xmm15
psrlw $0x4, %xmm15
pand %xmm6, %xmm15
movdqa %xmm4, %xmm10
movdqa %xmm2, %xmm4
pshufb %xmm15, %xmm4
movdqa %xmm13, %xmm15
pand %xmm6, %xmm15
movdqa 0x4827(%rip), %xmm5     # 0x8520
pshufb %xmm15, %xmm5
movdqa 0x4998(%rip), %xmm15    # 0x86a0
pand %xmm3, %xmm5
pand %xmm4, %xmm5
por %xmm0, %xmm5
pxor %xmm0, %xmm0
movdqa %xmm12, %xmm3
palignr $0xe, %xmm14, %xmm3     # xmm3 = xmm14[14,15],xmm3[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
movdqa %xmm8, %xmm4
pcmpgtb %xmm12, %xmm4
palignr $0xd, %xmm14, %xmm12    # xmm12 = xmm14[13,14,15],xmm12[0,1,2,3,4,5,6,7,8,9,10,11,12]
psubusb %xmm9, %xmm13
psubusb 0x494e(%rip), %xmm3     # 0x8690
por %xmm13, %xmm3
psubusb %xmm15, %xmm12
por %xmm3, %xmm12
pcmpgtb %xmm0, %xmm12
pxor %xmm4, %xmm12
movdqa %xmm10, %xmm4
movdqa %xmm12, %xmm3
por %xmm5, %xmm3
addq $0x10, %r8
cmpq $0x40, %r8
jne 0x3c90
movdqa %xmm11, %xmm15
movdqa 0x492c(%rip), %xmm7     # 0x86b0
psubusb %xmm7, %xmm15
movdqa %xmm11, %xmm7
movdqa %xmm9, %xmm10
movdqa 0x48f4(%rip), %xmm9     # 0x8690
jmp 0x3bad
movdqa %xmm7, %xmm6
movdqa 0x60(%rsp), %xmm11
palignr $0xf, %xmm11, %xmm6     # xmm6 = xmm11[15],xmm6[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movdqa %xmm7, %xmm3
psrlw $0x4, %xmm3
movdqa 0x489c(%rip), %xmm1     # 0x8660
pand %xmm1, %xmm3
movdqa 0x4730(%rip), %xmm5     # 0x8500
pshufb %xmm3, %xmm5
movdqa %xmm6, %xmm4
psrlw $0x4, %xmm4
pand %xmm1, %xmm4
movdqa 0x4725(%rip), %xmm8     # 0x8510
pshufb %xmm4, %xmm8
movdqa %xmm6, %xmm9
pand %xmm1, %xmm9
movdqa 0x471d(%rip), %xmm2     # 0x8520
movdqa %xmm2, %xmm10
pshufb %xmm9, %xmm10
pand %xmm5, %xmm10
pand %xmm8, %xmm10
movdqa %xmm7, %xmm8
palignr $0xe, %xmm11, %xmm8     # xmm8 = xmm11[14,15],xmm8[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
movdqa 0x4844(%rip), %xmm5     # 0x8670
movdqa %xmm5, %xmm9
pcmpgtb %xmm7, %xmm9
psubusb 0x4842(%rip), %xmm6     # 0x8680
palignr $0xd, %xmm11, %xmm7     # xmm7 = xmm11[13,14,15],xmm7[0,1,2,3,4,5,6,7,8,9,10,11,12]
psubusb 0x4842(%rip), %xmm8     # 0x8690
por %xmm6, %xmm8
psubusb 0x4845(%rip), %xmm7     # 0x86a0
por %xmm8, %xmm7
pxor %xmm6, %xmm6
pcmpgtb %xmm6, %xmm7
pxor %xmm9, %xmm7
movdqa (%rsp), %xmm3
por %xmm10, %xmm3
por %xmm7, %xmm3
pushq $0x10
popq %rax
movdqa 0x47fa(%rip), %xmm7     # 0x8680
movdqa 0x4801(%rip), %xmm8     # 0x8690
movdqa 0x4808(%rip), %xmm9     # 0x86a0
movdqa 0x10(%rsp,%rax), %xmm12
movdqa 0x20(%rsp,%rax), %xmm11
movdqa %xmm11, %xmm10
palignr $0xf, %xmm12, %xmm10    # xmm10 = xmm12[15],xmm10[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movdqa %xmm11, %xmm13
psrlw $0x4, %xmm13
pand %xmm1, %xmm13
movdqa 0x4635(%rip), %xmm14    # 0x8500
pshufb %xmm13, %xmm14
movdqa %xmm10, %xmm13
psrlw $0x4, %xmm13
pand %xmm1, %xmm13
movdqa 0x4626(%rip), %xmm15    # 0x8510
pshufb %xmm13, %xmm15
movdqa %xmm10, %xmm13
pand %xmm1, %xmm13
movdqa %xmm2, %xmm4
pshufb %xmm13, %xmm4
pand %xmm14, %xmm4
pand %xmm15, %xmm4
por %xmm3, %xmm4
movdqa %xmm11, %xmm13
palignr $0xe, %xmm12, %xmm13    # xmm13 = xmm12[14,15],xmm13[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
movdqa %xmm5, %xmm14
pcmpgtb %xmm11, %xmm14
palignr $0xd, %xmm12, %xmm11    # xmm11 = xmm12[13,14,15],xmm11[0,1,2,3,4,5,6,7,8,9,10,11,12]
psubusb %xmm8, %xmm13
psubusb %xmm7, %xmm10
por %xmm13, %xmm10
psubusb %xmm9, %xmm11
por %xmm11, %xmm10
pcmpgtb %xmm6, %xmm10
pxor %xmm14, %xmm10
movdqa %xmm10, %xmm3
por %xmm4, %xmm3
addq $0x10, %rax
cmpq $0x40, %rax
jne 0x3e98
psubusb 0x473f(%rip), %xmm0     # 0x86b0
movdqa %xmm0, %xmm15
jmp 0x3af1