user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<multiply>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%r8
  mov    %rsi,%r10
  mov    (%rdi),%rsi
  movabs $0x89705f3112a28fe5,%rcx
  mov    %rsi,%rax
  imul   %rcx
  lea    (%rdx,%rsi,1),%rdi
  sar    $0x1d,%rdi
  mov    %rsi,%rax
  sar    $0x3f,%rax
  sub    %rax,%rdi
  imul   $0x3b9aca07,%rdi,%rax
  mov    %rsi,%rdi
  sub    %rax,%rdi
  mov    (%r10),%rsi
  mov    %rsi,%rax
  imul   %rcx
  lea    (%rdx,%rsi,1),%rbp
  sar    $0x1d,%rbp
  mov    %rsi,%rax
  sar    $0x3f,%rax
  sub    %rax,%rbp
  imul   $0x3b9aca07,%rbp,%rax
  sub    %rax,%rsi
  mov    %rsi,%rbp
  mov    0x8(%r8),%r9
  mov    %r9,%rax
  imul   %rcx
  lea    (%rdx,%r9,1),%rsi
  sar    $0x1d,%rsi
  mov    %r9,%rax
  sar    $0x3f,%rax
  mov    %rsi,%rbx
  sub    %rax,%rbx
  imul   $0x3b9aca07,%rbx,%rax
  mov    %r9,%rbx
  sub    %rax,%rbx
  mov    0x10(%r10),%rsi
  mov    %rsi,%rax
  imul   %rcx
  lea    (%rdx,%rsi,1),%r12
  sar    $0x1d,%r12
  mov    %rsi,%rax
  sar    $0x3f,%rax
  sub    %rax,%r12
  imul   $0x3b9aca07,%r12,%rax
  sub    %rax,%rsi
  mov    %rsi,%r12
  mov    0x8(%r10),%rsi
  mov    %rsi,%rax
  imul   %rcx
  lea    (%rdx,%rsi,1),%r9
  sar    $0x1d,%r9
  mov    %rsi,%rax
  sar    $0x3f,%rax
  sub    %rax,%r9
  imul   $0x3b9aca07,%r9,%rax
  sub    %rax,%rsi
  mov    %rsi,%r9
  mov    0x18(%r10),%r11
  mov    %r11,%rax
  imul   %rcx
  lea    (%rdx,%r11,1),%rsi
  sar    $0x1d,%rsi
  mov    %r11,%rax
  sar    $0x3f,%rax
  sub    %rax,%rsi
  imul   $0x3b9aca07,%rsi,%rax
  mov    %r11,%r10
  sub    %rax,%r10
  mov    0x10(%r8),%rsi
  mov    %rsi,%rax
  imul   %rcx
  lea    (%rdx,%rsi,1),%r13
  sar    $0x1d,%r13
  mov    %rsi,%rax
  sar    $0x3f,%rax
  sub    %rax,%r13
  imul   $0x3b9aca07,%r13,%rax
  sub    %rax,%rsi
  mov    %rsi,%r13
  mov    0x18(%r8),%rsi
  mov    %rsi,%rax
  imul   %rcx
  lea    (%rdx,%rsi,1),%r11
  sar    $0x1d,%r11
  mov    %rsi,%rax
  sar    $0x3f,%rax
  sub    %rax,%r11
  imul   $0x3b9aca07,%r11,%rax
  sub    %rax,%rsi
  mov    %rsi,%r11
  mov    %rdi,%rsi
  imul   %rbp,%rsi
  mov    %rsi,%rax
  imul   %rcx
  add    %rsi,%rdx
  sar    $0x1d,%rdx
  mov    %rsi,%rax
  sar    $0x3f,%rax
  sub    %rax,%rdx
  imul   $0x3b9aca07,%rdx,%rdx
  sub    %rdx,%rsi
  mov    %rbx,%r14
  imul   %r12,%r14
  mov    %r14,%rax
  imul   %rcx
  add    %r14,%rdx
  sar    $0x1d,%rdx
  mov    %r14,%rax
  sar    $0x3f,%rax
  sub    %rax,%rdx
  imul   $0x3b9aca07,%rdx,%rdx
  sub    %rdx,%r14
  add    %r14,%rsi
  mov    %rsi,(%r8)
  imul   %r9,%rdi
  mov    %rdi,%rax
  imul   %rcx
  add    %rdi,%rdx
  sar    $0x1d,%rdx
  mov    %rdi,%rax
  sar    $0x3f,%rax
  sub    %rax,%rdx
  imul   $0x3b9aca07,%rdx,%rdx
  sub    %rdx,%rdi
  imul   %r10,%rbx
  mov    %rbx,%rsi
  mov    %rbx,%rax
  imul   %rcx
  add    %rbx,%rdx
  sar    $0x1d,%rdx
  mov    %rbx,%rax
  sar    $0x3f,%rax
  sub    %rax,%rdx
  imul   $0x3b9aca07,%rdx,%rdx
  sub    %rdx,%rsi
  add    %rsi,%rdi
  mov    %rdi,0x8(%r8)
  imul   %r13,%rbp
  mov    %rbp,%rax
  imul   %rcx
  add    %rbp,%rdx
  sar    $0x1d,%rdx
  mov    %rbp,%rax
  sar    $0x3f,%rax
  sub    %rax,%rdx
  imul   $0x3b9aca07,%rdx,%rdx
  sub    %rdx,%rbp
  imul   %r11,%r12
  mov    %r12,%rax
  imul   %rcx
  add    %r12,%rdx
  sar    $0x1d,%rdx
  mov    %r12,%rax
  sar    $0x3f,%rax
  sub    %rax,%rdx
  imul   $0x3b9aca07,%rdx,%rdx
  sub    %rdx,%r12
  add    %r12,%rbp
  mov    %rbp,0x10(%r8)
  imul   %r13,%r9
  mov    %r9,%rax
  imul   %rcx
  lea    (%rdx,%r9,1),%rdi
  sar    $0x1d,%rdi
  mov    %r9,%rax
  sar    $0x3f,%rax
  sub    %rax,%rdi
  imul   $0x3b9aca07,%rdi,%rdi
  sub    %rdi,%r9
  mov    %r10,%rsi
  imul   %r11,%rsi
  mov    %rsi,%rax
  imul   %rcx
  lea    (%rdx,%rsi,1),%rcx
  sar    $0x1d,%rcx
  mov    %rsi,%rax
  sar    $0x3f,%rax
  sub    %rax,%rcx
  imul   $0x3b9aca07,%rcx,%rcx
  sub    %rcx,%rsi
  add    %rsi,%r9
  mov    %r9,0x18(%r8)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

assistant: ```c
void multiply(long long int F[2][2], long long int M[2][2]) {
  long long int x = ((F[0][0] % 1000000007) * (M[0][0] % 1000000007)) % 1000000007 + ((F[0][1] % 1000000007) * (M[1][0] % 1000000007)) % 1000000007;
  long long int y = ((F[0][0] % 1000000007) * (M[0][1] % 1000000007)) % 1000000007 + ((F[0][1] % 1000000007) * (M[1][1] % 1000000007)) % 1000000007;
  long long int z = ((F[1][0] % 1000000007) * (M[0][0] % 1000000007)) % 1000000007 + ((F[1][1] % 1000000007) * (M[1][0] % 1000000007)) % 1000000007;
  long long int w = ((F[1][0] % 1000000007) * (M[0][1] % 1000000007)) % 1000000007 + ((F[1][1] % 1000000007) * (M[1][1] % 1000000007)) % 1000000007;
  F[0][0] = x;
  F[0][1] = y;
  F[1][0] = z;
  F[1][1] = w;
}
```