user: What would the C source look like for the assembly code provided here?

```asm
<bn_sqr_comba4>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xf8,%rsp
  mov    %rdi,-0x168(%rbp)
  mov    %rsi,-0x170(%rbp)
  movq   $0x0,-0x150(%rbp)
  movq   $0x0,-0x148(%rbp)
  movq   $0x0,-0x140(%rbp)
  mov    -0x170(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x138(%rbp)
  mov    -0x138(%rbp),%rax
  movzwl %ax,%eax
  mov    %rax,-0xe8(%rbp)
  mov    -0x138(%rbp),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0x138(%rbp)
  mov    -0xe8(%rbp),%rax
  imul   -0x138(%rbp),%rax
  mov    %rax,-0xe0(%rbp)
  mov    -0xe8(%rbp),%rax
  imul   %rax,%rax
  mov    %rax,-0xe8(%rbp)
  mov    -0x138(%rbp),%rax
  imul   %rax,%rax
  mov    %rax,-0x138(%rbp)
  mov    -0xe0(%rbp),%rax
  shr    $0xf,%rax
  and    $0x1ffff,%eax
  add    %rax,-0x138(%rbp)
  mov    -0xe0(%rbp),%rax
  shl    $0x11,%rax
  mov    %rax,%rdx
  movabs $0x1fffe0000,%rax
  and    %rdx,%rax
  mov    %rax,-0xe0(%rbp)
  mov    -0xe8(%rbp),%rdx
  mov    -0xe0(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xe8(%rbp)
  mov    -0xe8(%rbp),%rax
  cmp    -0xe0(%rbp),%rax
  jae    L244
  addq   $0x1,-0x138(%rbp)
L244:
  mov    -0xe8(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0x138(%rbp),%rax
  mov    %rax,-0x158(%rbp)
  mov    -0x150(%rbp),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x150(%rbp)
  mov    -0x150(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L420
  addq   $0x1,-0x158(%rbp)
L420:
  mov    -0x148(%rbp),%rdx
  mov    -0x158(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x148(%rbp)
  mov    -0x148(%rbp),%rax
  cmp    -0x158(%rbp),%rax
  jae    L73
  addq   $0x1,-0x140(%rbp)
L73:
  mov    -0x168(%rbp),%rax
  mov    -0x150(%rbp),%rdx
  mov    %rdx,(%rax)
  movq   $0x0,-0x150(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  and    $0xffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0x158(%rbp)
  mov    -0x170(%rbp),%rax
  mov    (%rax),%rax
  and    $0xffff,%eax
  mov    %rax,-0xd0(%rbp)
  mov    -0x170(%rbp),%rax
  mov    (%rax),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0xc8(%rbp)
  mov    -0xd8(%rbp),%rax
  mov    %rax,-0xc0(%rbp)
  mov    -0x158(%rbp),%rax
  mov    %rax,-0x130(%rbp)
  mov    -0xc8(%rbp),%rax
  imul   -0xc0(%rbp),%rax
  mov    %rax,-0xb8(%rbp)
  mov    -0xc0(%rbp),%rax
  imul   -0xd0(%rbp),%rax
  mov    %rax,-0xc0(%rbp)
  mov    -0xd0(%rbp),%rax
  imul   -0x130(%rbp),%rax
  mov    %rax,-0xb0(%rbp)
  mov    -0x130(%rbp),%rax
  imul   -0xc8(%rbp),%rax
  mov    %rax,-0x130(%rbp)
  mov    -0xb8(%rbp),%rdx
  mov    -0xb0(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xb8(%rbp)
  mov    -0xb8(%rbp),%rax
  cmp    -0xb0(%rbp),%rax
  jae    L506
  addq   $0x10000,-0x130(%rbp)
L506:
  mov    -0xb8(%rbp),%rax
  shr    $0x10,%rax
  movzwl %ax,%eax
  add    %rax,-0x130(%rbp)
  mov    -0xb8(%rbp),%rax
  shl    $0x10,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xb0(%rbp)
  mov    -0xc0(%rbp),%rdx
  mov    -0xb0(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xc0(%rbp)
  mov    -0xc0(%rbp),%rax
  cmp    -0xb0(%rbp),%rax
  jae    L381
  addq   $0x1,-0x130(%rbp)
L381:
  mov    -0xc0(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0x130(%rbp),%rax
  mov    %rax,-0x158(%rbp)
  mov    -0x158(%rbp),%rax
  and    $0x80000000,%eax
  test   %rax,%rax
  je     L202
  addq   $0x1,-0x150(%rbp)
L202:
  mov    -0x158(%rbp),%rax
  add    %rax,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x158(%rbp)
  mov    -0xd8(%rbp),%rax
  and    $0x80000000,%eax
  test   %rax,%rax
  je     L178
  addq   $0x1,-0x158(%rbp)
L178:
  mov    -0xd8(%rbp),%rax
  add    %rax,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0x148(%rbp),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x148(%rbp)
  mov    -0x148(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L312
  addq   $0x1,-0x158(%rbp)
  mov    -0x158(%rbp),%rax
  mov    %eax,%eax
  test   %rax,%rax
  jne    L312
  addq   $0x1,-0x150(%rbp)
L312:
  mov    -0x140(%rbp),%rdx
  mov    -0x158(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x140(%rbp)
  mov    -0x140(%rbp),%rax
  cmp    -0x158(%rbp),%rax
  jae    L358
  addq   $0x1,-0x150(%rbp)
L358:
  mov    -0x168(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    -0x148(%rbp),%rax
  mov    %rax,(%rdx)
  movq   $0x0,-0x148(%rbp)
  mov    -0x170(%rbp),%rax
  mov    0x8(%rax),%rax
  mov    %rax,-0x128(%rbp)
  mov    -0x128(%rbp),%rax
  movzwl %ax,%eax
  mov    %rax,-0xa8(%rbp)
  mov    -0x128(%rbp),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0x128(%rbp)
  mov    -0xa8(%rbp),%rax
  imul   -0x128(%rbp),%rax
  mov    %rax,-0xa0(%rbp)
  mov    -0xa8(%rbp),%rax
  imul   %rax,%rax
  mov    %rax,-0xa8(%rbp)
  mov    -0x128(%rbp),%rax
  imul   %rax,%rax
  mov    %rax,-0x128(%rbp)
  mov    -0xa0(%rbp),%rax
  shr    $0xf,%rax
  and    $0x1ffff,%eax
  add    %rax,-0x128(%rbp)
  mov    -0xa0(%rbp),%rax
  shl    $0x11,%rax
  mov    %rax,%rdx
  movabs $0x1fffe0000,%rax
  and    %rdx,%rax
  mov    %rax,-0xa0(%rbp)
  mov    -0xa8(%rbp),%rdx
  mov    -0xa0(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xa8(%rbp)
  mov    -0xa8(%rbp),%rax
  cmp    -0xa0(%rbp),%rax
  jae    L22
  addq   $0x1,-0x128(%rbp)
L22:
  mov    -0xa8(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0x128(%rbp),%rax
  mov    %rax,-0x158(%rbp)
  mov    -0x140(%rbp),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x140(%rbp)
  mov    -0x140(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L44
  addq   $0x1,-0x158(%rbp)
L44:
  mov    -0x150(%rbp),%rdx
  mov    -0x158(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x150(%rbp)
  mov    -0x150(%rbp),%rax
  cmp    -0x158(%rbp),%rax
  jae    L238
  addq   $0x1,-0x148(%rbp)
L238:
  mov    -0x170(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  and    $0xffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0x158(%rbp)
  mov    -0x170(%rbp),%rax
  mov    (%rax),%rax
  and    $0xffff,%eax
  mov    %rax,-0xd0(%rbp)
  mov    -0x170(%rbp),%rax
  mov    (%rax),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0xc8(%rbp)
  mov    -0xd8(%rbp),%rax
  mov    %rax,-0x98(%rbp)
  mov    -0x158(%rbp),%rax
  mov    %rax,-0x120(%rbp)
  mov    -0xc8(%rbp),%rax
  imul   -0x98(%rbp),%rax
  mov    %rax,-0x90(%rbp)
  mov    -0x98(%rbp),%rax
  imul   -0xd0(%rbp),%rax
  mov    %rax,-0x98(%rbp)
  mov    -0xd0(%rbp),%rax
  imul   -0x120(%rbp),%rax
  mov    %rax,-0x88(%rbp)
  mov    -0x120(%rbp),%rax
  imul   -0xc8(%rbp),%rax
  mov    %rax,-0x120(%rbp)
  mov    -0x90(%rbp),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x90(%rbp)
  mov    -0x90(%rbp),%rax
  cmp    -0x88(%rbp),%rax
  jae    L166
  addq   $0x10000,-0x120(%rbp)
L166:
  mov    -0x90(%rbp),%rax
  shr    $0x10,%rax
  movzwl %ax,%eax
  add    %rax,-0x120(%rbp)
  mov    -0x90(%rbp),%rax
  shl    $0x10,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x88(%rbp)
  mov    -0x98(%rbp),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x98(%rbp)
  mov    -0x98(%rbp),%rax
  cmp    -0x88(%rbp),%rax
  jae    L97
  addq   $0x1,-0x120(%rbp)
L97:
  mov    -0x98(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0x120(%rbp),%rax
  mov    %rax,-0x158(%rbp)
  mov    -0x158(%rbp),%rax
  and    $0x80000000,%eax
  test   %rax,%rax
  je     L62
  addq   $0x1,-0x148(%rbp)
L62:
  mov    -0x158(%rbp),%rax
  add    %rax,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x158(%rbp)
  mov    -0xd8(%rbp),%rax
  and    $0x80000000,%eax
  test   %rax,%rax
  je     L175
  addq   $0x1,-0x158(%rbp)
L175:
  mov    -0xd8(%rbp),%rax
  add    %rax,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0x140(%rbp),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x140(%rbp)
  mov    -0x140(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L256
  addq   $0x1,-0x158(%rbp)
  mov    -0x158(%rbp),%rax
  mov    %eax,%eax
  test   %rax,%rax
  jne    L256
  addq   $0x1,-0x148(%rbp)
L256:
  mov    -0x150(%rbp),%rdx
  mov    -0x158(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x150(%rbp)
  mov    -0x150(%rbp),%rax
  cmp    -0x158(%rbp),%rax
  jae    L465
  addq   $0x1,-0x148(%rbp)
L465:
  mov    -0x168(%rbp),%rax
  lea    0x10(%rax),%rdx
  mov    -0x140(%rbp),%rax
  mov    %rax,(%rdx)
  movq   $0x0,-0x140(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  and    $0xffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0x158(%rbp)
  mov    -0x170(%rbp),%rax
  mov    (%rax),%rax
  and    $0xffff,%eax
  mov    %rax,-0xd0(%rbp)
  mov    -0x170(%rbp),%rax
  mov    (%rax),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0xc8(%rbp)
  mov    -0xd8(%rbp),%rax
  mov    %rax,-0x80(%rbp)
  mov    -0x158(%rbp),%rax
  mov    %rax,-0x118(%rbp)
  mov    -0xc8(%rbp),%rax
  imul   -0x80(%rbp),%rax
  mov    %rax,-0x78(%rbp)
  mov    -0x80(%rbp),%rax
  imul   -0xd0(%rbp),%rax
  mov    %rax,-0x80(%rbp)
  mov    -0xd0(%rbp),%rax
  imul   -0x118(%rbp),%rax
  mov    %rax,-0x70(%rbp)
  mov    -0x118(%rbp),%rax
  imul   -0xc8(%rbp),%rax
  mov    %rax,-0x118(%rbp)
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x78(%rbp)
  mov    -0x78(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jae    L287
  addq   $0x10000,-0x118(%rbp)
L287:
  mov    -0x78(%rbp),%rax
  shr    $0x10,%rax
  movzwl %ax,%eax
  add    %rax,-0x118(%rbp)
  mov    -0x78(%rbp),%rax
  shl    $0x10,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x70(%rbp)
  mov    -0x80(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x80(%rbp)
  mov    -0x80(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jae    L322
  addq   $0x1,-0x118(%rbp)
L322:
  mov    -0x80(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0x118(%rbp),%rax
  mov    %rax,-0x158(%rbp)
  mov    -0x158(%rbp),%rax
  and    $0x80000000,%eax
  test   %rax,%rax
  je     L159
  addq   $0x1,-0x140(%rbp)
L159:
  mov    -0x158(%rbp),%rax
  add    %rax,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x158(%rbp)
  mov    -0xd8(%rbp),%rax
  and    $0x80000000,%eax
  test   %rax,%rax
  je     L476
  addq   $0x1,-0x158(%rbp)
L476:
  mov    -0xd8(%rbp),%rax
  add    %rax,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0x150(%rbp),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x150(%rbp)
  mov    -0x150(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L527
  addq   $0x1,-0x158(%rbp)
  mov    -0x158(%rbp),%rax
  mov    %eax,%eax
  test   %rax,%rax
  jne    L527
  addq   $0x1,-0x140(%rbp)
L527:
  mov    -0x148(%rbp),%rdx
  mov    -0x158(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x148(%rbp)
  mov    -0x148(%rbp),%rax
  cmp    -0x158(%rbp),%rax
  jae    L522
  addq   $0x1,-0x140(%rbp)
L522:
  mov    -0x170(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  and    $0xffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0x158(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  and    $0xffff,%eax
  mov    %rax,-0xd0(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0xc8(%rbp)
  mov    -0xd8(%rbp),%rax
  mov    %rax,-0x68(%rbp)
  mov    -0x158(%rbp),%rax
  mov    %rax,-0x110(%rbp)
  mov    -0xc8(%rbp),%rax
  imul   -0x68(%rbp),%rax
  mov    %rax,-0x60(%rbp)
  mov    -0x68(%rbp),%rax
  imul   -0xd0(%rbp),%rax
  mov    %rax,-0x68(%rbp)
  mov    -0xd0(%rbp),%rax
  imul   -0x110(%rbp),%rax
  mov    %rax,-0x58(%rbp)
  mov    -0x110(%rbp),%rax
  imul   -0xc8(%rbp),%rax
  mov    %rax,-0x110(%rbp)
  mov    -0x60(%rbp),%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x60(%rbp)
  mov    -0x60(%rbp),%rax
  cmp    -0x58(%rbp),%rax
  jae    L124
  addq   $0x10000,-0x110(%rbp)
L124:
  mov    -0x60(%rbp),%rax
  shr    $0x10,%rax
  movzwl %ax,%eax
  add    %rax,-0x110(%rbp)
  mov    -0x60(%rbp),%rax
  shl    $0x10,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x58(%rbp)
  mov    -0x68(%rbp),%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x68(%rbp)
  mov    -0x68(%rbp),%rax
  cmp    -0x58(%rbp),%rax
  jae    L12
  addq   $0x1,-0x110(%rbp)
L12:
  mov    -0x68(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0x110(%rbp),%rax
  mov    %rax,-0x158(%rbp)
  mov    -0x158(%rbp),%rax
  and    $0x80000000,%eax
  test   %rax,%rax
  je     L431
  addq   $0x1,-0x140(%rbp)
L431:
  mov    -0x158(%rbp),%rax
  add    %rax,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x158(%rbp)
  mov    -0xd8(%rbp),%rax
  and    $0x80000000,%eax
  test   %rax,%rax
  je     L416
  addq   $0x1,-0x158(%rbp)
L416:
  mov    -0xd8(%rbp),%rax
  add    %rax,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0x150(%rbp),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x150(%rbp)
  mov    -0x150(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L132
  addq   $0x1,-0x158(%rbp)
  mov    -0x158(%rbp),%rax
  mov    %eax,%eax
  test   %rax,%rax
  jne    L132
  addq   $0x1,-0x140(%rbp)
L132:
  mov    -0x148(%rbp),%rdx
  mov    -0x158(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x148(%rbp)
  mov    -0x148(%rbp),%rax
  cmp    -0x158(%rbp),%rax
  jae    L152
  addq   $0x1,-0x140(%rbp)
L152:
  mov    -0x168(%rbp),%rax
  lea    0x18(%rax),%rdx
  mov    -0x150(%rbp),%rax
  mov    %rax,(%rdx)
  movq   $0x0,-0x150(%rbp)
  mov    -0x170(%rbp),%rax
  mov    0x10(%rax),%rax
  mov    %rax,-0x108(%rbp)
  mov    -0x108(%rbp),%rax
  movzwl %ax,%eax
  mov    %rax,-0x50(%rbp)
  mov    -0x108(%rbp),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0x108(%rbp)
  mov    -0x50(%rbp),%rax
  imul   -0x108(%rbp),%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x50(%rbp),%rax
  imul   %rax,%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x108(%rbp),%rax
  imul   %rax,%rax
  mov    %rax,-0x108(%rbp)
  mov    -0x48(%rbp),%rax
  shr    $0xf,%rax
  and    $0x1ffff,%eax
  add    %rax,-0x108(%rbp)
  mov    -0x48(%rbp),%rax
  shl    $0x11,%rax
  mov    %rax,%rdx
  movabs $0x1fffe0000,%rax
  and    %rdx,%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x50(%rbp),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  cmp    -0x48(%rbp),%rax
  jae    L236
  addq   $0x1,-0x108(%rbp)
L236:
  mov    -0x50(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0x108(%rbp),%rax
  mov    %rax,-0x158(%rbp)
  mov    -0x148(%rbp),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x148(%rbp)
  mov    -0x148(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L290
  addq   $0x1,-0x158(%rbp)
L290:
  mov    -0x140(%rbp),%rdx
  mov    -0x158(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x140(%rbp)
  mov    -0x140(%rbp),%rax
  cmp    -0x158(%rbp),%rax
  jae    L32
  addq   $0x1,-0x150(%rbp)
L32:
  mov    -0x170(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  and    $0xffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0x158(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  and    $0xffff,%eax
  mov    %rax,-0xd0(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0xc8(%rbp)
  mov    -0xd8(%rbp),%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x158(%rbp),%rax
  mov    %rax,-0x100(%rbp)
  mov    -0xc8(%rbp),%rax
  imul   -0x40(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x40(%rbp),%rax
  imul   -0xd0(%rbp),%rax
  mov    %rax,-0x40(%rbp)
  mov    -0xd0(%rbp),%rax
  imul   -0x100(%rbp),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x100(%rbp),%rax
  imul   -0xc8(%rbp),%rax
  mov    %rax,-0x100(%rbp)
  mov    -0x38(%rbp),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  cmp    -0x30(%rbp),%rax
  jae    L434
  addq   $0x10000,-0x100(%rbp)
L434:
  mov    -0x38(%rbp),%rax
  shr    $0x10,%rax
  movzwl %ax,%eax
  add    %rax,-0x100(%rbp)
  mov    -0x38(%rbp),%rax
  shl    $0x10,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x30(%rbp)
  mov    -0x40(%rbp),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  cmp    -0x30(%rbp),%rax
  jae    L396
  addq   $0x1,-0x100(%rbp)
L396:
  mov    -0x40(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0x100(%rbp),%rax
  mov    %rax,-0x158(%rbp)
  mov    -0x158(%rbp),%rax
  and    $0x80000000,%eax
  test   %rax,%rax
  je     L453
  addq   $0x1,-0x150(%rbp)
L453:
  mov    -0x158(%rbp),%rax
  add    %rax,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x158(%rbp)
  mov    -0xd8(%rbp),%rax
  and    $0x80000000,%eax
  test   %rax,%rax
  je     L400
  addq   $0x1,-0x158(%rbp)
L400:
  mov    -0xd8(%rbp),%rax
  add    %rax,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0x148(%rbp),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x148(%rbp)
  mov    -0x148(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L389
  addq   $0x1,-0x158(%rbp)
  mov    -0x158(%rbp),%rax
  mov    %eax,%eax
  test   %rax,%rax
  jne    L389
  addq   $0x1,-0x150(%rbp)
L389:
  mov    -0x140(%rbp),%rdx
  mov    -0x158(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x140(%rbp)
  mov    -0x140(%rbp),%rax
  cmp    -0x158(%rbp),%rax
  jae    L153
  addq   $0x1,-0x150(%rbp)
L153:
  mov    -0x168(%rbp),%rax
  lea    0x20(%rax),%rdx
  mov    -0x148(%rbp),%rax
  mov    %rax,(%rdx)
  movq   $0x0,-0x148(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  and    $0xffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0x158(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  and    $0xffff,%eax
  mov    %rax,-0xd0(%rbp)
  mov    -0x170(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0xc8(%rbp)
  mov    -0xd8(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x158(%rbp),%rax
  mov    %rax,-0xf8(%rbp)
  mov    -0xc8(%rbp),%rax
  imul   -0x28(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x28(%rbp),%rax
  imul   -0xd0(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0xd0(%rbp),%rax
  imul   -0xf8(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0xf8(%rbp),%rax
  imul   -0xc8(%rbp),%rax
  mov    %rax,-0xf8(%rbp)
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jae    L302
  addq   $0x10000,-0xf8(%rbp)
L302:
  mov    -0x20(%rbp),%rax
  shr    $0x10,%rax
  movzwl %ax,%eax
  add    %rax,-0xf8(%rbp)
  mov    -0x20(%rbp),%rax
  shl    $0x10,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x18(%rbp)
  mov    -0x28(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jae    L104
  addq   $0x1,-0xf8(%rbp)
L104:
  mov    -0x28(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0xf8(%rbp),%rax
  mov    %rax,-0x158(%rbp)
  mov    -0x158(%rbp),%rax
  and    $0x80000000,%eax
  test   %rax,%rax
  je     L89
  addq   $0x1,-0x148(%rbp)
L89:
  mov    -0x158(%rbp),%rax
  add    %rax,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x158(%rbp)
  mov    -0xd8(%rbp),%rax
  and    $0x80000000,%eax
  test   %rax,%rax
  je     L121
  addq   $0x1,-0x158(%rbp)
L121:
  mov    -0xd8(%rbp),%rax
  add    %rax,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0x140(%rbp),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x140(%rbp)
  mov    -0x140(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L16
  addq   $0x1,-0x158(%rbp)
  mov    -0x158(%rbp),%rax
  mov    %eax,%eax
  test   %rax,%rax
  jne    L16
  addq   $0x1,-0x148(%rbp)
L16:
  mov    -0x150(%rbp),%rdx
  mov    -0x158(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x150(%rbp)
  mov    -0x150(%rbp),%rax
  cmp    -0x158(%rbp),%rax
  jae    L298
  addq   $0x1,-0x148(%rbp)
L298:
  mov    -0x168(%rbp),%rax
  lea    0x28(%rax),%rdx
  mov    -0x140(%rbp),%rax
  mov    %rax,(%rdx)
  movq   $0x0,-0x140(%rbp)
  mov    -0x170(%rbp),%rax
  mov    0x18(%rax),%rax
  mov    %rax,-0xf0(%rbp)
  mov    -0xf0(%rbp),%rax
  movzwl %ax,%eax
  mov    %rax,-0x10(%rbp)
  mov    -0xf0(%rbp),%rax
  shr    $0x10,%rax
  and    $0xffff,%eax
  mov    %rax,-0xf0(%rbp)
  mov    -0x10(%rbp),%rax
  imul   -0xf0(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x10(%rbp),%rax
  imul   %rax,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0xf0(%rbp),%rax
  imul   %rax,%rax
  mov    %rax,-0xf0(%rbp)
  mov    -0x8(%rbp),%rax
  shr    $0xf,%rax
  and    $0x1ffff,%eax
  add    %rax,-0xf0(%rbp)
  mov    -0x8(%rbp),%rax
  shl    $0x11,%rax
  mov    %rax,%rdx
  movabs $0x1fffe0000,%rax
  and    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x10(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jae    L428
  addq   $0x1,-0xf0(%rbp)
L428:
  mov    -0x10(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0xf0(%rbp),%rax
  mov    %rax,-0x158(%rbp)
  mov    -0x150(%rbp),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x150(%rbp)
  mov    -0x150(%rbp),%rax
  cmp    -0xd8(%rbp),%rax
  jae    L508
  addq   $0x1,-0x158(%rbp)
L508:
  mov    -0x148(%rbp),%rdx
  mov    -0x158(%rbp),%rax
  add    %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0x148(%rbp)
  mov    -0x148(%rbp),%rax
  cmp    -0x158(%rbp),%rax
  jae    L194
  addq   $0x1,-0x140(%rbp)
L194:
  mov    -0x168(%rbp),%rax
  lea    0x30(%rax),%rdx
  mov    -0x150(%rbp),%rax
  mov    %rax,(%rdx)
  mov    -0x168(%rbp),%rax
  lea    0x38(%rax),%rdx
  mov    -0x148(%rbp),%rax
  mov    %rax,(%rdx)
  nop
  leave
  ret
```

