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

```asm
<iSqrt>:
  endbr64
  mov    %edi,%eax
  cmp    $0x3fffffff,%edi
  jle    L82
  sub    $0x40000000,%eax
  mov    $0x40000000,%edx
L121:
  sar    %edx
  jmp    L1
L82:
  cmp    $0xfffffff,%edi
  jle    L18
  sub    $0x10000000,%eax
  mov    $0x10000000,%edx
L1:
  lea    0x3ffffff(%rdx),%esi
  mov    %edx,%ecx
  sar    %ecx
  cmp    %esi,%eax
  jle    L176
  sub    $0x4000000,%eax
  sub    %edx,%eax
  or     $0x4000000,%ecx
L176:
  lea    0xffffff(%rcx),%esi
  mov    %ecx,%edx
  sar    %edx
  cmp    %esi,%eax
  jle    L59
  sub    $0x1000000,%eax
  sub    %ecx,%eax
  mov    %edx,%ecx
  or     $0x1000000,%ecx
  mov    %ecx,%edx
L59:
  lea    0x3fffff(%rdx),%esi
  mov    %edx,%ecx
  sar    %ecx
  cmp    %esi,%eax
  jle    L38
  sub    $0x400000,%eax
  sub    %edx,%eax
  or     $0x400000,%ecx
L38:
  lea    0xfffff(%rcx),%esi
  mov    %ecx,%edx
  sar    %edx
  cmp    %esi,%eax
  jle    L109
  sub    $0x100000,%eax
  sub    %ecx,%eax
  mov    %edx,%ecx
  or     $0x100000,%ecx
  mov    %ecx,%edx
L109:
  lea    0x3ffff(%rdx),%esi
  mov    %edx,%ecx
  sar    %ecx
  cmp    %esi,%eax
  jle    L7
  sub    $0x40000,%eax
  sub    %edx,%eax
  mov    %ecx,%edx
  or     $0x40000,%edx
  mov    %edx,%ecx
L7:
  lea    0xffff(%rcx),%esi
  mov    %ecx,%edx
  sar    %edx
  cmp    %esi,%eax
  jle    L128
  sub    $0x10000,%eax
  sub    %ecx,%eax
  mov    %edx,%ecx
  or     $0x10000,%ecx
  mov    %ecx,%edx
L128:
  lea    0x3fff(%rdx),%esi
  mov    %edx,%ecx
  sar    %ecx
  cmp    %esi,%eax
  jle    L149
  sub    $0x4000,%eax
  sub    %edx,%eax
  mov    %ecx,%edx
  or     $0x40,%dh
  mov    %edx,%ecx
L149:
  lea    0xfff(%rcx),%esi
  mov    %ecx,%edx
  sar    %edx
  cmp    %esi,%eax
  jle    L168
  sub    $0x1000,%eax
  sub    %ecx,%eax
  mov    %edx,%ecx
  or     $0x10,%ch
  mov    %ecx,%edx
L168:
  lea    0x3ff(%rdx),%esi
  mov    %edx,%ecx
  sar    %ecx
  cmp    %esi,%eax
  jle    L144
  sub    $0x400,%eax
  sub    %edx,%eax
  mov    %ecx,%edx
  or     $0x4,%dh
  mov    %edx,%ecx
L144:
  lea    0xff(%rcx),%esi
  mov    %ecx,%edx
  sar    %edx
  cmp    %esi,%eax
  jle    L103
  sub    $0x100,%eax
  sub    %ecx,%eax
  mov    %edx,%ecx
  or     $0x1,%ch
  mov    %ecx,%edx
L103:
  lea    0x3f(%rdx),%esi
  mov    %edx,%ecx
  sar    %ecx
  cmp    %esi,%eax
  jle    L112
  sub    $0x40,%eax
  sub    %edx,%eax
  mov    %ecx,%edx
  or     $0x40,%edx
  mov    %edx,%ecx
L112:
  lea    0xf(%rcx),%esi
  mov    %ecx,%edx
  sar    %edx
  cmp    %esi,%eax
  jle    L94
  sub    $0x10,%eax
  sub    %ecx,%eax
  mov    %edx,%ecx
  or     $0x10,%ecx
  mov    %ecx,%edx
L94:
  lea    0x3(%rdx),%esi
  mov    %edx,%ecx
  sar    %ecx
  cmp    %esi,%eax
  jle    L64
  sub    $0x4,%eax
  sub    %edx,%eax
  mov    %ecx,%edx
  or     $0x4,%edx
  mov    %edx,%ecx
L64:
  mov    %ecx,%edx
  sar    %edx
  cmp    %ecx,%eax
  jle    L67
  sub    $0x1,%eax
  sub    %ecx,%eax
  mov    %edx,%ecx
  or     $0x1,%ecx
  mov    %ecx,%edx
L67:
  cmp    %edx,%eax
  setg   %al
  movzbl %al,%eax
  add    %eax,%edx
  mov    %edx,%eax
  ret
L18:
  mov    $0x0,%edx
  jmp    L121
```

assistant: ```c
int iSqrt(int value) {
  int root = 0;
  if ((0x40000000l >> 0) + root <= value) {
    value -= (0x40000000l >> 0) + root;
    root = (root >> 1) | (0x40000000l >> 0);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 2) + root <= value) {
    value -= (0x40000000l >> 2) + root;
    root = (root >> 1) | (0x40000000l >> 2);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 4) + root <= value) {
    value -= (0x40000000l >> 4) + root;
    root = (root >> 1) | (0x40000000l >> 4);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 6) + root <= value) {
    value -= (0x40000000l >> 6) + root;
    root = (root >> 1) | (0x40000000l >> 6);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 8) + root <= value) {
    value -= (0x40000000l >> 8) + root;
    root = (root >> 1) | (0x40000000l >> 8);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 10) + root <= value) {
    value -= (0x40000000l >> 10) + root;
    root = (root >> 1) | (0x40000000l >> 10);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 12) + root <= value) {
    value -= (0x40000000l >> 12) + root;
    root = (root >> 1) | (0x40000000l >> 12);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 14) + root <= value) {
    value -= (0x40000000l >> 14) + root;
    root = (root >> 1) | (0x40000000l >> 14);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 16) + root <= value) {
    value -= (0x40000000l >> 16) + root;
    root = (root >> 1) | (0x40000000l >> 16);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 18) + root <= value) {
    value -= (0x40000000l >> 18) + root;
    root = (root >> 1) | (0x40000000l >> 18);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 20) + root <= value) {
    value -= (0x40000000l >> 20) + root;
    root = (root >> 1) | (0x40000000l >> 20);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 22) + root <= value) {
    value -= (0x40000000l >> 22) + root;
    root = (root >> 1) | (0x40000000l >> 22);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 24) + root <= value) {
    value -= (0x40000000l >> 24) + root;
    root = (root >> 1) | (0x40000000l >> 24);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 26) + root <= value) {
    value -= (0x40000000l >> 26) + root;
    root = (root >> 1) | (0x40000000l >> 26);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 28) + root <= value) {
    value -= (0x40000000l >> 28) + root;
    root = (root >> 1) | (0x40000000l >> 28);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 30) + root <= value) {
    value -= (0x40000000l >> 30) + root;
    root = (root >> 1) | (0x40000000l >> 30);
  } else {
    root = root >> 1;
  };
  if (root < value) {
    ++root;
  }
  return root;
}
```