// File: /workspace/github_cpp_makefile_star2_O3/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 0x39f3
pxor %xmm10, %xmm10
pxor %xmm4, %xmm4
pxor %xmm0, %xmm0
movdqa %xmm0, (%rsp)
subq %rax, %rdx
jbe 0x39db
movdqa %xmm10, 0x20(%rsp)
movdqa %xmm4, 0x10(%rsp)
movaps 0x4d4f(%rip), %xmm0     # 0x86c0
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 0x20f0
movdqa (%rbx), %xmm3
movdqa 0x10(%rbx), %xmm1
movdqa 0x20(%rbx), %xmm2
movdqa 0x30(%rbx), %xmm0
movdqa %xmm1, 0x40(%rsp)
movdqa %xmm2, 0x50(%rsp)
movdqa %xmm0, 0x60(%rsp)
por %xmm3, %xmm1
por %xmm0, %xmm2
por %xmm1, %xmm2
ptest 0x4c86(%rip), %xmm2     # 0x8650
jne 0x3cae
movdqa 0x10(%rsp), %xmm4
por (%rsp), %xmm4
por (%rsp), %xmm4
xorl %eax, %eax
ptest %xmm4, %xmm4
setne %al
addq $0xb0, %rsp
popq %rbx
retq
pushq $0x10
popq %rdi
pxor %xmm0, %xmm0
xorl %eax, %eax
movdqa 0x4c4c(%rip), %xmm1     # 0x8650
movdqa 0x4c54(%rip), %xmm6     # 0x8660
movdqa 0x4aec(%rip), %xmm3     # 0x8500
movdqa 0x4af4(%rip), %xmm2     # 0x8510
movdqa 0x4c4b(%rip), %xmm8     # 0x8670
movdqa 0x4c53(%rip), %xmm7     # 0x8680
movdqa 0x4c5a(%rip), %xmm9     # 0x8690
movdqa 0x4c61(%rip), %xmm15    # 0x86a0
pxor %xmm4, %xmm4
movdqa %xmm4, (%rsp)
pxor %xmm10, %xmm10
movdqu (%rsi,%rax), %xmm12
movdqu 0x10(%rsi,%rax), %xmm13
movdqu 0x20(%rsi,%rax), %xmm14
movdqu 0x30(%rsi,%rax), %xmm11
movdqa %xmm13, 0x40(%rsp)
movdqa %xmm14, 0x50(%rsp)
movdqa %xmm11, 0x60(%rsp)
por %xmm12, %xmm13
por %xmm11, %xmm14
por %xmm13, %xmm14
ptest %xmm1, %xmm14
jne 0x3aa7
por (%rsp), %xmm4
addq $0x40, %rax
cmpq %rcx, %rax
jb 0x3a4d
jmp 0x3958
movdqa %xmm12, %xmm13
palignr $0xf, %xmm10, %xmm13    # xmm13 = xmm10[15],xmm13[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movdqa %xmm13, (%rsp)
movdqa %xmm13, %xmm5
movdqa %xmm12, %xmm14
psrlw $0x4, %xmm14
pand %xmm6, %xmm14
movdqa %xmm3, 0x10(%rsp)
movdqa 0x10(%rsp), %xmm13
pshufb %xmm14, %xmm13
movdqa %xmm13, 0x10(%rsp)
movdqa %xmm5, %xmm13
movdqa %xmm5, %xmm14
psrlw $0x4, %xmm14
pand %xmm6, %xmm14
movdqa %xmm2, %xmm5
pshufb %xmm14, %xmm5
movdqa %xmm13, %xmm14
pand %xmm6, %xmm14
movdqa 0x4a06(%rip), %xmm13    # 0x8520
pshufb %xmm14, %xmm13
pand 0x10(%rsp), %xmm13
pand %xmm5, %xmm13
movdqa %xmm13, 0x10(%rsp)
movdqa %xmm12, %xmm14
palignr $0xe, %xmm10, %xmm14    # xmm14 = xmm10[14,15],xmm14[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
movdqa %xmm10, %xmm5
movdqa %xmm12, %xmm10
palignr $0xd, %xmm5, %xmm10     # xmm10 = xmm5[13,14,15],xmm10[0,1,2,3,4,5,6,7,8,9,10,11,12]
movdqa (%rsp), %xmm13
psubusb %xmm7, %xmm13
movdqa %xmm13, (%rsp)
psubusb %xmm9, %xmm14
por (%rsp), %xmm14
psubusb %xmm15, %xmm10
por %xmm14, %xmm10
movdqa %xmm8, %xmm14
pcmpgtb %xmm12, %xmm14
pcmpgtb %xmm0, %xmm10
pxor %xmm14, %xmm10
por 0x10(%rsp), %xmm4
por %xmm10, %xmm4
movq %rdi, %r8
movdqa %xmm7, %xmm9
movdqa 0x30(%rsp,%r8), %xmm13
movdqa %xmm13, %xmm14
palignr $0xf, %xmm12, %xmm14    # xmm14 = xmm12[15],xmm14[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movdqa %xmm13, %xmm10
psrlw $0x4, %xmm10
pand %xmm6, %xmm10
movdqa %xmm3, %xmm15
pshufb %xmm10, %xmm3
movdqa %xmm14, %xmm10
psrlw $0x4, %xmm10
pand %xmm6, %xmm10
movdqa %xmm4, %xmm0
movdqa %xmm2, %xmm4
pshufb %xmm10, %xmm4
movdqa %xmm14, %xmm10
pand %xmm6, %xmm10
movdqa 0x4925(%rip), %xmm5     # 0x8520
pshufb %xmm10, %xmm5
pand %xmm3, %xmm5
pand %xmm4, %xmm5
por %xmm0, %xmm5
pxor %xmm0, %xmm0
movdqa %xmm13, %xmm3
palignr $0xe, %xmm12, %xmm3     # xmm3 = xmm12[14,15],xmm3[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
movdqa %xmm13, %xmm4
palignr $0xd, %xmm12, %xmm4     # xmm4 = xmm12[13,14,15],xmm4[0,1,2,3,4,5,6,7,8,9,10,11,12]
psubusb %xmm9, %xmm14
psubusb 0x4a5a(%rip), %xmm3     # 0x8690
por %xmm14, %xmm3
psubusb 0x4a5d(%rip), %xmm4     # 0x86a0
por %xmm3, %xmm4
movdqa %xmm8, %xmm3
pcmpgtb %xmm13, %xmm3
pcmpgtb %xmm0, %xmm4
pxor %xmm3, %xmm4
movdqa %xmm15, %xmm3
por %xmm5, %xmm4
addq $0x10, %r8
movdqa %xmm13, %xmm12
cmpq $0x40, %r8
jne 0x3b9d
movdqa %xmm11, %xmm10
movdqa 0x4a2e(%rip), %xmm7     # 0x86b0
psubusb %xmm7, %xmm10
movdqa %xmm10, (%rsp)
movdqa %xmm11, %xmm10
movdqa %xmm9, %xmm7
movdqa 0x49f0(%rip), %xmm9     # 0x8690
movdqa 0x49f7(%rip), %xmm15    # 0x86a0
jmp 0x3a99
movdqa %xmm3, %xmm7
movdqa 0x20(%rsp), %xmm2
palignr $0xf, %xmm2, %xmm7      # xmm7 = xmm2[15],xmm7[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movdqa %xmm3, %xmm4
psrlw $0x4, %xmm4
movdqa 0x4991(%rip), %xmm1     # 0x8660
pand %xmm1, %xmm4
movdqa 0x4825(%rip), %xmm6     # 0x8500
pshufb %xmm4, %xmm6
movdqa %xmm7, %xmm5
psrlw $0x4, %xmm5
pand %xmm1, %xmm5
movdqa 0x481a(%rip), %xmm8     # 0x8510
pshufb %xmm5, %xmm8
movdqa %xmm7, %xmm9
pand %xmm1, %xmm9
movdqa 0x4812(%rip), %xmm5     # 0x8520
movdqa %xmm5, %xmm10
pshufb %xmm9, %xmm10
pand %xmm6, %xmm10
pand %xmm8, %xmm10
movdqa %xmm3, %xmm8
palignr $0xe, %xmm2, %xmm8      # xmm8 = xmm2[14,15],xmm8[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
movdqa %xmm3, %xmm9
palignr $0xd, %xmm2, %xmm9      # xmm9 = xmm2[13,14,15],xmm9[0,1,2,3,4,5,6,7,8,9,10,11,12]
movdqa 0x492d(%rip), %xmm6     # 0x8670
movdqa %xmm6, %xmm11
psubusb 0x4930(%rip), %xmm7     # 0x8680
pcmpgtb %xmm3, %xmm11
psubusb 0x4932(%rip), %xmm8     # 0x8690
por %xmm7, %xmm8
psubusb 0x4934(%rip), %xmm9     # 0x86a0
por %xmm8, %xmm9
pxor %xmm7, %xmm7
pcmpgtb %xmm7, %xmm9
pxor %xmm11, %xmm9
movdqa 0x10(%rsp), %xmm4
por %xmm10, %xmm4
por %xmm9, %xmm4
pushq $0x10
popq %rax
movdqa 0x48e5(%rip), %xmm8     # 0x8680
movdqa 0x48ec(%rip), %xmm9     # 0x8690
movdqa 0x48f3(%rip), %xmm10    # 0x86a0
movdqa 0x30(%rsp,%rax), %xmm11
movdqa %xmm11, %xmm12
palignr $0xf, %xmm3, %xmm12     # xmm12 = xmm3[15],xmm12[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 0x4727(%rip), %xmm14    # 0x8500
pshufb %xmm13, %xmm14
movdqa %xmm12, %xmm13
psrlw $0x4, %xmm13
pand %xmm1, %xmm13
movdqa 0x4718(%rip), %xmm15    # 0x8510
pshufb %xmm13, %xmm15
movdqa %xmm12, %xmm2
pand %xmm1, %xmm2
movdqa %xmm5, %xmm13
pshufb %xmm2, %xmm13
pand %xmm14, %xmm13
pand %xmm15, %xmm13
movdqa %xmm11, %xmm2
por %xmm4, %xmm13
movdqa %xmm11, %xmm14
palignr $0xe, %xmm3, %xmm2      # xmm2 = xmm3[14,15],xmm2[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
palignr $0xd, %xmm3, %xmm14     # xmm14 = xmm3[13,14,15],xmm14[0,1,2,3,4,5,6,7,8,9,10,11,12]
psubusb %xmm9, %xmm2
psubusb %xmm8, %xmm12
por %xmm2, %xmm12
psubusb %xmm10, %xmm14
por %xmm14, %xmm12
movdqa %xmm6, %xmm2
pcmpgtb %xmm11, %xmm2
pcmpgtb %xmm7, %xmm12
pxor %xmm2, %xmm12
movdqa %xmm12, %xmm4
por %xmm13, %xmm4
movdqa %xmm11, %xmm3
addq $0x10, %rax
cmpq $0x40, %rax
jne 0x3dad
psubusb 0x4827(%rip), %xmm0     # 0x86b0
movdqa %xmm0, (%rsp)
jmp 0x39db