user: 下面的汇编指令对应的C源代码是什么:

```asm
<scanline_col32cb16blend_c>:
  endbr64
  mov    %rdx,%r11
  mov    %esi,%eax
  mov    %esi,%edx
  mov    $0x100,%ecx
  sar    $0x1f,%eax
  sar    $0x18,%edx
  add    %edx,%eax
  sub    %eax,%ecx
  test   %r11,%r11
  je     L30
  mov    %esi,%r8d
  mov    %esi,%r9d
  lea    -0x1(%r11),%r10
  sar    $0x13,%esi
  sar    $0x3,%r8d
  sar    $0xa,%r9d
  push   %rbx
  and    $0x1f,%esi
  and    $0x1f,%r8d
  and    $0x3f,%r9d
  cmp    $0x2,%r10
  jbe    L36
  movd   %ecx,%xmm5
  movd   %r8d,%xmm6
  mov    %r11,%rbx
  mov    %rdi,%rax
  pshufd $0x0,%xmm5,%xmm2
  movd   %esi,%xmm5
  movd   %r9d,%xmm7
  xor    %edx,%edx
  pshufd $0x0,%xmm6,%xmm8
  movdqa %xmm2,%xmm3
  pshufd $0x0,%xmm5,%xmm6
  movdqa D4(%rip),%xmm4
  shr    $0x2,%rbx
  psrlq  $0x20,%xmm3
  pshufd $0x0,%xmm7,%xmm7
  movdqa D0(%rip),%xmm5
  nopw   0x0(%rax,%rax,1)
L58:
  movdqu (%rax),%xmm1
  add    $0x1,%rdx
  add    $0x10,%rax
  movdqa %xmm1,%xmm0
  movdqa %xmm1,%xmm10
  pand   %xmm4,%xmm1
  psrad  $0xb,%xmm0
  psrad  $0x5,%xmm10
  pand   %xmm4,%xmm0
  pand   %xmm5,%xmm10
  movdqa %xmm0,%xmm9
  psrlq  $0x20,%xmm0
  pmuludq %xmm2,%xmm9
  pmuludq %xmm3,%xmm0
  pshufd $0x8,%xmm9,%xmm9
  pshufd $0x8,%xmm0,%xmm0
  punpckldq %xmm0,%xmm9
  movdqa %xmm10,%xmm0
  psrlq  $0x20,%xmm10
  pmuludq %xmm2,%xmm0
  pmuludq %xmm3,%xmm10
  psrad  $0x8,%xmm9
  paddd  %xmm8,%xmm9
  pslld  $0xb,%xmm9
  pshufd $0x8,%xmm0,%xmm0
  pshufd $0x8,%xmm10,%xmm10
  punpckldq %xmm10,%xmm0
  psrad  $0x8,%xmm0
  paddd  %xmm7,%xmm0
  pslld  $0x5,%xmm0
  por    %xmm9,%xmm0
  movdqa %xmm1,%xmm9
  psrlq  $0x20,%xmm1
  pmuludq %xmm2,%xmm9
  pmuludq %xmm3,%xmm1
  pshufd $0x8,%xmm9,%xmm9
  pshufd $0x8,%xmm1,%xmm1
  punpckldq %xmm1,%xmm9
  movdqa %xmm9,%xmm1
  psrad  $0x8,%xmm1
  paddd  %xmm6,%xmm1
  por    %xmm1,%xmm0
  movups %xmm0,-0x10(%rax)
  cmp    %rdx,%rbx
  jne    L58
  mov    %r11,%rax
  and    $0xfffffffffffffffc,%rax
  lea    (%rdi,%rax,4),%rdi
  sub    %rax,%r10
  cmp    %rax,%r11
  je     L17
L36:
  mov    (%rdi),%edx
  mov    %edx,%eax
  mov    %edx,%r11d
  and    $0x1f,%edx
  sar    $0xb,%eax
  sar    $0x5,%r11d
  imul   %ecx,%edx
  and    $0x1f,%eax
  and    $0x3f,%r11d
  imul   %ecx,%eax
  imul   %ecx,%r11d
  sar    $0x8,%edx
  add    %esi,%edx
  sar    $0x8,%eax
  sar    $0x8,%r11d
  add    %r8d,%eax
  add    %r9d,%r11d
  shl    $0xb,%eax
  shl    $0x5,%r11d
  or     %r11d,%eax
  or     %edx,%eax
  mov    %eax,(%rdi)
  test   %r10,%r10
  je     L17
  mov    0x4(%rdi),%edx
  mov    %edx,%eax
  mov    %edx,%r11d
  and    $0x1f,%edx
  sar    $0xb,%eax
  sar    $0x5,%r11d
  imul   %ecx,%edx
  and    $0x1f,%eax
  and    $0x3f,%r11d
  imul   %ecx,%eax
  imul   %ecx,%r11d
  sar    $0x8,%edx
  add    %esi,%edx
  sar    $0x8,%eax
  sar    $0x8,%r11d
  add    %r8d,%eax
  add    %r9d,%r11d
  shl    $0xb,%eax
  shl    $0x5,%r11d
  or     %r11d,%eax
  or     %edx,%eax
  mov    %eax,0x4(%rdi)
  cmp    $0x1,%r10
  je     L17
  mov    0x8(%rdi),%edx
  mov    %edx,%eax
  sar    $0x5,%eax
  and    $0x3f,%eax
  imul   %ecx,%eax
  sar    $0x8,%eax
  add    %r9d,%eax
  mov    %edx,%r9d
  and    $0x1f,%edx
  sar    $0xb,%r9d
  imul   %ecx,%edx
  shl    $0x5,%eax
  and    $0x1f,%r9d
  imul   %ecx,%r9d
  sar    $0x8,%edx
  add    %esi,%edx
  sar    $0x8,%r9d
  add    %r9d,%r8d
  shl    $0xb,%r8d
  or     %r8d,%eax
  or     %edx,%eax
  mov    %eax,0x8(%rdi)
L17:
  pop    %rbx
  ret
  nopl   0x0(%rax)
L30:
  ret
```

tool_calls: name: unpack_data
arguments: tag: D4
type_infered: byte[16]
name: unpack_data
arguments: tag: D0
type_infered: byte[16]

tool: {"D4": [0x1f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00]}

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

assistant: ```c
void scanline_col32cb16blend_c(uint16_t *dst, int32_t src, size_t count) {
  int srcAlpha = (src >> 24);
  int f = 0x100 - (srcAlpha + (srcAlpha >> 7));
  while (count--) {
    uint16_t d = *dst;
    int dstR = (d >> 11) & 0x1f;
    int dstG = (d >> 5) & 0x3f;
    int dstB = (d)&0x1f;
    int srcR = (src >> (3)) & 0x1F;
    int srcG = (src >> (8 + 2)) & 0x3F;
    int srcB = (src >> (16 + 3)) & 0x1F;
    srcR += (f * dstR) >> 8;
    srcG += (f * dstG) >> 8;
    srcB += (f * dstB) >> 8;
    *dst++ = (uint16_t)((srcR << 11) | (srcG << 5) | srcB);
  }
}
```