user: 请从给定的汇编指令推导出C源代码:

```asm
<fexpand>:
  endbr64
  mov    %rsi,%rax
  mov    0x18(%rsi),%r10
  mov    0x30(%rsi),%r8
  mov    %rdi,%rcx
  mov    0x8(%rax),%edx
  mov    0x10(%rax),%r9d
  mov    0x48(%rsi),%rsi
  mov    0x60(%rax),%rdi
  shl    $0x10,%r9d
  shl    $0x8,%edx
  or     %r9d,%edx
  mov    %r10d,%r9d
  or     (%rax),%edx
  shl    $0x18,%r9d
  or     %r9d,%edx
  mov    0x28(%rax),%r9d
  movd   %edx,%xmm0
  mov    0x20(%rax),%edx
  shl    $0x10,%r9d
  shl    $0x8,%edx
  or     %r9d,%edx
  mov    %r8d,%r9d
  or     %r10d,%edx
  shl    $0x18,%r9d
  mov    0x40(%rax),%r10d
  or     %r9d,%edx
  sar    $0x2,%edx
  shl    $0x10,%r10d
  mov    %edx,%r9d
  mov    0x38(%rax),%edx
  movd   %r9d,%xmm3
  mov    0x98(%rax),%r9
  shl    $0x8,%edx
  punpckldq %xmm3,%xmm0
  or     %r10d,%edx
  mov    0x58(%rax),%r10d
  or     %r8d,%edx
  mov    %esi,%r8d
  shl    $0x18,%r8d
  shl    $0x10,%r10d
  or     %r8d,%edx
  mov    0x50(%rax),%r8d
  sar    $0x3,%edx
  shl    $0x8,%r8d
  movd   %edx,%xmm1
  mov    0x68(%rax),%edx
  or     %r10d,%r8d
  mov    0x70(%rax),%r10d
  or     %r8d,%esi
  mov    %edi,%r8d
  shl    $0x8,%edx
  shl    $0x18,%r8d
  shl    $0x10,%r10d
  or     %r8d,%esi
  or     %r10d,%edx
  mov    0xb0(%rax),%r8
  sar    $0x5,%esi
  or     %edi,%edx
  mov    0x78(%rax),%edi
  movd   %esi,%xmm2
  mov    0xc8(%rax),%rsi
  punpckldq %xmm2,%xmm1
  shl    $0x18,%edi
  or     %edi,%edx
  punpcklqdq %xmm1,%xmm0
  pand   D5(%rip),%xmm0
  mov    0x90(%rax),%edi
  shr    $0x6,%edx
  movups %xmm0,(%rcx)
  movd   %edx,%xmm0
  mov    0x88(%rax),%edx
  shl    $0x10,%edi
  shl    $0x8,%edx
  or     %edi,%edx
  mov    %r9d,%edi
  or     0x80(%rax),%edx
  shl    $0x18,%edi
  or     %edi,%edx
  mov    0xa8(%rax),%edi
  and    $0x1ffffff,%edx
  mov    %edx,%r10d
  mov    0xa0(%rax),%edx
  shl    $0x10,%edi
  movd   %r10d,%xmm5
  shl    $0x8,%edx
  punpckldq %xmm5,%xmm0
  or     %edi,%edx
  mov    %r8d,%edi
  or     %r9d,%edx
  shl    $0x18,%edi
  mov    0xc0(%rax),%r9d
  or     %edi,%edx
  mov    0xb8(%rax),%edi
  shl    $0x10,%r9d
  sar    %edx
  shl    $0x8,%edi
  and    $0x3ffffff,%edx
  or     %r9d,%edi
  movd   %edx,%xmm1
  mov    0xd0(%rax),%edx
  or     %r8d,%edi
  mov    %esi,%r8d
  shl    $0x18,%r8d
  shl    $0x8,%edx
  or     %r8d,%edi
  mov    0xe0(%rax),%r8
  sar    $0x3,%edi
  and    $0x1ffffff,%edi
  movd   %edi,%xmm4
  mov    0xd8(%rax),%edi
  punpckldq %xmm4,%xmm1
  shl    $0x10,%edi
  punpcklqdq %xmm1,%xmm0
  or     %edi,%edx
  movups %xmm0,0x10(%rcx)
  or     %esi,%edx
  mov    %r8d,%esi
  shl    $0x18,%esi
  or     %esi,%edx
  sar    $0x4,%edx
  and    $0x3ffffff,%edx
  mov    %edx,0x20(%rcx)
  mov    0xe8(%rax),%edx
  mov    0xf0(%rax),%esi
  mov    0xf8(%rax),%rax
  shl    $0x8,%edx
  shl    $0x10,%esi
  shl    $0x18,%eax
  or     %esi,%edx
  or     %r8d,%edx
  or     %edx,%eax
  sar    $0x6,%eax
  and    $0x1ffffff,%eax
  mov    %eax,0x24(%rcx)
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D5
datatype: byte[16]

tool: {"D5": [0xff,0xff,0xff,0x03,0xff,0xff,0xff,0x01,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0x01]}

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;
  ;
}
```