user: 请将以下的汇编代码转换成C语言代码：

```asm
<DecompressBlockBC2>:
  endbr64
  sub    $0x58,%rsp
  movq   0x8(%rcx),%xmm1
  mov    %edx,%r10d
  mov    0x10(%rcx),%edx
  mov    %fs:0x28,%rax
  mov    %rax,0x48(%rsp)
  xor    %eax,%eax
  movq   (%rcx),%xmm0
  mov    0x18(%rcx),%eax
  movslq %edi,%r9
  movq   D0(%rip),%xmm3
  mov    %edx,%r11d
  imul   %r10d,%esi
  mov    %rcx,%rdi
  punpckldq %xmm1,%xmm0
  sar    $0x8,%r11d
  mov    %edx,%ecx
  add    $0x20,%rdi
  movdqa %xmm0,%xmm2
  movdqa %xmm0,%xmm4
  sar    $0x4,%ecx
  pand   %xmm3,%xmm2
  psrad  $0x4,%xmm4
  movd   %ecx,%xmm7
  mov    %eax,%ecx
  movdqa %xmm2,%xmm1
  pand   %xmm3,%xmm4
  sar    $0x8,%ecx
  movslq %esi,%rsi
  pslld  $0x4,%xmm1
  paddd  %xmm2,%xmm1
  movdqa %xmm4,%xmm2
  pslld  $0x4,%xmm2
  paddd  %xmm4,%xmm2
  movdqa %xmm0,%xmm4
  psrad  $0x8,%xmm4
  psrad  $0xc,%xmm0
  pand   %xmm3,%xmm4
  pand   %xmm3,%xmm0
  movdqa %xmm1,%xmm3
  movdqa %xmm4,%xmm5
  pslld  $0x4,%xmm5
  paddd  %xmm4,%xmm5
  movdqa %xmm0,%xmm4
  pslld  $0x4,%xmm4
  paddd  %xmm0,%xmm4
  punpckldq %xmm5,%xmm3
  punpckldq %xmm5,%xmm1
  movdqa %xmm2,%xmm5
  pshufd $0xe,%xmm1,%xmm1
  punpckldq %xmm4,%xmm2
  movdqa %xmm1,%xmm0
  punpckldq %xmm4,%xmm5
  pshufd $0xe,%xmm2,%xmm2
  movdqa %xmm2,%xmm1
  movdqa %xmm3,%xmm2
  punpckldq %xmm5,%xmm3
  punpckldq %xmm5,%xmm2
  pshufd $0xe,%xmm3,%xmm3
  movq   %xmm2,(%rsp)
  movdqa %xmm0,%xmm2
  punpckldq %xmm1,%xmm0
  punpckldq %xmm1,%xmm2
  movd   %r11d,%xmm1
  mov    %edx,%r11d
  movq   %xmm3,0x8(%rsp)
  pshufd $0xe,%xmm0,%xmm0
  sar    $0xc,%r11d
  movq   %xmm2,0x10(%rsp)
  movdqa D0(%rip),%xmm2
  movd   %r11d,%xmm6
  movq   %xmm0,0x18(%rsp)
  movd   %edx,%xmm0
  mov    %eax,%edx
  punpckldq %xmm6,%xmm1
  punpckldq %xmm7,%xmm0
  sar    $0x4,%edx
  punpcklqdq %xmm1,%xmm0
  movd   %edx,%xmm7
  mov    %r10d,%edx
  pand   %xmm2,%xmm0
  movdqa %xmm0,%xmm1
  pslld  $0x4,%xmm1
  paddd  %xmm1,%xmm0
  movd   %ecx,%xmm1
  mov    %eax,%ecx
  sar    $0xc,%ecx
  movaps %xmm0,0x20(%rsp)
  movd   %eax,%xmm0
  lea    (%rsi,%r9,4),%rax
  movd   %ecx,%xmm6
  punpckldq %xmm7,%xmm0
  lea    (%r8,%rax,1),%rsi
  mov    %rsp,%rcx
  punpckldq %xmm6,%xmm1
  punpcklqdq %xmm1,%xmm0
  pand   %xmm2,%xmm0
  movdqa %xmm0,%xmm1
  pslld  $0x4,%xmm1
  paddd  %xmm1,%xmm0
  movaps %xmm0,0x30(%rsp)
  call   <DecompressBlockBC1Internal@plt>
  mov    0x48(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L2
  add    $0x58,%rsp
  ret
L2:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D0
type_guessed: byte[16]

tool: {"D0": [0x0f,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0f,0x00,0x00,0x00]}

assistant: ```c
void DecompressBlockBC2(uint32_t x, uint32_t y, uint32_t stride, const uint8_t *blockStorage, unsigned char *image) {
  int i;
  uint8_t alphaValues[16] = {0};
  for (i = 0; i < 4; ++i) {
    const uint16_t *alphaData = (const uint16_t *)(blockStorage);
    alphaValues[i * 4 + 0] = (((*alphaData) >> 0) & 0xF) * 17;
    alphaValues[i * 4 + 1] = (((*alphaData) >> 4) & 0xF) * 17;
    alphaValues[i * 4 + 2] = (((*alphaData) >> 8) & 0xF) * 17;
    alphaValues[i * 4 + 3] = (((*alphaData) >> 12) & 0xF) * 17;
    blockStorage += 2;
  }
  DecompressBlockBC1Internal(blockStorage, image + x * sizeof(uint32_t) + (y * stride), stride, alphaValues);
}
```