user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<md5_decode>:
  endbr64
  mov    %rsi,%rcx
  mov    %edx,%esi
  test   %edx,%edx
  jle    L29
  movslq %edx,%rdx
  lea    (%rcx,%rdx,4),%rax
  lea    (%rdi,%rdx,8),%rdx
  cmp    %rax,%rdi
  setae  %al
  cmp    %rdx,%rcx
  setae  %dl
  or     %dl,%al
  je     L66
  lea    -0x1(%rsi),%eax
  cmp    $0xe,%eax
  jbe    L66
  mov    %esi,%r8d
  mov    %rcx,%rdx
  pxor   %xmm5,%xmm5
  mov    %rdi,%rax
  shr    $0x4,%r8d
  movdqa D7(%rip),%xmm6
  pxor   %xmm3,%xmm3
  pxor   %xmm4,%xmm4
  sub    $0x1,%r8d
  shl    $0x6,%r8
  lea    0x40(%rcx,%r8,1),%r8
  nopw   0x0(%rax,%rax,1)
L46:
  movdqu (%rdx),%xmm0
  movdqu 0x10(%rdx),%xmm1
  movdqa %xmm6,%xmm9
  movdqa %xmm6,%xmm10
  movdqu 0x10(%rdx),%xmm2
  movdqu 0x20(%rdx),%xmm7
  add    $0x40,%rdx
  sub    $0xffffffffffffff80,%rax
  pand   %xmm6,%xmm1
  pand   %xmm6,%xmm0
  movdqu -0x10(%rdx),%xmm8
  packuswb %xmm1,%xmm0
  movdqu -0x40(%rdx),%xmm1
  psrlw  $0x8,%xmm2
  pand   %xmm6,%xmm7
  psrlw  $0x8,%xmm8
  pand   %xmm0,%xmm9
  psrlw  $0x8,%xmm1
  psrlw  $0x8,%xmm0
  packuswb %xmm2,%xmm1
  movdqu -0x10(%rdx),%xmm2
  pand   %xmm1,%xmm10
  psrlw  $0x8,%xmm1
  pand   %xmm6,%xmm2
  packuswb %xmm2,%xmm7
  movdqu -0x20(%rdx),%xmm2
  psrlw  $0x8,%xmm2
  packuswb %xmm8,%xmm2
  movdqa %xmm6,%xmm8
  pand   %xmm7,%xmm8
  psrlw  $0x8,%xmm7
  packuswb %xmm7,%xmm0
  movdqa %xmm6,%xmm7
  packuswb %xmm8,%xmm9
  pand   %xmm2,%xmm7
  psrlw  $0x8,%xmm2
  movdqa %xmm9,%xmm11
  packuswb %xmm7,%xmm10
  packuswb %xmm2,%xmm1
  movdqa %xmm0,%xmm2
  movdqa %xmm10,%xmm12
  punpcklbw %xmm5,%xmm2
  movdqa %xmm1,%xmm7
  punpcklbw %xmm5,%xmm12
  movdqa %xmm2,%xmm8
  punpcklbw %xmm5,%xmm7
  psllw  $0x8,%xmm12
  punpcklwd %xmm3,%xmm8
  punpcklbw %xmm5,%xmm11
  movdqa %xmm12,%xmm13
  pslld  $0x10,%xmm8
  punpckhwd %xmm3,%xmm2
  punpcklwd %xmm3,%xmm13
  movdqa %xmm11,%xmm14
  punpckhwd %xmm3,%xmm12
  por    %xmm13,%xmm8
  movdqa %xmm7,%xmm13
  punpckhwd %xmm3,%xmm7
  punpckhwd %xmm3,%xmm11
  pslld  $0x10,%xmm2
  punpckhbw %xmm5,%xmm0
  pslld  $0x18,%xmm7
  por    %xmm12,%xmm2
  punpckhbw %xmm5,%xmm10
  por    %xmm11,%xmm7
  psllw  $0x8,%xmm10
  punpckhbw %xmm5,%xmm1
  por    %xmm7,%xmm2
  movdqa %xmm0,%xmm7
  movdqa %xmm10,%xmm11
  punpcklwd %xmm3,%xmm7
  punpcklwd %xmm3,%xmm11
  punpcklwd %xmm3,%xmm13
  pslld  $0x10,%xmm7
  punpckhbw %xmm5,%xmm9
  punpcklwd %xmm3,%xmm14
  por    %xmm11,%xmm7
  pslld  $0x18,%xmm13
  movdqa %xmm1,%xmm11
  punpckhwd %xmm3,%xmm0
  punpckhwd %xmm3,%xmm1
  movdqa %xmm9,%xmm12
  por    %xmm14,%xmm13
  pslld  $0x10,%xmm0
  punpckhwd %xmm3,%xmm10
  pslld  $0x18,%xmm1
  punpckhwd %xmm3,%xmm9
  por    %xmm13,%xmm8
  por    %xmm9,%xmm1
  por    %xmm10,%xmm0
  punpcklwd %xmm3,%xmm11
  por    %xmm1,%xmm0
  movdqa %xmm8,%xmm1
  punpcklwd %xmm3,%xmm12
  punpckldq %xmm4,%xmm1
  pslld  $0x18,%xmm11
  punpckhdq %xmm4,%xmm8
  movups %xmm1,-0x80(%rax)
  por    %xmm12,%xmm11
  movdqa %xmm2,%xmm1
  punpckhdq %xmm4,%xmm2
  por    %xmm11,%xmm7
  punpckldq %xmm4,%xmm1
  movups %xmm8,-0x70(%rax)
  movups %xmm1,-0x60(%rax)
  movdqa %xmm7,%xmm1
  punpckhdq %xmm4,%xmm7
  punpckldq %xmm4,%xmm1
  movups %xmm2,-0x50(%rax)
  movups %xmm1,-0x40(%rax)
  movdqa %xmm0,%xmm1
  punpckhdq %xmm4,%xmm0
  punpckldq %xmm4,%xmm1
  movups %xmm7,-0x30(%rax)
  movups %xmm1,-0x20(%rax)
  movups %xmm0,-0x10(%rax)
  cmp    %r8,%rdx
  jne    L46
  mov    %esi,%r8d
  and    $0xfffffff0,%r8d
  lea    0x0(,%r8,4),%edx
  cmp    %r8d,%esi
  je     L29
  movslq %edx,%rdx
  add    %rcx,%rdx
  nopl   (%rax)
