user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<helper_double_4_recursive>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  cmpl   $0x4,-0x1c(%rbp)
  jne    L49
  movl   $0x0,-0x8(%rbp)
  jmp    L5
L25:
  movl   $0x0,-0x4(%rbp)
  jmp    L13
L2:
  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
  vmovupd (%rax),%ymm0
  vmovupd (%rdx),%ymm1
  vmovupd (%rcx),%ymm2
  vmovupd (%rsi),%ymm3
  vpermilpd $0x0,%ymm0,%ymm8
  vpermilpd $0xf,%ymm0,%ymm9
  vxorpd %ymm10,%ymm10,%ymm10
  vsubpd %ymm9,%ymm10,%ymm11
  vaddsubpd %ymm11,%ymm8,%ymm0
  vpermilpd $0x0,%ymm1,%ymm8
  vpermilpd $0xf,%ymm1,%ymm9
  vxorpd %ymm10,%ymm10,%ymm10
  vsubpd %ymm9,%ymm10,%ymm11
  vaddsubpd %ymm11,%ymm8,%ymm1
  vpermilpd $0x0,%ymm2,%ymm8
  vpermilpd $0xf,%ymm2,%ymm9
  vxorpd %ymm10,%ymm10,%ymm10
  vsubpd %ymm9,%ymm10,%ymm11
  vaddsubpd %ymm11,%ymm8,%ymm2
  vpermilpd $0x0,%ymm3,%ymm8
  vpermilpd $0xf,%ymm3,%ymm9
  vxorpd %ymm10,%ymm10,%ymm10
  vsubpd %ymm9,%ymm10,%ymm11
  vaddsubpd %ymm11,%ymm8,%ymm3
  vperm2f128 $0x0,%ymm0,%ymm0,%ymm8
  vxorpd %ymm9,%ymm9,%ymm9
  vsubpd %ymm0,%ymm9,%ymm10
  vperm2f128 $0x31,%ymm10,%ymm0,%ymm11
  vaddpd %ymm11,%ymm8,%ymm0
  vperm2f128 $0x0,%ymm1,%ymm1,%ymm8
  vxorpd %ymm9,%ymm9,%ymm9
  vsubpd %ymm1,%ymm9,%ymm10
  vperm2f128 $0x31,%ymm10,%ymm1,%ymm11
  vaddpd %ymm11,%ymm8,%ymm1
  vperm2f128 $0x0,%ymm2,%ymm2,%ymm8
  vxorpd %ymm9,%ymm9,%ymm9
  vsubpd %ymm2,%ymm9,%ymm10
  vperm2f128 $0x31,%ymm10,%ymm2,%ymm11
  vaddpd %ymm11,%ymm8,%ymm2
  vperm2f128 $0x0,%ymm3,%ymm3,%ymm8
  vxorpd %ymm9,%ymm9,%ymm9
  vsubpd %ymm3,%ymm9,%ymm10
  vperm2f128 $0x31,%ymm10,%ymm3,%ymm11
  vaddpd %ymm11,%ymm8,%ymm3
  vaddpd %ymm1,%ymm0,%ymm8
  vsubpd %ymm1,%ymm0,%ymm9
  vaddpd %ymm3,%ymm2,%ymm10
  vsubpd %ymm3,%ymm2,%ymm11
  vaddpd %ymm10,%ymm8,%ymm0
  vsubpd %ymm10,%ymm8,%ymm2
  vaddpd %ymm11,%ymm9,%ymm1
  vsubpd %ymm11,%ymm9,%ymm3
  vmovupd %ymm0,(%rax)
  vmovupd %ymm1,(%rdx)
  vmovupd %ymm2,(%rcx)
  vmovupd %ymm3,(%rsi)
  addl   $0x4,-0x4(%rbp)
L13:
  cmpl   $0x3,-0x4(%rbp)
  jle    L2
  addl   $0x10,-0x8(%rbp)
L5:
  cmpl   $0xf,-0x8(%rbp)
  jle    L25
  nop
L49:
  pop    %rbp
  ret
