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

```asm
<helper_double_4_recursive>:
  endbr64
  cmp    $0x4,%esi
  je     L10
L12:
  ret
L10:
  lea    0x20(%rdi),%rax
  lea    0x40(%rdi),%rdx
  lea    0x60(%rdi),%rcx
  vmovupd (%rdi),%ymm0
  vmovupd (%rax),%ymm1
  vmovupd (%rdx),%ymm2
  vmovupd (%rcx),%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,(%rdi)
  vmovupd %ymm1,(%rax)
  vmovupd %ymm2,(%rdx)
  vmovupd %ymm3,(%rcx)
  jmp    L12
```

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;
  }
}
```