user: Please show me the C implementation that matches the assembly code listed below:

```asm
<TexConv_A8_ARGB4444>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %edx,-0x24(%rbp)
  mov    %ecx,-0x28(%rbp)
  mov    -0x24(%rbp),%eax
  imul   -0x28(%rbp),%eax
  add    %eax,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x18(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    -0x4(%rbp),%r8d
L4:
  mov    (%rsi),%eax
  add    $0x4,%rsi
  mov    %eax,%edx
  and    $0xf000,%eax
  shl    $0x10,%eax
  mov    %eax,%ecx
  shr    $0x4,%eax
  or     %eax,%ecx
  shr    $0x4,%eax
  or     %eax,%ecx
  shr    $0x4,%eax
  or     %eax,%ecx
  mov    %edx,%eax
  and    $0xf0,%eax
  shl    $0x8,%eax
  or     %eax,%ecx
  shr    $0x4,%eax
  or     %eax,%ecx
  shr    $0x4,%eax
  or     %eax,%ecx
  shr    $0x4,%eax
  or     %eax,%ecx
  mov    %ecx,(%rdi)
  add    $0x4,%rdi
  mov    %edx,%eax
  and    $0xf0000000,%eax
  mov    %eax,%ecx
  shr    $0x4,%eax
  or     %eax,%ecx
  shr    $0x4,%eax
  or     %eax,%ecx
  shr    $0x4,%eax
  or     %eax,%ecx
  and    $0xf00000,%edx
  shr    $0x8,%edx
  or     %edx,%ecx
  shr    $0x4,%edx
  or     %edx,%ecx
  shr    $0x4,%edx
  or     %edx,%ecx
  shr    $0x4,%edx
  or     %edx,%ecx
  mov    %ecx,(%rdi)
  add    $0x4,%rdi
  dec    %r8d
  jne    L4
  mov    %rsi,-0x18(%rbp)
  mov    %rdi,-0x20(%rbp)
  mov    %r8d,-0x4(%rbp)
  nop
  pop    %rbp
  ret
```

assistant: ```c
void TexConv_A8_ARGB4444(unsigned char *_src, unsigned char *_dst, int width, int height) {
  int _size = (width * height) << 1;
  asm volatile("0: \n"
               "mov (%[src]), %%eax     \n"
               "add $4, %[src]          \n"
               "mov %%eax, %%edx       \n"
               "and $0x0000F000, %%eax \n"
               "shl $16, %%eax         \n"
               "mov %%eax, %%ecx       \n"
               "shr $4, %%eax          \n"
               "or %%eax, %%ecx        \n"
               "shr $4, %%eax          \n"
               "or %%eax, %%ecx        \n"
               "shr $4, %%eax          \n"
               "or %%eax, %%ecx        \n"
               "mov %%edx, %%eax       \n"
               "and $0x000000F0, %%eax \n"
               "shl $8, %%eax          \n"
               "or %%eax, %%ecx        \n"
               "shr $4, %%eax          \n"
               "or %%eax, %%ecx        \n"
               "shr $4, %%eax          \n"
               "or %%eax, %%ecx        \n"
               "shr $4, %%eax          \n"
               "or %%eax, %%ecx        \n"
               "mov %%ecx, (%[_dst])     \n"
               "add $4, %[_dst]          \n"
               "mov %%edx, %%eax       \n"
               "and $0xF0000000, %%eax \n"
               "mov %%eax, %%ecx       \n"
               "shr $4, %%eax          \n"
               "or %%eax, %%ecx        \n"
               "shr $4, %%eax          \n"
               "or %%eax, %%ecx        \n"
               "shr $4, %%eax          \n"
               "or %%eax, %%ecx        \n"
               "and $0x00F00000, %%edx \n"
               "shr $8, %%edx          \n"
               "or %%edx, %%ecx        \n"
               "shr $4, %%edx          \n"
               "or %%edx, %%ecx        \n"
               "shr $4, %%edx          \n"
               "or %%edx, %%ecx        \n"
               "shr $4, %%edx          \n"
               "or %%edx, %%ecx        \n"
               "mov %%ecx, (%[_dst])     \n"
               "add $4, %[_dst]          \n"
               "decl %[_size]            \n"
               "jnz 0b \n"
               : [src] "+S"(_src), [_dst] "+D"(_dst), [_size] "+g"(_size)
               :
               : "memory", "cc", "eax", "ecx", "edx");
}
```