user: What is the c source code of the assembly code below?

```asm
<utf8_string_length>:
  endbr64
  push   %r15
  push   %r14
  mov    %rdi,%r14
  push   %r13
  mov    %rsi,%r13
  push   %r12
  push   %rbp
  xor    %ebp,%ebp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x8,%rsp
  and    $0x7,%edi
  je     L48
  cmp    %rsi,%r14
  jb     L51
  jmp    L48
  nopl   0x0(%rax)
L25:
  cmp    %rbx,%r13
  jbe    L48
L51:
  mov    (%rbx),%edx
  xor    %eax,%eax
  and    $0xc0,%edx
  cmp    $0x80,%edx
  sete   %al
  add    $0x4,%rbx
  add    %rax,%rbp
  test   $0x7,%bl
  jne    L25
L48:
  lea    -0x20(%r13),%r15
  cmp    %rbx,%r15
  jbe    L107
  mov    %rbx,%r12
L92:
  mov    (%r12),%rdi
  add    $0x20,%r12
  call   <utf8_count_non_start_bytes_in_word@plt>
  add    %rax,%rbp
  cmp    %r15,%r12
  jb     L92
  lea    -0x21(%r13),%rax
  sub    %rbx,%rax
  and    $0xffffffffffffffe0,%rax
  lea    0x20(%rbx,%rax,1),%rbx
L107:
  cmp    %rbx,%r13
  jbe    L105
  lea    -0x1(%r13),%rax
  sub    %rbx,%rax
  mov    %rax,%rdx
  shr    $0x2,%rdx
  add    $0x1,%rdx
  cmp    $0xb,%rax
  jbe    L99
  movdqa D6(%rip),%xmm1
  movdqu (%rbx),%xmm0
  pxor   %xmm2,%xmm2
  mov    %rdx,%rax
  movdqa D24(%rip),%xmm4
  movdqa D23(%rip),%xmm3
  shr    $0x2,%rax
  pand   %xmm1,%xmm0
  pcmpeqd %xmm4,%xmm0
  pand   %xmm3,%xmm0
  movdqa %xmm0,%xmm5
  punpckhdq %xmm2,%xmm0
  punpckldq %xmm2,%xmm5
  paddq  %xmm5,%xmm0
  cmp    $0x1,%rax
  je     L74
  movdqu 0x10(%rbx),%xmm6
  pand   %xmm6,%xmm1
  pcmpeqd %xmm4,%xmm1
  pand   %xmm3,%xmm1
  movdqa %xmm1,%xmm3
  punpckhdq %xmm2,%xmm1
  punpckldq %xmm2,%xmm3
  paddq  %xmm3,%xmm0
  paddq  %xmm1,%xmm0
L74:
  movdqa %xmm0,%xmm1
  psrldq $0x8,%xmm1
  paddq  %xmm1,%xmm0
  movq   %xmm0,%rax
  add    %rax,%rbp
  mov    %rdx,%rax
  and    $0xfffffffffffffffc,%rax
  lea    (%rbx,%rax,4),%rbx
  cmp    %rdx,%rax
  je     L105
L99:
  mov    (%rbx),%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  sete   %al
  movzbl %al,%eax
  add    %rax,%rbp
  lea    0x4(%rbx),%rax
  cmp    %rax,%r13
  jbe    L105
  mov    0x4(%rbx),%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  sete   %al
  movzbl %al,%eax
  add    %rax,%rbp
  lea    0x8(%rbx),%rax
  cmp    %rax,%r13
  jbe    L105
  mov    0x8(%rbx),%eax
  and    $0xc0,%eax
  cmp    $0x80,%eax
  sete   %al
  movzbl %al,%eax
  add    %rax,%rbp
L105:
  mov    %r13,%rax
  add    $0x8,%rsp
  sub    %r14,%rax
  pop    %rbx
  sar    $0x2,%rax
  sub    %rbp,%rax
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: parse_data
arguments: label: D6
type: byte[16]
name: parse_data
arguments: label: D24
type: byte[16]
name: parse_data
arguments: label: D23
type: byte[16]

tool: {"D6": [0xc0,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0x00,0x00]}

tool: {"D24": [0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00]}

tool: {"D23": [0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00]}

assistant: ```c
ssize_t utf8_string_length(const uint8_t *start, const uint8_t *end) {
  ssize_t non_start_count = 0;
  const uint8_t *p = start;
  while ((uintptr_t)(p) & (sizeof(uintptr_t) - 1) && p < end) {
    non_start_count += !((*p & 0xC0) != 0x80);
    ++p;
  }
  while (p < (end - sizeof(uintptr_t))) {
    uintptr_t w = *(uintptr_t *)(p);
    p += sizeof(uintptr_t);
    non_start_count += utf8_count_non_start_bytes_in_word(w);
  }
  while (p < end) {
    non_start_count += !((*p & 0xC0) != 0x80);
    ++p;
  }
  return end - start - non_start_count;
}
```