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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  lea    -0x9000(%rsp),%r11
L341:
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  cmp    %r11,%rsp
  jne    L341
  sub    $0xb80,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    $0x0,%eax
  call   <check_offloading@plt>
  lea    -0x9b10(%rbp),%rax
  mov    %rax,-0x9b38(%rbp)
  lea    -0x7c10(%rbp),%rax
  mov    %rax,-0x9b30(%rbp)
  lea    -0x5d10(%rbp),%rax
  mov    %rax,-0x9b28(%rbp)
  lea    -0x3e10(%rbp),%rax
  mov    %rax,-0x9b20(%rbp)
  lea    -0x1f10(%rbp),%rax
  mov    %rax,-0x9b18(%rbp)
  movl   $0x0,-0x9b78(%rbp)
  jmp    L328
L335:
  mov    -0x9b78(%rbp),%eax
  cltq
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x9b10(%rbp,%rax,8)
  mov    -0x9b78(%rbp),%eax
  cltq
  movsd  D79(%rip),%xmm0
  movsd  %xmm0,-0x5d10(%rbp,%rax,8)
  pxor   %xmm0,%xmm0
  cvtsi2sdl -0x9b78(%rbp),%xmm0
  mov    -0x9b78(%rbp),%eax
  cltq
  movsd  %xmm0,-0x3e10(%rbp,%rax,8)
  mov    -0x9b78(%rbp),%eax
  neg    %eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mov    -0x9b78(%rbp),%eax
  cltq
  movsd  %xmm0,-0x1f10(%rbp,%rax,8)
  addl   $0x1,-0x9b78(%rbp)
L328:
  cmpl   $0x3df,-0x9b78(%rbp)
  jle    L335
  movl   $0x0,-0x9b74(%rbp)
  jmp    L349
