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

```asm
<helper_double_5_recursive>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  cmpl   $0x2,-0x1c(%rbp)
  jne    L90
  movl   $0x0,-0x10(%rbp)
  jmp    L27
L75:
  movl   $0x0,-0xc(%rbp)
  jmp    L73
L92:
  mov    -0x10(%rbp),%eax
  movslq %eax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    -0x10(%rbp),%edx
  movslq %edx,%rcx
  mov    -0xc(%rbp),%edx
  movslq %edx,%rdx
  add    %rcx,%rdx
  add    $0x2,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x18(%rbp),%rdx
  add    %rcx,%rdx
  movupd (%rax),%xmm0
  movupd (%rdx),%xmm1
  movapd %xmm0,%xmm8
  haddpd %xmm8,%xmm8
  movapd %xmm0,%xmm9
  hsubpd %xmm9,%xmm9
  blendpd $0x1,%xmm8,%xmm9
  movapd %xmm9,%xmm0
  movapd %xmm1,%xmm8
  haddpd %xmm8,%xmm8
  movapd %xmm1,%xmm9
  hsubpd %xmm9,%xmm9
  blendpd $0x1,%xmm8,%xmm9
  movapd %xmm9,%xmm1
  movapd %xmm0,%xmm8
  movapd %xmm0,%xmm9
  addpd  %xmm1,%xmm8
  subpd  %xmm1,%xmm9
  movupd %xmm8,(%rax)
  movupd %xmm9,(%rdx)
  addl   $0x2,-0xc(%rbp)
L73:
  cmpl   $0x1,-0xc(%rbp)
  jle    L92
  addl   $0x4,-0x10(%rbp)
L27:
  cmpl   $0x3,-0x10(%rbp)
  jle    L75
  jmp    L31
L90:
  cmpl   $0x5,-0x1c(%rbp)
  jne    L31
  mov    -0x18(%rbp),%rax
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <helper_double_5_recursive>
  mov    -0x18(%rbp),%rax
  add    $0x20,%rax
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <helper_double_5_recursive>
  mov    -0x18(%rbp),%rax
  add    $0x40,%rax
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <helper_double_5_recursive>
  mov    -0x18(%rbp),%rax
  add    $0x60,%rax
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <helper_double_5_recursive>
  mov    -0x18(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <helper_double_5_recursive>
  mov    -0x18(%rbp),%rax
  add    $0xa0,%rax
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <helper_double_5_recursive>
  mov    -0x18(%rbp),%rax
  add    $0xc0,%rax
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <helper_double_5_recursive>
  mov    -0x18(%rbp),%rax
  add    $0xe0,%rax
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <helper_double_5_recursive>
  movl   $0x0,-0x8(%rbp)
  jmp    L95
L3:
  movl   $0x0,-0x4(%rbp)
  jmp    L4
L101:
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x4(%rbp),%eax
  cltq
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    -0x8(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x4(%rbp),%edx
  movslq %edx,%rdx
  add    %rcx,%rdx
  add    $0x4,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x18(%rbp),%rdx
  add    %rcx,%rdx
  mov    -0x8(%rbp),%ecx
  movslq %ecx,%rsi
  mov    -0x4(%rbp),%ecx
  movslq %ecx,%rcx
  add    %rsi,%rcx
  add    $0x8,%rcx
  lea    0x0(,%rcx,8),%rsi
  mov    -0x18(%rbp),%rcx
  add    %rsi,%rcx
  mov    -0x8(%rbp),%esi
  movslq %esi,%rdi
  mov    -0x4(%rbp),%esi
  movslq %esi,%rsi
  add    %rdi,%rsi
  add    $0xc,%rsi
  lea    0x0(,%rsi,8),%rdi
  mov    -0x18(%rbp),%rsi
  add    %rdi,%rsi
  mov    -0x8(%rbp),%edi
  movslq %edi,%r8
  mov    -0x4(%rbp),%edi
  movslq %edi,%rdi
  add    %r8,%rdi
  add    $0x10,%rdi
  lea    0x0(,%rdi,8),%r8
  mov    -0x18(%rbp),%rdi
  add    %r8,%rdi
  mov    -0x8(%rbp),%r8d
  movslq %r8d,%r9
  mov    -0x4(%rbp),%r8d
  movslq %r8d,%r8
  add    %r9,%r8
  add    $0x14,%r8
  lea    0x0(,%r8,8),%r9
  mov    -0x18(%rbp),%r8
  add    %r9,%r8
  mov    -0x8(%rbp),%r9d
  movslq %r9d,%r10
  mov    -0x4(%rbp),%r9d
  movslq %r9d,%r9
  add    %r10,%r9
  add    $0x18,%r9
  lea    0x0(,%r9,8),%r10
  mov    -0x18(%rbp),%r9
  add    %r10,%r9
  mov    -0x8(%rbp),%r10d
  movslq %r10d,%r11
  mov    -0x4(%rbp),%r10d
  movslq %r10d,%r10
  add    %r11,%r10
  add    $0x1c,%r10
  lea    0x0(,%r10,8),%r11
  mov    -0x18(%rbp),%r10
  add    %r11,%r10
  movupd (%rax),%xmm0
  movupd (%rdx),%xmm1
  movupd (%rcx),%xmm2
  movupd (%rsi),%xmm3
  movupd (%rdi),%xmm4
  movupd (%r8),%xmm5
  movupd (%r9),%xmm6
  movupd (%r10),%xmm7
  movapd %xmm0,%xmm8
  movapd %xmm0,%xmm9
  addpd  %xmm1,%xmm8
  subpd  %xmm1,%xmm9
  movapd %xmm2,%xmm10
  movapd %xmm2,%xmm11
  addpd  %xmm3,%xmm10
  subpd  %xmm3,%xmm11
  movapd %xmm4,%xmm12
  movapd %xmm4,%xmm13
  addpd  %xmm5,%xmm12
  subpd  %xmm5,%xmm13
  movapd %xmm6,%xmm14
  movapd %xmm6,%xmm15
  addpd  %xmm7,%xmm14
  subpd  %xmm7,%xmm15
  movapd %xmm8,%xmm0
  movapd %xmm8,%xmm2
  addpd  %xmm10,%xmm0
  subpd  %xmm10,%xmm2
  movapd %xmm9,%xmm1
  movapd %xmm9,%xmm3
  addpd  %xmm11,%xmm1
  subpd  %xmm11,%xmm3
  movapd %xmm12,%xmm4
  movapd %xmm12,%xmm6
  addpd  %xmm14,%xmm4
  subpd  %xmm14,%xmm6
  movapd %xmm13,%xmm5
  movapd %xmm13,%xmm7
  addpd  %xmm15,%xmm5
  subpd  %xmm15,%xmm7
  movapd %xmm0,%xmm8
  movapd %xmm0,%xmm12
  addpd  %xmm4,%xmm8
  subpd  %xmm4,%xmm12
  movapd %xmm1,%xmm9
  movapd %xmm1,%xmm13
  addpd  %xmm5,%xmm9
  subpd  %xmm5,%xmm13
  movapd %xmm2,%xmm10
  movapd %xmm2,%xmm14
  addpd  %xmm6,%xmm10
  subpd  %xmm6,%xmm14
  movapd %xmm3,%xmm11
  movapd %xmm3,%xmm15
  addpd  %xmm7,%xmm11
  subpd  %xmm7,%xmm15
  movupd %xmm8,(%rax)
  movupd %xmm9,(%rdx)
  movupd %xmm10,(%rcx)
  movupd %xmm11,(%rsi)
  movupd %xmm12,(%rdi)
  movupd %xmm13,(%r8)
  movupd %xmm14,(%r9)
  movupd %xmm15,(%r10)
  addl   $0x2,-0x4(%rbp)
L4:
  cmpl   $0x3,-0x4(%rbp)
  jle    L101
  addl   $0x20,-0x8(%rbp)
L95:
  cmpl   $0x1f,-0x8(%rbp)
  jle    L3
  nop
L31:
  leave
  ret
```

