user: Converte this assembly snippet into its equivalent C code:

```asm
<md5_encode>:
  endbr64
  test   %edx,%edx
  jle    L19
  lea    -0x1(%rdx),%eax
  mov    %rdi,%rcx
  mov    %rsi,%rdi
  mov    %edx,%esi
  cmp    $0x2,%eax
  jbe    L63
  mov    %esi,%r8d
  mov    %rdi,%rdx
  pxor   %xmm4,%xmm4
  mov    %rcx,%rax
  shr    $0x2,%r8d
  movdqa D1(%rip),%xmm5
  sub    $0x1,%r8d
  shl    $0x4,%r8
  lea    0x10(%rdi,%r8,1),%r8
  cs nopw 0x0(%rax,%rax,1)
L35:
  movdqu (%rdx),%xmm0
  movdqa %xmm4,%xmm2
  movdqa %xmm4,%xmm6
  add    $0x10,%rdx
  movdqa %xmm4,%xmm9
  sub    $0xffffffffffffff80,%rax
  movdqa %xmm0,%xmm1
  pand   %xmm5,%xmm1
  pcmpgtd %xmm1,%xmm2
  movdqa %xmm1,%xmm8
  movdqa %xmm1,%xmm3
  movdqa %xmm0,%xmm1
  psrad  $0x8,%xmm1
  pand   %xmm5,%xmm1
  punpckldq %xmm2,%xmm8
  punpckhdq %xmm2,%xmm3
  pcmpgtd %xmm1,%xmm6
  movdqa %xmm1,%xmm7
  movdqa %xmm1,%xmm2
  movhps %xmm3,-0x20(%rax)
  movdqa %xmm0,%xmm1
  psrld  $0x18,%xmm0
  movq   %xmm8,-0x80(%rax)
  psrad  $0x10,%xmm1
  movhps %xmm8,-0x60(%rax)
  pand   %xmm5,%xmm1
  punpckldq %xmm6,%xmm7
  punpckhdq %xmm6,%xmm2
  movq   %xmm3,-0x40(%rax)
  pcmpgtd %xmm1,%xmm9
  movdqa %xmm1,%xmm6
  movq   %xmm7,-0x78(%rax)
  movhps %xmm7,-0x58(%rax)
  movq   %xmm2,-0x38(%rax)
  punpckhdq %xmm9,%xmm1
  punpckldq %xmm9,%xmm6
  movhps %xmm2,-0x18(%rax)
  movq   %xmm1,-0x30(%rax)
  movhps %xmm1,-0x10(%rax)
  movdqa %xmm0,%xmm1
  punpckhdq %xmm4,%xmm0
  punpckldq %xmm4,%xmm1
  movq   %xmm6,-0x70(%rax)
  movhps %xmm6,-0x50(%rax)
  movq   %xmm1,-0x68(%rax)
  movhps %xmm1,-0x48(%rax)
  movq   %xmm0,-0x28(%rax)
  movhps %xmm0,-0x8(%rax)
  cmp    %r8,%rdx
  jne    L35
  mov    %esi,%eax
  and    $0xfffffffc,%eax
  lea    0x0(,%rax,4),%r8d
  cmp    %eax,%esi
  je     L58
L6:
  movslq %eax,%rdx
  push   %rbp
  movslq %r8d,%r8
  push   %rbx
  mov    (%rdi,%rdx,4),%ebx
  lea    0x0(,%rdx,4),%r9
  lea    0x0(,%r8,8),%rdx
  movzbl %bh,%ebp
  movzbl %bl,%r11d
  movslq %ebp,%r10
  movq   %r11,%xmm0
  movq   %r10,%xmm5
  punpcklqdq %xmm5,%xmm0
  movups %xmm0,(%rcx,%r8,8)
  mov    %ebx,%r8d
  shr    $0x18,%ebx
  sar    $0x10,%r8d
  mov    %rbx,0x18(%rcx,%rdx,1)
  movzbl %r8b,%r8d
  mov    %r8,0x10(%rcx,%rdx,1)
  lea    0x1(%rax),%r8d
  cmp    %r8d,%esi
  jle    L12
  mov    0x4(%rdi,%r9,1),%ebx
  add    $0x2,%eax
  movzbl %bh,%ebp
  movzbl %bl,%r11d
  movslq %ebp,%r8
  movq   %r11,%xmm0
  movq   %r8,%xmm5
  mov    %ebx,%r8d
  shr    $0x18,%ebx
  sar    $0x10,%r8d
  punpcklqdq %xmm5,%xmm0
  mov    %rbx,0x38(%rcx,%rdx,1)
  movzbl %r8b,%r8d
  movups %xmm0,0x20(%rcx,%rdx,1)
  mov    %r8,0x30(%rcx,%rdx,1)
  cmp    %eax,%esi
  jle    L12
  mov    0x8(%rdi,%r9,1),%eax
  movzbl %ah,%esi
  movzbl %al,%edi
  movslq %esi,%rsi
  movq   %rdi,%xmm0
  movq   %rsi,%xmm5
  mov    %eax,%esi
  shr    $0x18,%eax
  sar    $0x10,%esi
  mov    %rax,0x58(%rcx,%rdx,1)
  punpcklqdq %xmm5,%xmm0
  movzbl %sil,%esi
  movups %xmm0,0x40(%rcx,%rdx,1)
  mov    %rsi,0x50(%rcx,%rdx,1)
L12:
  pop    %rbx
  pop    %rbp
  ret
  nopl   (%rax)
L19:
  ret
  nopl   0x0(%rax)
L58:
  ret
L63:
  xor    %r8d,%r8d
  xor    %eax,%eax
  jmp    L6
```

tool_calls: name: retrieve_data
arguments: data_label: D1
data_type: byte[16]

tool: {"D1": [0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00]}

assistant: ```c
void md5_encode(uint8_t *output, const uint32_t *input, uint32_t len) {
  uint32_t i, j;
  for (i = 0, j = 0; i < len; i++, j += 4) {
    output[j] = (uint8_t)(input[i] & 0xff);
    output[j + 1] = (uint8_t)((input[i] >> 8) & 0xff);
    output[j + 2] = (uint8_t)((input[i] >> 16) & 0xff);
    output[j + 3] = (uint8_t)((input[i] >> 24) & 0xff);
  }
}
```