assistant: ```c
void bn_sqr_comba4(unsigned long *r, unsigned long *a) {
  unsigned long bl, bh;
  unsigned long t1, t2;
  unsigned long c1, c2, c3;
  c1 = 0;
  c2 = 0;
  c3 = 0;
  {
    unsigned long l, h, m;
    h = ((a)[0]);
    l = ((h) & (0xffff));
    h = (((h) >> 16) & (0xffff));
    m = (l) * (h);
    l *= l;
    h *= h;
    h += (m & (0xffff8000L)) >> (16 - 1);
    m = (m & (0xffff)) << (16 + 1);
    l = (l + m) & (0xffffffffL);
    if (l < m)
      h++;
    (t1) = l;
    (t2) = h;
  };
  c1 = (c1 + t1) & (0xffffffffL);
  if ((c1) < t1)
    t2++;
  c2 = (c2 + t2) & (0xffffffffL);
  if ((c2) < t2)
    c3++;
  ;
  r[0] = c1;
  c1 = 0;
  t1 = (((a)[1]) & (0xffff));
  t2 = ((((a)[1]) >> 16) & (0xffff));
  bl = (((a)[0]) & (0xffff));
  bh = ((((a)[0]) >> 16) & (0xffff));
  {
    unsigned long m, m1, lt, ht;
    lt = t1;
    ht = t2;
    m = (bh) * (lt);
    lt = (bl) * (lt);
    m1 = (bl) * (ht);
    ht = (bh) * (ht);
    m = (m + m1) & (0xffffffffL);
    if (m < m1)
      ht += ((unsigned long)((1L) & (0xffff)) << 16);
    ht += (((m) >> 16) & (0xffff));
    m1 = ((unsigned long)((m) & (0xffff)) << 16);
    lt = (lt + m1) & (0xffffffffL);
    if (lt < m1)
      ht++;
    (t1) = lt;
    (t2) = ht;
  };
  if (t2 & (0x80000000L))
    c1++;
  t2 = (t2 + t2) & (0xffffffffL);
  if (t1 & (0x80000000L))
    t2++;
  t1 = (t1 + t1) & (0xffffffffL);
  c2 = (c2 + t1) & (0xffffffffL);
  if ((c2 < t1) && (((++t2) & (0xffffffffL)) == 0))
    c1++;
  c3 = (c3 + t2) & (0xffffffffL);
  if ((c3) < t2)
    c1++;
  ;
  r[1] = c2;
  c2 = 0;
  {
    unsigned long l, h, m;
    h = ((a)[1]);
    l = ((h) & (0xffff));
    h = (((h) >> 16) & (0xffff));
    m = (l) * (h);
    l *= l;
    h *= h;
    h += (m & (0xffff8000L)) >> (16 - 1);
    m = (m & (0xffff)) << (16 + 1);
    l = (l + m) & (0xffffffffL);
    if (l < m)
      h++;
    (t1) = l;
    (t2) = h;
  };
  c3 = (c3 + t1) & (0xffffffffL);
  if ((c3) < t1)
    t2++;
  c1 = (c1 + t2) & (0xffffffffL);
  if ((c1) < t2)
    c2++;
  ;
  t1 = (((a)[2]) & (0xffff));
  t2 = ((((a)[2]) >> 16) & (0xffff));
  bl = (((a)[0]) & (0xffff));
  bh = ((((a)[0]) >> 16) & (0xffff));
  {
    unsigned long m, m1, lt, ht;
    lt = t1;
    ht = t2;
    m = (bh) * (lt);
    lt = (bl) * (lt);
    m1 = (bl) * (ht);
    ht = (bh) * (ht);
    m = (m + m1) & (0xffffffffL);
    if (m < m1)
      ht += ((unsigned long)((1L) & (0xffff)) << 16);
    ht += (((m) >> 16) & (0xffff));
    m1 = ((unsigned long)((m) & (0xffff)) << 16);
    lt = (lt + m1) & (0xffffffffL);
    if (lt < m1)
      ht++;
    (t1) = lt;
    (t2) = ht;
  };
  if (t2 & (0x80000000L))
    c2++;
  t2 = (t2 + t2) & (0xffffffffL);
  if (t1 & (0x80000000L))
    t2++;
  t1 = (t1 + t1) & (0xffffffffL);
  c3 = (c3 + t1) & (0xffffffffL);
  if ((c3 < t1) && (((++t2) & (0xffffffffL)) == 0))
    c2++;
  c1 = (c1 + t2) & (0xffffffffL);
  if ((c1) < t2)
    c2++;
  ;
  r[2] = c3;
  c3 = 0;
  t1 = (((a)[3]) & (0xffff));
  t2 = ((((a)[3]) >> 16) & (0xffff));
  bl = (((a)[0]) & (0xffff));
  bh = ((((a)[0]) >> 16) & (0xffff));
  {
    unsigned long m, m1, lt, ht;
    lt = t1;
    ht = t2;
    m = (bh) * (lt);
    lt = (bl) * (lt);
    m1 = (bl) * (ht);
    ht = (bh) * (ht);
    m = (m + m1) & (0xffffffffL);
    if (m < m1)
      ht += ((unsigned long)((1L) & (0xffff)) << 16);
    ht += (((m) >> 16) & (0xffff));
    m1 = ((unsigned long)((m) & (0xffff)) << 16);
    lt = (lt + m1) & (0xffffffffL);
    if (lt < m1)
      ht++;
    (t1) = lt;
    (t2) = ht;
  };
  if (t2 & (0x80000000L))
    c3++;
  t2 = (t2 + t2) & (0xffffffffL);
  if (t1 & (0x80000000L))
    t2++;
  t1 = (t1 + t1) & (0xffffffffL);
  c1 = (c1 + t1) & (0xffffffffL);
  if ((c1 < t1) && (((++t2) & (0xffffffffL)) == 0))
    c3++;
  c2 = (c2 + t2) & (0xffffffffL);
  if ((c2) < t2)
    c3++;
  ;
  t1 = (((a)[2]) & (0xffff));
  t2 = ((((a)[2]) >> 16) & (0xffff));
  bl = (((a)[1]) & (0xffff));
  bh = ((((a)[1]) >> 16) & (0xffff));
  {
    unsigned long m, m1, lt, ht;
    lt = t1;
    ht = t2;
    m = (bh) * (lt);
    lt = (bl) * (lt);
    m1 = (bl) * (ht);
    ht = (bh) * (ht);
    m = (m + m1) & (0xffffffffL);
    if (m < m1)
      ht += ((unsigned long)((1L) & (0xffff)) << 16);
    ht += (((m) >> 16) & (0xffff));
    m1 = ((unsigned long)((m) & (0xffff)) << 16);
    lt = (lt + m1) & (0xffffffffL);
    if (lt < m1)
      ht++;
    (t1) = lt;
    (t2) = ht;
  };
  if (t2 & (0x80000000L))
    c3++;
  t2 = (t2 + t2) & (0xffffffffL);
  if (t1 & (0x80000000L))
    t2++;
  t1 = (t1 + t1) & (0xffffffffL);
  c1 = (c1 + t1) & (0xffffffffL);
  if ((c1 < t1) && (((++t2) & (0xffffffffL)) == 0))
    c3++;
  c2 = (c2 + t2) & (0xffffffffL);
  if ((c2) < t2)
    c3++;
  ;
  r[3] = c1;
  c1 = 0;
  {
    unsigned long l, h, m;
    h = ((a)[2]);
    l = ((h) & (0xffff));
    h = (((h) >> 16) & (0xffff));
    m = (l) * (h);
    l *= l;
    h *= h;
    h += (m & (0xffff8000L)) >> (16 - 1);
    m = (m & (0xffff)) << (16 + 1);
    l = (l + m) & (0xffffffffL);
    if (l < m)
      h++;
    (t1) = l;
    (t2) = h;
  };
  c2 = (c2 + t1) & (0xffffffffL);
  if ((c2) < t1)
    t2++;
  c3 = (c3 + t2) & (0xffffffffL);
  if ((c3) < t2)
    c1++;
  ;
  t1 = (((a)[3]) & (0xffff));
  t2 = ((((a)[3]) >> 16) & (0xffff));
  bl = (((a)[1]) & (0xffff));
  bh = ((((a)[1]) >> 16) & (0xffff));
  {
    unsigned long m, m1, lt, ht;
    lt = t1;
    ht = t2;
    m = (bh) * (lt);
    lt = (bl) * (lt);
    m1 = (bl) * (ht);
    ht = (bh) * (ht);
    m = (m + m1) & (0xffffffffL);
    if (m < m1)
      ht += ((unsigned long)((1L) & (0xffff)) << 16);
    ht += (((m) >> 16) & (0xffff));
    m1 = ((unsigned long)((m) & (0xffff)) << 16);
    lt = (lt + m1) & (0xffffffffL);
    if (lt < m1)
      ht++;
    (t1) = lt;
    (t2) = ht;
  };
  if (t2 & (0x80000000L))
    c1++;
  t2 = (t2 + t2) & (0xffffffffL);
  if (t1 & (0x80000000L))
    t2++;
  t1 = (t1 + t1) & (0xffffffffL);
  c2 = (c2 + t1) & (0xffffffffL);
  if ((c2 < t1) && (((++t2) & (0xffffffffL)) == 0))
    c1++;
  c3 = (c3 + t2) & (0xffffffffL);
  if ((c3) < t2)
    c1++;
  ;
  r[4] = c2;
  c2 = 0;
  t1 = (((a)[3]) & (0xffff));
  t2 = ((((a)[3]) >> 16) & (0xffff));
  bl = (((a)[2]) & (0xffff));
  bh = ((((a)[2]) >> 16) & (0xffff));
  {
    unsigned long m, m1, lt, ht;
    lt = t1;
    ht = t2;
    m = (bh) * (lt);
    lt = (bl) * (lt);
    m1 = (bl) * (ht);
    ht = (bh) * (ht);
    m = (m + m1) & (0xffffffffL);
    if (m < m1)
      ht += ((unsigned long)((1L) & (0xffff)) << 16);
    ht += (((m) >> 16) & (0xffff));
    m1 = ((unsigned long)((m) & (0xffff)) << 16);
    lt = (lt + m1) & (0xffffffffL);
    if (lt < m1)
      ht++;
    (t1) = lt;
    (t2) = ht;
  };
  if (t2 & (0x80000000L))
    c2++;
  t2 = (t2 + t2) & (0xffffffffL);
  if (t1 & (0x80000000L))
    t2++;
  t1 = (t1 + t1) & (0xffffffffL);
  c3 = (c3 + t1) & (0xffffffffL);
  if ((c3 < t1) && (((++t2) & (0xffffffffL)) == 0))
    c2++;
  c1 = (c1 + t2) & (0xffffffffL);
  if ((c1) < t2)
    c2++;
  ;
  r[5] = c3;
  c3 = 0;
  {
    unsigned long l, h, m;
    h = ((a)[3]);
    l = ((h) & (0xffff));
    h = (((h) >> 16) & (0xffff));
    m = (l) * (h);
    l *= l;
    h *= h;
    h += (m & (0xffff8000L)) >> (16 - 1);
    m = (m & (0xffff)) << (16 + 1);
    l = (l + m) & (0xffffffffL);
    if (l < m)
      h++;
    (t1) = l;
    (t2) = h;
  };
  c1 = (c1 + t1) & (0xffffffffL);
  if ((c1) < t1)
    t2++;
  c2 = (c2 + t2) & (0xffffffffL);
  if ((c2) < t2)
    c3++;
  ;
  r[6] = c1;
  r[7] = c2;
}
```