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

```asm
<__emul>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x88,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %rsi,-0x80(%rbp)
  mov    %rdx,-0x88(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <__eisnan@plt>
  test   %rax,%rax
  je     L108
  mov    -0x88(%rbp),%rdx
  mov    -0x78(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <__emov@plt>
  jmp    L282
L108:
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <__eisnan@plt>
  test   %rax,%rax
  je     L254
  mov    -0x88(%rbp),%rdx
  mov    -0x80(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <__emov@plt>
  jmp    L282
L254:
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <__eisinf@plt>
  test   %rax,%rax
  je     L199
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <__eiiszero@plt>
  test   %rax,%rax
  jne    L127
L199:
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <__eisinf@plt>
  test   %rax,%rax
  je     L168
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <__eiiszero@plt>
  test   %rax,%rax
  je     L168
L127:
  mov    -0x88(%rbp),%rax
  mov    %rax,%rdi
  call   <__enan_NBITS@plt>
  jmp    L282
L168:
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <__eisinf@plt>
  test   %rax,%rax
  jne    L238
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <__eisinf@plt>
  test   %rax,%rax
  je     L3
L238:
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <__eisneg@plt>
  mov    %eax,%ebx
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <__eisneg@plt>
  cmp    %eax,%ebx
  je     L20
  mov    -0x88(%rbp),%rax
  add    $0xa,%rax
  movw   $0x8000,(%rax)
  jmp    L31
L20:
  mov    -0x88(%rbp),%rax
  add    $0xa,%rax
  movw   $0x0,(%rax)
L31:
  mov    -0x88(%rbp),%rax
  mov    %rax,%rdi
  call   <__einfin@plt>
  jmp    L282
L3:
  lea    -0x50(%rbp),%rdx
  mov    -0x78(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <__emovi@plt>
  lea    -0x30(%rbp),%rdx
  mov    -0x80(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <__emovi@plt>
  movzwl -0x4e(%rbp),%eax
  movzwl %ax,%eax
  mov    %rax,-0x68(%rbp)
  movzwl -0x2e(%rbp),%eax
  movzwl %ax,%eax
  mov    %rax,-0x60(%rbp)
  movzwl -0x4e(%rbp),%eax
  test   %ax,%ax
  jne    L48
  movl   $0x1,-0x70(%rbp)
  jmp    L84
L193:
  mov    -0x70(%rbp),%eax
  cltq
  movzwl -0x50(%rbp,%rax,2),%eax
  test   %ax,%ax
  je     L231
  lea    -0x50(%rbp),%rax
  mov    %rax,%rdi
  call   <__enormlz@plt>
  sub    %rax,-0x68(%rbp)
  jmp    L24
L231:
  addl   $0x1,-0x70(%rbp)
L84:
  cmpl   $0x7,-0x70(%rbp)
  jle    L193
  mov    -0x88(%rbp),%rax
  mov    %rax,%rdi
  call   <__eclear@plt>
  jmp    L282
L48:
  nop
L24:
  movzwl -0x2e(%rbp),%eax
  test   %ax,%ax
  jne    L35
  movl   $0x1,-0x70(%rbp)
  jmp    L216
L9:
  mov    -0x70(%rbp),%eax
  cltq
  movzwl -0x30(%rbp,%rax,2),%eax
  test   %ax,%ax
  je     L45
  lea    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <__enormlz@plt>
  sub    %rax,-0x60(%rbp)
  jmp    L260
L45:
  addl   $0x1,-0x70(%rbp)
L216:
  cmpl   $0x7,-0x70(%rbp)
  jle    L9
  mov    -0x88(%rbp),%rax
  mov    %rax,%rdi
  call   <__eclear@plt>
  jmp    L282
L35:
  nop
L260:
  lea    -0x30(%rbp),%rdx
  lea    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <__emulm@plt>
  mov    %eax,-0x6c(%rbp)
  mov    -0x68(%rbp),%rdx
  mov    -0x60(%rbp),%rax
  add    %rdx,%rax
  sub    $0x3ffe,%rax
  mov    %rax,-0x58(%rbp)
  mov    -0x58(%rbp),%rdx
  mov    -0x6c(%rbp),%esi
  lea    -0x30(%rbp),%rax
  mov    $0x50,%r9d
  mov    $0x40,%r8d
  mov    %rdx,%rcx
  mov    $0x0,%edx
  mov    %rax,%rdi
  call   <__emdnorm@plt>
  movzwl -0x50(%rbp),%edx
  movzwl -0x30(%rbp),%eax
  cmp    %ax,%dx
  jne    L175
  movw   $0x0,-0x30(%rbp)
  jmp    L2
L175:
  movw   $0xffff,-0x30(%rbp)
L2:
  mov    -0x88(%rbp),%rdx
  lea    -0x30(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <__emovo@plt>
L282:
  mov    -0x18(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L201
  call   <__stack_chk_fail@plt>
L201:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void __emul(const short unsigned int *a, const short unsigned int *b, short unsigned int *c) {
  unsigned short ai[(6 + 3)], bi[(6 + 3)];
  int i, j;
  long lt, lta, ltb;
  if (__eisnan(a)) {
    __emov(a, c);
    return;
  }
  if (__eisnan(b)) {
    __emov(b, c);
    return;
  }
  if ((__eisinf(a) && __eiiszero(b)) || (__eisinf(b) && __eiiszero(a))) {
    ;
    __enan_NBITS(c);
    return;
  }
  if (__eisinf(a) || __eisinf(b)) {
    if (__eisneg(a) ^ __eisneg(b))
      *(c + (6 - 1)) = 0x8000;
    else
      *(c + (6 - 1)) = 0;
    __einfin(c);
    return;
  }
  __emovi(a, ai);
  __emovi(b, bi);
  lta = ai[1];
  ltb = bi[1];
  if (ai[1] == 0) {
    for (i = 1; i < (6 + 3) - 1; i++) {
      if (ai[i] != 0) {
        lta -= __enormlz(ai);
        goto mnzer1;
      }
    }
    __eclear(c);
    return;
  }
mnzer1:
  if (bi[1] == 0) {
    for (i = 1; i < (6 + 3) - 1; i++) {
      if (bi[i] != 0) {
        ltb -= __enormlz(bi);
        goto mnzer2;
      }
    }
    __eclear(c);
    return;
  }
mnzer2:
  j = __emulm(ai, bi);
  lt = lta + ltb - ((0x3fff) - 1);
  __emdnorm(bi, j, 0, lt, 64, (((6 + 3) - 4) * 16));
  if (ai[0] == bi[0])
    bi[0] = 0;
  else
    bi[0] = 0xffff;
  __emovo(bi, c);
}
```