user: Translate the below assembly code into C programming language:

```asm
<TexConv_A8_ARGB4444>:
  endbr64
  imul   %ecx,%edx
  mov    %rsi,%r9
  mov    %rdi,%rsi
  mov    %r9,%rdi
  lea    (%rdx,%rdx,1),%r8d
L8:
  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    L8
  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");
}
```