user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<fcontract>:
  endbr64
  mov    (%rsi),%eax
  mov    %rdi,%r9
  mov    %rsi,%r8
  mov    $0x2,%r10d
  lea    0x4(%rsi),%r11
L33:
  mov    %r11,%rcx
  xor    %esi,%esi
  jmp    L47
  nopl   (%rax)
L49:
  and    $0xfe000000,%edx
  sar    $0x19,%edi
  add    $0x1,%esi
  sub    %edx,%eax
  mov    %eax,-0x4(%rcx)
  mov    (%rcx),%eax
  add    %edi,%eax
  mov    %eax,(%rcx)
  cmp    $0x9,%esi
  je     L35
L44:
  add    $0x4,%rcx
L47:
  cltd
  and    %eax,%edx
  mov    %edx,%edi
  test   $0x1,%sil
  jne    L49
  and    $0xfc000000,%edx
  sar    $0x1a,%edi
  add    $0x1,%esi
  sub    %edx,%eax
  mov    %eax,-0x4(%rcx)
  mov    (%rcx),%eax
  add    %edi,%eax
  mov    %eax,(%rcx)
  cmp    $0x9,%esi
  jne    L44
L35:
  mov    0x24(%r8),%ecx
  mov    %ecx,%eax
  sar    $0x1f,%eax
  and    %ecx,%eax
  mov    %eax,%edx
  and    $0xfe000000,%eax
  sar    $0x19,%edx
  sub    %eax,%ecx
  lea    (%rdx,%rdx,8),%eax
  mov    %ecx,0x24(%r8)
  lea    (%rdx,%rax,2),%eax
  add    (%r8),%eax
  mov    %eax,(%r8)
  cmp    $0x1,%r10d
  je     L40
  mov    $0x1,%r10d
  jmp    L33
  nop
L40:
  shl    $0x6,%ecx
  cltd
  shll   $0x3,0x8(%r8)
  and    %eax,%edx
  mov    %ecx,0x24(%r8)
  mov    %edx,%esi
  and    $0xfc000000,%edx
  shll   $0x5,0xc(%r8)
  sar    $0x1a,%esi
  sub    %edx,%eax
  shll   $0x6,0x10(%r8)
  mov    %eax,(%r8)
  mov    0x4(%r8),%eax
  shll   0x18(%r8)
  add    %esi,%eax
  shll   $0x3,0x1c(%r8)
  shl    $0x2,%eax
  shll   $0x4,0x20(%r8)
  mov    %eax,0x4(%r8)
  movl   $0x0,(%r9)
  movl   $0x0,0x40(%r9)
  movzbl (%r8),%eax
  mov    %eax,(%r9)
  mov    (%r8),%eax
  movzbl %ah,%eax
  mov    %eax,0x4(%r9)
  movzbl 0x2(%r8),%eax
  mov    %eax,0x8(%r9)
  mov    (%r8),%eax
  shr    $0x18,%eax
  mov    %eax,0xc(%r9)
  movzbl 0x4(%r8),%edx
  or     %edx,%eax
  mov    %eax,0xc(%r9)
  movzbl 0x5(%r8),%eax
  mov    %eax,0x10(%r9)
  movzbl 0x6(%r8),%eax
  mov    %eax,0x14(%r9)
  movzbl 0x7(%r8),%edx
  mov    %edx,0x18(%r9)
  movzbl 0x8(%r8),%eax
  or     %edx,%eax
  mov    %eax,0x18(%r9)
  movzbl 0x9(%r8),%eax
  mov    %eax,0x1c(%r9)
  movzbl 0xa(%r8),%eax
  mov    %eax,0x20(%r9)
  movzbl 0xb(%r8),%edx
  mov    %edx,0x24(%r9)
  movzbl 0xc(%r8),%eax
  or     %edx,%eax
  mov    %eax,0x24(%r9)
  movzbl 0xd(%r8),%eax
  mov    %eax,0x28(%r9)
  movzbl 0xe(%r8),%eax
  mov    %eax,0x2c(%r9)
  movzbl 0xf(%r8),%edx
  mov    %edx,0x30(%r9)
  movzbl 0x10(%r8),%eax
  or     %edx,%eax
  mov    %eax,0x30(%r9)
  movzbl 0x11(%r8),%eax
  mov    %eax,0x34(%r9)
  movzbl 0x12(%r8),%eax
  mov    %eax,0x38(%r9)
  movzbl 0x13(%r8),%eax
  mov    %eax,0x3c(%r9)
  movzbl 0x14(%r8),%eax
  mov    %eax,0x40(%r9)
  movzbl 0x15(%r8),%eax
  mov    %eax,0x44(%r9)
  movzbl 0x16(%r8),%eax
  mov    %eax,0x48(%r9)
  movzbl 0x17(%r8),%edx
  mov    %edx,0x4c(%r9)
  movzbl 0x18(%r8),%eax
  or     %edx,%eax
  mov    %eax,0x4c(%r9)
  movzbl 0x19(%r8),%eax
  mov    %eax,0x50(%r9)
  movzbl 0x1a(%r8),%eax
  mov    %eax,0x54(%r9)
  movzbl 0x1b(%r8),%edx
  mov    %edx,0x58(%r9)
  movzbl 0x1c(%r8),%eax
  or     %edx,%eax
  mov    %eax,0x58(%r9)
  movzbl 0x1d(%r8),%eax
  mov    %eax,0x5c(%r9)
  movzbl 0x1e(%r8),%eax
  mov    %eax,0x60(%r9)
  movzbl 0x1f(%r8),%edx
  mov    %edx,0x64(%r9)
  movzbl 0x20(%r8),%eax
  or     %edx,%eax
  mov    %eax,0x64(%r9)
  movzbl 0x21(%r8),%eax
  mov    %eax,0x68(%r9)
  movzbl 0x22(%r8),%eax
  mov    %eax,0x6c(%r9)
  movzbl 0x23(%r8),%edx
  mov    %edx,0x70(%r9)
  movzbl 0x24(%r8),%eax
  or     %edx,%eax
  mov    %eax,0x70(%r9)
  movzbl 0x25(%r8),%eax
  mov    %eax,0x74(%r9)
  movzbl 0x26(%r8),%eax
  mov    %eax,0x78(%r9)
  movzbl 0x27(%r8),%eax
  mov    %eax,0x7c(%r9)
  ret