L53:
  mov    -0x9b74(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x9b28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x9b74(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x9b20(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  addsd  %xmm0,%xmm1
  mov    -0x9b74(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x9b38(%rbp),%rax
  add    %rdx,%rax
  movsd  D79(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x9b74(%rbp)
L349:
  cmpl   $0x3df,-0x9b74(%rbp)
  jle    L53
  movl   $0x0,-0x9b7c(%rbp)
  movl   $0x0,-0x9b6c(%rbp)
  movl   $0x0,-0x9b70(%rbp)
  jmp    L251
L7:
  mov    -0x9b70(%rbp),%eax
  cltq
  movsd  -0x9b10(%rbp,%rax,8),%xmm0
  mov    -0x9b70(%rbp),%eax
  add    $0x2,%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  ucomisd %xmm1,%xmm0
  jp     L380
  ucomisd %xmm1,%xmm0
  je     L27
L380:
  mov    -0x9b70(%rbp),%eax
  cltq
  movsd  -0x9b10(%rbp,%rax,8),%xmm0
  mov    -0x9b70(%rbp),%eax
  add    $0x2,%eax
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm2
  movq   %xmm2,%rdx
  mov    -0x9b70(%rbp),%eax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  lea    D169(%rip),%rdx
  mov    %eax,%esi
  lea    D92(%rip),%rax
  mov    %rax,%rdi
  mov    $0x2,%eax
  call   <printf@plt>
  movl   $0x1,-0x9b7c(%rbp)
  mov    -0x9b6c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x9b6c(%rbp)
  cmp    $0xa,%eax
  jg     L411
L27:
  addl   $0x1,-0x9b70(%rbp)
L251:
  cmpl   $0x3df,-0x9b70(%rbp)
  jle    L7
  jmp    L181
L411:
  nop
L181:
  cmpl   $0x0,-0x9b7c(%rbp)
  je     L311
  lea    D175(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L220
L311:
  lea    D115(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
L220:
  movl   $0x0,-0x9b68(%rbp)
  jmp    L159
L36:
  mov    -0x9b68(%rbp),%eax
  cltq
  movsd  D207(%rip),%xmm0
  movsd  %xmm0,-0x5d10(%rbp,%rax,8)
  mov    -0x9b68(%rbp),%eax
  add    $0x1,%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mov    -0x9b68(%rbp),%eax
  cltq
  movsd  %xmm0,-0x3e10(%rbp,%rax,8)
  addl   $0x1,-0x9b68(%rbp)
L159:
  cmpl   $0x3df,-0x9b68(%rbp)
  jle    L36
  movl   $0x0,-0x9b64(%rbp)
  jmp    L338
L310:
  mov    -0x9b64(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x9b28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x9b64(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x9b20(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  addsd  %xmm0,%xmm1
  mov    -0x9b64(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x9b38(%rbp),%rax
  add    %rdx,%rax
  movsd  D79(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x9b64(%rbp)
L338:
  cmpl   $0x3df,-0x9b64(%rbp)
  jle    L310
  movl   $0x0,-0x9b7c(%rbp)
  movl   $0x0,-0x9b5c(%rbp)
  movl   $0x0,-0x9b60(%rbp)
  jmp    L424
L394:
  mov    -0x9b60(%rbp),%eax
  cltq
  movsd  -0x9b10(%rbp,%rax,8),%xmm0
  mov    -0x9b60(%rbp),%eax
  add    $0x4,%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  ucomisd %xmm1,%xmm0
  jp     L85
  ucomisd %xmm1,%xmm0
  je     L107
L85:
  mov    -0x9b60(%rbp),%eax
  cltq
  movsd  -0x9b10(%rbp,%rax,8),%xmm0
  mov    -0x9b60(%rbp),%eax
  add    $0x4,%eax
  pxor   %xmm3,%xmm3
  cvtsi2sd %eax,%xmm3
  movq   %xmm3,%rdx
  mov    -0x9b60(%rbp),%eax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  lea    D169(%rip),%rdx
  mov    %eax,%esi
  lea    D92(%rip),%rax
  mov    %rax,%rdi
  mov    $0x2,%eax
  call   <printf@plt>
  movl   $0x1,-0x9b7c(%rbp)
  mov    -0x9b5c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x9b5c(%rbp)
  cmp    $0xa,%eax
  jg     L471
L107:
  addl   $0x1,-0x9b60(%rbp)
L424:
  cmpl   $0x3df,-0x9b60(%rbp)
  jle    L394
  jmp    L280
L471:
  nop
L280:
  cmpl   $0x0,-0x9b7c(%rbp)
  je     L414
  lea    D102(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L103
L414:
  lea    D239(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
L103:
  subq   $0x320,-0x9b38(%rbp)
  subq   $0x640,-0x9b28(%rbp)
  subq   $0x960,-0x9b20(%rbp)
  movl   $0x0,-0x9b58(%rbp)
  jmp    L388
L376:
  mov    -0x9b58(%rbp),%eax
  cltq
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x9b10(%rbp,%rax,8)
  mov    -0x9b58(%rbp),%eax
  cltq
  movsd  D79(%rip),%xmm0
  movsd  %xmm0,-0x5d10(%rbp,%rax,8)
  pxor   %xmm0,%xmm0
  cvtsi2sdl -0x9b58(%rbp),%xmm0
  mov    -0x9b58(%rbp),%eax
  cltq
  movsd  %xmm0,-0x3e10(%rbp,%rax,8)
  mov    -0x9b58(%rbp),%eax
  neg    %eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mov    -0x9b58(%rbp),%eax
  cltq
  movsd  %xmm0,-0x1f10(%rbp,%rax,8)
  addl   $0x1,-0x9b58(%rbp)
L388:
  cmpl   $0x3df,-0x9b58(%rbp)
  jle    L376
  movl   $0x0,-0x9b54(%rbp)
  jmp    L320
L234:
  mov    -0x9b54(%rbp),%eax
  cltq
  add    $0xc8,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x9b28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x9b54(%rbp),%eax
  cltq
  add    $0x12c,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x9b20(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  addsd  %xmm0,%xmm1
  mov    -0x9b54(%rbp),%eax
  cltq
  add    $0x64,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x9b38(%rbp),%rax
  add    %rdx,%rax
  movsd  D79(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x9b54(%rbp)
L320:
  cmpl   $0x3df,-0x9b54(%rbp)
  jle    L234
  movl   $0x0,-0x9b7c(%rbp)
  movl   $0x0,-0x9b4c(%rbp)
  movl   $0x0,-0x9b50(%rbp)
  jmp    L2
L492:
  mov    -0x9b50(%rbp),%eax
  cltq
  movsd  -0x9b10(%rbp,%rax,8),%xmm0
  mov    -0x9b50(%rbp),%eax
  add    $0x2,%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  ucomisd %xmm1,%xmm0
  jp     L249
  ucomisd %xmm1,%xmm0
  je     L351
L249:
  mov    -0x9b50(%rbp),%eax
  cltq
  movsd  -0x9b10(%rbp,%rax,8),%xmm0
  mov    -0x9b50(%rbp),%eax
  add    $0x2,%eax
  pxor   %xmm4,%xmm4
  cvtsi2sd %eax,%xmm4
  movq   %xmm4,%rdx
  mov    -0x9b50(%rbp),%eax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  lea    D169(%rip),%rdx
  mov    %eax,%esi
  lea    D92(%rip),%rax
  mov    %rax,%rdi
  mov    $0x2,%eax
  call   <printf@plt>
  movl   $0x1,-0x9b7c(%rbp)
  mov    -0x9b4c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x9b4c(%rbp)
  cmp    $0xa,%eax
  jg     L302
L351:
  addl   $0x1,-0x9b50(%rbp)
L2:
  cmpl   $0x3df,-0x9b50(%rbp)
  jle    L492
  jmp    L14
L302:
  nop
L14:
  cmpl   $0x0,-0x9b7c(%rbp)
  je     L192
  lea    D139(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L238
L192:
  lea    D141(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
L238:
  movl   $0x0,-0x9b48(%rbp)
  jmp    L389
L66:
  mov    -0x9b48(%rbp),%eax
  cltq
  movsd  D207(%rip),%xmm0
  movsd  %xmm0,-0x5d10(%rbp,%rax,8)
  mov    -0x9b48(%rbp),%eax
  add    $0x1,%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mov    -0x9b48(%rbp),%eax
  cltq
  movsd  %xmm0,-0x3e10(%rbp,%rax,8)
  addl   $0x1,-0x9b48(%rbp)
L389:
  cmpl   $0x3df,-0x9b48(%rbp)
  jle    L66
  movl   $0x0,-0x9b44(%rbp)
  jmp    L24
L457:
  mov    -0x9b44(%rbp),%eax
  cltq
  add    $0xc8,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x9b28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x9b44(%rbp),%eax
  cltq
  add    $0x12c,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x9b20(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  addsd  %xmm0,%xmm1
  mov    -0x9b44(%rbp),%eax
  cltq
  add    $0x64,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x9b38(%rbp),%rax
  add    %rdx,%rax
  movsd  D79(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x9b44(%rbp)
L24:
  cmpl   $0x3df,-0x9b44(%rbp)
  jle    L457
  movl   $0x0,-0x9b7c(%rbp)
  movl   $0x0,-0x9b3c(%rbp)
  movl   $0x0,-0x9b40(%rbp)
  jmp    L263
L4:
  mov    -0x9b40(%rbp),%eax
  cltq
  movsd  -0x9b10(%rbp,%rax,8),%xmm0
  mov    -0x9b40(%rbp),%eax
  add    $0x4,%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  ucomisd %xmm1,%xmm0
  jp     L449
  ucomisd %xmm1,%xmm0
  je     L239
L449:
  mov    -0x9b40(%rbp),%eax
  cltq
  movsd  -0x9b10(%rbp,%rax,8),%xmm0
  mov    -0x9b40(%rbp),%eax
  add    $0x4,%eax
  pxor   %xmm5,%xmm5
  cvtsi2sd %eax,%xmm5
  movq   %xmm5,%rdx
  mov    -0x9b40(%rbp),%eax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  lea    D169(%rip),%rdx
  mov    %eax,%esi
  lea    D92(%rip),%rax
  mov    %rax,%rdi
  mov    $0x2,%eax
  call   <printf@plt>
  movl   $0x1,-0x9b7c(%rbp)
  mov    -0x9b3c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x9b3c(%rbp)
  cmp    $0xa,%eax
  jg     L137
L239:
  addl   $0x1,-0x9b40(%rbp)
L263:
  cmpl   $0x3df,-0x9b40(%rbp)
  jle    L4
  jmp    L236
L137:
  nop
L236:
  cmpl   $0x0,-0x9b7c(%rbp)
  je     L456
  lea    D97(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L382
L456:
  lea    D186(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
L382:
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L246
  call   <__stack_chk_fail@plt>
L246:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D79
type: byte[8]
name: extract_symbolic_data
arguments: data_label: D169
type: string
name: extract_symbolic_data
arguments: data_label: D92
type: string
name: extract_symbolic_data
arguments: data_label: D175
type: string
name: extract_symbolic_data
arguments: data_label: D115
type: string
name: extract_symbolic_data
arguments: data_label: D207
type: byte[8]
name: extract_symbolic_data
arguments: data_label: D102
type: string
name: extract_symbolic_data
arguments: data_label: D239
type: string
name: extract_symbolic_data
arguments: data_label: D139
type: string
name: extract_symbolic_data
arguments: data_label: D141
type: string
name: extract_symbolic_data
arguments: data_label: D97
type: string
name: extract_symbolic_data
arguments: data_label: D186
type: string

tool: {"D79": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

tool: D169: A[i]

tool: D92: Failed at %3d with %s, expected %f, got %f


tool: D175: Test update from: Failed

tool: D115: Test update from: Succeeded

tool: {"D207": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40]}

tool: D102: Test update to: Failed

tool: D239: Test update to: Succeeded

tool: D139: Test update from with offsets: Failed

tool: D141: Test update from with offsets: Succeeded

tool: D97: Test update to with offsets: Failed

tool: D186: Test update to with offsets: Succeeded

assistant: ```c
int main(void) {
  check_offloading();
  int fail;
  double A[(992)], B[(992)], C[(992)], D[(992)], E[(992)];
  double *pA, *pB, *pC, *pD, *pE;
  pA = &A[0];
  pB = &B[0];
  pC = &C[0];
  pD = &D[0];
  pE = &E[0];
  {
    int i;
    for (i = 0; i < (992); i++) {
      {
        A[i] = 0;
        C[i] = 1;
        D[i] = i;
        E[i] = -i;
      }
    }
  };
#pragma omp target data map(from : pA [0:N]) map(to : pC [0:N], pD [0:N]) device(1)
  {
#pragma omp target device(1)
    {
#pragma omp parallel for schedule(static, 1)
      for (int i = 0; i < (992); i++)
        pA[i] = pC[i] + pD[i] + 1;
    }
#pragma omp target update from(pA [0:N]) device(1)
    fail = 0;
    {
      int i;
      int errorNum = 0;
      for (i = 0; i < (992); i++) {
        if (A[i] != (double)(i + 2)) {
          printf("Failed at %3d with %s, expected %f, got %f\n", i, "A[i]", (double)(i + 2), A[i]);
          fail = 1;
          if (errorNum++ > 10)
            break;
        }
      }
    };
    if (fail) {
      printf("Test update from: Failed\n");
    } else {
      printf("Test update from: Succeeded\n");
    }
    for (int i = 0; i < (992); i++) {
      C[i] = 2;
      D[i] = i + 1;
    }
#pragma omp target update to(pC [0:N], pD [0:N]) device(1)
#pragma omp target device(1)
    {
#pragma omp parallel for schedule(static, 1)
      for (int i = 0; i < (992); i++)
        pA[i] = pC[i] + pD[i] + 1;
    }
#pragma omp target update from(pA [0:N]) device(1)
    fail = 0;
    {
      int i;
      int errorNum = 0;
      for (i = 0; i < (992); i++) {
        if (A[i] != (double)(i + 4)) {
          printf("Failed at %3d with %s, expected %f, got %f\n", i, "A[i]", (double)(i + 4), A[i]);
          fail = 1;
          if (errorNum++ > 10)
            break;
        }
      }
    };
    if (fail) {
      printf("Test update to: Failed\n");
    } else {
      printf("Test update to: Succeeded\n");
    }
  }
  pA = pA - 100;
  pC = pC - 200;
  pD = pD - 300;
  {
    int i;
    for (i = 0; i < (992); i++) {
      {
        A[i] = 0;
        C[i] = 1;
        D[i] = i;
        E[i] = -i;
      }
    }
  };
#pragma omp target data map(from : pA [100:N]) map(to : pC [200:N], pD [300:N]) device(1)
  {
#pragma omp target map(from : pA [100:N]) map(to : pC [200:N], pD [300:N]) device(1)
    {
#pragma omp parallel for schedule(static, 1)
      for (int i = 0; i < (992); i++)
        pA[i + 100] = pC[i + 200] + pD[i + 300] + 1;
    }
#pragma omp target update from(pA [100:N]) device(1)
    fail = 0;
    {
      int i;
      int errorNum = 0;
      for (i = 0; i < (992); i++) {
        if (A[i] != (double)(i + 2)) {
          printf("Failed at %3d with %s, expected %f, got %f\n", i, "A[i]", (double)(i + 2), A[i]);
          fail = 1;
          if (errorNum++ > 10)
            break;
        }
      }
    };
    if (fail) {
      printf("Test update from with offsets: Failed\n");
    } else {
      printf("Test update from with offsets: Succeeded\n");
    }
    for (int i = 0; i < (992); i++) {
      C[i] = 2;
      D[i] = i + 1;
    }
#pragma omp target update to(pC [200:N], pD [300:N]) device(1)
#pragma omp target map(from : pA [100:N]) map(to : pC [200:N], pD [300:N]) device(1)
    {
#pragma omp parallel for schedule(static, 1)
      for (int i = 0; i < (992); i++)
        pA[i + 100] = pC[i + 200] + pD[i + 300] + 1;
    }
#pragma omp target update from(pA [100:N]) device(1)
    fail = 0;
    {
      int i;
      int errorNum = 0;
      for (i = 0; i < (992); i++) {
        if (A[i] != (double)(i + 4)) {
          printf("Failed at %3d with %s, expected %f, got %f\n", i, "A[i]", (double)(i + 4), A[i]);
          fail = 1;
          if (errorNum++ > 10)
            break;
        }
      }
    };
    if (fail) {
      printf("Test update to with offsets: Failed\n");
    } else {
      printf("Test update to with offsets: Succeeded\n");
    }
  }
  return 0;
}
```