user: What is the c source code of the assembly code below?

```asm
<boundaryvalues>:
  endbr64
  movslq %edi,%r9
  mov    %esi,%r8d
  push   %r13
  mov    %rdx,%rdi
  push   %r12
  mov    %rcx,%rsi
  push   %rbp
  push   %rbx
  cmp    %r8d,%r9d
  je     L1
  test   %r9d,%r9d
  jle    L17
  movslq %r8d,%rcx
  movq   D8(%rip),%xmm0
  lea    0x1(%r9),%r10d
  movsd  D18(%rip),%xmm2
  shl    $0x3,%rcx
  mov    $0x1,%eax
  lea    0x8(%rcx),%r11
  nopl   0x0(%rax,%rax,1)
L65:
  mov    (%rdi,%rax,8),%rdx
  movsd  0x8(%rdx),%xmm1
  xorpd  %xmm0,%xmm1
  movsd  %xmm1,(%rdx)
  movapd %xmm2,%xmm1
  subsd  (%rdx,%rcx,1),%xmm1
  movsd  %xmm1,(%rdx,%r11,1)
  mov    (%rsi,%rax,8),%rdx
  add    $0x1,%rax
  movq   $0x0,(%rdx)
  movq   $0x0,(%rdx,%rcx,1)
  cmp    %r10,%rax
  jne    L65
L17:
  test   %r8d,%r8d
  jle    L16
  mov    (%rdi),%rbp
  mov    (%rdi,%r9,8),%rbx
  lea    0x1(%r8),%edx
  mov    $0x1,%eax
  mov    0x8(%rsi),%r11
  mov    (%rsi),%r10
  mov    (%rsi,%r9,8),%rdi
  mov    0x8(%rsi,%r9,8),%rcx
  movq   D8(%rip),%xmm0
  nopl   0x0(%rax)
L40:
  movq   $0x0,0x0(%rbp,%rax,8)
  movq   $0x0,(%rbx,%rax,8)
  movsd  (%r11,%rax,8),%xmm1
  xorpd  %xmm0,%xmm1
  movsd  %xmm1,(%r10,%rax,8)
  movsd  (%rdi,%rax,8),%xmm1
  xorpd  %xmm0,%xmm1
  movsd  %xmm1,(%rcx,%rax,8)
  add    $0x1,%rax
  cmp    %rdx,%rax
  jne    L40
L16:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nop
L1:
  test   %r9d,%r9d
  jle    L16
  movslq %r9d,%rax
  mov    (%rdi),%rbx
  lea    0x8(%rsi),%rbp
  lea    0x8(%rdx),%rdx
  mov    (%rdi,%rax,8),%rcx
  lea    0x0(,%rax,8),%r12
  movq   D8(%rip),%xmm0
  movsd  D18(%rip),%xmm2
  lea    0x8(%r12),%r13
  add    $0x8,%rbx
  lea    0x8(%rcx),%r11
  mov    0x8(%rsi),%rcx
  lea    0x8(%rcx),%r10
  mov    (%rsi),%rcx
  lea    0x8(%rcx),%r8
  mov    (%rsi,%rax,8),%rcx
  mov    0x8(%rsi,%r12,1),%rsi
  lea    -0x1(%r9),%eax
  lea    0x10(%rdi,%rax,8),%rdi
  add    $0x8,%rcx
  add    $0x8,%rsi
  nopl   (%rax)
L29:
  mov    (%rdx),%rax
  add    $0x8,%rdx
  add    $0x8,%rbx
  add    $0x8,%r11
  add    $0x8,%rbp
  add    $0x8,%r10
  add    $0x8,%r8
  add    $0x8,%rcx
  movsd  0x8(%rax),%xmm1
  add    $0x8,%rsi
  xorpd  %xmm0,%xmm1
  movsd  %xmm1,(%rax)
  movapd %xmm2,%xmm1
  subsd  (%rax,%r12,1),%xmm1
  movsd  %xmm1,(%rax,%r13,1)
  mov    -0x8(%rbp),%rax
  movq   $0x0,-0x8(%rbx)
  movq   $0x0,-0x8(%r11)
  movq   $0x0,(%rax)
  movq   $0x0,(%rax,%r12,1)
  movsd  -0x8(%r10),%xmm1
  xorpd  %xmm0,%xmm1
  movsd  %xmm1,-0x8(%r8)
  movsd  -0x8(%rcx),%xmm1
  xorpd  %xmm0,%xmm1
  movsd  %xmm1,-0x8(%rsi)
  cmp    %rdi,%rdx
  jne    L29
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D8
datatype: byte[8]
name: unpack_data
arguments: data_tag: D18
datatype: f64

tool: {"D8": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80]}

tool: D18: 2

assistant: ```c
void boundaryvalues(int imax, int jmax, double **U, double **V) {
  int i, j;
  if (imax == jmax) {
    for (i = 1; i < imax + 1; i++) {
      U[i][0] = -U[i][1];
      U[i][imax + 1] = 2.0 - U[i][imax];
      U[0][i] = 0;
      U[imax][i] = 0;
      V[i][0] = 0;
      V[i][imax] = 0;
      V[0][i] = -V[1][i];
      V[imax + 1][i] = -V[imax][i];
    }
  } else {
    for (i = 1; i < imax + 1; i++) {
      U[i][0] = -U[i][1];
      U[i][jmax + 1] = 2.0 - U[i][jmax];
      V[i][0] = 0;
      V[i][jmax] = 0;
    }
    for (j = 1; j < jmax + 1; j++) {
      U[0][j] = 0;
      U[imax][j] = 0;
      V[0][j] = -V[1][j];
      V[imax + 1][j] = -V[imax][j];
    }
  }
}
```