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

```asm
<prediction_em>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,-0x40(%rbp)
  mov    %r8,-0x48(%rbp)
  mov    %r9,-0x50(%rbp)
  mov    0x48(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  add    $0x1,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x28(%rbp),%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x50(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x1,%eax
  jg     L61
  movl   $0x1,-0x10(%rbp)
  jmp    L201
L61:
  movl   $0x0,-0x10(%rbp)
L201:
  mov    -0x30(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x4,%eax
  jne    L22
  movl   $0x0,-0x14(%rbp)
  jmp    L120
L145:
  mov    -0x10(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  jmp    L176
L8:
  mov    -0x48(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0xc(%rbp),%eax
  imul   -0x14(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x18(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movsd  -0x8(%rbp),%xmm0
  movq   D29(%rip),%xmm1
  andpd  %xmm1,%xmm0
  comisd D110(%rip),%xmm0
  jbe    L113
  movsd  -0x8(%rbp),%xmm1
  movsd  D110(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  -0x8(%rbp),%xmm1
  movq   D29(%rip),%xmm2
  andpd  %xmm2,%xmm1
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
L113:
  cmpl   $0x0,-0x18(%rbp)
  jne    L34
  movsd  -0x8(%rbp),%xmm0
  movq   D29(%rip),%xmm1
  andpd  %xmm1,%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  comisd %xmm1,%xmm0
  jbe    L34
  mov    -0xc(%rbp),%eax
  imul   -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jle    L34
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  movsd  -0x8(%rbp),%xmm0
  movq   D29(%rip),%xmm1
  andpd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
L34:
  mov    -0xc(%rbp),%eax
  imul   -0x14(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0xc(%rbp),%eax
  imul   -0x14(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x20(%rbp),%rax
  add    %rdx,%rax
  addsd  -0x8(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x18(%rbp)
L176:
  mov    -0x18(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jl     L8
  addl   $0x1,-0x14(%rbp)
L120:
  mov    0x10(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x14(%rbp)
  jl     L145
  jmp    L165
L22:
  mov    0x28(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x1,%eax
  jle    L219
  movl   $0x0,-0x14(%rbp)
  jmp    L77
L198:
  mov    -0x10(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  jmp    L271
L160:
  mov    0x30(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L234
  mov    -0x48(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0xc(%rbp),%eax
  imul   -0x14(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x18(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movsd  -0x8(%rbp),%xmm0
  movq   D29(%rip),%xmm1
  andpd  %xmm1,%xmm0
  comisd D110(%rip),%xmm0
  jbe    L11
  movsd  -0x8(%rbp),%xmm1
  movsd  D110(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  -0x8(%rbp),%xmm1
  movq   D29(%rip),%xmm2
  andpd  %xmm2,%xmm1
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
L11:
  cmpl   $0x0,-0x18(%rbp)
  jne    L267
  movsd  -0x8(%rbp),%xmm0
  movq   D29(%rip),%xmm1
  andpd  %xmm1,%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  comisd %xmm1,%xmm0
  jbe    L267
  mov    -0xc(%rbp),%eax
  imul   -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jle    L267
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  movsd  -0x8(%rbp),%xmm0
  movq   D29(%rip),%xmm1
  andpd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
L267:
  mov    -0xc(%rbp),%eax
  imul   -0x14(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0xc(%rbp),%eax
  imul   -0x14(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x20(%rbp),%rax
  add    %rdx,%rax
  addsd  -0x8(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  jmp    L107
L234:
  mov    -0xc(%rbp),%eax
  imul   -0x14(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x38(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  imul   -0x14(%rbp),%eax
  mov    %eax,%ecx
  mov    -0x18(%rbp),%eax
  add    %ecx,%eax
  cltq
  lea    0x0(,%rax,8),%rcx
  mov    0x20(%rbp),%rax
  add    %rcx,%rax
  movsd  (%rdx),%xmm0
  movsd  %xmm0,(%rax)
L107:
  addl   $0x1,-0x18(%rbp)
L271:
  mov    -0x18(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jl     L160
  addl   $0x1,-0x14(%rbp)
L77:
  mov    0x10(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x14(%rbp)
  jl     L198
  jmp    L165
L219:
  movl   $0x0,-0x14(%rbp)
  jmp    L37
L72:
  mov    -0x10(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  jmp    L207
L134:
  mov    -0xc(%rbp),%eax
  imul   -0x14(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x38(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  imul   -0x14(%rbp),%eax
  mov    %eax,%ecx
  mov    -0x18(%rbp),%eax
  add    %ecx,%eax
  cltq
  lea    0x0(,%rax,8),%rcx
  mov    0x20(%rbp),%rax
  add    %rcx,%rax
  movsd  (%rdx),%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x18(%rbp)
L207:
  mov    -0x18(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jl     L134
  addl   $0x1,-0x14(%rbp)
L37:
  mov    0x10(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x14(%rbp)
  jl     L72
L165:
  mov    0x30(%rbp),%rax
  movl   $0x0,(%rax)
  nop
  pop    %rbp
  ret
```

tool_calls: name: unpack_data
arguments: label: D29
type_infered: qword
name: unpack_data
arguments: label: D110
type_infered: f64

tool: D29: 9223372036854775807

tool: D110: 100

assistant: ```c
void prediction_em(double *uam, int *nmethod, double *bet, double *gam, double *dtime, int *ithermal, int *nk, double *veold, double *v, int *iinc, int *idiscon, double *vold, int *nactdof, int *mi) {
  int j, k, mt = mi[1] + 1, jstart;
  double dextrapol;
  uam[0] = 0.;
  uam[1] = 0.;
  if (*ithermal < 2) {
    jstart = 1;
  } else {
    jstart = 0;
  }
  if (*nmethod == 4) {
    for (k = 0; k < *nk; ++k) {
      for (j = jstart; j < mt; j++) {
        dextrapol = *dtime * veold[mt * k + j];
        if (fabs(dextrapol) > 100.)
          dextrapol = 100. * dextrapol / fabs(dextrapol);
        if (j == 0) {
          if ((fabs(dextrapol) > uam[1]) && (nactdof[mt * k] > 0)) {
            uam[1] = fabs(dextrapol);
          }
        }
        v[mt * k + j] = vold[mt * k + j] + dextrapol;
      }
    }
  } else {
    if (*iinc > 1) {
      for (k = 0; k < *nk; ++k) {
        for (j = jstart; j < mt; j++) {
          if (*idiscon == 0) {
            dextrapol = *dtime * veold[mt * k + j];
            if (fabs(dextrapol) > 100.)
              dextrapol = 100. * dextrapol / fabs(dextrapol);
            if (j == 0) {
              if ((fabs(dextrapol) > uam[1]) && (nactdof[mt * k] > 0)) {
                uam[1] = fabs(dextrapol);
              }
            }
            v[mt * k + j] = vold[mt * k + j] + dextrapol;
          } else {
            v[mt * k + j] = vold[mt * k + j];
          }
        }
      }
    } else {
      for (k = 0; k < *nk; ++k) {
        for (j = jstart; j < mt; j++) {
          v[mt * k + j] = vold[mt * k + j];
        }
      }
    }
  }
  *idiscon = 0;
  return;
}
```