```

assistant: ```c
void fcontract(uint8_t *output, int64_t *input) {
  int i;
  int j;
  for (j = 0; j < 2; ++j) {
    for (i = 0; i < 9; ++i) {
      if ((i & 1) == 1) {
        const int32_t mask = (int32_t)(input[i]) >> 31;
        const int32_t carry = -(((int32_t)(input[i]) & mask) >> 25);
        input[i] = (int32_t)(input[i]) + (carry << 25);
        input[i + 1] = (int32_t)(input[i + 1]) - carry;
      } else {
        const int32_t mask = (int32_t)(input[i]) >> 31;
        const int32_t carry = -(((int32_t)(input[i]) & mask) >> 26);
        input[i] = (int32_t)(input[i]) + (carry << 26);
        input[i + 1] = (int32_t)(input[i + 1]) - carry;
      }
    }
    const int32_t mask = (int32_t)(input[9]) >> 31;
    const int32_t carry = -(((int32_t)(input[9]) & mask) >> 25);
    input[9] = (int32_t)(input[9]) + (carry << 25);
    input[0] = (int32_t)(input[0]) - (carry * 19);
  }
  const int32_t mask = (int32_t)(input[0]) >> 31;
  const int32_t carry = -(((int32_t)(input[0]) & mask) >> 26);
  input[0] = (int32_t)(input[0]) + (carry << 26);
  input[1] = (int32_t)(input[1]) - carry;
  input[1] <<= 2;
  input[2] <<= 3;
  input[3] <<= 5;
  input[4] <<= 6;
  input[6] <<= 1;
  input[7] <<= 3;
  input[8] <<= 4;
  input[9] <<= 6;
  output[0] = 0;
  output[16] = 0;
  output[0 + 0] |= input[0] & 0xff;
  output[0 + 1] = (input[0] >> 8) & 0xff;
  output[0 + 2] = (input[0] >> 16) & 0xff;
  output[0 + 3] = (input[0] >> 24) & 0xff;
  ;
  output[3 + 0] |= input[1] & 0xff;
  output[3 + 1] = (input[1] >> 8) & 0xff;
  output[3 + 2] = (input[1] >> 16) & 0xff;
  output[3 + 3] = (input[1] >> 24) & 0xff;
  ;
  output[6 + 0] |= input[2] & 0xff;
  output[6 + 1] = (input[2] >> 8) & 0xff;
  output[6 + 2] = (input[2] >> 16) & 0xff;
  output[6 + 3] = (input[2] >> 24) & 0xff;
  ;
  output[9 + 0] |= input[3] & 0xff;
  output[9 + 1] = (input[3] >> 8) & 0xff;
  output[9 + 2] = (input[3] >> 16) & 0xff;
  output[9 + 3] = (input[3] >> 24) & 0xff;
  ;
  output[12 + 0] |= input[4] & 0xff;
  output[12 + 1] = (input[4] >> 8) & 0xff;
  output[12 + 2] = (input[4] >> 16) & 0xff;
  output[12 + 3] = (input[4] >> 24) & 0xff;
  ;
  output[16 + 0] |= input[5] & 0xff;
  output[16 + 1] = (input[5] >> 8) & 0xff;
  output[16 + 2] = (input[5] >> 16) & 0xff;
  output[16 + 3] = (input[5] >> 24) & 0xff;
  ;
  output[19 + 0] |= input[6] & 0xff;
  output[19 + 1] = (input[6] >> 8) & 0xff;
  output[19 + 2] = (input[6] >> 16) & 0xff;
  output[19 + 3] = (input[6] >> 24) & 0xff;
  ;
  output[22 + 0] |= input[7] & 0xff;
  output[22 + 1] = (input[7] >> 8) & 0xff;
  output[22 + 2] = (input[7] >> 16) & 0xff;
  output[22 + 3] = (input[7] >> 24) & 0xff;
  ;
  output[25 + 0] |= input[8] & 0xff;
  output[25 + 1] = (input[8] >> 8) & 0xff;
  output[25 + 2] = (input[8] >> 16) & 0xff;
  output[25 + 3] = (input[8] >> 24) & 0xff;
  ;
  output[28 + 0] |= input[9] & 0xff;
  output[28 + 1] = (input[9] >> 8) & 0xff;
  output[28 + 2] = (input[9] >> 16) & 0xff;
  output[28 + 3] = (input[9] >> 24) & 0xff;
  ;
}
```