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

```asm
<fexpand>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x8(%rbp)
  mov    %rsi,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %edx,%eax
  and    $0x3ffffff,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x10(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x20,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x28,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x30,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %edx,%eax
  sar    $0x2,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x4,%rax
  and    $0x1ffffff,%edx
  mov    %edx,(%rax)
  mov    -0x10(%rbp),%rax
  add    $0x30,%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x38,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x40,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x48,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %edx,%eax
  sar    $0x3,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x8,%rax
  and    $0x3ffffff,%edx
  mov    %edx,(%rax)
  mov    -0x10(%rbp),%rax
  add    $0x48,%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x50,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x58,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x60,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %edx,%eax
  sar    $0x5,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0xc,%rax
  and    $0x1ffffff,%edx
  mov    %edx,(%rax)
  mov    -0x10(%rbp),%rax
  add    $0x60,%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x68,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x70,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x78,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %edx,%eax
  shr    $0x6,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  mov    %edx,(%rax)
  mov    -0x10(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x88,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x90,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x98,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x14,%rax
  and    $0x1ffffff,%edx
  mov    %edx,(%rax)
  mov    -0x10(%rbp),%rax
  add    $0x98,%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0xa0,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0xa8,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0xb0,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %edx,%eax
  sar    %eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x18,%rax
  and    $0x3ffffff,%edx
  mov    %edx,(%rax)
  mov    -0x10(%rbp),%rax
  add    $0xb0,%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0xb8,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0xc0,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0xc8,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %edx,%eax
  sar    $0x3,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x1c,%rax
  and    $0x1ffffff,%edx
  mov    %edx,(%rax)
  mov    -0x10(%rbp),%rax
  add    $0xc8,%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0xd0,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0xd8,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0xe0,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %edx,%eax
  sar    $0x4,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  and    $0x3ffffff,%edx
  mov    %edx,(%rax)
  mov    -0x10(%rbp),%rax
  add    $0xe0,%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0xe8,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0xf0,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0xf8,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %edx,%eax
  sar    $0x6,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x24,%rax
  and    $0x1ffffff,%edx
  mov    %edx,(%rax)
  nop
  pop    %rbp
  ret
```

assistant: ```c
void fexpand(int64_t *output, const uint8_t *input) {
  output[0] = ((((int64_t)input[0 + 0]) | ((int64_t)input[0 + 1]) << 8 | ((int64_t)input[0 + 2]) << 16 | ((int64_t)input[0 + 3]) << 24) >> 0) & 0x3ffffff;
  ;
  output[1] = ((((int64_t)input[3 + 0]) | ((int64_t)input[3 + 1]) << 8 | ((int64_t)input[3 + 2]) << 16 | ((int64_t)input[3 + 3]) << 24) >> 2) & 0x1ffffff;
  ;
  output[2] = ((((int64_t)input[6 + 0]) | ((int64_t)input[6 + 1]) << 8 | ((int64_t)input[6 + 2]) << 16 | ((int64_t)input[6 + 3]) << 24) >> 3) & 0x3ffffff;
  ;
  output[3] = ((((int64_t)input[9 + 0]) | ((int64_t)input[9 + 1]) << 8 | ((int64_t)input[9 + 2]) << 16 | ((int64_t)input[9 + 3]) << 24) >> 5) & 0x1ffffff;
  ;
  output[4] = ((((int64_t)input[12 + 0]) | ((int64_t)input[12 + 1]) << 8 | ((int64_t)input[12 + 2]) << 16 | ((int64_t)input[12 + 3]) << 24) >> 6) & 0x3ffffff;
  ;
  output[5] = ((((int64_t)input[16 + 0]) | ((int64_t)input[16 + 1]) << 8 | ((int64_t)input[16 + 2]) << 16 | ((int64_t)input[16 + 3]) << 24) >> 0) & 0x1ffffff;
  ;
  output[6] = ((((int64_t)input[19 + 0]) | ((int64_t)input[19 + 1]) << 8 | ((int64_t)input[19 + 2]) << 16 | ((int64_t)input[19 + 3]) << 24) >> 1) & 0x3ffffff;
  ;
  output[7] = ((((int64_t)input[22 + 0]) | ((int64_t)input[22 + 1]) << 8 | ((int64_t)input[22 + 2]) << 16 | ((int64_t)input[22 + 3]) << 24) >> 3) & 0x1ffffff;
  ;
  output[8] = ((((int64_t)input[25 + 0]) | ((int64_t)input[25 + 1]) << 8 | ((int64_t)input[25 + 2]) << 16 | ((int64_t)input[25 + 3]) << 24) >> 4) & 0x3ffffff;
  ;
  output[9] = ((((int64_t)input[28 + 0]) | ((int64_t)input[28 + 1]) << 8 | ((int64_t)input[28 + 2]) << 16 | ((int64_t)input[28 + 3]) << 24) >> 6) & 0x1ffffff;
  ;
}
```