user: Demonstrate the C code that generates the assembly output below:

```asm
<approx2>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  mov    %edi,-0x44(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %rdx,-0x58(%rbp)
  mov    %rcx,-0x60(%rbp)
  mov    %r8,-0x68(%rbp)
  mov    %r9,-0x70(%rbp)
  mov    0x10(%rbp),%rax
  mov    %rax,-0x78(%rbp)
  mov    0x18(%rbp),%rax
  mov    %rax,-0x80(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x50(%rbp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x50(%rbp),%rax
  mov    0x8(%rax),%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x50(%rbp),%rax
  mov    0xc(%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x50(%rbp),%rax
  mov    0x10(%rax),%eax
  mov    %eax,-0x20(%rbp)
  movl   $0x3,-0x1c(%rbp)
  movl   $0x4,-0x1c(%rbp)
  mov    -0x2c(%rbp),%eax
  cltq
  imul   $0xfa00,%rax,%rdx
  mov    -0x70(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdi
  mov    -0x28(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x24(%rbp),%eax
  movslq %eax,%rcx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x4,%rax
  mov    %rcx,%rdx
  shl    $0x2,%rdx
  add    %rcx,%rdx
  shl    $0x2,%rdx
  add    %rdx,%rax
  add    %rdi,%rax
  movsd  (%rsi,%rax,8),%xmm1
  mov    -0x2c(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x5,%rax
  mov    %rax,%rdx
  mov    -0x60(%rbp),%rax
  add    %rax,%rdx
  mov    -0x28(%rbp),%eax
  cltq
  movsd  (%rdx,%rax,8),%xmm2
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x5,%rax
  mov    %rax,%rdx
  mov    -0x60(%rbp),%rax
  add    %rax,%rdx
  mov    -0x20(%rbp),%eax
  cltq
  movsd  (%rdx,%rax,8),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  mov    -0x80(%rbp),%rax
  movl   $0x1,(%rax)
  movl   $0x5,-0x30(%rbp)
  jmp    L5
L12:
  mov    -0x70(%rbp),%r9
  mov    -0x68(%rbp),%r8
  mov    -0x60(%rbp),%rcx
  mov    -0x58(%rbp),%rdx
  mov    -0x50(%rbp),%rsi
  mov    -0x30(%rbp),%eax
  sub    $0x8,%rsp
  lea    -0x34(%rbp),%rdi
  push   %rdi
  mov    %eax,%edi
  call   <cond2@plt>
  add    $0x10,%rsp
  movq   %xmm0,%rax
  mov    %rax,-0x10(%rbp)
  movsd  -0x18(%rbp),%xmm0
  mulsd  -0x10(%rbp),%xmm0
  movsd  %xmm0,-0x18(%rbp)
  mov    -0x34(%rbp),%eax
  test   %eax,%eax
  jne    L39
  mov    -0x80(%rbp),%rax
  movl   $0x0,(%rax)
L39:
  addl   $0x1,-0x30(%rbp)
L5:
  mov    -0x30(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jle    L12
  mov    -0x78(%rbp),%rax
  movsd  -0x18(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L30
  call   <__stack_chk_fail@plt>
L30:
  leave
  ret
```

assistant: ```c
void approx2(int m, int a[], double p[], double pp[][20], double p3[][20][20], double p4[][20][20][20], double *rec, int *idet) {
  double pra, rec2;
  double cond2(int, int[], double[], double[][20], double[][20][20], double[][20][20][20], int *);
  int ii, a1, a2, a3, idt, m1, a4;
  a1 = a[1];
  a2 = a[2];
  a3 = a[3];
  a4 = a[4];
  m1 = 3;
  m1 = 4;
  rec2 = p4[a1][a2][a3][a4] + pp[a1][a2] * pp[a3][a4];
  *idet = 1;
  for (ii = 5; ii <= m; ii++) {
    pra = cond2(ii, a, p, pp, p3, p4, &idt);
    rec2 *= pra;
    if (idt == 0)
      *idet = 0;
  }
  *rec = rec2;
}
```