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

```asm
<stuffdouble>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  movsd  %xmm0,-0x18(%rbp)
  mov    %rdi,-0x20(%rbp)
  mov    %rsi,-0x28(%rbp)
  lea    -0x18(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  movzwl %ax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    -0x8(%rbp),%rdx
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %dx,(%rax)
  mov    -0x8(%rbp),%rax
  shr    $0x8,%rax
  mov    %rax,%rcx
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  movzwl %ax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %dx,(%rax)
  mov    -0x8(%rbp),%rax
  shr    $0x10,%rax
  mov    %rax,%rcx
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  movzwl %ax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %dx,(%rax)
  mov    -0x8(%rbp),%rax
  shr    $0x18,%rax
  mov    %rax,%rcx
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  movzwl %ax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %dx,(%rax)
  mov    -0x8(%rbp),%rax
  shr    $0x20,%rax
  mov    %rax,%rcx
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  movzwl %ax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %dx,(%rax)
  mov    -0x8(%rbp),%rax
  shr    $0x28,%rax
  mov    %rax,%rcx
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  movzwl %ax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %dx,(%rax)
  mov    -0x8(%rbp),%rax
  shr    $0x30,%rax
  mov    %rax,%rcx
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  movzwl %ax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %dx,(%rax)
  mov    -0x8(%rbp),%rax
  shr    $0x38,%rax
  mov    %rax,%rcx
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  movzwl %ax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %dx,(%rax)
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  movzwl %ax,%eax
  pop    %rbp
  ret
```

assistant: ```c
int stuffdouble(double data, unsigned char *buffer, unsigned short *index) {
  unsigned long long *tempp, temp;
  tempp = (unsigned long long *)&data;
  temp = *tempp;
  buffer[*index] = (temp >> 0) & 0xff;
  *index += 1;
  buffer[*index] = (temp >> 8) & 0xff;
  *index += 1;
  buffer[*index] = (temp >> 16) & 0xff;
  *index += 1;
  buffer[*index] = (temp >> 24) & 0xff;
  *index += 1;
  buffer[*index] = (temp >> 32) & 0xff;
  *index += 1;
  buffer[*index] = (temp >> 40) & 0xff;
  *index += 1;
  buffer[*index] = (temp >> 48) & 0xff;
  *index += 1;
  buffer[*index] = (temp >> 56) & 0xff;
  *index += 1;
  return (*index);
}
```