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

```asm
<helper_double_3_recursive>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  cmpl   $0x3,-0x1c(%rbp)
  jne    L13
  movl   $0x0,-0x8(%rbp)
  jmp    L45
L0:
  movl   $0x0,-0x4(%rbp)
  jmp    L25
L5:
  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    $0x2,%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    $0x4,%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    $0x6,%rsi
  lea    0x0(,%rsi,8),%rdi
  mov    -0x18(%rbp),%rsi
  add    %rdi,%rsi
  movupd (%rax),%xmm0
  movupd (%rdx),%xmm1
  movupd (%rcx),%xmm2
  movupd (%rsi),%xmm3
  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 %xmm2,%xmm8
  haddpd %xmm8,%xmm8
  movapd %xmm2,%xmm9
  hsubpd %xmm9,%xmm9
  blendpd $0x1,%xmm8,%xmm9
  movapd %xmm9,%xmm2
  movapd %xmm3,%xmm8
  haddpd %xmm8,%xmm8
  movapd %xmm3,%xmm9
  hsubpd %xmm9,%xmm9
  blendpd $0x1,%xmm8,%xmm9
  movapd %xmm9,%xmm3
  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 %xmm8,%xmm0
  movapd %xmm8,%xmm2
  addpd  %xmm10,%xmm0
  subpd  %xmm10,%xmm2
  movapd %xmm9,%xmm1
  movapd %xmm9,%xmm3
  addpd  %xmm11,%xmm1
  subpd  %xmm11,%xmm3
  movupd %xmm0,(%rax)
  movupd %xmm1,(%rdx)
  movupd %xmm2,(%rcx)
  movupd %xmm3,(%rsi)
  addl   $0x2,-0x4(%rbp)
L25:
  cmpl   $0x1,-0x4(%rbp)
  jle    L5
  addl   $0x8,-0x8(%rbp)
L45:
  cmpl   $0x7,-0x8(%rbp)
  jle    L0
  nop
L13:
  pop    %rbp
  ret
```

assistant: ```c
void helper_double_3_recursive(double *buf, int depth) {
  if (depth == 3) {
    for (int j = 0; j < 8; j += 8) {
      for (int k = 0; k < 2; k += 2) {
        __asm__ volatile("movupd (%0), %%xmm0\n"
                         "movupd (%1), %%xmm1\n"
                         "movupd (%2), %%xmm2\n"
                         "movupd (%3), %%xmm3\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 %%xmm2, %%xmm8\n"
                         "haddpd %%xmm8, %%xmm8\n"
                         "movapd %%xmm2, %%xmm9\n"
                         "hsubpd %%xmm9, %%xmm9\n"
                         "blendpd $1, %%xmm8, %%xmm9\n"
                         "movapd %%xmm9, %%xmm2\n"
                         "movapd %%xmm3, %%xmm8\n"
                         "haddpd %%xmm8, %%xmm8\n"
                         "movapd %%xmm3, %%xmm9\n"
                         "hsubpd %%xmm9, %%xmm9\n"
                         "blendpd $1, %%xmm8, %%xmm9\n"
                         "movapd %%xmm9, %%xmm3\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 %%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"
                         "movupd %%xmm0, (%0)\n"
                         "movupd %%xmm1, (%1)\n"
                         "movupd %%xmm2, (%2)\n"
                         "movupd %%xmm3, (%3)\n" ::"r"(buf + j + k + 0),
                         "r"(buf + j + k + 2), "r"(buf + j + k + 4), "r"(buf + j + k + 6)
                         : "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7", "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm12", "%xmm13", "%xmm14", "%xmm15", "memory");
      }
    }
    return;
  }
}
```