user: 下面的汇编指令对应的C源代码是什么：

```asm
<ibitmap_clip>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rax
  mov    %rdx,-0x10(%rsp)
  mov    %rcx,%rsi
  mov    %rcx,-0x8(%rsp)
  mov    (%rdi),%r13d
  mov    0x4(%rdi),%r14d
  mov    0x8(%rdi),%ebx
  mov    %ebx,-0x1c(%rsp)
  mov    0xc(%rdi),%ecx
  mov    %ecx,-0x18(%rsp)
  mov    (%rax),%edi
  mov    0x4(%rax),%r10d
  mov    0x8(%rax),%ebp
  mov    0xc(%rax),%r12d
  mov    (%rdx),%ecx
  mov    (%rsi),%esi
  mov    (%r8),%r11d
  mov    0x4(%r8),%ebx
  mov    0x8(%r8),%eax
  mov    0xc(%r8),%edx
  mov    %r9d,%r15d
  sar    %r15d
  and    $0x1,%r15d
  sar    $0x2,%r9d
  and    $0x1,%r9d
  mov    %r9d,-0x14(%rsp)
  cmp    -0x1c(%rsp),%r13d
  jge    L361
  cmp    -0x18(%rsp),%r14d
  jge    L361
  cmp    %ebp,%edi
  jge    L113
  cmp    %r12d,%r10d
  jge    L113
  cmp    %eax,%edi
  jge    L273
  cmp    %edx,%r10d
  jge    L273
  cmp    %r11d,%ebp
  jle    L392
  cmp    %ebx,%r12d
  jle    L392
  cmp    %ecx,%r13d
  jle    L402
  mov    %r13d,%r9d
  sub    %ecx,%r9d
  test   %r15d,%r15d
  jne    L11
  add    %r9d,%r11d
  mov    %r13d,%ecx
L402:
  cmp    %esi,%r14d
  jle    L54
  mov    %r14d,%r9d
  sub    %esi,%r9d
  cmpl   $0x0,-0x14(%rsp)
  jne    L466
  add    %r9d,%ebx
  mov    %r14d,%esi
L54:
  mov    %eax,%r13d
  sub    %r11d,%r13d
  mov    %edx,%r9d
  sub    %ebx,%r9d
  mov    %r13d,%r14d
  or     %r9d,%r14d
  js     L375
  add    %ecx,%r13d
  mov    -0x1c(%rsp),%r14d
  cmp    %r14d,%r13d
  jle    L166
  sub    %r14d,%r13d
  test   %r15d,%r15d
  jne    L184
  sub    %r13d,%eax
L166:
  add    %esi,%r9d
  mov    -0x18(%rsp),%r14d
  cmp    %r14d,%r9d
  jle    L296
  sub    %r14d,%r9d
  cmpl   $0x0,-0x14(%rsp)
  jne    L272
  sub    %r9d,%edx
L296:
  cmp    %eax,%r11d
  jge    L132
  cmp    %edx,%ebx
  jge    L132
  cmp    %edi,%r11d
  jge    L379
  mov    %edi,%r9d
  sub    %r11d,%r9d
  add    %ecx,%r9d
  test   %r15d,%r15d
  cmove  %r9d,%ecx
  cmp    %r10d,%ebx
  jge    L446
L77:
  mov    %r10d,%r9d
  sub    %ebx,%r9d
  add    %esi,%r9d
  cmpl   $0x0,-0x14(%rsp)
  cmove  %r9d,%esi
L274:
  cmp    %edi,%eax
  jle    L115
  cmp    %edx,%r10d
  jge    L115
L185:
  cmp    %ebp,%eax
  jle    L315
  sub    %ebp,%eax
  add    %ecx,%eax
  test   %r15d,%r15d
  cmovne %eax,%ecx
  cmp    %r12d,%edx
  jle    L462
L399:
  sub    %r12d,%edx
  add    %esi,%edx
  cmpl   $0x0,-0x14(%rsp)
  cmovne %edx,%esi
L357:
  cmp    %ebp,%edi
  jge    L436
  cmp    %r10d,%r12d
  jle    L436
L101:
  mov    -0x10(%rsp),%rax
  mov    %ecx,(%rax)
  mov    -0x8(%rsp),%rax
  mov    %esi,(%rax)
  mov    %edi,(%r8)
  mov    %r10d,0x4(%r8)
  mov    %ebp,0x8(%r8)
  mov    %r12d,0xc(%r8)
  mov    $0x0,%eax
L453:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L11:
  sub    %r9d,%eax
  mov    %r13d,%ecx
  jmp    L402
L466:
  sub    %r9d,%edx
  mov    %r14d,%esi
  jmp    L54
L184:
  add    %r13d,%r11d
  jmp    L166
L272:
  add    %r9d,%ebx
  jmp    L296
L241:
  mov    %r11d,%edi
  jmp    L77
L446:
  mov    %ebx,%r10d
  jmp    L274
L423:
  mov    %eax,%ebp
  jmp    L399
L462:
  mov    %edx,%r12d
  jmp    L357
L361:
  mov    $0xffffffff,%eax
  jmp    L453
L113:
  mov    $0xffffffff,%eax
  jmp    L453
L273:
  mov    $0xfffffffe,%eax
  jmp    L453
L392:
  mov    $0xfffffffe,%eax
  jmp    L453
L375:
  mov    $0xfffffffd,%eax
  jmp    L453
L132:
  mov    $0xfffffffc,%eax
  jmp    L453
L115:
  mov    $0xfffffffb,%eax
  jmp    L453
L436:
  mov    $0xfffffffa,%eax
  jmp    L453
L315:
  cmp    %r12d,%edx
  jg     L423
  mov    %edx,%r12d
  mov    %eax,%ebp
  jmp    L101
L379:
  cmp    %r10d,%ebx
  jl     L241
  mov    %ebx,%r10d
  mov    %r11d,%edi
  jmp    L185
```

