user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<mp_toom_mul>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x140,%rsp
  mov    %rdi,-0x118(%rbp)
  mov    %rsi,-0x120(%rbp)
  mov    %rdx,-0x128(%rbp)
  mov    %rcx,-0x130(%rbp)
  mov    %r8,-0x138(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x130(%rbp),%rdx
  mov    -0x138(%rbp),%rax
  add    %rdx,%rax
  add    $0x4,%rax
  movabs $0xaaaaaaaaaaaaaaab,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x2,%rax
  mov    %rax,-0xf0(%rbp)
  mov    -0xf0(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x130(%rbp),%rax
  sub    %rdx,%rax
  mov    %rax,-0xe8(%rbp)
  mov    -0xf0(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x138(%rbp),%rax
  sub    %rdx,%rax
  mov    %rax,-0xe0(%rbp)
  mov    -0xf0(%rbp),%rax
  add    $0x2,%rax
  add    %eax,%eax
  mov    %eax,%edi
  call   <mp_malloc@plt>
  mov    %rax,-0x40(%rbp)
  mov    -0xf0(%rbp),%rax
  add    $0x2,%rax
  add    %eax,%eax
  mov    %eax,%edi
  call   <mp_malloc@plt>
  mov    %rax,-0x20(%rbp)
  mov    -0xf0(%rbp),%rax
  add    $0x1,%rax
  add    %eax,%eax
  mov    %eax,%edi
  call   <mp_malloc@plt>
  mov    %rax,-0x38(%rbp)
  mov    -0xf0(%rbp),%rax
  add    $0x1,%rax
  add    %eax,%eax
  mov    %eax,%edi
  call   <mp_malloc@plt>
  mov    %rax,-0x18(%rbp)
  mov    -0xf0(%rbp),%rax
  add    $0x2,%rax
  add    %eax,%eax
  mov    %eax,%edi
  call   <mp_malloc@plt>
  mov    %rax,-0x30(%rbp)
  mov    -0xf0(%rbp),%rax
  add    $0x2,%rax
  add    %eax,%eax
  mov    %eax,%edi
  call   <mp_malloc@plt>
  mov    %rax,-0x10(%rbp)
  mov    -0xf0(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x120(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0x38(%rbp),%rax
  mov    -0xf0(%rbp),%rdx
  mov    $0x1,%ecx
  mov    %rax,%rdi
  call   <mp_lshift@plt>
  mov    %rax,-0x78(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0xf0(%rbp),%rdx
  mov    -0x120(%rbp),%rsi
  mov    $0x2,%ecx
  mov    %rax,%rdi
  call   <mp_lshift@plt>
  mov    %rax,-0x80(%rbp)
  mov    -0x78(%rbp),%rcx
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  mov    -0x38(%rbp),%rdx
  mov    -0x40(%rbp),%rsi
  mov    -0x40(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdi,%rcx
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x80(%rbp)
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  mov    -0xf0(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x120(%rbp),%rax
  add    %rax,%rdx
  mov    -0x40(%rbp),%rsi
  mov    -0x40(%rbp),%rax
  mov    -0xe8(%rbp),%rcx
  mov    %rcx,%r8
  mov    %rdi,%rcx
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x80(%rbp)
  mov    -0xf0(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x120(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0x30(%rbp),%rax
  mov    -0xe8(%rbp),%rdx
  mov    $0x2,%ecx
  mov    %rax,%rdi
  call   <mp_lshift@plt>
  mov    %rax,-0x70(%rbp)
  mov    -0x78(%rbp),%rcx
  mov    -0x70(%rbp),%rax
  mov    %rax,%rdi
  mov    -0x38(%rbp),%rdx
  mov    -0x30(%rbp),%rsi
  mov    -0x30(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdi,%rcx
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x70(%rbp)
  mov    -0x70(%rbp),%rax
  mov    %rax,%rdi
  mov    -0x30(%rbp),%rsi
  mov    -0x30(%rbp),%rax
  mov    -0xf0(%rbp),%rcx
  mov    -0x120(%rbp),%rdx
  mov    %rcx,%r8
  mov    %rdi,%rcx
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x70(%rbp)
  mov    -0xf0(%rbp),%rdx
  mov    -0xf0(%rbp),%rax
  lea    (%rax,%rax,1),%rcx
  mov    -0x120(%rbp),%rax
  lea    (%rcx,%rax,1),%rdi
  mov    -0x38(%rbp),%rax
  mov    -0xf0(%rbp),%rcx
  mov    -0x120(%rbp),%rsi
  mov    %rcx,%r8
  mov    %rdx,%rcx
  mov    %rdi,%rdx
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x78(%rbp)
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  mov    -0xf0(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x120(%rbp),%rax
  add    %rax,%rdx
  mov    -0x38(%rbp),%rsi
  mov    -0x38(%rbp),%rax
  mov    -0xe8(%rbp),%rcx
  mov    %rcx,%r8
  mov    %rdi,%rcx
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x78(%rbp)
  mov    -0xf0(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x128(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0x18(%rbp),%rax
  mov    -0xf0(%rbp),%rdx
  mov    $0x1,%ecx
  mov    %rax,%rdi
  call   <mp_lshift@plt>
  mov    %rax,-0x58(%rbp)
  mov    -0x20(%rbp),%rax
  mov    -0xf0(%rbp),%rdx
  mov    -0x128(%rbp),%rsi
  mov    $0x2,%ecx
  mov    %rax,%rdi
  call   <mp_lshift@plt>
  mov    %rax,-0x60(%rbp)
  mov    -0x58(%rbp),%rcx
  mov    -0x60(%rbp),%rax
  mov    %rax,%rdi
  mov    -0x18(%rbp),%rdx
  mov    -0x20(%rbp),%rsi
  mov    -0x20(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdi,%rcx
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x60(%rbp)
  mov    -0x60(%rbp),%rax
  mov    %rax,%rdi
  mov    -0xf0(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x128(%rbp),%rax
  add    %rax,%rdx
  mov    -0x20(%rbp),%rsi
  mov    -0x20(%rbp),%rax
  mov    -0xe0(%rbp),%rcx
  mov    %rcx,%r8
  mov    %rdi,%rcx
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x60(%rbp)
  mov    -0xf0(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x128(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0x10(%rbp),%rax
  mov    -0xe0(%rbp),%rdx
  mov    $0x2,%ecx
  mov    %rax,%rdi
  call   <mp_lshift@plt>
  mov    %rax,-0x50(%rbp)
  mov    -0x58(%rbp),%rcx
  mov    -0x50(%rbp),%rax
  mov    %rax,%rdi
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rsi
  mov    -0x10(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdi,%rcx
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  mov    %rax,%rdi
  mov    -0x10(%rbp),%rsi
  mov    -0x10(%rbp),%rax
  mov    -0xf0(%rbp),%rcx
  mov    -0x128(%rbp),%rdx
  mov    %rcx,%r8
  mov    %rdi,%rcx
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x50(%rbp)
  mov    -0xf0(%rbp),%rdx
  mov    -0xf0(%rbp),%rax
  lea    (%rax,%rax,1),%rcx
  mov    -0x128(%rbp),%rax
  lea    (%rcx,%rax,1),%rdi
  mov    -0x18(%rbp),%rax
  mov    -0xf0(%rbp),%rcx
  mov    -0x128(%rbp),%rsi
  mov    %rcx,%r8
  mov    %rdx,%rcx
  mov    %rdi,%rdx
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x58(%rbp)
  mov    -0x58(%rbp),%rax
  mov    %rax,%rdi
  mov    -0xf0(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x128(%rbp),%rax
  add    %rax,%rdx
  mov    -0x18(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    -0xe0(%rbp),%rcx
  mov    %rcx,%r8
  mov    %rdi,%rcx
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x58(%rbp)
  mov    -0x80(%rbp),%rax
  mov    %eax,%edx
  mov    -0x60(%rbp),%rax
  imul   %edx,%eax
  add    %eax,%eax
  mov    %eax,%esi
  mov    $0x1,%edi
  call   <mp_calloc@plt>
  mov    %rax,-0xd8(%rbp)
  mov    -0x60(%rbp),%rdi
  mov    -0x80(%rbp),%rcx
  mov    -0x20(%rbp),%rdx
  mov    -0x40(%rbp),%rsi
  mov    -0xd8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_mul@plt>
  mov    %rax,-0xd0(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <mp_free@plt>
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <mp_free@plt>
  mov    -0x78(%rbp),%rax
  mov    %eax,%edx
  mov    -0x58(%rbp),%rax
  imul   %edx,%eax
  add    %eax,%eax
  mov    %eax,%esi
  mov    $0x1,%edi
  call   <mp_calloc@plt>
  mov    %rax,-0xc8(%rbp)
  mov    -0x58(%rbp),%rdi
  mov    -0x78(%rbp),%rcx
  mov    -0x18(%rbp),%rdx
  mov    -0x38(%rbp),%rsi
  mov    -0xc8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_mul@plt>
  mov    %rax,-0xc0(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <mp_free@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <mp_free@plt>
  mov    -0x70(%rbp),%rax
  mov    %eax,%edx
  mov    -0x50(%rbp),%rax
  imul   %edx,%eax
  add    %eax,%eax
  mov    %eax,%esi
  mov    $0x1,%edi
  call   <mp_calloc@plt>
  mov    %rax,-0xb8(%rbp)
  mov    -0x50(%rbp),%rdi
  mov    -0x70(%rbp),%rcx
  mov    -0x10(%rbp),%rdx
  mov    -0x30(%rbp),%rsi
  mov    -0xb8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_mul@plt>
  mov    %rax,-0xb0(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <mp_free@plt>
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <mp_free@plt>
  mov    -0xf0(%rbp),%rax
  shl    $0x2,%eax
  mov    %eax,%esi
  mov    $0x1,%edi
  call   <mp_calloc@plt>
  mov    %rax,-0xa8(%rbp)
  mov    -0xf0(%rbp),%rdi
  mov    -0xf0(%rbp),%rcx
  mov    -0x128(%rbp),%rdx
  mov    -0x120(%rbp),%rsi
  mov    -0xa8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_mul@plt>
  mov    %rax,-0xa0(%rbp)
  mov    -0xe8(%rbp),%rdx
  mov    -0xe0(%rbp),%rax
  add    %rdx,%rax
  add    %eax,%eax
  mov    %eax,%esi
  mov    $0x1,%edi
  call   <mp_calloc@plt>
  mov    %rax,-0x98(%rbp)
  mov    -0xf0(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x128(%rbp),%rax
  lea    (%rdx,%rax,1),%rdi
  mov    -0xf0(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x120(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0xe0(%rbp),%rcx
  mov    -0xe8(%rbp),%rdx
  mov    -0x98(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdx,%rcx
  mov    %rdi,%rdx
  mov    %rax,%rdi
  call   <mp_mul@plt>
  mov    %rax,-0x90(%rbp)
  mov    -0xa0(%rbp),%rdx
  mov    -0xa8(%rbp),%rsi
  mov    -0x118(%rbp),%rax
  mov    $0x4,%ecx
  mov    %rax,%rdi
  call   <mp_lshift@plt>
  mov    %rax,-0x108(%rbp)
  mov    -0x108(%rbp),%rdi
  mov    -0xd0(%rbp),%rcx
  mov    -0x118(%rbp),%rdx
  mov    -0xd8(%rbp),%rsi
  mov    -0xd8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_sub@plt>
  mov    %rax,-0xd0(%rbp)
  mov    -0x90(%rbp),%rdi
  mov    -0xd0(%rbp),%rcx
  mov    -0x98(%rbp),%rdx
  mov    -0xd8(%rbp),%rsi
  mov    -0xd8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_sub@plt>
  mov    %rax,-0xd0(%rbp)
  mov    -0xa0(%rbp),%rdi
  mov    -0xc0(%rbp),%rcx
  mov    -0xa8(%rbp),%rdx
  mov    -0xc8(%rbp),%rsi
  mov    -0xc8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_sub@plt>
  mov    %rax,-0xc0(%rbp)
  mov    -0x90(%rbp),%rdi
  mov    -0xc0(%rbp),%rcx
  mov    -0x98(%rbp),%rdx
  mov    -0xc8(%rbp),%rsi
  mov    -0xc8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_sub@plt>
  mov    %rax,-0xc0(%rbp)
  mov    -0xa0(%rbp),%rdi
  mov    -0xb0(%rbp),%rcx
  mov    -0xa8(%rbp),%rdx
  mov    -0xb8(%rbp),%rsi
  mov    -0xb8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_sub@plt>
  mov    %rax,-0xb0(%rbp)
  mov    -0x90(%rbp),%rdx
  mov    -0x98(%rbp),%rsi
  mov    -0x118(%rbp),%rax
  mov    $0x4,%ecx
  mov    %rax,%rdi
  call   <mp_lshift@plt>
  mov    %rax,-0x108(%rbp)
  mov    -0x108(%rbp),%rdi
  mov    -0xb0(%rbp),%rcx
  mov    -0x118(%rbp),%rdx
  mov    -0xb8(%rbp),%rsi
  mov    -0xb8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_sub@plt>
  mov    %rax,-0xb0(%rbp)
  mov    -0xd0(%rbp),%rcx
  mov    -0xb0(%rbp),%rdi
  mov    -0xb8(%rbp),%rdx
  mov    -0xd8(%rbp),%rsi
  mov    -0x118(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x108(%rbp)
  mov    -0x108(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x118(%rbp),%rax
  lea    (%rdx,%rax,1),%rdi
  mov    -0xc0(%rbp),%rdx
  mov    -0xc8(%rbp),%rax
  mov    $0x3,%ecx
  mov    %rax,%rsi
  call   <mp_lshift@plt>
  mov    %rax,-0x88(%rbp)
  mov    -0x108(%rbp),%rdx
  mov    -0x108(%rbp),%rax
  lea    (%rax,%rax,1),%rcx
  mov    -0x118(%rbp),%rax
  lea    (%rcx,%rax,1),%rdi
  mov    -0x88(%rbp),%rcx
  mov    -0x118(%rbp),%rsi
  mov    -0x118(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdx,%rcx
  mov    %rdi,%rdx
  mov    %rax,%rdi
  call   <mp_sub@plt>
  mov    %rax,-0x108(%rbp)
  mov    -0x108(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x118(%rbp),%rax
  lea    (%rdx,%rax,1),%rdi
  mov    -0xc0(%rbp),%rdx
  mov    -0xc8(%rbp),%rax
  mov    $0x1,%ecx
  mov    %rax,%rsi
  call   <mp_lshift@plt>
  mov    %rax,-0x88(%rbp)
  mov    -0x88(%rbp),%rcx
  mov    -0x108(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x118(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0x108(%rbp),%rdi
  mov    -0x118(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_sub@plt>
  mov    %rax,-0x108(%rbp)
  mov    -0xd0(%rbp),%rdx
  mov    -0xd8(%rbp),%rsi
  mov    -0xd8(%rbp),%rax
  mov    $0x1,%ecx
  mov    %rax,%rdi
  call   <mp_rshift@plt>
  mov    %rax,-0xd0(%rbp)
  mov    -0xc0(%rbp),%rdi
  mov    -0xd0(%rbp),%rcx
  mov    -0xc8(%rbp),%rdx
  mov    -0xd8(%rbp),%rsi
  mov    -0xd8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_sub@plt>
  mov    %rax,-0xd0(%rbp)
  mov    -0x108(%rbp),%rdx
  mov    -0x118(%rbp),%rsi
  mov    -0xc8(%rbp),%rax
  mov    $0x1,%ecx
  mov    %rax,%rdi
  call   <mp_rshift@plt>
  mov    %rax,-0xc0(%rbp)
  mov    -0xc0(%rbp),%rdi
  mov    -0xd0(%rbp),%rcx
  mov    -0xc8(%rbp),%rdx
  mov    -0xd8(%rbp),%rsi
  mov    -0xd8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_sub@plt>
  mov    %rax,-0xd0(%rbp)
  mov    -0xd0(%rbp),%rax
  sub    $0x1,%rax
  mov    %rax,-0x100(%rbp)
  mov    -0x100(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  movzwl %ax,%eax
  mov    %rax,-0xf8(%rbp)
  mov    -0xf8(%rbp),%rax
  movabs $0xaaaaaaaaaaaaaaab,%rdx
  mul    %rdx
  shr    %rdx
  mov    -0x100(%rbp),%rax
  lea    (%rax,%rax,1),%rcx
  mov    -0xd8(%rbp),%rax
  add    %rcx,%rax
  mov    %dx,(%rax)
  subq   $0x1,-0x100(%rbp)
  jmp    L35
L26:
  mov    -0xf8(%rbp),%rcx
  movabs $0xaaaaaaaaaaaaaaab,%rdx
  mov    %rcx,%rax
  mul    %rdx
  mov    %rdx,%rax
  shr    %rax
  mov    %rax,%rdx
  add    %rdx,%rdx
  add    %rax,%rdx
  mov    %rcx,%rax
  sub    %rdx,%rax
  mov    %ax,-0x10a(%rbp)
  movzwl -0x10a(%rbp),%eax
  shl    $0x10,%rax
  mov    %rax,%rdx
  mov    -0x100(%rbp),%rax
  lea    (%rax,%rax,1),%rcx
  mov    -0xd8(%rbp),%rax
  add    %rcx,%rax
  movzwl (%rax),%eax
  movzwl %ax,%eax
  add    %rdx,%rax
  mov    %rax,-0xf8(%rbp)
  mov    -0xf8(%rbp),%rax
  movabs $0xaaaaaaaaaaaaaaab,%rdx
  mul    %rdx
  shr    %rdx
  mov    -0x100(%rbp),%rax
  lea    (%rax,%rax,1),%rcx
  mov    -0xd8(%rbp),%rax
  add    %rcx,%rax
  mov    %dx,(%rax)
  subq   $0x1,-0x100(%rbp)
L35:
  cmpq   $0x0,-0x100(%rbp)
  jns    L26
  mov    -0xb0(%rbp),%rdx
  mov    -0xb8(%rbp),%rsi
  mov    -0xb8(%rbp),%rax
  mov    $0x1,%ecx
  mov    %rax,%rdi
  call   <mp_rshift@plt>
  mov    %rax,-0xb0(%rbp)
  mov    -0xd0(%rbp),%rdi
  mov    -0xb0(%rbp),%rcx
  mov    -0xd8(%rbp),%rdx
  mov    -0xb8(%rbp),%rsi
  mov    -0xb8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_sub@plt>
  mov    %rax,-0xb0(%rbp)
  mov    -0x108(%rbp),%rdi
  mov    -0xb0(%rbp),%rcx
  mov    -0x118(%rbp),%rdx
  mov    -0xb8(%rbp),%rsi
  mov    -0xb8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_sub@plt>
  mov    %rax,-0xb0(%rbp)
  mov    -0xb0(%rbp),%rdx
  mov    -0xb8(%rbp),%rsi
  mov    -0xb8(%rbp),%rax
  mov    $0x2,%ecx
  mov    %rax,%rdi
  call   <mp_rshift@plt>
  mov    %rax,-0xb0(%rbp)
  mov    -0x130(%rbp),%rdx
  mov    -0x138(%rbp),%rax
  add    %rdx,%rax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x118(%rbp),%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0xf0(%rbp),%rax
  shl    $0x2,%rax
  mov    %rax,-0x100(%rbp)
  mov    -0x130(%rbp),%rdx
  mov    -0x138(%rbp),%rax
  add    %rdx,%rax
  mov    -0x100(%rbp),%rdx
  sub    %rdx,%rax
  mov    %rax,-0x88(%rbp)
  mov    -0x100(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x118(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0x100(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x118(%rbp),%rax
  lea    (%rdx,%rax,1),%rdi
  mov    -0x90(%rbp),%rcx
  mov    -0x88(%rbp),%rdx
  mov    -0x98(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdx,%rcx
  mov    %rax,%rdx
  call   <mp_add@plt>
  mov    -0x100(%rbp),%rdx
  add    %rdx,%rax
  mov    %rax,-0x108(%rbp)
  mov    -0xf0(%rbp),%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  mov    %rax,-0x100(%rbp)
  mov    -0x108(%rbp),%rax
  sub    -0x100(%rbp),%rax
  mov    %rax,-0x88(%rbp)
  mov    -0x100(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x118(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0x100(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x118(%rbp),%rax
  lea    (%rdx,%rax,1),%rdi
  mov    -0xb0(%rbp),%rcx
  mov    -0x88(%rbp),%rdx
  mov    -0xb8(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdx,%rcx
  mov    %rax,%rdx
  call   <mp_add@plt>
  mov    -0x100(%rbp),%rdx
  add    %rdx,%rax
  mov    %rax,-0x108(%rbp)
  mov    -0xf0(%rbp),%rax
  add    %rax,%rax
  mov    %rax,-0x100(%rbp)
  mov    -0x108(%rbp),%rax
  sub    -0x100(%rbp),%rax
  mov    %rax,-0x88(%rbp)
  mov    -0x100(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x118(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0x100(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x118(%rbp),%rax
  lea    (%rdx,%rax,1),%rdi
  mov    -0xc0(%rbp),%rcx
  mov    -0x88(%rbp),%rdx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdx,%rcx
  mov    %rax,%rdx
  call   <mp_add@plt>
  mov    -0x100(%rbp),%rdx
  add    %rdx,%rax
  mov    %rax,-0x108(%rbp)
  mov    -0xf0(%rbp),%rax
  mov    %rax,-0x100(%rbp)
  mov    -0x108(%rbp),%rax
  sub    -0x100(%rbp),%rax
  mov    %rax,-0x88(%rbp)
  mov    -0x100(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x118(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0x100(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x118(%rbp),%rax
  lea    (%rdx,%rax,1),%rdi
  mov    -0xd0(%rbp),%rcx
  mov    -0x88(%rbp),%rdx
  mov    -0xd8(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdx,%rcx
  mov    %rax,%rdx
  call   <mp_add@plt>
  mov    -0x100(%rbp),%rdx
  add    %rdx,%rax
  mov    %rax,-0x108(%rbp)
  mov    -0xa0(%rbp),%rdi
  mov    -0x108(%rbp),%rcx
  mov    -0xa8(%rbp),%rdx
  mov    -0x118(%rbp),%rsi
  mov    -0x118(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <mp_add@plt>
  mov    %rax,-0x108(%rbp)
  mov    -0x98(%rbp),%rax
  mov    %rax,%rdi
  call   <mp_free@plt>
  mov    -0xb8(%rbp),%rax
  mov    %rax,%rdi
  call   <mp_free@plt>
  mov    -0xc8(%rbp),%rax
  mov    %rax,%rdi
  call   <mp_free@plt>
  mov    -0xd8(%rbp),%rax
  mov    %rax,%rdi
  call   <mp_free@plt>
  mov    -0xa8(%rbp),%rax
  mov    %rax,%rdi
  call   <mp_free@plt>
  cmpq   $0x1,-0x108(%rbp)
  jle    L42
  mov    -0x108(%rbp),%rax
  add    %rax,%rax
  lea    -0x2(%rax),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  test   %ax,%ax
  jne    L42
  subq   $0x1,-0x108(%rbp)
L42:
  mov    -0x108(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L44
  call   <__stack_chk_fail@plt>
L44:
  leave
  ret
```

assistant: ```c
long mp_toom_mul(unsigned short *rop, unsigned short *op1, unsigned short *op2, unsigned long len1, unsigned long len2) {
  long size, xsize, i;
  unsigned long value;
  unsigned short carry;
  unsigned long x;
  unsigned long l1, l2;
  unsigned long al, bl, cl, dl, el, Ul[3], Vl[3];
  unsigned short *a, *b, *c, *d, *e, *U[3], *V[3];
  x = (len1 + len2 + 4) / 6;
  l1 = len1 - (x << 1);
  l2 = len2 - (x << 1);
  U[0] = mp_malloc(sizeof(unsigned short) * (x + 2));
  V[0] = mp_malloc(sizeof(unsigned short) * (x + 2));
  U[1] = mp_malloc(sizeof(unsigned short) * (x + 1));
  V[1] = mp_malloc(sizeof(unsigned short) * (x + 1));
  U[2] = mp_malloc(sizeof(unsigned short) * (x + 2));
  V[2] = mp_malloc(sizeof(unsigned short) * (x + 2));
  Ul[1] = mp_lshift(U[1], op1 + x, x, 1);
  Ul[0] = mp_lshift(U[0], op1, x, 2);
  Ul[0] = mp_add(U[0], U[0], U[1], Ul[0], Ul[1]);
  Ul[0] = mp_add(U[0], U[0], op1 + x + x, Ul[0], l1);
  Ul[2] = mp_lshift(U[2], op1 + x + x, l1, 2);
  Ul[2] = mp_add(U[2], U[2], U[1], Ul[2], Ul[1]);
  Ul[2] = mp_add(U[2], U[2], op1, Ul[2], x);
  Ul[1] = mp_add(U[1], op1, op1 + x, x, x);
  Ul[1] = mp_add(U[1], U[1], op1 + x + x, Ul[1], l1);
  Vl[1] = mp_lshift(V[1], op2 + x, x, 1);
  Vl[0] = mp_lshift(V[0], op2, x, 2);
  Vl[0] = mp_add(V[0], V[0], V[1], Vl[0], Vl[1]);
  Vl[0] = mp_add(V[0], V[0], op2 + x + x, Vl[0], l2);
  Vl[2] = mp_lshift(V[2], op2 + x + x, l2, 2);
  Vl[2] = mp_add(V[2], V[2], V[1], Vl[2], Vl[1]);
  Vl[2] = mp_add(V[2], V[2], op2, Vl[2], x);
  Vl[1] = mp_add(V[1], op2, op2 + x, x, x);
  Vl[1] = mp_add(V[1], V[1], op2 + x + x, Vl[1], l2);
  b = mp_calloc(1, sizeof(unsigned short) * (Ul[0] * Vl[0]));
  bl = mp_mul(b, U[0], V[0], Ul[0], Vl[0]);
  mp_free(U[0]);
  mp_free(V[0]);
  c = mp_calloc(1, sizeof(unsigned short) * (Ul[1] * Vl[1]));
  cl = mp_mul(c, U[1], V[1], Ul[1], Vl[1]);
  mp_free(U[1]);
  mp_free(V[1]);
  d = mp_calloc(1, sizeof(unsigned short) * (Ul[2] * Vl[2]));
  dl = mp_mul(d, U[2], V[2], Ul[2], Vl[2]);
  mp_free(U[2]);
  mp_free(V[2]);
  a = mp_calloc(1, sizeof(unsigned short) * (x + x));
  al = mp_mul(a, op1, op2, x, x);
  e = mp_calloc(1, sizeof(unsigned short) * (l1 + l2));
  el = mp_mul(e, op1 + x + x, op2 + x + x, l1, l2);
  size = mp_lshift(rop, a, al, 4);
  bl = mp_sub(b, b, rop, bl, size);
  bl = mp_sub(b, b, e, bl, el);
  cl = mp_sub(c, c, a, cl, al);
  cl = mp_sub(c, c, e, cl, el);
  dl = mp_sub(d, d, a, dl, al);
  size = mp_lshift(rop, e, el, 4);
  dl = mp_sub(d, d, rop, dl, size);
  size = mp_add(rop, b, d, bl, dl);
  xsize = mp_lshift(rop + size, c, cl, 3);
  size = mp_sub(rop, rop, rop + size, size, xsize);
  xsize = mp_lshift(rop + size, c, cl, 1);
  size = mp_sub(rop, rop + size, rop, xsize, size);
  bl = mp_rshift(b, b, bl, 1);
  bl = mp_sub(b, b, c, bl, cl);
  cl = mp_rshift(c, rop, size, 1);
  bl = mp_sub(b, b, c, bl, cl);
  i = bl - 1;
  value = b[i];
  b[i] = value / 3;
  for (--i; i >= 0; i--) {
    carry = value % 3;
    value = ((unsigned long)carry << 16) + b[i];
    b[i] = (unsigned short)(value / 3);
  }
  dl = mp_rshift(d, d, dl, 1);
  dl = mp_sub(d, d, b, dl, bl);
  dl = mp_sub(d, d, rop, dl, size);
  dl = mp_rshift(d, d, dl, 2);
  memset(rop, '\0', sizeof(unsigned short) * (len1 + len2));
  i = x * 4;
  xsize = (len1 + len2) - i;
  size = mp_add(rop + i, rop + i, e, xsize, el) + i;
  i = x * 3;
  xsize = size - i;
  size = mp_add(rop + i, rop + i, d, xsize, dl) + i;
  i = x * 2;
  xsize = size - i;
  size = mp_add(rop + i, rop + i, c, xsize, cl) + i;
  i = x;
  xsize = size - i;
  size = mp_add(rop + i, rop + i, b, xsize, bl) + i;
  size = mp_add(rop, rop, a, size, al);
  mp_free(e);
  mp_free(d);
  mp_free(c);
  mp_free(b);
  mp_free(a);
  if (size > 1 && rop[size - 1] == 0)
    --size;
  return (size);
}
```