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

```asm
<fxp_ln>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %edi,-0x14(%rbp)
  movl   $0xa65af,-0x8(%rbp)
  cmpl   $0x7fff,-0x14(%rbp)
  jg     L93
  shll   $0x10,-0x14(%rbp)
  subl   $0xb1721,-0x8(%rbp)
L93:
  cmpl   $0x7fffff,-0x14(%rbp)
  jg     L4
  shll   $0x8,-0x14(%rbp)
  subl   $0x58b91,-0x8(%rbp)
L4:
  cmpl   $0x7ffffff,-0x14(%rbp)
  jg     L119
  shll   $0x4,-0x14(%rbp)
  subl   $0x2c5c8,-0x8(%rbp)
L119:
  cmpl   $0x1fffffff,-0x14(%rbp)
  jg     L38
  shll   $0x2,-0x14(%rbp)
  subl   $0x162e4,-0x8(%rbp)
L38:
  cmpl   $0x3fffffff,-0x14(%rbp)
  jg     L81
  shll   -0x14(%rbp)
  subl   $0xb172,-0x8(%rbp)
L81:
  mov    -0x14(%rbp),%eax
  sar    %eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  js     L37
  mov    -0x4(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  subl   $0x67cd,-0x8(%rbp)
L37:
  mov    -0x14(%rbp),%eax
  sar    $0x2,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  js     L55
  mov    -0x4(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  subl   $0x3920,-0x8(%rbp)
L55:
  mov    -0x14(%rbp),%eax
  sar    $0x3,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  js     L88
  mov    -0x4(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  subl   $0x1e27,-0x8(%rbp)
L88:
  mov    -0x14(%rbp),%eax
  sar    $0x4,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  js     L108
  mov    -0x4(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  subl   $0xf85,-0x8(%rbp)
L108:
  mov    -0x14(%rbp),%eax
  sar    $0x5,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  js     L65
  mov    -0x4(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  subl   $0x7e1,-0x8(%rbp)
L65:
  mov    -0x14(%rbp),%eax
  sar    $0x6,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  js     L110
  mov    -0x4(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  subl   $0x3f8,-0x8(%rbp)
L110:
  mov    -0x14(%rbp),%eax
  sar    $0x7,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  js     L40
  mov    -0x4(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  subl   $0x1fe,-0x8(%rbp)
L40:
  mov    -0x14(%rbp),%edx
  mov    $0x80000000,%eax
  sub    %edx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  sar    $0xf,%eax
  sub    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  pop    %rbp
  ret
```

assistant: ```c
int fxp_ln(int x) {
  int t, y;
  y = 0xa65af;
  if (x < 0x00008000)
    x <<= 16, y -= 0xb1721;
  if (x < 0x00800000)
    x <<= 8, y -= 0x58b91;
  if (x < 0x08000000)
    x <<= 4, y -= 0x2c5c8;
  if (x < 0x20000000)
    x <<= 2, y -= 0x162e4;
  if (x < 0x40000000)
    x <<= 1, y -= 0x0b172;
  t = x + (x >> 1);
  if ((t & 0x80000000) == 0)
    x = t, y -= 0x067cd;
  t = x + (x >> 2);
  if ((t & 0x80000000) == 0)
    x = t, y -= 0x03920;
  t = x + (x >> 3);
  if ((t & 0x80000000) == 0)
    x = t, y -= 0x01e27;
  t = x + (x >> 4);
  if ((t & 0x80000000) == 0)
    x = t, y -= 0x00f85;
  t = x + (x >> 5);
  if ((t & 0x80000000) == 0)
    x = t, y -= 0x007e1;
  t = x + (x >> 6);
  if ((t & 0x80000000) == 0)
    x = t, y -= 0x003f8;
  t = x + (x >> 7);
  if ((t & 0x80000000) == 0)
    x = t, y -= 0x001fe;
  x = 0x80000000 - x;
  y -= x >> 15;
  return y;
}
```