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

```asm
<MultiNomialAliasSetTable>:
  endbr64
  mov    %rdx,%r9
  mov    %rcx,%r10
  test   %edi,%edi
  jle    L557
  lea    -0x1(%rdi),%ecx
  cmp    $0x2,%ecx
  jbe    L647
  mov    %edi,%edx
  movdqa D76(%rip),%xmm0
  mov    %r10,%rax
  shr    $0x2,%edx
  sub    $0x1,%edx
  shl    $0x4,%rdx
  lea    0x10(%r10,%rdx,1),%rdx
  nopw   0x0(%rax,%rax,1)
L711:
  movups %xmm0,(%rax)
  add    $0x10,%rax
  cmp    %rax,%rdx
  jne    L711
  mov    %edi,%eax
  and    $0xfffffffc,%eax
  test   $0x3,%dil
  je     L623
L657:
  movslq %eax,%rdx
  movl   $0xfffffff7,(%r10,%rdx,4)
  lea    0x0(,%rdx,4),%r11
  lea    0x1(%rax),%edx
  cmp    %edx,%edi
  jle    L623
  movl   $0xfffffff7,0x4(%r10,%r11,1)
  add    $0x2,%eax
  cmp    %eax,%edi
  jle    L623
  movl   $0xfffffff7,0x8(%r10,%r11,1)
L623:
  pxor   %xmm1,%xmm1
  lea    0x8(%rsi),%rax
  cvtsi2sd %edi,%xmm1
  cmp    %rax,%r9
  je     L108
  cmp    $0x1,%ecx
  jbe    L108
  mov    %edi,%edx
  movapd %xmm1,%xmm2
  xor    %eax,%eax
  shr    %edx
  unpcklpd %xmm2,%xmm2
  shl    $0x4,%rdx
  nopw   0x0(%rax,%rax,1)
L651:
  movupd (%rsi,%rax,1),%xmm0
  mulpd  %xmm2,%xmm0
  movups %xmm0,(%r9,%rax,1)
  add    $0x10,%rax
  cmp    %rdx,%rax
  jne    L651
  mov    %edi,%eax
  and    $0xfffffffe,%eax
  test   $0x1,%dil
  je     L100
  mulsd  (%rsi,%rax,8),%xmm1
  movsd  %xmm1,(%r9,%rax,8)
L100:
  movslq %edi,%rax
  lea    (%r9,%rax,8),%rdx
  cmp    %rdx,%r8
  setae  %dl
  add    %r8,%rax
  cmp    %rax,%r9
  setae  %al
  or     %al,%dl
  je     L91
  cmp    $0xe,%ecx
  jbe    L91
  mov    %edi,%ecx
  mov    %r9,%rax
  pxor   %xmm12,%xmm12
  mov    %r8,%rdx
  shr    $0x4,%ecx
  pcmpeqd %xmm13,%xmm13
  movapd D75(%rip),%xmm15
  movdqa D41(%rip),%xmm14
  sub    $0x1,%ecx
  shl    $0x7,%rcx
  lea    0x80(%r9,%rcx,1),%rcx
  nopw   0x0(%rax,%rax,1)
L239:
  movupd 0x20(%rax),%xmm5
  movapd %xmm15,%xmm3
  movapd %xmm15,%xmm6
  movupd 0x40(%rax),%xmm2
  movapd %xmm15,%xmm1
  movupd (%rax),%xmm7
  movupd 0x10(%rax),%xmm4
  movapd %xmm15,%xmm0
  cmplepd %xmm5,%xmm3
  movupd 0x30(%rax),%xmm5
  sub    $0xffffffffffffff80,%rax
  add    $0x10,%rdx
  cmplepd %xmm2,%xmm1
  movupd -0x30(%rax),%xmm2
  cmplepd %xmm7,%xmm0
  movapd %xmm15,%xmm7
  cmplepd %xmm5,%xmm6
  cmplepd %xmm4,%xmm7
  movdqa %xmm3,%xmm8
  movaps %xmm0,-0x18(%rsp)
  movdqa %xmm0,%xmm9
  movupd -0x20(%rax),%xmm0
  movdqa %xmm1,%xmm11
  movdqa %xmm6,%xmm5
  movdqa %xmm7,%xmm4
  pandn  %xmm14,%xmm9
  pandn  %xmm14,%xmm5
  pandn  %xmm14,%xmm4
  pandn  %xmm14,%xmm8
  movaps %xmm5,-0x38(%rsp)
  movapd %xmm15,%xmm5
  pandn  %xmm14,%xmm11
  shufps $0x88,-0x38(%rsp),%xmm8
  cmplepd %xmm2,%xmm5
  movaps %xmm4,-0x48(%rsp)
  movapd %xmm15,%xmm4
  shufps $0x88,-0x48(%rsp),%xmm9
  paddd  %xmm12,%xmm9
  paddd  %xmm9,%xmm8
  movdqa %xmm11,%xmm9
  movdqa %xmm5,%xmm2
  pandn  %xmm14,%xmm2
  movaps %xmm2,-0x28(%rsp)
  movapd %xmm15,%xmm2
  shufps $0x88,-0x28(%rsp),%xmm9
  paddd  %xmm9,%xmm8
  cmplepd %xmm0,%xmm2
  movupd -0x10(%rax),%xmm0
  cmplepd %xmm0,%xmm4
  movdqa %xmm2,%xmm10
  pandn  %xmm14,%xmm10
  movdqa %xmm4,%xmm0
  movdqa %xmm10,%xmm9
  pandn  %xmm14,%xmm0
  shufps $0x88,%xmm0,%xmm9
  movapd -0x18(%rsp),%xmm0
  movdqa %xmm9,%xmm12
  paddd  %xmm8,%xmm12
  movdqa %xmm14,%xmm8
  pand   %xmm0,%xmm8
  pandn  %xmm13,%xmm0
  por    %xmm8,%xmm0
  movdqa %xmm14,%xmm8
  pand   %xmm7,%xmm8
  pandn  %xmm13,%xmm7
  por    %xmm8,%xmm7
  movdqa %xmm14,%xmm8
  pand   %xmm3,%xmm8
  pandn  %xmm13,%xmm3
  shufps $0x88,%xmm7,%xmm0
  por    %xmm8,%xmm3
  movdqa %xmm14,%xmm8
  pand   %xmm6,%xmm8
  pandn  %xmm13,%xmm6
  por    %xmm8,%xmm6
  movdqa %xmm14,%xmm8
  pand   %xmm1,%xmm8
  pandn  %xmm13,%xmm1
  shufps $0x88,%xmm6,%xmm3
  movdqa %xmm0,%xmm6
  por    %xmm8,%xmm1
  movdqa %xmm14,%xmm8
  punpcklwd %xmm3,%xmm0
  pand   %xmm5,%xmm8
  pandn  %xmm13,%xmm5
  punpckhwd %xmm3,%xmm6
  por    %xmm8,%xmm5
  movdqa %xmm14,%xmm8
  movdqa %xmm0,%xmm3
  pand   %xmm2,%xmm8
  punpckhwd %xmm6,%xmm3
  punpcklwd %xmm6,%xmm0
  shufps $0x88,%xmm5,%xmm1
  pandn  %xmm13,%xmm2
  punpcklwd %xmm3,%xmm0
  movdqa %xmm1,%xmm3
  por    %xmm8,%xmm2
  movdqa %xmm14,%xmm8
  pand   D59(%rip),%xmm0
  pand   %xmm4,%xmm8
  pandn  %xmm13,%xmm4
  por    %xmm8,%xmm4
  shufps $0x88,%xmm4,%xmm2
  punpcklwd %xmm2,%xmm1
  punpckhwd %xmm2,%xmm3
  movdqa %xmm1,%xmm2
  punpcklwd %xmm3,%xmm1
  punpckhwd %xmm3,%xmm2
  punpcklwd %xmm2,%xmm1
  pand   D59(%rip),%xmm1
  packuswb %xmm1,%xmm0
  movups %xmm0,-0x10(%rdx)
  cmp    %rax,%rcx
  jne    L239
  movdqa %xmm12,%xmm0
  mov    %edi,%eax
  psrldq $0x8,%xmm0
  and    $0xfffffff0,%eax
  paddd  %xmm12,%xmm0
  movdqa %xmm0,%xmm1
  psrldq $0x4,%xmm1
  paddd  %xmm1,%xmm0
  movd   %xmm0,%esi
  test   $0xf,%dil
  je     L648
  mov    %eax,%ecx
  movsd  D75(%rip),%xmm0
  movsd  (%r9,%rcx,8),%xmm1
  lea    0x0(,%rcx,8),%rdx
  lea    (%r8,%rcx,1),%r11
  mov    $0x1,%ecx
  comisd %xmm0,%xmm1
  jb     L598
L276:
  mov    %cl,(%r11)
  lea    0x1(%rax),%ecx
  cmp    %edi,%ecx
  jge    L648
  movsd  0x8(%r9,%rdx,1),%xmm1
  movslq %ecx,%rcx
  mov    $0x1,%r11d
  add    %r8,%rcx
  comisd %xmm0,%xmm1
  jb     L325
L197:
  mov    %r11b,(%rcx)
  lea    0x2(%rax),%ecx
  cmp    %ecx,%edi
  jle    L648
  movsd  0x10(%r9,%rdx,1),%xmm1
  movslq %ecx,%rcx
  mov    $0x1,%r11d
  add    %r8,%rcx
  comisd %xmm0,%xmm1
  jb     L698
L159:
  mov    %r11b,(%rcx)
  lea    0x3(%rax),%ecx
  cmp    %ecx,%edi
  jle    L648
  movsd  0x18(%r9,%rdx,1),%xmm1
  movslq %ecx,%rcx
  mov    $0x1,%r11d
  add    %r8,%rcx
  comisd %xmm0,%xmm1
  jb     L321
L232:
  mov    %r11b,(%rcx)
  lea    0x4(%rax),%ecx
  cmp    %ecx,%edi
  jle    L648
  movsd  0x20(%r9,%rdx,1),%xmm1
  movslq %ecx,%rcx
  mov    $0x1,%r11d
  add    %r8,%rcx
  comisd %xmm0,%xmm1
  jb     L242
  mov    %r11b,(%rcx)
  lea    0x5(%rax),%ecx
  cmp    %ecx,%edi
  jle    L648
L612:
  movsd  0x28(%r9,%rdx,1),%xmm1
  movslq %ecx,%rcx
  mov    $0x1,%r11d
  add    %r8,%rcx
  comisd %xmm0,%xmm1
  jae    L307
  add    $0x1,%esi
  mov    $0xffffffff,%r11d
L307:
  mov    %r11b,(%rcx)
  lea    0x6(%rax),%ecx
  cmp    %ecx,%edi
  jle    L648
  movsd  0x30(%r9,%rdx,1),%xmm1
  movslq %ecx,%rcx
  mov    $0x1,%r11d
  add    %r8,%rcx
  comisd %xmm0,%xmm1
  jae    L412
  add    $0x1,%esi
  mov    $0xffffffff,%r11d
L412:
  mov    %r11b,(%rcx)
  lea    0x7(%rax),%ecx
  cmp    %ecx,%edi
  jle    L648
  movsd  0x38(%r9,%rdx,1),%xmm1
  movslq %ecx,%rcx
  mov    $0x1,%r11d
  add    %r8,%rcx
  comisd %xmm0,%xmm1
  jae    L441
  add    $0x1,%esi
  mov    $0xffffffff,%r11d
L441:
  mov    %r11b,(%rcx)
  lea    0x8(%rax),%ecx
  cmp    %ecx,%edi
  jle    L648
  movsd  0x40(%r9,%rdx,1),%xmm1
  movslq %ecx,%rcx
  mov    $0x1,%r11d
  add    %r8,%rcx
  comisd %xmm0,%xmm1
  jb     L704
L632:
  mov    %r11b,(%rcx)
  lea    0x9(%rax),%ecx
  cmp    %ecx,%edi
  jle    L648
  movsd  0x48(%r9,%rdx,1),%xmm1
  movslq %ecx,%rcx
  mov    $0x1,%r11d
  add    %r8,%rcx
  comisd %xmm0,%xmm1
  jb     L472
L214:
  mov    %r11b,(%rcx)
  lea    0xa(%rax),%ecx
  cmp    %ecx,%edi
  jle    L648
  movsd  0x50(%r9,%rdx,1),%xmm1
  movslq %ecx,%rcx
  mov    $0x1,%r11d
  add    %r8,%rcx
  comisd %xmm0,%xmm1
  jb     L717
L191:
  mov    %r11b,(%rcx)
  lea    0xb(%rax),%ecx
  cmp    %ecx,%edi
  jle    L648
  movsd  0x58(%r9,%rdx,1),%xmm1
  movslq %ecx,%rcx
  mov    $0x1,%r11d
  add    %r8,%rcx
  comisd %xmm0,%xmm1
  jb     L694
L714:
  mov    %r11b,(%rcx)
  lea    0xc(%rax),%ecx
  cmp    %ecx,%edi
  jle    L648
  movsd  0x60(%r9,%rdx,1),%xmm1
  movslq %ecx,%rcx
  mov    $0x1,%r11d
  add    %r8,%rcx
  comisd %xmm0,%xmm1
  jb     L154
L312:
  mov    %r11b,(%rcx)
  lea    0xd(%rax),%ecx
  cmp    %ecx,%edi
  jle    L648
  movsd  0x68(%r9,%rdx,1),%xmm1
  movslq %ecx,%rcx
  mov    $0x1,%r11d
  add    %r8,%rcx
  comisd %xmm0,%xmm1
  jae    L480
  add    $0x1,%esi
  mov    $0xffffffff,%r11d
L480:
  add    $0xe,%eax
  mov    %r11b,(%rcx)
  cmp    %eax,%edi
  jle    L648
  movsd  0x70(%r9,%rdx,1),%xmm1
  cltq
  mov    $0x1,%edx
  add    %r8,%rax
  comisd %xmm0,%xmm1
  jb     L87
  mov    %dl,(%rax)
  nopw   0x0(%rax,%rax,1)
L648:
  test   %esi,%esi
  je     L557
  movsd  D75(%rip),%xmm1
  nopl   0x0(%rax)
L429:
  mov    %r8,%rcx
  mov    %r8,%rdx
  xor    %eax,%eax
  jmp    L305
  nopw   0x0(%rax,%rax,1)
L243:
  add    $0x1,%eax
  add    $0x1,%rdx
  cmp    %eax,%edi
  je     L593
L305:
  cmpb   $0xff,(%rdx)
  jne    L243
L593:
  xor    %edx,%edx
  jmp    L94
  nopl   0x0(%rax)
L465:
  add    $0x1,%edx
  add    $0x1,%rcx
  cmp    %edx,%edi
  je     L557
L94:
  cmpb   $0x1,(%rcx)
  jne    L465
  cmp    %edx,%edi
  je     L557
  cltq
  movapd %xmm1,%xmm2
  mov    %edx,(%r10,%rax,4)
  movslq %edx,%rdx
  subsd  (%r9,%rax,8),%xmm2
  add    %r8,%rax
  lea    (%r9,%rdx,8),%rcx
  movsd  (%rcx),%xmm0
  subsd  %xmm2,%xmm0
  comisd %xmm0,%xmm1
  movsd  %xmm0,(%rcx)
  ja     L368
  movb   $0x0,(%rax)
  sub    $0x1,%esi
  jne    L429
L557:
  xor    %eax,%eax
  ret
  nopl   0x0(%rax,%rax,1)
L368:
  movb   $0xff,(%r8,%rdx,1)
  movb   $0x0,(%rax)
  jmp    L429
L91:
  movsd  D75(%rip),%xmm0
  mov    %edi,%ecx
  xor    %eax,%eax
  xor    %esi,%esi
L158:
  movsd  (%r9,%rax,8),%xmm1
  mov    $0x1,%edx
  comisd %xmm0,%xmm1
  jae    L203
  add    $0x1,%esi
  mov    $0xffffffff,%edx
L203:
  mov    %dl,(%r8,%rax,1)
  add    $0x1,%rax
  cmp    %rax,%rcx
  jne    L158
  jmp    L648
L598:
  add    $0x1,%esi
  mov    $0xffffffff,%ecx
  jmp    L276
L325:
  add    $0x1,%esi
  mov    $0xffffffff,%r11d
  jmp    L197
L698:
  add    $0x1,%esi
  mov    $0xffffffff,%r11d
  jmp    L159
L321:
  add    $0x1,%esi
  mov    $0xffffffff,%r11d
  jmp    L232
L242:
  mov    $0xffffffff,%r11d
  add    $0x1,%esi
  mov    %r11b,(%rcx)
  lea    0x5(%rax),%ecx
  cmp    %ecx,%edi
  jg     L612
  jmp    L648
L704:
  add    $0x1,%esi
  mov    $0xffffffff,%r11d
  jmp    L632
L472:
  add    $0x1,%esi
  mov    $0xffffffff,%r11d
  jmp    L214
L717:
  add    $0x1,%esi
  mov    $0xffffffff,%r11d
  jmp    L191
L694:
  add    $0x1,%esi
  mov    $0xffffffff,%r11d
  jmp    L714
L154:
  add    $0x1,%esi
  mov    $0xffffffff,%r11d
  jmp    L312
L87:
  mov    $0xffffffff,%edx
  add    $0x1,%esi
  mov    %dl,(%rax)
  jmp    L648
L108:
  mov    %edi,%edx
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L514:
  movsd  (%rsi,%rax,8),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%r9,%rax,8)
  add    $0x1,%rax
  cmp    %rdx,%rax
  jne    L514
  jmp    L100
L647:
  xor    %eax,%eax
  jmp    L657
```

