user: Translate the below assembly code into C programming language:

```asm
<gemver>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  mov    %r8,-0x38(%rbp)
  mov    %r9,-0x40(%rbp)
  movl   $0x0,-0x8(%rbp)
  jmp    L52
L2:
  movl   $0x0,-0x4(%rbp)
  jmp    L82
L40:
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0xf,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0x4(%rbp),%eax
  cltq
  movsd  (%rdx,%rax,8),%xmm1
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm2
  mov    -0x4(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm2
  mov    -0x4(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0xf,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  addsd  %xmm1,%xmm0
  mov    -0x4(%rbp),%eax
  cltq
  movsd  %xmm0,(%rdx,%rax,8)
  addl   $0x1,-0x4(%rbp)
L82:
  cmpl   $0xfff,-0x4(%rbp)
  jle    L40
  addl   $0x1,-0x8(%rbp)
L52:
  cmpl   $0xfff,-0x8(%rbp)
  jle    L2
  movl   $0x0,-0x8(%rbp)
  jmp    L5
L38:
  movl   $0x0,-0x4(%rbp)
  jmp    L61
L43:
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x10(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x4(%rbp),%eax
  cltq
  shl    $0xf,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0x8(%rbp),%eax
  cltq
  movsd  (%rdx,%rax,8),%xmm2
  mov    -0x4(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x18(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x10(%rbp),%rax
  add    %rdx,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x4(%rbp)
L61:
  cmpl   $0xfff,-0x4(%rbp)
  jle    L43
  addl   $0x1,-0x8(%rbp)
L5:
  cmpl   $0xfff,-0x8(%rbp)
  jle    L38
  movl   $0x0,-0x8(%rbp)
  jmp    L22
L31:
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x10(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x20(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x10(%rbp),%rax
  add    %rdx,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x8(%rbp)
L22:
  cmpl   $0xfff,-0x8(%rbp)
  jle    L31
  movl   $0x0,-0x8(%rbp)
  jmp    L56
L35:
  movl   $0x0,-0x4(%rbp)
  jmp    L67
L48:
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0xf,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0x4(%rbp),%eax
  cltq
  movsd  (%rdx,%rax,8),%xmm2
  mov    -0x4(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x10(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x4(%rbp)
L67:
  cmpl   $0xfff,-0x4(%rbp)
  jle    L48
  addl   $0x1,-0x8(%rbp)
L56:
  cmpl   $0xfff,-0x8(%rbp)
  jle    L35
  nop
  nop
  pop    %rbp
  ret
```

assistant: ```c
void gemver(double A[4096][4096], double u1[4096], double v1[4096], double u2[4096], double v2[4096], double w[4096], double x[4096], double y[4096], double z[4096]) {
  int i, j;
#pragma scop
#pragma live - out w
  for (i = 0; i < 4096; i++)
    for (j = 0; j < 4096; j++)
      A[i][j] = A[i][j] + u1[i] * v1[j] + u2[i] * v2[j];
  for (i = 0; i < 4096; i++)
    for (j = 0; j < 4096; j++)
      x[i] = x[i] + A[j][i] * y[j];
  for (i = 0; i < 4096; i++)
    x[i] = x[i] + z[i];
  for (i = 0; i < 4096; i++)
    for (j = 0; j < 4096; j++)
      w[i] = w[i] + A[i][j] * x[j];
#pragma endscop
}
```