user: What would the C source look like for the assembly code provided here?

```asm
<connected_component_filter>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %esi,-0x3c(%rbp)
  mov    %edx,-0x40(%rbp)
  mov    %rcx,-0x48(%rbp)
  movss  %xmm0,-0x4c(%rbp)
  mov    -0x3c(%rbp),%eax
  imul   -0x40(%rbp),%eax
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <adsf_begin@plt>
  movl   $0x0,-0x2c(%rbp)
  jmp    L151
L76:
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  movd   %eax,%xmm0
  call   <isnan@plt>
  test   %rax,%rax
  je     L83
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movl   $0xffffffff,(%rax)
L83:
  addl   $0x1,-0x2c(%rbp)
L151:
  mov    -0x3c(%rbp),%eax
  imul   -0x40(%rbp),%eax
  cmp    %eax,-0x2c(%rbp)
  jl     L76
  movl   $0x0,-0x28(%rbp)
  jmp    L29
L36:
  movl   $0x0,-0x24(%rbp)
  jmp    L154
L54:
  mov    -0x28(%rbp),%eax
  imul   -0x3c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x24(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x28(%rbp),%eax
  imul   -0x3c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x24(%rbp),%eax
  add    %edx,%eax
  add    $0x1,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x28(%rbp),%eax
  add    $0x1,%eax
  imul   -0x3c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x24(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  test   %eax,%eax
  js     L159
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  test   %eax,%eax
  js     L159
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  call   <fabs@plt>
  movss  -0x4c(%rbp),%xmm1
  comiss %xmm0,%xmm1
  jbe    L159
  mov    -0x3c(%rbp),%eax
  imul   -0x40(%rbp),%eax
  mov    %eax,%esi
  mov    -0x18(%rbp),%ecx
  mov    -0x1c(%rbp),%edx
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <adsf_union@plt>
L159:
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  test   %eax,%eax
  js     L147
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  test   %eax,%eax
  js     L147
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  call   <fabs@plt>
  movss  -0x4c(%rbp),%xmm1
  comiss %xmm0,%xmm1
  jbe    L147
  mov    -0x3c(%rbp),%eax
  imul   -0x40(%rbp),%eax
  mov    %eax,%esi
  mov    -0x14(%rbp),%ecx
  mov    -0x1c(%rbp),%edx
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <adsf_union@plt>
L147:
  addl   $0x1,-0x24(%rbp)
L154:
  mov    -0x3c(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,-0x24(%rbp)
  jl     L54
  addl   $0x1,-0x28(%rbp)
L29:
  mov    -0x40(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,-0x28(%rbp)
  jl     L36
  movl   $0x0,-0x20(%rbp)
  jmp    L66
L59:
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  test   %eax,%eax
  js     L77
  mov    -0x3c(%rbp),%eax
  imul   -0x40(%rbp),%eax
  mov    %eax,%ecx
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  lea    (%rdx,%rax,1),%rbx
  mov    -0x20(%rbp),%edx
  mov    -0x38(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <adsf_find@plt>
  mov    %eax,(%rbx)
L77:
  addl   $0x1,-0x20(%rbp)
L66:
  mov    -0x3c(%rbp),%eax
  imul   -0x40(%rbp),%eax
  cmp    %eax,-0x20(%rbp)
  jl     L59
  nop
  nop
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void connected_component_filter(int *rep, int w, int h, float *in, float intensity_threshold) {
  adsf_begin(rep, w * h);
  for (int i = 0; i < w * h; i++)
    if (isnan(in[i]))
      rep[i] = -1;
  for (int j = 0; j < h - 1; j++)
    for (int i = 0; i < w - 1; i++) {
      int p0 = j * w + i;
      int p1 = j * w + i + 1;
      int p2 = (j + 1) * w + i;
      if (rep[p0] >= 0 && rep[p1] >= 0 && fabs(in[p0] - in[p1]) < intensity_threshold)
        adsf_union(rep, w * h, p0, p1);
      if (rep[p0] >= 0 && rep[p2] >= 0 && fabs(in[p0] - in[p2]) < intensity_threshold)
        adsf_union(rep, w * h, p0, p2);
    }
  for (int i = 0; i < w * h; i++)
    if (rep[i] >= 0)
      rep[i] = adsf_find(rep, w * h, i);
}
```