assistant: ```c
int ibitmap_clip(const int *clipdst, const int *clipsrc, int *x, int *y, int *rectsrc, int clip) {
  int dcl = clipdst[0];
  int dct = clipdst[1];
  int dcr = clipdst[2];
  int dcb = clipdst[3];
  int scl = clipsrc[0];
  int sct = clipsrc[1];
  int scr = clipsrc[2];
  int scb = clipsrc[3];
  int dx = *x;
  int dy = *y;
  int sl = rectsrc[0];
  int st = rectsrc[1];
  int sr = rectsrc[2];
  int sb = rectsrc[3];
  int hflip, vflip;
  int w, h, d;
  hflip = (clip & 2) ? 1 : 0;
  vflip = (clip & 4) ? 1 : 0;
  if (dcr <= dcl || dcb <= dct || scr <= scl || scb <= sct)
    return -1;
  if (sr <= scl || sb <= sct || sl >= scr || st >= scb)
    return -2;
  if (dx < dcl) {
    d = dcl - dx;
    dx = dcl;
    if (!hflip)
      sl += d;
    else
      sr -= d;
  }
  if (dy < dct) {
    d = dct - dy;
    dy = dct;
    if (!vflip)
      st += d;
    else
      sb -= d;
  }
  w = sr - sl;
  h = sb - st;
  if (w < 0 || h < 0)
    return -3;
  if (dx + w > dcr) {
    d = dx + w - dcr;
    if (!hflip)
      sr -= d;
    else
      sl += d;
  }
  if (dy + h > dcb) {
    d = dy + h - dcb;
    if (!vflip)
      sb -= d;
    else
      st += d;
  }
  if (sl >= sr || st >= sb)
    return -4;
  if (sl < scl) {
    d = scl - sl;
    sl = scl;
    if (!hflip)
      dx += d;
  }
  if (st < sct) {
    d = sct - st;
    st = sct;
    if (!vflip)
      dy += d;
  }
  if (sl >= sr || st >= sb)
    return -5;
  if (sr > scr) {
    d = sr - scr;
    sr = scr;
    if (hflip)
      dx += d;
  }
  if (sb > scb) {
    d = sb - scb;
    sb = scb;
    if (vflip)
      dy += d;
  }
  if (sl >= sr || st >= sb)
    return -6;
  *x = dx;
  *y = dy;
  rectsrc[0] = sl;
  rectsrc[1] = st;
  rectsrc[2] = sr;
  rectsrc[3] = sb;
  return 0;
}
```