user: 请将以下的汇编代码转换成C语言代码：

```asm
<sqrti>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %edi,-0x14(%rbp)
  movl   $0x0,-0x8(%rbp)
  cmpl   $0x3fffffff,-0x14(%rbp)
  jle    L25
  subl   $0x40000000,-0x14(%rbp)
  movl   $0x8000,-0x8(%rbp)
L25:
  mov    -0x8(%rbp),%eax
  add    $0x2000,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0xf,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L102
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x4000,-0x8(%rbp)
L102:
  mov    -0x8(%rbp),%eax
  add    $0x1000,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0xe,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L19
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x2000,-0x8(%rbp)
L19:
  mov    -0x8(%rbp),%eax
  add    $0x800,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0xd,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L23
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x1000,-0x8(%rbp)
L23:
  mov    -0x8(%rbp),%eax
  add    $0x400,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0xc,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L73
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x800,-0x8(%rbp)
L73:
  mov    -0x8(%rbp),%eax
  add    $0x200,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0xb,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L67
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x400,-0x8(%rbp)
L67:
  mov    -0x8(%rbp),%eax
  add    $0x100,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0xa,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L58
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x200,-0x8(%rbp)
L58:
  mov    -0x8(%rbp),%eax
  sub    $0xffffff80,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0x9,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L31
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x100,-0x8(%rbp)
L31:
  mov    -0x8(%rbp),%eax
  add    $0x40,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0x8,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L127
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x80,-0x8(%rbp)
L127:
  mov    -0x8(%rbp),%eax
  add    $0x20,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0x7,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L43
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x40,-0x8(%rbp)
L43:
  mov    -0x8(%rbp),%eax
  add    $0x10,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0x6,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L106
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x20,-0x8(%rbp)
L106:
  mov    -0x8(%rbp),%eax
  add    $0x8,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0x5,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L120
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x10,-0x8(%rbp)
L120:
  mov    -0x8(%rbp),%eax
  add    $0x4,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0x4,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L3
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x8,-0x8(%rbp)
L3:
  mov    -0x8(%rbp),%eax
  add    $0x2,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0x3,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L148
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x4,-0x8(%rbp)
L148:
  mov    -0x8(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x4(%rbp)
  shll   $0x2,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L126
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  orl    $0x2,-0x8(%rbp)
L126:
  mov    -0x8(%rbp),%eax
  add    %eax,%eax
  cmp    %eax,-0x14(%rbp)
  jle    L4
  orl    $0x1,-0x8(%rbp)
L4:
  mov    -0x8(%rbp),%eax
  pop    %rbp
  ret
```

assistant: ```c
uint32_t sqrti(uint32_t n) {
  uint32_t s, t;
  s = 0;
  if (n >= 1 << 30) {
    n -= 1 << 30;
    s = 1 << 15;
  }
  t = s + (1UL << (14 - 1));
  t <<= 14 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 14;
  };
  t = s + (1UL << (13 - 1));
  t <<= 13 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 13;
  };
  t = s + (1UL << (12 - 1));
  t <<= 12 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 12;
  };
  t = s + (1UL << (11 - 1));
  t <<= 11 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 11;
  };
  t = s + (1UL << (10 - 1));
  t <<= 10 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 10;
  };
  t = s + (1UL << (9 - 1));
  t <<= 9 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 9;
  };
  t = s + (1UL << (8 - 1));
  t <<= 8 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 8;
  };
  t = s + (1UL << (7 - 1));
  t <<= 7 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 7;
  };
  t = s + (1UL << (6 - 1));
  t <<= 6 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 6;
  };
  t = s + (1UL << (5 - 1));
  t <<= 5 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 5;
  };
  t = s + (1UL << (4 - 1));
  t <<= 4 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 4;
  };
  t = s + (1UL << (3 - 1));
  t <<= 3 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 3;
  };
  t = s + (1UL << (2 - 1));
  t <<= 2 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 2;
  };
  t = s + (1UL << (1 - 1));
  t <<= 1 + 1;
  if (n >= t) {
    n -= t;
    s |= 1UL << 1;
  };
  if (n > s << 1)
    s |= 1;
  return s;
}
```