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

```asm
<mysort4>:
  endbr64
  cmp    $0x1,%edi
  jle    L28
  push   %r15
  mov    %rsi,%r9
  mov    %rdx,%r10
  mov    %rcx,%r11
  push   %r14
  push   %r13
  push   %r12
  mov    %edi,%r12d
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
L30:
  movsd  (%r9),%xmm1
  lea    0x8(%r9),%rbx
  mov    $0x8,%ecx
  xor    %edi,%edi
  movslq %r12d,%rbp
  nopw   0x0(%rax,%rax,1)
L8:
  lea    0x1(%rdi),%r14d
  cmp    %r12d,%r14d
  jge    L1
  comisd (%rbx),%xmm1
  ja     L47
L1:
  lea    -0x1(%rbp),%eax
  lea    -0x8(%r9,%rbp,8),%rsi
  cltq
  nopl   (%rax)
L9:
  movsd  (%rsi),%xmm0
  movslq %eax,%rbp
  lea    0x0(,%rax,8),%rdx
  mov    %rsi,%r13
  sub    $0x1,%rax
  sub    $0x8,%rsi
  comisd %xmm1,%xmm0
  ja     L9
  lea    (%r10,%rcx,1),%rax
  lea    (%r11,%rcx,1),%rsi
  lea    (%r8,%rcx,1),%r15
  cmp    %ebp,%r14d
  jge    L3
  movsd  (%rbx),%xmm2
  lea    (%r10,%rdx,1),%rax
  movsd  %xmm0,(%rbx)
  movsd  %xmm2,0x0(%r13)
  movsd  (%rax),%xmm2
  movsd  (%r10,%rcx,1),%xmm0
  movsd  %xmm2,(%r10,%rcx,1)
  movsd  %xmm0,(%rax)
  lea    (%r11,%rdx,1),%rax
  movsd  (%r11,%rcx,1),%xmm0
  add    %r8,%rdx
  movsd  (%rax),%xmm2
  movsd  %xmm2,(%r11,%rcx,1)
  movsd  %xmm0,(%rax)
  movsd  (%r8,%rcx,1),%xmm0
  movsd  (%rdx),%xmm2
  movsd  %xmm2,(%r8,%rcx,1)
  movsd  %xmm0,(%rdx)
L47:
  add    $0x8,%rbx
  add    $0x8,%rcx
  mov    %r14d,%edi
  jmp    L8
  cs nopw 0x0(%rax,%rax,1)
L3:
  sub    $0x8,%rcx
  mov    %rax,%r13
  movsd  (%r9),%xmm1
  mov    %r14d,%ebp
  lea    (%r9,%rcx,1),%rax
  mov    %rsi,%r14
  mov    %r10,%rdx
  mov    %r9,%rsi
  movsd  (%rax),%xmm0
  movsd  %xmm1,(%rax)
  lea    (%r10,%rcx,1),%rax
  sub    %ebp,%r12d
  movsd  %xmm0,(%r9)
  movsd  (%r10),%xmm1
  movsd  (%rax),%xmm0
  movsd  %xmm1,(%rax)
  lea    (%r11,%rcx,1),%rax
  add    %r8,%rcx
  movsd  %xmm0,(%r10)
  movsd  (%rax),%xmm0
  movsd  (%r11),%xmm1
  movsd  %xmm1,(%rax)
  movsd  %xmm0,(%r11)
  movsd  (%rcx),%xmm0
  movsd  (%r8),%xmm1
  movsd  %xmm1,(%rcx)
  mov    %r11,%rcx
  movsd  %xmm0,(%r8)
  call   <mysort4>
  cmp    $0x1,%r12d
  jle    L73
  mov    %r15,%r8
  mov    %r14,%r11
  mov    %r13,%r10
  mov    %rbx,%r9
  jmp    L30
L73:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L28:
  ret
```

assistant: ```c
void mysort4(int N, double *data1, double *data2, double *data3, double *data4) {
  int i, j;
  double v, t1, t2, t3, t4;
  if (N <= 1)
    return;
  v = data1[0];
  i = 0;
  j = N;
  for (;;) {
    while (++i < N ? data1[i] < v : 0) {
    }
    while (data1[--j] > v) {
    }
    if (i >= j)
      break;
    t1 = data1[i];
    data1[i] = data1[j];
    data1[j] = t1;
    t2 = data2[i];
    data2[i] = data2[j];
    data2[j] = t2;
    t3 = data3[i];
    data3[i] = data3[j];
    data3[j] = t3;
    t4 = data4[i];
    data4[i] = data4[j];
    data4[j] = t4;
  }
  t1 = data1[i - 1];
  data1[i - 1] = data1[0];
  data1[0] = t1;
  t2 = data2[i - 1];
  data2[i - 1] = data2[0];
  data2[0] = t2;
  t3 = data3[i - 1];
  data3[i - 1] = data3[0];
  data3[0] = t3;
  t4 = data4[i - 1];
  data4[i - 1] = data4[0];
  data4[0] = t4;
  mysort4(i - 1, data1, data2, data3, data4);
  mysort4(N - i, data1 + i, data2 + i, data3 + i, data4 + i);
}
```