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

```asm
<interleave>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  movsd  %xmm0,-0x28(%rbp)
  movsd  %xmm1,-0x30(%rbp)
  movsd  %xmm2,-0x38(%rbp)
  movsd  %xmm3,-0x40(%rbp)
  mov    %rdi,-0x48(%rbp)
  movl   $0x2,-0x14(%rbp)
  movl   $0x0,-0x10(%rbp)
  movsd  -0x28(%rbp),%xmm0
  mulsd  -0x40(%rbp),%xmm0
  cvttsd2si %xmm0,%rax
  mov    %eax,-0xc(%rbp)
  movsd  -0x30(%rbp),%xmm0
  mulsd  -0x40(%rbp),%xmm0
  cvttsd2si %xmm0,%rax
  mov    %eax,-0x8(%rbp)
  movsd  -0x38(%rbp),%xmm0
  mulsd  -0x40(%rbp),%xmm0
  cvttsd2si %xmm0,%rax
  mov    %eax,-0x4(%rbp)
  mov    -0x48(%rbp),%rax
  movl   $0x0,(%rax)
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movl   $0x0,(%rax)
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movl   $0x0,(%rax)
  movl   $0x1f,-0x18(%rbp)
  jmp    L90
L109:
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%esi
  mov    -0x18(%rbp),%eax
  mov    -0xc(%rbp),%edx
  mov    %eax,%ecx
  shr    %cl,%edx
  mov    %edx,%eax
  and    $0x1,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0x48(%rbp),%rax
  add    %rcx,%rax
  add    %esi,%edx
  mov    %edx,(%rax)
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0x48(%rbp),%rax
  add    %rcx,%rax
  add    %edx,%edx
  mov    %edx,(%rax)
  mov    -0x10(%rbp),%eax
  cltq
  and    $0x1f,%eax
  test   %rax,%rax
  jne    L38
  cmpl   $0x0,-0x10(%rbp)
  je     L38
  movl   $0x0,-0x10(%rbp)
  subl   $0x1,-0x14(%rbp)
  jmp    L40
L38:
  addl   $0x1,-0x10(%rbp)
L40:
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%esi
  mov    -0x18(%rbp),%eax
  mov    -0x8(%rbp),%edx
  mov    %eax,%ecx
  shr    %cl,%edx
  mov    %edx,%eax
  and    $0x1,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0x48(%rbp),%rax
  add    %rcx,%rax
  add    %esi,%edx
  mov    %edx,(%rax)
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0x48(%rbp),%rax
  add    %rcx,%rax
  add    %edx,%edx
  mov    %edx,(%rax)
  mov    -0x10(%rbp),%eax
  cltq
  and    $0x1f,%eax
  test   %rax,%rax
  jne    L74
  cmpl   $0x0,-0x10(%rbp)
  je     L74
  movl   $0x0,-0x10(%rbp)
  subl   $0x1,-0x14(%rbp)
  jmp    L32
L74:
  addl   $0x1,-0x10(%rbp)
L32:
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%esi
  mov    -0x18(%rbp),%eax
  mov    -0x4(%rbp),%edx
  mov    %eax,%ecx
  shr    %cl,%edx
  mov    %edx,%eax
  and    $0x1,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0x48(%rbp),%rax
  add    %rcx,%rax
  add    %esi,%edx
  mov    %edx,(%rax)
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0x48(%rbp),%rax
  add    %rcx,%rax
  add    %edx,%edx
  mov    %edx,(%rax)
  mov    -0x10(%rbp),%eax
  cltq
  and    $0x1f,%eax
  test   %rax,%rax
  jne    L87
  cmpl   $0x0,-0x10(%rbp)
  je     L87
  movl   $0x0,-0x10(%rbp)
  subl   $0x1,-0x14(%rbp)
  jmp    L77
L87:
  addl   $0x1,-0x10(%rbp)
L77:
  subl   $0x1,-0x18(%rbp)
L90:
  cmpl   $0x0,-0x18(%rbp)
  jns    L109
  nop
  nop
  pop    %rbp
  ret
```

assistant: ```c
void interleave(double x, double y, double z, double deg, unsigned int index[3]) {
  unsigned int tempx, tempy, tempz;
  int i, j = 2, cnt = 0;
  tempx = (unsigned int)(x * deg);
  tempy = (unsigned int)(y * deg);
  tempz = (unsigned int)(z * deg);
  index[0] = 0;
  index[1] = 0;
  index[2] = 0;
  for (i = sizeof(unsigned int) * 8 - 1; i >= 0; i--) {
    index[j] += (tempx >> i) & 01;
    index[j] = index[j] << 01;
    if ((cnt % (sizeof(unsigned int) * 8) == 0) && (cnt != 0)) {
      cnt = 0;
      j--;
    } else
      cnt++;
    index[j] += (tempy >> i) & 01;
    index[j] = index[j] << 01;
    if ((cnt % (sizeof(unsigned int) * 8) == 0) && (cnt != 0)) {
      cnt = 0;
      j--;
    } else
      cnt++;
    index[j] += (tempz >> i) & 01;
    index[j] = index[j] << 01;
    if ((cnt % (sizeof(unsigned int) * 8) == 0) && (cnt != 0)) {
      cnt = 0;
      j--;
    } else
      cnt++;
  }
}
```