user: What would the C source look like for the assembly code provided here:

```asm
<main>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x88,%rsp
  mov    %edi,%ebp
  mov    %rsi,%rbx
  mov    %fs:0x28,%rax
  mov    %rax,0x78(%rsp)
  xor    %eax,%eax
  lea    0x40(%rsp),%rdi
  mov    $0x0,%esi
  call   <gettimeofday@plt>
  cmp    $0x1,%ebp
  jle    L94
L236:
  mov    0x8(%rbx),%rdi
  call   <atoi@plt>
  mov    %eax,%r13d
  movslq %eax,%r12
  lea    0x0(,%rax,8),%ebx
  mov    %ebx,%edi
  call   <malloc@plt>
  mov    %rax,0x18(%rsp)
  mov    %ebx,%edi
  call   <malloc@plt>
  mov    %rax,%r15
  mov    %ebx,%edi
  call   <malloc@plt>
  mov    %rax,0x8(%rsp)
  mov    %ebx,%edi
  call   <malloc@plt>
  mov    %rax,0x20(%rsp)
  mov    %r13d,%r14d
  imul   %r13d,%r14d
  shl    $0x3,%r14d
  mov    %r14d,%edi
  call   <malloc@plt>
  mov    %rax,%rbp
  mov    %r14d,%edi
  call   <malloc@plt>
  mov    %rax,%rbx
  mov    %r14d,%edi
  call   <malloc@plt>
  mov    %rax,0x10(%rsp)
  mov    %r14d,%edi
  call   <malloc@plt>
  test   %r13d,%r13d
  jle    L23
  shl    $0x3,%r12
  lea    -0x1(%r13),%edx
  shl    $0x3,%rdx
  mov    0x18(%rsp),%rcx
  lea    0x8(%rcx,%rdx,1),%rsi
L30:
  mov    %rbp,(%rcx)
  add    %r12,%rbp
  add    $0x8,%rcx
  cmp    %rsi,%rcx
  jne    L30
  lea    0x8(%r15,%rdx,1),%rsi
  mov    %r15,%rcx
L59:
  mov    %rbx,(%rcx)
  add    %r12,%rbx
  add    $0x8,%rcx
  cmp    %rsi,%rcx
  jne    L59
  mov    0x10(%rsp),%rcx
  mov    0x8(%rsp),%rsi
  lea    0x8(%rsi,%rdx,1),%rdi
L158:
  mov    %rcx,(%rsi)
  add    %r12,%rcx
  add    $0x8,%rsi
  cmp    %rdi,%rsi
  jne    L158
  mov    0x20(%rsp),%rbx
  lea    0x8(%rbx,%rdx,1),%rcx
  mov    %rbx,%rdx
L212:
  mov    %rax,(%rdx)
  add    %r12,%rax
  add    $0x8,%rdx
  cmp    %rcx,%rdx
  jne    L212
  lea    0x0(%r13,%r13,1),%eax
  mov    %eax,0x28(%rsp)
  mov    %r13d,%r12d
  mov    0x18(%rsp),%rax
  mov    %rax,0x10(%rsp)
L238:
  mov    0x10(%rsp),%r14
  mov    %r12d,%ebx
  sub    %r13d,%ebx
  mov    $0x0,%ebp
L288:
  mov    $0x0,%eax
  call   <rand@plt>
  mov    (%r14),%rdx
  pxor   %xmm0,%xmm0
  cvtsi2sd %ebx,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %rax,%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%rdx,%rbp,1)
  add    $0x1,%ebx
  add    $0x8,%rbp
  cmp    %r12d,%ebx
  jne    L288
  addq   $0x8,0x10(%rsp)
  add    $0x1,%r12d
  cmp    0x28(%rsp),%r12d
  jne    L238
  mov    %r13d,%r12d
  shl    $0x3,%r12
  mov    %r15,0x28(%rsp)
  movl   $0x0,0x10(%rsp)
  mov    %r15,0x30(%rsp)
L12:
  mov    0x28(%rsp),%r14
  mov    0x10(%rsp),%r15d
  mov    $0x0,%ebx
  mov    $0x0,%ebp
L311:
  mov    $0x0,%eax
  call   <rand@plt>
  mov    (%r14),%rdx
  pxor   %xmm0,%xmm0
  cvtsi2sd %ebp,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %rax,%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%rdx,%rbx,1)
  add    %r15d,%ebp
  add    $0x8,%rbx
  cmp    %rbx,%r12
  jne    L311
  mov    0x10(%rsp),%eax
  lea    0x1(%rax),%ebx
  addq   $0x8,0x28(%rsp)
  cmp    %ebx,%r13d
  je     L250
  mov    %ebx,0x10(%rsp)
  jmp    L12
L94:
  lea    D12(%rip),%rdi
  call   <puts@plt>
  mov    $0xffffffff,%edi
  call   <exit@plt>
  jmp    L236
L250:
  mov    0x30(%rsp),%r15
  mov    0x8(%rsp),%rax
  mov    %rax,%rdi
  mov    $0x0,%r8d
  mov    0x20(%rsp),%r9
  sub    %rax,%r9
L315:
  mov    %rdi,%rsi
  lea    (%r9,%rdi,1),%rcx
  mov    $0x0,%eax
L2:
  mov    (%rsi),%rdx
  movq   $0x0,(%rdx,%rax,8)
  mov    (%rcx),%rdx
  movq   $0x0,(%rdx,%rax,8)
  add    $0x1,%rax
  cmp    %eax,%ebx
  jg     L2
  lea    0x1(%r8),%eax
  add    $0x8,%rdi
  cmp    %r8d,0x10(%rsp)
  jle    L296
  mov    %eax,%r8d
  jmp    L315
L296:
  mov    0x18(%rsp),%rcx
  mov    %rcx,%rsi
  pxor   %xmm3,%xmm3
  mov    $0x0,%edi
  mov    %r15,%rax
  sub    %rcx,%rax
  mov    %rax,0x28(%rsp)
L282:
  mov    (%rsi),%rcx
  mov    0x28(%rsp),%rax
  mov    (%rsi,%rax,1),%rdx
  mov    $0x0,%eax
L290:
  movsd  (%rcx,%rax,8),%xmm0
  addsd  (%rdx,%rax,8),%xmm0
  addsd  %xmm0,%xmm3
  add    $0x1,%rax
  cmp    %eax,%ebx
  jg     L290
  lea    0x1(%rdi),%eax
  add    $0x8,%rsi
  cmp    %edi,0x10(%rsp)
  jle    L138
  mov    %eax,%edi
  jmp    L282
L40:
  add    $0x1,%r10d
  add    $0x1,%eax
  cmp    %edx,%r10d
  je     L316
L322:
  test   %eax,%eax
  jle    L40
  mov    %rcx,%r11
  add    (%rdi),%r11
  pxor   %xmm1,%xmm1
  cvtsi2sd %r8d,%xmm1
  movapd %xmm1,%xmm0
  mulsd  %xmm3,%xmm0
  pxor   %xmm2,%xmm2
  cvtsi2sd %r10d,%xmm2
  addsd  %xmm2,%xmm0
  subsd  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  divsd  %xmm1,%xmm0
  movsd  (%r11),%xmm1
  subsd  %xmm0,%xmm1
  movsd  %xmm1,(%r11)
  jmp    L40
L316:
  add    $0x1,%rsi
  add    $0x8,%r9
  cmp    %esi,%ebx
  jle    L9
L256:
  mov    %esi,%eax
  mov    %esi,%r8d
  mov    %rcx,%r10
  add    (%rdi),%r10
  mov    (%r9),%r11
  mov    %r11,0x8(%rsp)
  mov    0x0(%r13),%r11
  movsd  (%r11,%rsi,8),%xmm0
  mov    0x8(%rsp),%r11
  mulsd  (%r11,%rcx,1),%xmm0
  addsd  (%r10),%xmm0
  movsd  %xmm0,(%r10)
  test   %r12d,%r12d
  jle    L316
  mov    $0x0,%r10d
  jmp    L322
L9:
  add    $0x1,%r14
  cmp    %r14d,%ebx
  jle    L38
L64:
  lea    0x0(,%r14,8),%rcx
  mov    %r15,%r9
  mov    $0x0,%esi
  jmp    L256
L38:
  add    $0x8,%rbp
  add    $0x1,%r12d
  mov    0x30(%rsp),%eax
  add    %r12d,%eax
  cmp    %eax,%ebx
  jle    L247
L265:
  mov    %rbp,%rdi
  mov    0x38(%rsp),%rax
  lea    (%rax,%rbp,1),%r13
  mov    $0x0,%r14d
  mov    %r12d,%edx
  jmp    L64
L247:
  mov    0x18(%rsp),%rax
  mov    %rax,%r9
  mov    $0x0,%r10d
  mov    0x20(%rsp),%r11
  sub    %rax,%r11
L329:
  mov    %r9,%rbp
  mov    0x28(%rsp),%rax
  lea    (%rax,%r9,1),%r8
  lea    (%r11,%r9,1),%rdi
  mov    $0x0,%eax
L280:
  mov    (%rdi),%rdx
  mov    0x0(%rbp),%rsi
  mov    (%r8),%rcx
  movsd  (%rsi,%rax,8),%xmm0
  addsd  (%rcx,%rax,8),%xmm0
  movsd  %xmm0,(%rdx,%rax,8)
  add    $0x1,%rax
  cmp    %eax,%ebx
  jg     L280
  lea    0x1(%r10),%eax
  add    $0x8,%r9
  cmp    %r10d,0x10(%rsp)
  jle    L23
  mov    %eax,%r10d
  jmp    L329
L138:
  lea    (%rbx,%rbx,1),%r12d
  mov    %r12d,%eax
  neg    %eax
  mov    %eax,0x30(%rsp)
  mov    0x8(%rsp),%rsi
  mov    %rsi,%rbp
  mov    0x18(%rsp),%rax
  sub    %rsi,%rax
  mov    %rax,0x38(%rsp)
  jmp    L265
L23:
  lea    0x50(%rsp),%rbx
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <gettimeofday@plt>
  lea    0x60(%rsp),%rdx
  lea    0x40(%rsp),%rsi
  mov    %rbx,%rdi
  call   <timersub@plt>
  mov    0x60(%rsp),%rdx
  mov    0x68(%rsp),%rsi
  lea    D2(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x0,%edi
  call   <exit@plt>
  mov    0x78(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L50
  mov    $0x0,%eax
  add    $0x88,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L50:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: data_label: D12
type_guessed: string
name: parse_data
arguments: data_label: D2
type_guessed: string

tool: D12: Usage: mm matrix_size

tool: D2: %ld.%08ld


assistant: ```c
int main(int argc, char *argv[]) {
  struct timeval start_time, end_time, wall_time;
  gettimeofday(&start_time, NULL);
  int N;
  int tid, nthreads, i, j, k, l;
  double **a, **b, **c, **d, Z;
  double *a_block, *b_block, *c_block, *d_block;
  if (argc < 2) {
    printf("Usage: mm matrix_size\n");
    exit(-1);
  }
  N = atoi(argv[1]);
  a = (double **)malloc(N * sizeof(double *));
  b = (double **)malloc(N * sizeof(double *));
  c = (double **)malloc(N * sizeof(double *));
  d = (double **)malloc(N * sizeof(double *));
  a_block = (double *)malloc(N * N * sizeof(double));
  b_block = (double *)malloc(N * N * sizeof(double));
  c_block = (double *)malloc(N * N * sizeof(double));
  d_block = (double *)malloc(N * N * sizeof(double));
  for (i = 0; i < N; i++)
    a[i] = a_block + i * N;
  for (i = 0; i < N; i++)
    b[i] = b_block + i * N;
  for (i = 0; i < N; i++)
    c[i] = c_block + i * N;
  for (i = 0; i < N; i++)
    d[i] = d_block + i * N;
  for (i = 0; i < N; i++)
    for (j = 0; j < N; j++)
      a[i][j] = (i + j) * ((double)rand());
  for (i = 0; i < N; i++)
    for (j = 0; j < N; j++)
      b[i][j] = i * j * ((double)rand());
  for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
      c[i][j] = 0.0;
      d[i][j] = 0.0;
    }
  }
  Z = 0.0;
  for (i = 0; i < N; i++)
    for (j = 0; j < N; j++) {
      Z += a[i][j] + b[i][j];
    }
  for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
      for (k = 0; k < N; k++) {
        c[i][j] += a[i][k] * b[k][j];
        for (l = 0; l < i + N + N; l++) {
          if ((l + k) > 0)
            c[i][j] -= ((Z * k) + l - k) / (l + k);
        }
      }
    }
  }
  for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
      d[i][j] = a[i][j] + b[i][j];
    }
  }
  gettimeofday(&end_time, NULL);
  timersub(&end_time, &start_time, &wall_time);
  printf("%ld.%08ld\n", (long int)wall_time.tv_sec, (long int)wall_time.tv_usec);
  exit(0);
}
```