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

```asm
<mborg_isqrt4>:
  endbr64
  mov    %rdi,%rax
  mov    $0x0,%edx
  cmp    $0x3fffffff,%rdi
  jbe    L17
  sub    $0x40000000,%rax
  mov    $0x8000,%edx
L17:
  mov    %edx,%ecx
  shl    $0xf,%ecx
  add    $0x10000000,%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L47
  add    $0x4000,%edx
  sub    %rcx,%rax
L47:
  mov    %edx,%ecx
  shl    $0xe,%ecx
  add    $0x4000000,%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L1
  add    $0x2000,%edx
  sub    %rcx,%rax
L1:
  mov    %edx,%ecx
  shl    $0xd,%ecx
  add    $0x1000000,%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L136
  add    $0x1000,%edx
  sub    %rcx,%rax
L136:
  mov    %edx,%ecx
  shl    $0xc,%ecx
  add    $0x400000,%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L101
  add    $0x800,%edx
  sub    %rcx,%rax
L101:
  mov    %edx,%ecx
  shl    $0xb,%ecx
  add    $0x100000,%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L113
  add    $0x400,%edx
  sub    %rcx,%rax
L113:
  mov    %edx,%ecx
  shl    $0xa,%ecx
  add    $0x40000,%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L10
  add    $0x200,%edx
  sub    %rcx,%rax
L10:
  mov    %edx,%ecx
  shl    $0x9,%ecx
  add    $0x10000,%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L114
  add    $0x100,%edx
  sub    %rcx,%rax
L114:
  mov    %edx,%ecx
  shl    $0x8,%ecx
  add    $0x4000,%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L23
  sub    $0xffffff80,%edx
  sub    %rcx,%rax
L23:
  mov    %edx,%ecx
  shl    $0x7,%ecx
  add    $0x1000,%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L5
  add    $0x40,%edx
  sub    %rcx,%rax
L5:
  mov    %edx,%ecx
  shl    $0x6,%ecx
  add    $0x400,%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L67
  add    $0x20,%edx
  sub    %rcx,%rax
L67:
  mov    %edx,%ecx
  shl    $0x5,%ecx
  add    $0x100,%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L15
  add    $0x10,%edx
  sub    %rcx,%rax
L15:
  mov    %edx,%ecx
  shl    $0x4,%ecx
  add    $0x40,%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L53
  add    $0x8,%edx
  sub    %rcx,%rax
L53:
  lea    0x10(,%rdx,8),%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L130
  add    $0x4,%edx
  sub    %rcx,%rax
L130:
  lea    0x4(,%rdx,4),%ecx
  mov    %ecx,%ecx
  cmp    %rax,%rcx
  ja     L7
  add    $0x2,%edx
  sub    %rcx,%rax
L7:
  lea    0x1(%rdx,%rdx,1),%ecx
  cmp    %rcx,%rax
  sbb    $0xffffffff,%edx
  mov    %edx,%eax
  ret
```

assistant: ```c
unsigned int mborg_isqrt4(unsigned long val) {
  unsigned int temp, g = 0;
  if (val >= 0x40000000) {
    g = 0x8000;
    val -= 0x40000000;
  }
  temp = (g << (15)) + (1 << ((15) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((15) - 1);
    val -= temp;
  }
  temp = (g << (14)) + (1 << ((14) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((14) - 1);
    val -= temp;
  }
  temp = (g << (13)) + (1 << ((13) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((13) - 1);
    val -= temp;
  }
  temp = (g << (12)) + (1 << ((12) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((12) - 1);
    val -= temp;
  }
  temp = (g << (11)) + (1 << ((11) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((11) - 1);
    val -= temp;
  }
  temp = (g << (10)) + (1 << ((10) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((10) - 1);
    val -= temp;
  }
  temp = (g << (9)) + (1 << ((9) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((9) - 1);
    val -= temp;
  }
  temp = (g << (8)) + (1 << ((8) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((8) - 1);
    val -= temp;
  }
  temp = (g << (7)) + (1 << ((7) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((7) - 1);
    val -= temp;
  }
  temp = (g << (6)) + (1 << ((6) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((6) - 1);
    val -= temp;
  }
  temp = (g << (5)) + (1 << ((5) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((5) - 1);
    val -= temp;
  }
  temp = (g << (4)) + (1 << ((4) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((4) - 1);
    val -= temp;
  }
  temp = (g << (3)) + (1 << ((3) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((3) - 1);
    val -= temp;
  }
  temp = (g << (2)) + (1 << ((2) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((2) - 1);
    val -= temp;
  }
  temp = g + g + 1;
  if (val >= temp)
    g++;
  return g;
}
```