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

```asm
<stbi_decode_DXT_color_block>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x58,%rsp
  movzbl 0x3(%rsi),%r14d
  movzbl 0x1(%rsi),%edi
  mov    %fs:0x28,%rax
  mov    %rax,0x48(%rsp)
  xor    %eax,%eax
  movzbl 0x2(%rsi),%eax
  lea    0x2c(%rsp),%r15
  lea    0x34(%rsp),%rcx
  shl    $0x8,%r14d
  shl    $0x8,%edi
  lea    0x30(%rsp),%rdx
  mov    %rcx,0x18(%rsp)
  add    %eax,%r14d
  movzbl (%rsi),%eax
  mov    %r15,%rsi
  mov    %rdx,0x10(%rsp)
  add    %eax,%edi
  call   <stbi_rgb_888_from_565@plt>
  mov    0x30(%rsp),%r10d
  xor    %eax,%eax
  mov    %r15,%rsi
  mov    0x2c(%rsp),%r13d
  mov    0x34(%rsp),%r12d
  mov    %r14d,%edi
  mov    %r10d,%ecx
  mov    0x10(%rsp),%rdx
  mov    %r10d,0xc(%rsp)
  mov    %r13b,%al
  mov    %r12b,0x3a(%rsp)
  movzbl %r13b,%r13d
  mov    %cl,%ah
  mov    0x18(%rsp),%rcx
  mov    %ax,0x38(%rsp)
  call   <stbi_rgb_888_from_565@plt>
  mov    0x2c(%rsp),%edi
  mov    0x30(%rsp),%r8d
  mov    $0xaaaaaaab,%edx
  mov    0xc(%rsp),%r10d
  mov    0x34(%rsp),%r9d
  movzbl %r12b,%ecx
  movzbl %dil,%r15d
  movzbl %r8b,%r14d
  movzbl %r8b,%r8d
  movzbl %dil,%edi
  movzbl %r10b,%eax
  lea    (%r15,%r13,2),%r10d
  lea    0x0(%r13,%r15,2),%r13d
  movzbl %r9b,%esi
  lea    (%r14,%rax,2),%r11d
  lea    (%rax,%r14,2),%eax
  movzbl %r9b,%r9d
  imul   %rdx,%r13
  lea    (%rsi,%rcx,2),%r12d
  imul   %rdx,%rax
  imul   %rdx,%r12
  shr    $0x21,%r13
  imul   %rdx,%r11
  shr    $0x19,%rax
  imul   %rdx,%r10
  movzbl %r13b,%r13d
  and    $0xff00,%eax
  shr    $0x21,%r12
  or     %r13,%rax
  movzbl %r12b,%r12d
  shr    $0x21,%r11
  shl    $0x8,%rax
  movzbl %r11b,%r11d
  shr    $0x21,%r10
  or     %r12,%rax
  movzbl %r10b,%r10d
  shl    $0x8,%rax
  or     %r11,%rax
  shl    $0x8,%rax
  or     %r10,%rax
  shl    $0x8,%rax
  or     %r9,%rax
  shl    $0x8,%rax
  or     %r8,%rax
  shl    $0x8,%rax
  or     %rdi,%rax
  mov    %rax,0x3b(%rsp)
  lea    (%rcx,%rsi,2),%eax
  imul   %rdx,%rax
  shr    $0x21,%rax
  mov    %al,0x43(%rsp)
  movzbl 0x4(%rbp),%eax
  and    $0x3,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x1(%rbx)
  mov    %al,0x2(%rbx)
  movzbl 0x4(%rbp),%eax
  sar    $0x2,%eax
  and    $0x3,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x4(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x5(%rbx)
  mov    %al,0x6(%rbx)
  movzbl 0x4(%rbp),%eax
  sar    $0x4,%eax
  and    $0x3,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x8(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x9(%rbx)
  mov    %al,0xa(%rbx)
  movzbl 0x4(%rbp),%eax
  sar    $0x6,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0xc(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0xd(%rbx)
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %al,0xe(%rbx)
  movzbl 0x5(%rbp),%eax
  and    $0x3,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x10(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x11(%rbx)
  mov    %al,0x12(%rbx)
  movzbl 0x5(%rbp),%eax
  sar    $0x2,%eax
  and    $0x3,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x14(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x15(%rbx)
  mov    %al,0x16(%rbx)
  movzbl 0x5(%rbp),%eax
  sar    $0x4,%eax
  and    $0x3,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x18(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x19(%rbx)
  mov    %al,0x1a(%rbx)
  movzbl 0x5(%rbp),%eax
  sar    $0x6,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x1c(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x1d(%rbx)
  mov    %al,0x1e(%rbx)
  movzbl 0x6(%rbp),%eax
  and    $0x3,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x20(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x21(%rbx)
  mov    %al,0x22(%rbx)
  movzbl 0x6(%rbp),%eax
  sar    $0x2,%eax
  and    $0x3,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x24(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x25(%rbx)
  mov    %al,0x26(%rbx)
  movzbl 0x6(%rbp),%eax
  sar    $0x4,%eax
  and    $0x3,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x28(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x29(%rbx)
  mov    %al,0x2a(%rbx)
  movzbl 0x6(%rbp),%eax
  sar    $0x6,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x2c(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x2d(%rbx)
  mov    %al,0x2e(%rbx)
  movzbl 0x7(%rbp),%eax
  and    $0x3,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x30(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x31(%rbx)
  mov    %al,0x32(%rbx)
  movzbl 0x7(%rbp),%eax
  sar    $0x2,%eax
  and    $0x3,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x34(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x35(%rbx)
  mov    %al,0x36(%rbx)
  movzbl 0x7(%rbp),%eax
  sar    $0x4,%eax
  and    $0x3,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x38(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x39(%rbx)
  mov    %al,0x3a(%rbx)
  movzbl 0x7(%rbp),%eax
  sar    $0x6,%eax
  lea    (%rax,%rax,2),%eax
  movslq %eax,%rdx
  movzbl 0x38(%rsp,%rdx,1),%edx
  mov    %dl,0x3c(%rbx)
  lea    0x1(%rax),%edx
  add    $0x2,%eax
  movslq %edx,%rdx
  cltq
  movzbl 0x38(%rsp,%rdx,1),%edx
  movzbl 0x38(%rsp,%rax,1),%eax
  mov    %dl,0x3d(%rbx)
  mov    %al,0x3e(%rbx)
  mov    0x48(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L9
  add    $0x58,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L9:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void stbi_decode_DXT_color_block(unsigned char uncompressed[16 * 4], unsigned char compressed[8]) {
  int next_bit = 4 * 8;
  int i, r, g, b;
  int c0, c1;
  unsigned char decode_colors[4 * 3];
  c0 = compressed[0] + (compressed[1] << 8);
  c1 = compressed[2] + (compressed[3] << 8);
  stbi_rgb_888_from_565(c0, &r, &g, &b);
  decode_colors[0] = r;
  decode_colors[1] = g;
  decode_colors[2] = b;
  stbi_rgb_888_from_565(c1, &r, &g, &b);
  decode_colors[3] = r;
  decode_colors[4] = g;
  decode_colors[5] = b;
  decode_colors[6] = (2 * decode_colors[0] + decode_colors[3]) / 3;
  decode_colors[7] = (2 * decode_colors[1] + decode_colors[4]) / 3;
  decode_colors[8] = (2 * decode_colors[2] + decode_colors[5]) / 3;
  decode_colors[9] = (decode_colors[0] + 2 * decode_colors[3]) / 3;
  decode_colors[10] = (decode_colors[1] + 2 * decode_colors[4]) / 3;
  decode_colors[11] = (decode_colors[2] + 2 * decode_colors[5]) / 3;
  for (i = 0; i < 16 * 4; i += 4) {
    int idx = ((compressed[next_bit >> 3] >> (next_bit & 7)) & 3) * 3;
    next_bit += 2;
    uncompressed[i + 0] = decode_colors[idx + 0];
    uncompressed[i + 1] = decode_colors[idx + 1];
    uncompressed[i + 2] = decode_colors[idx + 2];
  }
}
```