```

assistant: ```c
void helper_double_4_recursive(double *buf, int depth) {
  if (depth == 4) {
    for (int j = 0; j < 16; j += 16) {
      for (int k = 0; k < 4; k += 4) {
        __asm__ volatile("vmovupd (%0), %%ymm0\n"
                         "vmovupd (%1), %%ymm1\n"
                         "vmovupd (%2), %%ymm2\n"
                         "vmovupd (%3), %%ymm3\n"
                         "vpermilpd $0, %%ymm0, %%ymm8\n"
                         "vpermilpd $15, %%ymm0, %%ymm9\n"
                         "vxorpd %%ymm10, %%ymm10, %%ymm10\n"
                         "vsubpd %%ymm9, %%ymm10, %%ymm11\n"
                         "vaddsubpd %%ymm11, %%ymm8, %%ymm0\n"
                         "vpermilpd $0, %%ymm1, %%ymm8\n"
                         "vpermilpd $15, %%ymm1, %%ymm9\n"
                         "vxorpd %%ymm10, %%ymm10, %%ymm10\n"
                         "vsubpd %%ymm9, %%ymm10, %%ymm11\n"
                         "vaddsubpd %%ymm11, %%ymm8, %%ymm1\n"
                         "vpermilpd $0, %%ymm2, %%ymm8\n"
                         "vpermilpd $15, %%ymm2, %%ymm9\n"
                         "vxorpd %%ymm10, %%ymm10, %%ymm10\n"
                         "vsubpd %%ymm9, %%ymm10, %%ymm11\n"
                         "vaddsubpd %%ymm11, %%ymm8, %%ymm2\n"
                         "vpermilpd $0, %%ymm3, %%ymm8\n"
                         "vpermilpd $15, %%ymm3, %%ymm9\n"
                         "vxorpd %%ymm10, %%ymm10, %%ymm10\n"
                         "vsubpd %%ymm9, %%ymm10, %%ymm11\n"
                         "vaddsubpd %%ymm11, %%ymm8, %%ymm3\n"
                         "vperm2f128 $0, %%ymm0, %%ymm0, %%ymm8\n"
                         "vxorpd %%ymm9, %%ymm9, %%ymm9\n"
                         "vsubpd %%ymm0, %%ymm9, %%ymm10\n"
                         "vperm2f128 $49, %%ymm10, %%ymm0, %%ymm11\n"
                         "vaddpd %%ymm11, %%ymm8, %%ymm0\n"
                         "vperm2f128 $0, %%ymm1, %%ymm1, %%ymm8\n"
                         "vxorpd %%ymm9, %%ymm9, %%ymm9\n"
                         "vsubpd %%ymm1, %%ymm9, %%ymm10\n"
                         "vperm2f128 $49, %%ymm10, %%ymm1, %%ymm11\n"
                         "vaddpd %%ymm11, %%ymm8, %%ymm1\n"
                         "vperm2f128 $0, %%ymm2, %%ymm2, %%ymm8\n"
                         "vxorpd %%ymm9, %%ymm9, %%ymm9\n"
                         "vsubpd %%ymm2, %%ymm9, %%ymm10\n"
                         "vperm2f128 $49, %%ymm10, %%ymm2, %%ymm11\n"
                         "vaddpd %%ymm11, %%ymm8, %%ymm2\n"
                         "vperm2f128 $0, %%ymm3, %%ymm3, %%ymm8\n"
                         "vxorpd %%ymm9, %%ymm9, %%ymm9\n"
                         "vsubpd %%ymm3, %%ymm9, %%ymm10\n"
                         "vperm2f128 $49, %%ymm10, %%ymm3, %%ymm11\n"
                         "vaddpd %%ymm11, %%ymm8, %%ymm3\n"
                         "vaddpd %%ymm1, %%ymm0, %%ymm8\n"
                         "vsubpd %%ymm1, %%ymm0, %%ymm9\n"
                         "vaddpd %%ymm3, %%ymm2, %%ymm10\n"
                         "vsubpd %%ymm3, %%ymm2, %%ymm11\n"
                         "vaddpd %%ymm10, %%ymm8, %%ymm0\n"
                         "vsubpd %%ymm10, %%ymm8, %%ymm2\n"
                         "vaddpd %%ymm11, %%ymm9, %%ymm1\n"
                         "vsubpd %%ymm11, %%ymm9, %%ymm3\n"
                         "vmovupd %%ymm0, (%0)\n"
                         "vmovupd %%ymm1, (%1)\n"
                         "vmovupd %%ymm2, (%2)\n"
                         "vmovupd %%ymm3, (%3)\n" ::"r"(buf + j + k + 0),
                         "r"(buf + j + k + 4), "r"(buf + j + k + 8), "r"(buf + j + k + 12)
                         : "%ymm0", "%ymm1", "%ymm2", "%ymm3", "%ymm4", "%ymm5", "%ymm6", "%ymm7", "%ymm8", "%ymm9", "%ymm10", "%ymm11", "%ymm12", "%ymm13", "%ymm14", "%ymm15", "memory");
      }
    }
    return;
  }
}
```