user: Please show me the C implementation that matches the assembly code listed below:

```asm
<fcontract>:
  endbr64
  push   %r15
  mov    %rsi,%rax
  mov    %rdi,%rdx
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    (%rsi),%r15d
  mov    0x4(%rsi),%r14d
  mov    0x8(%rsi),%r13d
  mov    %r15d,%r12d
  mov    0xc(%rsi),%r8d
  mov    0x10(%rsi),%ecx
  sar    $0x1f,%r12d
  mov    0x14(%rax),%r9d
  and    %r15d,%r12d
  sar    $0x1a,%r12d
  add    %r12d,%r14d
  mov    %r14d,%ebp
  sar    $0x1f,%ebp
  and    %r14d,%ebp
  sar    $0x19,%ebp
  add    %ebp,%r13d
  mov    %r13d,%ebx
  sar    $0x1f,%ebx
  and    %r13d,%ebx
  sar    $0x1a,%ebx
  add    %ebx,%r8d
  mov    %r8d,%r11d
  sar    $0x1f,%r11d
  and    %r8d,%r11d
  sar    $0x19,%r11d
  add    %r11d,%ecx
  mov    %ecx,%esi
  sar    $0x1f,%esi
  and    %ecx,%esi
  sar    $0x1a,%esi
  add    %esi,%r9d
  mov    %esi,-0x24(%rsp)
  mov    %r9d,%esi
  sar    $0x1f,%esi
  and    %r9d,%esi
  sar    $0x19,%esi
  mov    %esi,-0xc(%rsp)
  add    0x18(%rax),%esi
  mov    %esi,%edi
  sar    $0x1f,%edi
  and    %esi,%edi
  sar    $0x1a,%edi
  mov    %edi,-0x18(%rsp)
  add    0x1c(%rax),%edi
  mov    %edi,%r10d
  sar    $0x1f,%r10d
  and    %edi,%r10d
  sar    $0x19,%r10d
  mov    %r10d,-0x14(%rsp)
  add    0x20(%rax),%r10d
  mov    %r10d,-0x1c(%rsp)
  sar    $0x1f,%r10d
  and    -0x1c(%rsp),%r10d
  shl    $0x1a,%r12d
  sar    $0x1a,%r10d
  sub    %r12d,%r15d
  shl    $0x19,%ebp
  mov    %r10d,-0x10(%rsp)
  add    0x24(%rax),%r10d
  sub    %ebp,%r14d
  shl    $0x1a,%ebx
  mov    %r10d,-0x20(%rsp)
  sar    $0x1f,%r10d
  sub    %ebx,%r13d
  shl    $0x19,%r11d
  and    -0x20(%rsp),%r10d
  sub    %r11d,%r8d
  sar    $0x19,%r10d
  lea    (%r10,%r10,8),%r12d
  lea    (%r10,%r12,2),%r12d
  add    %r12d,%r15d
  mov    %r15d,%r12d
  sar    $0x1f,%r12d
  and    %r15d,%r12d
  sar    $0x1a,%r12d
  add    %r12d,%r14d
  mov    %r12d,-0x38(%rsp)
  mov    %r14d,%ebp
  mov    %r14d,-0x34(%rsp)
  sar    $0x1f,%ebp
  and    %r14d,%ebp
  mov    %ebp,%r12d
  sar    $0x19,%r12d
  add    %r12d,%r13d
  mov    %r12d,-0x30(%rsp)
  mov    %r13d,%ebp
  mov    %r13d,-0x2c(%rsp)
  sar    $0x1f,%ebp
  mov    %ebp,%ebx
  mov    -0x24(%rsp),%ebp
  and    %r13d,%ebx
  mov    %ebx,%r13d
  shl    $0x1a,%ebp
  sar    $0x1a,%r13d
  add    %r13d,%r8d
  mov    %r13d,-0x28(%rsp)
  mov    %r8d,%r11d
  sar    $0x1f,%r11d
  and    %r8d,%r11d
  sar    $0x19,%r11d
  sub    %ebp,%ecx
  shl    $0x19,%r10d
  add    %r11d,%ecx
  mov    %r11d,-0x24(%rsp)
  mov    -0xc(%rsp),%ebp
  mov    %ecx,%r11d
  mov    -0x10(%rsp),%ebx
  sar    $0x1f,%r11d
  shl    $0x19,%ebp
  and    %ecx,%r11d
  sub    %ebp,%r9d
  mov    -0x18(%rsp),%ebp
  shl    $0x1a,%ebx
  sar    $0x1a,%r11d
  add    %r11d,%r9d
  shl    $0x1a,%ebp
  mov    %r9d,%r11d
  sub    %ebp,%esi
  sar    $0x1f,%r11d
  and    %r9d,%r11d
  sar    $0x19,%r11d
  add    %r11d,%esi
  mov    %r11d,-0x18(%rsp)
  mov    %esi,%ebp
  sar    $0x1f,%ebp
  mov    %ebp,%r11d
  and    %esi,%r11d
  mov    %r11d,%ebp
  mov    -0x14(%rsp),%r11d
  sar    $0x1a,%ebp
  shl    $0x19,%r11d
  mov    %ebp,-0x14(%rsp)
  sub    %r11d,%edi
  mov    -0x1c(%rsp),%r11d
  add    %ebp,%edi
  mov    %edi,%ebp
  sub    %ebx,%r11d
  mov    -0x20(%rsp),%ebx
  sar    $0x1f,%ebp
  and    %edi,%ebp
  sub    %r10d,%ebx
  sar    $0x19,%ebp
  add    %ebp,%r11d
  mov    %r11d,%r12d
  sar    $0x1f,%r12d
  and    %r11d,%r12d
  sar    $0x1a,%r12d
  lea    (%rbx,%r12,1),%r10d
  mov    %r10d,%ebx
  sar    $0x1f,%ebx
  mov    %ebx,%r13d
  mov    -0x38(%rsp),%ebx
  and    %r10d,%r13d
  shl    $0x19,%ebp
  shl    $0x1a,%ebx
  sar    $0x19,%r13d
  sub    %ebp,%edi
  shl    $0x3,%edi
  mov    %ebx,%r14d
  mov    %r15d,%ebx
  shl    $0x1a,%r12d
  sub    %r14d,%ebx
  lea    0x0(%r13,%r13,8),%r14d
  movd   %edi,%xmm4
  sub    %r12d,%r11d
  lea    0x0(%r13,%r14,2),%r14d
  shl    $0x19,%r13d
  shl    $0x4,%r11d
  add    %r14d,%ebx
  sub    %r13d,%r10d
  mov    %ebx,%r15d
  sar    $0x1f,%r15d
  mov    %r15d,%r14d
  and    %ebx,%r14d
  mov    %r14d,%r15d
  and    $0xfc000000,%r14d
  sub    %r14d,%ebx
  mov    -0x34(%rsp),%r14d
  sar    $0x1a,%r15d
  movd   %ebx,%xmm0
  mov    -0x30(%rsp),%ebx
  shl    $0x19,%ebx
  sub    %ebx,%r14d
  add    %r15d,%r14d
  mov    -0x28(%rsp),%r15d
  lea    0x0(,%r14,4),%ebx
  mov    -0x2c(%rsp),%r14d
  shl    $0x1a,%r15d
  movd   %ebx,%xmm3
  mov    %ecx,%ebx
  mov    -0x18(%rsp),%ecx
  sub    %r15d,%r14d
  mov    -0x24(%rsp),%r15d
  punpckldq %xmm3,%xmm0
  shl    $0x6,%ebx
  shl    $0x19,%ecx
  shl    $0x3,%r14d
  shl    $0x19,%r15d
  sub    %ecx,%r9d
  mov    -0x14(%rsp),%ecx
  movd   %r14d,%xmm1
  sub    %r15d,%r8d
  movd   %r9d,%xmm5
  shl    $0x5,%r8d
  shl    $0x1a,%ecx
  movd   %r8d,%xmm2
  sub    %ecx,%esi
  shl    $0x6,%r10d
  punpckldq %xmm2,%xmm1
  movd   %r10d,%xmm6
  punpcklqdq %xmm1,%xmm0
  movups %xmm0,(%rax)
  movd   %ebx,%xmm0
  lea    (%rsi,%rsi,1),%ebx
  movd   %ebx,%xmm1
  punpckldq %xmm5,%xmm0
  punpckldq %xmm4,%xmm1
  punpcklqdq %xmm1,%xmm0
  movups %xmm0,0x10(%rax)
  movd   %r11d,%xmm0
  punpckldq %xmm6,%xmm0
  movq   %xmm0,0x20(%rax)
  movl   $0x0,(%rdx)
  movl   $0x0,0x40(%rdx)
  movzbl (%rax),%ecx
  mov    %ecx,(%rdx)
  mov    (%rax),%ecx
  movzbl %ch,%ecx
  mov    %ecx,0x4(%rdx)
  movzbl 0x2(%rax),%ecx
  mov    %ecx,0x8(%rdx)
  mov    (%rax),%ecx
  shr    $0x18,%ecx
  mov    %ecx,0xc(%rdx)
  movzbl 0x4(%rax),%esi
  or     %esi,%ecx
  mov    %ecx,0xc(%rdx)
  movzbl 0x5(%rax),%ecx
  mov    %ecx,0x10(%rdx)
  movzbl 0x6(%rax),%ecx
  mov    %ecx,0x14(%rdx)
  movzbl 0x7(%rax),%esi
  mov    %esi,0x18(%rdx)
  movzbl 0x8(%rax),%ecx
  or     %esi,%ecx
  mov    %ecx,0x18(%rdx)
  movzbl 0x9(%rax),%ecx
  mov    %ecx,0x1c(%rdx)
  movzbl 0xa(%rax),%ecx
  mov    %ecx,0x20(%rdx)
  movzbl 0xb(%rax),%esi
  mov    %esi,0x24(%rdx)
  movzbl 0xc(%rax),%ecx
  or     %esi,%ecx
  mov    %ecx,0x24(%rdx)
  movzbl 0xd(%rax),%ecx
  mov    %ecx,0x28(%rdx)
  movzbl 0xe(%rax),%ecx
  mov    %ecx,0x2c(%rdx)
  movzbl 0xf(%rax),%esi
  mov    %esi,0x30(%rdx)
  movzbl 0x10(%rax),%ecx
  or     %esi,%ecx
  mov    %ecx,0x30(%rdx)
  movzbl 0x11(%rax),%ecx
  mov    %ecx,0x34(%rdx)
  movzbl 0x12(%rax),%ecx
  mov    %ecx,0x38(%rdx)
  movzbl 0x13(%rax),%ecx
  mov    %ecx,0x3c(%rdx)
  movzbl 0x14(%rax),%ecx
  mov    %ecx,0x40(%rdx)
  movzbl 0x15(%rax),%ecx
  mov    %ecx,0x44(%rdx)
  movzbl 0x16(%rax),%ecx
  mov    %ecx,0x48(%rdx)
  movzbl 0x17(%rax),%esi
  mov    %esi,0x4c(%rdx)
  movzbl 0x18(%rax),%ecx
  or     %esi,%ecx
  mov    %ecx,0x4c(%rdx)
  movzbl 0x19(%rax),%ecx
  mov    %ecx,0x50(%rdx)
  movzbl 0x1a(%rax),%ecx
  mov    %ecx,0x54(%rdx)
  movzbl 0x1b(%rax),%esi
  mov    %esi,0x58(%rdx)
  movzbl 0x1c(%rax),%ecx
  or     %esi,%ecx
  mov    %ecx,0x58(%rdx)
  movzbl 0x1d(%rax),%ecx
  mov    %ecx,0x5c(%rdx)
  movzbl 0x1e(%rax),%ecx
  mov    %ecx,0x60(%rdx)
  movzbl 0x1f(%rax),%esi
  mov    %esi,0x64(%rdx)
  movzbl 0x20(%rax),%ecx
  or     %esi,%ecx
  mov    %ecx,0x64(%rdx)
  movzbl 0x21(%rax),%ecx
  mov    %ecx,0x68(%rdx)
  movzbl 0x22(%rax),%ecx
  mov    %ecx,0x6c(%rdx)
  movzbl 0x23(%rax),%esi
  mov    %esi,0x70(%rdx)
  movzbl 0x24(%rax),%ecx
  or     %esi,%ecx
  mov    %ecx,0x70(%rdx)
  movzbl 0x25(%rax),%ecx
  mov    %ecx,0x74(%rdx)
  movzbl 0x26(%rax),%ecx
  pop    %rbx
  pop    %rbp
  mov    %ecx,0x78(%rdx)
  movzbl 0x27(%rax),%eax
  pop    %r12
  pop    %r13
  mov    %eax,0x7c(%rdx)
  pop    %r14
  pop    %r15
  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;
  ;
}
```