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

```asm
<compositeSourceAtop>:
  endbr64
  imul   %ecx,%edx
  mov    %rdi,%rax
  lea    0x0(,%rdx,4),%ecx
  movslq %ecx,%rcx
  add    %rsi,%rcx
  cmp    %rcx,%rsi
  jae    L160
  movsd  D25(%rip),%xmm7
  pxor   %xmm6,%xmm6
  movss  D83(%rip),%xmm9
  movss  D49(%rip),%xmm8
  jmp    L144
L145:
  movl   $0x0,-0x4(%rax)
L13:
  add    $0x4,%rsi
  cmp    %rsi,%rcx
  jbe    L160
L144:
  movzbl 0x3(%rax),%edx
  add    $0x4,%rax
  test   %edx,%edx
  je     L145
  movzbl 0x3(%rsi),%edi
  test   %edi,%edi
  je     L13
  pxor   %xmm0,%xmm0
  pxor   %xmm1,%xmm1
  pxor   %xmm4,%xmm4
  cvtsi2sd %edi,%xmm0
  pxor   %xmm2,%xmm2
  movaps %xmm9,%xmm5
  cvtsi2sd %edx,%xmm1
  movzbl (%rsi),%edx
  pxor   %xmm3,%xmm3
  pxor   %xmm10,%xmm10
  cvtsi2ss %edx,%xmm4
  movzbl -0x4(%rax),%edx
  divsd  %xmm7,%xmm0
  cvtsi2ss %edx,%xmm2
  movzbl 0x1(%rsi),%edx
  cvtsi2ss %edx,%xmm3
  movzbl -0x3(%rax),%edx
  divsd  %xmm7,%xmm1
  cvtsd2ss %xmm0,%xmm0
  subss  %xmm0,%xmm5
  mulss  %xmm5,%xmm2
  cvtsd2ss %xmm1,%xmm1
  mulss  %xmm1,%xmm4
  mulss  %xmm1,%xmm3
  mulss  %xmm1,%xmm0
  addss  %xmm2,%xmm4
  comiss D49(%rip),%xmm4
  pxor   %xmm2,%xmm2
  cvtsi2ss %edx,%xmm2
  movzbl 0x2(%rsi),%edx
  mulss  %xmm5,%xmm2
  addss  %xmm2,%xmm3
  pxor   %xmm2,%xmm2
  cvtsi2ss %edx,%xmm2
  movzbl -0x2(%rax),%edx
  cvtsi2ss %edx,%xmm10
  mov    $0xff,%edx
  mulss  %xmm1,%xmm2
  mulss  %xmm5,%xmm1
  mulss  %xmm5,%xmm10
  addss  %xmm1,%xmm0
  addss  %xmm10,%xmm2
  mulss  %xmm8,%xmm0
  ja     L32
  xor    %edx,%edx
  comiss %xmm4,%xmm6
  ja     L32
  cvttss2si %xmm4,%edx
L32:
  comiss D49(%rip),%xmm3
  jbe    L163
  or     $0xff,%dh
L45:
  comiss D49(%rip),%xmm2
  jbe    L29
L153:
  or     $0xff0000,%edx
L147:
  comiss D49(%rip),%xmm0
  jbe    L52
L53:
  or     $0xff000000,%edx
L5:
  add    $0x4,%rsi
  mov    %edx,-0x4(%rax)
  cmp    %rsi,%rcx
  ja     L144
L160:
  ret
  nopl   0x0(%rax)
L163:
  comiss %xmm3,%xmm6
  ja     L45
  cvttss2si %xmm3,%edi
  shl    $0x8,%edi
  or     %edi,%edx
  comiss D49(%rip),%xmm2
  ja     L153
L29:
  comiss %xmm2,%xmm6
  ja     L147
  cvttss2si %xmm2,%edi
  shl    $0x10,%edi
  or     %edi,%edx
  comiss D49(%rip),%xmm0
  ja     L53
L52:
  comiss %xmm0,%xmm6
  ja     L5
  cvttss2si %xmm0,%edi
  shl    $0x18,%edi
  or     %edi,%edx
  jmp    L5
```

tool_calls: name: disassemble_data
arguments: data_label: D25
data_type: f64
name: disassemble_data
arguments: data_label: D83
data_type: f32
name: disassemble_data
arguments: data_label: D49
data_type: byte[4]

tool: D25: 255

tool: D83: 1

tool: {"D49": [0x00,0x00,0x7f,0x43]}

assistant: ```c
void compositeSourceAtop(unsigned char *dst, unsigned char *src, int width, int height) {
  unsigned char *end = src + ((width * height) << 2);
  unsigned int *dst32 = (unsigned int *)dst;
  int d, s;
  float rr, rg, rb, ra;
  float sa, sa_inv;
  float da;
  while (src < end) {
    d = *(dst + 3);
    if (d == 0) {
      *dst32++ = 0;
    } else {
      s = *(src + 3);
      if (s == 0) {
        dst32++;
      } else {
        da = d / 255.0;
        sa = s / 255.0;
        sa_inv = (1.0 - sa);
        rr = *src * da + *dst * sa_inv;
        rg = *(src + 1) * da + *(dst + 1) * sa_inv;
        rb = *(src + 2) * da + *(dst + 2) * sa_inv;
        ra = (sa * da + da * sa_inv) * 255.0;
        *dst32++ = (int)((rr) > 0xff ? 0xff : ((rr) < 0 ? 0 : (rr))) | (int)((rg) > 0xff ? 0xff : ((rg) < 0 ? 0 : (rg))) << 8 | (int)((rb) > 0xff ? 0xff : ((rb) < 0 ? 0 : (rb))) << 16 | (int)((ra) > 0xff ? 0xff : ((ra) < 0 ? 0 : (ra))) << 24;
      }
    }
    src += 4;
    dst += 4;
  }
}
```