tool_calls: name: parse_data
arguments: label: D76
type: byte[16]
name: parse_data
arguments: label: D75
type: byte[16]
name: parse_data
arguments: label: D41
type: byte[16]
name: parse_data
arguments: label: D59
type: byte[16]

tool: {"D76": [0xf7,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xf7,0xff,0xff,0xff]}

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

tool: {"D41": [0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: {"D59": [0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00]}

assistant: ```c
int MultiNomialAliasSetTable(int ncat, double prob[], double F[], int L[], double space[]) {
  signed char *I = (signed char *)space;
  int i, j, k, nsmall;
  for (i = 0; i < ncat; i++)
    L[i] = -9;
  for (i = 0; i < ncat; i++)
    F[i] = ncat * prob[i];
  for (i = 0, nsmall = 0; i < ncat; i++) {
    if (F[i] >= 1)
      I[i] = 1;
    else {
      I[i] = -1;
      nsmall++;
    }
  }
  for (i = 0; nsmall > 0; i++) {
    for (j = 0; j < ncat; j++)
      if (I[j] == -1)
        break;
    for (k = 0; k < ncat; k++)
      if (I[k] == 1)
        break;
    if (k == ncat)
      break;
    L[j] = k;
    F[k] -= 1 - F[j];
    if (F[k] < 1) {
      I[k] = -1;
      nsmall++;
    }
    I[j] = 0;
    nsmall--;
  }
  return (0);
}
```