user: Translate the below assembly code into C programming language:

```asm
<f64ToRecF64>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %esi,-0x28(%rbp)
  mov    %rdx,-0x30(%rbp)
  mov    $0x3f,%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  and    $0x1,%eax
  mov    %eax,-0x14(%rbp)
  mov    $0x34,%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  and    $0x7ff,%eax
  mov    %eax,-0x1c(%rbp)
  mov    $0xffffffff,%edi
  call   <UINT64_C@plt>
  and    -0x24(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  cmpl   $0x7ff,-0x1c(%rbp)
  jne    L73
  cmpl   $0x0,-0x18(%rbp)
  je     L56
  movl   $0xe00,-0x1c(%rbp)
  jmp    L102
L56:
  movl   $0xc00,-0x1c(%rbp)
  cmpl   $0x0,-0x28(%rbp)
  je     L102
  mov    $0x0,%eax
  call   <rand@plt>
  mov    $0x2d,%edx
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,%ebx
  mov    $0x0,%eax
  call   <rand@plt>
  shl    $0x1e,%eax
  add    %eax,%ebx
  mov    $0x0,%eax
  call   <rand@plt>
  shl    $0xf,%eax
  add    %eax,%ebx
  mov    $0x0,%eax
  call   <rand@plt>
  add    %eax,%ebx
  mov    $0xffffffff,%edi
  call   <UINT64_C@plt>
  and    %ebx,%eax
  mov    %eax,-0x18(%rbp)
L102:
  cmpl   $0x0,-0x28(%rbp)
  je     L92
  mov    $0x0,%eax
  call   <rand@plt>
  and    $0x1ff,%eax
  or     %eax,-0x1c(%rbp)
  jmp    L92
L73:
  cmpl   $0x0,-0x1c(%rbp)
  jne    L86
  cmpl   $0xfffff,-0x18(%rbp)
  jg     L109
  cmpl   $0x0,-0x18(%rbp)
  jne    L93
  cmpl   $0x0,-0x28(%rbp)
  je     L90
  mov    $0x0,%eax
  call   <rand@plt>
  and    $0x1ff,%eax
  mov    %eax,-0x1c(%rbp)
  jmp    L90
L93:
  subl   $0x20,-0x1c(%rbp)
  mov    $0x20,%eax
  mov    %eax,%ecx
  shll   %cl,-0x18(%rbp)
L109:
  mov    $0x0,%edi
  call   <INT64_C@plt>
  cmp    %eax,-0x18(%rbp)
  jge    L156
  subl   $0x10,-0x1c(%rbp)
  shll   $0x10,-0x18(%rbp)
L156:
  mov    $0x0,%edi
  call   <INT64_C@plt>
  cmp    %eax,-0x18(%rbp)
  jge    L141
  subl   $0x8,-0x1c(%rbp)
  shll   $0x8,-0x18(%rbp)
L141:
  mov    $0x0,%edi
  call   <INT64_C@plt>
  cmp    %eax,-0x18(%rbp)
  jge    L1
  subl   $0x4,-0x1c(%rbp)
  shll   $0x4,-0x18(%rbp)
L1:
  mov    $0x0,%edi
  call   <INT64_C@plt>
  cmp    %eax,-0x18(%rbp)
  jge    L62
  subl   $0x2,-0x1c(%rbp)
  shll   $0x2,-0x18(%rbp)
L62:
  mov    $0x0,%edi
  call   <INT64_C@plt>
  and    -0x18(%rbp),%eax
  test   %eax,%eax
  jne    L118
  subl   $0x1,-0x1c(%rbp)
  shll   -0x18(%rbp)
L118:
  mov    -0x18(%rbp),%eax
  lea    (%rax,%rax,1),%ebx
  mov    $0x0,%edi
  call   <INT64_C@plt>
  mov    %eax,%edx
  mov    %ebx,%eax
  sub    %edx,%eax
  mov    %eax,-0x18(%rbp)
L86:
  addl   $0x401,-0x1c(%rbp)
  jmp    L92
L90:
  nop
L92:
  mov    -0x30(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    -0x14(%rbp),%eax
  mov    %eax,(%rdx)
  mov    $0x34,%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  or     -0x18(%rbp),%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    %edx,(%rax)
  nop
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void f64ToRecF64(uint64_t in, bool addRandomness, uint64_t *outPtr) {
  bool sign;
  int exp;
  int_fast64_t fract;
  sign = in >> 63 & 1;
  exp = in >> 52 & 0x7FF;
  fract = in & UINT64_C(0xFFFFFFFFFFFFF);
  if (exp == 0x7FF) {
    if (fract) {
      exp = 0xE00;
    } else {
      exp = 0xC00;
      if (addRandomness) {
        fract = (((uint_fast64_t)rand() << 45) + ((uint_fast64_t)rand() << 30) + ((uint_fast64_t)rand() << 15) + rand()) & UINT64_C(0xFFFFFFFFFFFFF);
      }
    }
    if (addRandomness)
      exp |= rand() & 0x1FF;
  } else {
    if (exp == 0) {
      if (fract < 0x100000) {
        if (!fract) {
          if (addRandomness)
            exp = rand() & 0x1FF;
          goto done;
        }
        exp -= 32;
        fract <<= 32;
      }
      if (fract < INT64_C(0x1000000000)) {
        exp -= 16;
        fract <<= 16;
      }
      if (fract < INT64_C(0x100000000000)) {
        exp -= 8;
        fract <<= 8;
      }
      if (fract < INT64_C(0x1000000000000)) {
        exp -= 4;
        fract <<= 4;
      }
      if (fract < INT64_C(0x4000000000000)) {
        exp -= 2;
        fract <<= 2;
      }
      if (!(fract & INT64_C(0x8000000000000))) {
        --exp;
        fract <<= 1;
      }
      fract = (fract << 1) - INT64_C(0x10000000000000);
    }
    exp += 0x401;
  }
done:
  outPtr[1] = sign;
  outPtr[0] = (uint_fast64_t)exp << 52 | fract;
}
```