user: 请将以下的汇编代码转换成C语言代码:

```asm
<fexpand>:
  endbr64
  mov    %rsi,%rax
  mov    0x8(%rsi),%edx
  shl    $0x8,%edx
  mov    0x10(%rsi),%esi
  shl    $0x10,%esi
  or     %esi,%edx
  or     (%rax),%edx
  mov    0x18(%rax),%esi
  shl    $0x18,%esi
  or     %esi,%edx
  and    $0x3ffffff,%edx
  mov    %edx,(%rdi)
  mov    0x20(%rax),%edx
  shl    $0x8,%edx
  mov    0x28(%rax),%esi
  shl    $0x10,%esi
  or     %esi,%edx
  or     0x18(%rax),%edx
  mov    0x30(%rax),%esi
  shl    $0x18,%esi
  or     %esi,%edx
  sar    $0x2,%edx
  and    $0x1ffffff,%edx
  mov    %edx,0x4(%rdi)
  mov    0x38(%rax),%edx
  shl    $0x8,%edx
  mov    0x40(%rax),%esi
  shl    $0x10,%esi
  or     %esi,%edx
  or     0x30(%rax),%edx
  mov    0x48(%rax),%esi
  shl    $0x18,%esi
  or     %esi,%edx
  sar    $0x3,%edx
  and    $0x3ffffff,%edx
  mov    %edx,0x8(%rdi)
  mov    0x50(%rax),%edx
  shl    $0x8,%edx
  mov    0x58(%rax),%esi
  shl    $0x10,%esi
  or     %esi,%edx
  or     0x48(%rax),%edx
  mov    0x60(%rax),%esi
  shl    $0x18,%esi
  or     %esi,%edx
  sar    $0x5,%edx
  and    $0x1ffffff,%edx
  mov    %edx,0xc(%rdi)
  mov    0x68(%rax),%edx
  shl    $0x8,%edx
  mov    0x70(%rax),%esi
  shl    $0x10,%esi
  or     %esi,%edx
  or     0x60(%rax),%edx
  mov    0x78(%rax),%esi
  shl    $0x18,%esi
  or     %esi,%edx
  shr    $0x6,%edx
  mov    %edx,0x10(%rdi)
  mov    0x88(%rax),%edx
  shl    $0x8,%edx
  mov    0x90(%rax),%esi
  shl    $0x10,%esi
  or     %esi,%edx
  or     0x80(%rax),%edx
  mov    0x98(%rax),%esi
  shl    $0x18,%esi
  or     %esi,%edx
  and    $0x1ffffff,%edx
  mov    %edx,0x14(%rdi)
  mov    0xa0(%rax),%edx
  shl    $0x8,%edx
  mov    0xa8(%rax),%esi
  shl    $0x10,%esi
  or     %esi,%edx
  or     0x98(%rax),%edx
  mov    0xb0(%rax),%esi
  shl    $0x18,%esi
  or     %esi,%edx
  sar    %edx
  and    $0x3ffffff,%edx
  mov    %edx,0x18(%rdi)
  mov    0xb8(%rax),%edx
  shl    $0x8,%edx
  mov    0xc0(%rax),%esi
  shl    $0x10,%esi
  or     %esi,%edx
  or     0xb0(%rax),%edx
  mov    0xc8(%rax),%esi
  shl    $0x18,%esi
  or     %esi,%edx
  sar    $0x3,%edx
  and    $0x1ffffff,%edx
  mov    %edx,0x1c(%rdi)
  mov    0xd0(%rax),%edx
  shl    $0x8,%edx
  mov    0xd8(%rax),%esi
  shl    $0x10,%esi
  or     %esi,%edx
  or     0xc8(%rax),%edx
  mov    0xe0(%rax),%esi
  shl    $0x18,%esi
  or     %esi,%edx
  sar    $0x4,%edx
  and    $0x3ffffff,%edx
  mov    %edx,0x20(%rdi)
  mov    0xe8(%rax),%edx
  shl    $0x8,%edx
  mov    0xf0(%rax),%esi
  shl    $0x10,%esi
  or     %esi,%edx
  or     0xe0(%rax),%edx
  mov    0xf8(%rax),%rax
  shl    $0x18,%eax
  or     %edx,%eax
  sar    $0x6,%eax
  and    $0x1ffffff,%eax
  mov    %eax,0x24(%rdi)
  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;
  ;
}
```