assistant: ```c
void helper_double_5_recursive(double *buf, int depth) {
  if (depth == 2) {
    for (int j = 0; j < 4; j += 4) {
      for (int k = 0; k < 2; k += 2) {
        __asm__ volatile("movupd (%0), %%xmm0\n"
                         "movupd (%1), %%xmm1\n"
                         "movapd %%xmm0, %%xmm8\n"
                         "haddpd %%xmm8, %%xmm8\n"
                         "movapd %%xmm0, %%xmm9\n"
                         "hsubpd %%xmm9, %%xmm9\n"
                         "blendpd $1, %%xmm8, %%xmm9\n"
                         "movapd %%xmm9, %%xmm0\n"
                         "movapd %%xmm1, %%xmm8\n"
                         "haddpd %%xmm8, %%xmm8\n"
                         "movapd %%xmm1, %%xmm9\n"
                         "hsubpd %%xmm9, %%xmm9\n"
                         "blendpd $1, %%xmm8, %%xmm9\n"
                         "movapd %%xmm9, %%xmm1\n"
                         "movapd %%xmm0, %%xmm8\n"
                         "movapd %%xmm0, %%xmm9\n"
                         "addpd %%xmm1, %%xmm8\n"
                         "subpd %%xmm1, %%xmm9\n"
                         "movupd %%xmm8, (%0)\n"
                         "movupd %%xmm9, (%1)\n" ::"r"(buf + j + k + 0),
                         "r"(buf + j + k + 2)
                         : "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7", "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm12", "%xmm13", "%xmm14", "%xmm15", "memory");
      }
    }
    return;
  }
  if (depth == 5) {
    helper_double_5_recursive(buf + 0, 2);
    helper_double_5_recursive(buf + 4, 2);
    helper_double_5_recursive(buf + 8, 2);
    helper_double_5_recursive(buf + 12, 2);
    helper_double_5_recursive(buf + 16, 2);
    helper_double_5_recursive(buf + 20, 2);
    helper_double_5_recursive(buf + 24, 2);
    helper_double_5_recursive(buf + 28, 2);
    for (int j = 0; j < 32; j += 32) {
      for (int k = 0; k < 4; k += 2) {
        __asm__ volatile("movupd (%0), %%xmm0\n"
                         "movupd (%1), %%xmm1\n"
                         "movupd (%2), %%xmm2\n"
                         "movupd (%3), %%xmm3\n"
                         "movupd (%4), %%xmm4\n"
                         "movupd (%5), %%xmm5\n"
                         "movupd (%6), %%xmm6\n"
                         "movupd (%7), %%xmm7\n"
                         "movapd %%xmm0, %%xmm8\n"
                         "movapd %%xmm0, %%xmm9\n"
                         "addpd %%xmm1, %%xmm8\n"
                         "subpd %%xmm1, %%xmm9\n"
                         "movapd %%xmm2, %%xmm10\n"
                         "movapd %%xmm2, %%xmm11\n"
                         "addpd %%xmm3, %%xmm10\n"
                         "subpd %%xmm3, %%xmm11\n"
                         "movapd %%xmm4, %%xmm12\n"
                         "movapd %%xmm4, %%xmm13\n"
                         "addpd %%xmm5, %%xmm12\n"
                         "subpd %%xmm5, %%xmm13\n"
                         "movapd %%xmm6, %%xmm14\n"
                         "movapd %%xmm6, %%xmm15\n"
                         "addpd %%xmm7, %%xmm14\n"
                         "subpd %%xmm7, %%xmm15\n"
                         "movapd %%xmm8, %%xmm0\n"
                         "movapd %%xmm8, %%xmm2\n"
                         "addpd %%xmm10, %%xmm0\n"
                         "subpd %%xmm10, %%xmm2\n"
                         "movapd %%xmm9, %%xmm1\n"
                         "movapd %%xmm9, %%xmm3\n"
                         "addpd %%xmm11, %%xmm1\n"
                         "subpd %%xmm11, %%xmm3\n"
                         "movapd %%xmm12, %%xmm4\n"
                         "movapd %%xmm12, %%xmm6\n"
                         "addpd %%xmm14, %%xmm4\n"
                         "subpd %%xmm14, %%xmm6\n"
                         "movapd %%xmm13, %%xmm5\n"
                         "movapd %%xmm13, %%xmm7\n"
                         "addpd %%xmm15, %%xmm5\n"
                         "subpd %%xmm15, %%xmm7\n"
                         "movapd %%xmm0, %%xmm8\n"
                         "movapd %%xmm0, %%xmm12\n"
                         "addpd %%xmm4, %%xmm8\n"
                         "subpd %%xmm4, %%xmm12\n"
                         "movapd %%xmm1, %%xmm9\n"
                         "movapd %%xmm1, %%xmm13\n"
                         "addpd %%xmm5, %%xmm9\n"
                         "subpd %%xmm5, %%xmm13\n"
                         "movapd %%xmm2, %%xmm10\n"
                         "movapd %%xmm2, %%xmm14\n"
                         "addpd %%xmm6, %%xmm10\n"
                         "subpd %%xmm6, %%xmm14\n"
                         "movapd %%xmm3, %%xmm11\n"
                         "movapd %%xmm3, %%xmm15\n"
                         "addpd %%xmm7, %%xmm11\n"
                         "subpd %%xmm7, %%xmm15\n"
                         "movupd %%xmm8, (%0)\n"
                         "movupd %%xmm9, (%1)\n"
                         "movupd %%xmm10, (%2)\n"
                         "movupd %%xmm11, (%3)\n"
                         "movupd %%xmm12, (%4)\n"
                         "movupd %%xmm13, (%5)\n"
                         "movupd %%xmm14, (%6)\n"
                         "movupd %%xmm15, (%7)\n" ::"r"(buf + j + k + 0),
                         "r"(buf + j + k + 4), "r"(buf + j + k + 8), "r"(buf + j + k + 12), "r"(buf + j + k + 16), "r"(buf + j + k + 20), "r"(buf + j + k + 24), "r"(buf + j + k + 28)
                         : "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7", "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm12", "%xmm13", "%xmm14", "%xmm15", "memory");
      }
    }
    return;
  }
}
```