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

```asm
<multiply>:
  endbr64
  push   %r15
  mov    %rsi,%r11
  mov    %rdi,%r8
  movabs $0x89705f3112a28fe5,%rcx
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    (%rdi),%rsi
  mov    %rsi,%rax
  imul   %rcx
  mov    %rsi,%rax
  sar    $0x3f,%rax
  lea    (%rdx,%rsi,1),%rdi
  sar    $0x1d,%rdi
  sub    %rax,%rdi
  imul   $0x3b9aca07,%rdi,%rax
  mov    0x8(%r8),%rdi
  sub    %rax,%rsi
  mov    %rsi,%r14
  mov    (%r11),%rsi
  mov    %r14,%r13
  mov    %rsi,%rax
  imul   %rcx
  mov    %rsi,%rax
  sar    $0x3f,%rax
  lea    (%rdx,%rsi,1),%r9
  sar    $0x1d,%r9
  sub    %rax,%r9
  imul   $0x3b9aca07,%r9,%rax
  sub    %rax,%rsi
  mov    %rdi,%rax
  imul   %rcx
  mov    %rsi,%r9
  mov    %rdi,%rax
  sar    $0x3f,%rax
  lea    (%rdx,%rdi,1),%rsi
  sar    $0x1d,%rsi
  sub    %rax,%rsi
  imul   $0x3b9aca07,%rsi,%rax
  sub    %rax,%rdi
  mov    %rdi,%r15
  mov    0x10(%r11),%rdi
  mov    %rdi,%rax
  imul   %rcx
  mov    %rdi,%rax
  sar    $0x3f,%rax
  lea    (%rdx,%rdi,1),%rsi
  sar    $0x1d,%rsi
  sub    %rax,%rsi
  imul   $0x3b9aca07,%rsi,%rax
  mov    0x8(%r11),%rsi
  sub    %rax,%rdi
  mov    %rsi,%rax
  imul   %rcx
  mov    %rsi,%rax
  mov    %rdi,%r10
  sar    $0x3f,%rax
  lea    (%rdx,%rsi,1),%r12
  sar    $0x1d,%r12
  sub    %rax,%r12
  imul   $0x3b9aca07,%r12,%rax
  sub    %rax,%rsi
  mov    %rsi,%r12
  mov    0x18(%r11),%rsi
  mov    %rsi,%rax
  imul   %rcx
  mov    %rsi,%rax
  lea    (%rdx,%rsi,1),%rdi
  sar    $0x1d,%rdi
  sar    $0x3f,%rax
  imul   %r9,%r13
  sub    %rax,%rdi
  imul   $0x3b9aca07,%rdi,%rax
  mov    %r14,%rdi
  imul   %r12,%rdi
  sub    %rax,%rsi
  mov    %rsi,%r11
  mov    0x10(%r8),%rsi
  mov    %rsi,%rax
  imul   %rcx
  mov    %rsi,%rax
  sar    $0x3f,%rax
  lea    (%rdx,%rsi,1),%rbx
  sar    $0x1d,%rbx
  sub    %rax,%rbx
  imul   $0x3b9aca07,%rbx,%rax
  mov    %rsi,%rbx
  mov    0x18(%r8),%rsi
  sub    %rax,%rbx
  mov    %rsi,%rax
  imul   %rcx
  mov    %rsi,%rax
  sar    $0x3f,%rax
  lea    (%rdx,%rsi,1),%rbp
  sar    $0x1d,%rbp
  sub    %rax,%rbp
  imul   $0x3b9aca07,%rbp,%rax
  sub    %rax,%rsi
  mov    %r13,%rax
  imul   %rcx
  mov    %r13,%rax
  mov    %rsi,%rbp
  mov    %r15,%rsi
  sar    $0x3f,%rax
  add    %r13,%rdx
  sar    $0x1d,%rdx
  sub    %rax,%rdx
  mov    %rdi,%rax
  imul   $0x3b9aca07,%rdx,%rdx
  sub    %rdx,%r13
  imul   %rcx
  mov    %rdi,%rax
  sar    $0x3f,%rax
  movq   %r13,%xmm0
  add    %rdi,%rdx
  sar    $0x1d,%rdx
  sub    %rax,%rdx
  imul   $0x3b9aca07,%rdx,%rdx
  sub    %rdx,%rdi
  imul   %r10,%rsi
  imul   %rbx,%r9
  movq   %rdi,%xmm2
  mov    %r11,%rdi
  imul   %r12,%rbx
  punpcklqdq %xmm2,%xmm0
  mov    %rsi,%rax
  imul   %rcx
  mov    %rsi,%rax
  sar    $0x3f,%rax
  add    %rsi,%rdx
  sar    $0x1d,%rdx
  sub    %rax,%rdx
  imul   $0x3b9aca07,%rdx,%rdx
  sub    %rdx,%rsi
  movq   %rsi,%xmm1
  mov    %r15,%rsi
  imul   %r11,%rsi
  mov    %rsi,%rax
  imul   %rcx
  mov    %rsi,%rax
  sar    $0x3f,%rax
  add    %rsi,%rdx
  sar    $0x1d,%rdx
  sub    %rax,%rdx
  mov    %r9,%rax
  imul   $0x3b9aca07,%rdx,%rdx
  sub    %rdx,%rsi
  imul   %rcx
  mov    %r9,%rax
  sar    $0x3f,%rax
  movq   %rsi,%xmm3
  mov    %r10,%rsi
  punpcklqdq %xmm3,%xmm1
  add    %r9,%rdx
  paddq  %xmm1,%xmm0
  sar    $0x1d,%rdx
  movups %xmm0,(%r8)
  sub    %rax,%rdx
  mov    %rbx,%rax
  imul   $0x3b9aca07,%rdx,%rdx
  sub    %rdx,%r9
  imul   %rcx
  mov    %rbx,%rax
  sar    $0x3f,%rax
  movq   %r9,%xmm1
  add    %rbx,%rdx
  sar    $0x1d,%rdx
  sub    %rax,%rdx
  imul   $0x3b9aca07,%rdx,%rdx
  sub    %rdx,%rbx
  imul   %rbp,%rsi
  imul   %rbp,%rdi
  movq   %rbx,%xmm4
  pop    %rbx
  pop    %rbp
  punpcklqdq %xmm4,%xmm1
  pop    %r12
  pop    %r13
  mov    %rsi,%rax
  pop    %r14
  pop    %r15
  imul   %rcx
  mov    %rsi,%rax
  sar    $0x3f,%rax
  add    %rsi,%rdx
  sar    $0x1d,%rdx
  sub    %rax,%rdx
  mov    %rdi,%rax
  imul   $0x3b9aca07,%rdx,%rdx
  sub    %rdx,%rsi
  imul   %rcx
  mov    %rdi,%rax
  sar    $0x3f,%rax
  movq   %rsi,%xmm0
  lea    (%rdx,%rdi,1),%rcx
  sar    $0x1d,%rcx
  sub    %rax,%rcx
  imul   $0x3b9aca07,%rcx,%rcx
  sub    %rcx,%rdi
  movq   %rdi,%xmm5
  punpcklqdq %xmm5,%xmm0
  paddq  %xmm1,%xmm0
  movups %xmm0,0x10(%r8)
  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;
}
```