L48:
  movzbl 0x1(%rdx),%eax
  movzbl 0x2(%rdx),%ecx
  add    $0x4,%rdx
  shl    $0x10,%rcx
  shl    $0x8,%rax
  or     %rcx,%rax
  movzbl -0x4(%rdx),%ecx
  or     %rcx,%rax
  movzbl -0x1(%rdx),%ecx
  shl    $0x18,%rcx
  or     %rcx,%rax
  mov    %rax,(%rdi,%r8,8)
  add    $0x1,%r8
  cmp    %r8d,%esi
  jg     L48
  ret
  nop
L66:
  mov    %esi,%esi
  xor    %edx,%edx
  nopl   0x0(%rax)
L62:
  movzbl 0x1(%rcx,%rdx,4),%eax
  movzbl 0x2(%rcx,%rdx,4),%r8d
  shl    $0x8,%rax
  shl    $0x10,%r8
  or     %r8,%rax
  movzbl (%rcx,%rdx,4),%r8d
  or     %r8,%rax
  movzbl 0x3(%rcx,%rdx,4),%r8d
  shl    $0x18,%r8
  or     %r8,%rax
  mov    %rax,(%rdi,%rdx,8)
  add    $0x1,%rdx
  cmp    %rdx,%rsi
  jne    L62
L29:
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D7
type_infered: byte[16]

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

assistant: ```c
void md5_decode(unsigned long *dst, unsigned char *src, int len) {
  int i, j;
  for (i = 0, j = 0; i < len; i++, j += 4)
    dst[i] = ((unsigned long)(src[j] & 0xff)) | (((unsigned long)(src[j + 1] & 0xff)) << 8) | (((unsigned long)(src[j + 2] & 0xff)) << 16) | (((unsigned long)(src[j + 3] & 0xff)) << 24);
}
```