user: 这段汇编代码用C语言表示是什么样的？

```asm
<chroma_smooth_2x2>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xb8,%rsp
  mov    %edi,0x58(%rsp)
  mov    %rcx,0x48(%rsp)
  mov    %r9,0x50(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0xa8(%rsp)
  xor    %eax,%eax
  lea    -0x5(%rsi),%eax
  mov    %eax,0x5c(%rsp)
  cmp    $0x4,%eax
  jle    L62
  lea    -0x4(%rdi),%eax
  mov    %edi,%esi
  mov    %eax,0x14(%rsp)
  cmp    $0x4,%eax
  jle    L62
  lea    (%rdi,%rdi,1),%ebx
  lea    0x0(,%rdi,4),%eax
  mov    %r8,%r13
  mov    %rdx,%r15
  movslq %ebx,%rdi
  mov    %eax,0x2c(%rsp)
  mov    %rdi,0x60(%rsp)
  movslq %eax,%rdi
  add    %esi,%eax
  cltq
  mov    %ebx,0x1c(%rsp)
  mov    %rax,0x38(%rsp)
  mov    %ebx,%eax
  add    %esi,%eax
  lea    0x10(%rdx),%rsi
  mov    %rdi,0x40(%rsp)
  movl   $0x4,0x34(%rsp)
  add    %eax,%eax
  mov    %rsi,0x68(%rsp)
L31:
  mov    0x58(%rsp),%ebx
  mov    0x2c(%rsp),%esi
  mov    $0x4,%r14d
  add    %ebx,%esi
  mov    %esi,0x30(%rsp)
  lea    (%rax,%rbx,1),%esi
  add    0x1c(%rsp),%ebx
  sub    $0x1,%eax
  mov    %esi,0x24(%rsp)
  mov    0x68(%rsp),%rsi
  mov    %ebx,0x20(%rsp)
  mov    0x38(%rsp),%rbx
  mov    %eax,0x28(%rsp)
  lea    (%rsi,%rbx,4),%rbx
  mov    %rbx,0x8(%rsp)
  mov    0x40(%rsp),%rbx
  lea    (%rsi,%rbx,4),%rsi
  mov    %rsi,(%rsp)
  jmp    L63
  nopl   0x0(%rax)
L33:
  addq   $0x8,0x8(%rsp)
  add    $0x2,%r14d
  addq   $0x8,(%rsp)
  cmp    %r14d,0x14(%rsp)
  jle    L91
L63:
  mov    (%rsp),%rdi
  mov    0x8(%rsp),%r8
  movslq 0x4(%rdi),%rdx
  movslq (%r8),%rax
  mov    0x0(%r13,%rax,4),%eax
  add    0x0(%r13,%rdx,4),%eax
  mov    %eax,0x10(%rsp)
  cmp    $0x1ffff,%eax
  jle    L33
  mov    0x1c(%rsp),%eax
  mov    %r14d,0x18(%rsp)
  mov    $0xfffffffe,%edx
  xor    %esi,%esi
  mov    $0x4,%r12d
  lea    (%rax,%r14,1),%ebx
  mov    0x20(%rsp),%eax
  lea    (%rax,%r14,1),%r11d
  mov    0x28(%rsp),%eax
  lea    (%rax,%r14,1),%r10d
  mov    0x24(%rsp),%eax
  lea    -0x2(%r14,%rax,1),%r9d
L48:
  movslq -0x4(%rdi),%rax
  movslq -0x8(%r8),%rcx
  movslq %esi,%rbp
  mov    0x0(%r13,%rcx,4),%ecx
  add    0x0(%r13,%rax,4),%ecx
  mov    %ecx,%eax
  shr    $0x1f,%eax
  add    %ecx,%eax
  movslq -0x8(%rdi),%rcx
  sar    %eax
  mov    0x0(%r13,%rcx,4),%ecx
  sub    %eax,%ecx
  mov    %ecx,0x70(%rsp,%rbp,4)
  movslq -0x4(%r8),%rcx
  mov    0x0(%r13,%rcx,4),%ecx
  sub    %eax,%ecx
  lea    0x1(%rsi),%eax
  mov    %ecx,0x90(%rsp,%rbp,4)
  cmp    $0x4,%r12d
  je     L61
  movslq %r10d,%rcx
  movslq %r9d,%rbp
  lea    0x1(%r9),%r12d
  cltq
  movslq (%r15,%rcx,4),%rcx
  movslq (%r15,%rbp,4),%rbp
  movslq %r12d,%r12
  mov    0x0(%r13,%rbp,4),%ebp
  add    0x0(%r13,%rcx,4),%ebp
  mov    %ebp,%ecx
  shr    $0x1f,%ecx
  add    %ebp,%ecx
  lea    -0x1(%r10),%ebp
  movslq %ebp,%rbp
  sar    %ecx
  movslq (%r15,%rbp,4),%rbp
  mov    0x0(%r13,%rbp,4),%ebp
  sub    %ecx,%ebp
  mov    %ebp,0x70(%rsp,%rax,4)
  movslq (%r15,%r12,4),%rbp
  mov    0x0(%r13,%rbp,4),%ebp
  sub    %ecx,%ebp
  mov    %ebp,0x90(%rsp,%rax,4)
  lea    0x2(%rsi),%eax
L61:
  lea    0x2(%rdx),%r14d
  cmp    $0x2,%edx
  je     L30
  lea    0x4(%rdx),%r12d
  lea    0x1(%rax),%esi
  test   %edx,%edx
  je     L36
  lea    0x1(%rbx),%edx
  movslq %r11d,%rcx
  lea    0x1(%r11),%ebp
  cltq
  movslq %edx,%rdx
  movslq (%r15,%rcx,4),%rcx
  movslq %ebp,%rbp
  movslq (%r15,%rdx,4),%rdx
  mov    0x0(%r13,%rcx,4),%ecx
  add    0x0(%r13,%rdx,4),%ecx
  mov    %ecx,%edx
  shr    $0x1f,%edx
  add    %ecx,%edx
  movslq %ebx,%rcx
  movslq (%r15,%rcx,4),%rcx
  sar    %edx
  mov    0x0(%r13,%rcx,4),%ecx
  sub    %edx,%ecx
  mov    %ecx,0x70(%rsp,%rax,4)
  movslq (%r15,%rbp,4),%rcx
  mov    0x0(%r13,%rcx,4),%ecx
  sub    %edx,%ecx
  mov    %ecx,0x90(%rsp,%rax,4)
L17:
  add    $0x8,%rdi
  add    $0x8,%r8
  add    $0x2,%ebx
  add    $0x2,%r11d
  add    $0x2,%r10d
  add    $0x2,%r9d
  mov    %r14d,%edx
  jmp    L48
  nopl   0x0(%rax,%rax,1)
L30:
  mov    0x10(%rsp),%ebp
  lea    0x70(%rsp),%rdi
  mov    0x18(%rsp),%r14d
  call   <opt_med5@plt>
  lea    0x90(%rsp),%rdi
  mov    %eax,%ebx
  sar    %ebp
  call   <opt_med5@plt>
  add    %ebp,%ebx
  cmp    $0x8000,%ebx
  jle    L33
  add    %ebp,%eax
  cmp    $0x8000,%eax
  jle    L33
  movslq %ebx,%rdx
  mov    $0x1bfffc,%ecx
  mov    0x2c(%rsp),%esi
  mov    0xf0(%rsp),%edi
  shl    $0x2,%rdx
  cmp    $0x6ffff,%ebx
  mov    0x50(%rsp),%rbx
  cmovge %rcx,%rdx
  add    %r14d,%esi
  movslq %esi,%rsi
  add    (%rbx,%rdx,1),%edi
  mov    %edi,%edx
  mov    0x48(%rsp),%rdi
  mov    %edx,(%rdi,%rsi,4)
  movslq %eax,%rdx
  mov    0x30(%rsp),%esi
  shl    $0x2,%rdx
  cmp    $0x6ffff,%eax
  mov    %rcx,%rax
  cmovl  %rdx,%rax
  lea    0x1(%r14,%rsi,1),%edx
  mov    0xf0(%rsp),%esi
  movslq %edx,%rdx
  add    (%rbx,%rax,1),%esi
  mov    %esi,(%rdi,%rdx,4)
  jmp    L33
  nopl   0x0(%rax)
L91:
  mov    0x58(%rsp),%eax
  mov    0x30(%rsp),%ebx
  mov    0x60(%rsp),%rdi
  addl   $0x2,0x34(%rsp)
  add    %eax,%ebx
  add    %rdi,0x40(%rsp)
  mov    0x34(%rsp),%esi
  mov    %ebx,0x2c(%rsp)
  mov    0x20(%rsp),%ebx
  add    %rdi,0x38(%rsp)
  add    %eax,%ebx
  mov    %ebx,0x1c(%rsp)
  mov    0x24(%rsp),%ebx
  add    %eax,%ebx
  mov    %ebx,%eax
  cmp    %esi,0x5c(%rsp)
  jg     L31
L62:
  mov    0xa8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L68
  add    $0xb8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L36:
  mov    %eax,%esi
  jmp    L17
L68:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void chroma_smooth_2x2(int w, int h, uint16_t *inp, uint16_t *out, int *raw2ev, int *ev2raw, int black) {
  int x, y;
  for (y = 4; y < h - 5; y += 2) {
    for (x = 4; x < w - 4; x += 2) {
      int g1 = inp[x + 1 + y * w];
      int g2 = inp[x + (y + 1) * w];
      int ge = (raw2ev[g1] + raw2ev[g2]) / 2;
      if (ge < 2 * 32768)
        continue;
      int i, j;
      int k = 0;
      int med_r[5];
      int med_b[5];
      for (i = -2; i <= 2; i += 2) {
        for (j = -2; j <= 2; j += 2) {
          if (((i) > 0 ? (i) : -(i)) + ((j) > 0 ? (j) : -(j)) == 4)
            continue;
          int r = inp[x + i + (y + j) * w];
          int g1 = inp[x + i + 1 + (y + j) * w];
          int g2 = inp[x + i + (y + j + 1) * w];
          int b = inp[x + i + 1 + (y + j + 1) * w];
          int ge = (raw2ev[g1] + raw2ev[g2]) / 2;
          med_r[k] = raw2ev[r] - ge;
          med_b[k] = raw2ev[b] - ge;
          k++;
        }
      }
      int dr = opt_med5(med_r);
      int db = opt_med5(med_b);
      if (ge + dr <= 32768)
        continue;
      if (ge + db <= 32768)
        continue;
      out[x + y * w] = ev2raw[(((((((ge + dr)) < ((14 * 32768 - 1))) ? ((ge + dr)) : ((14 * 32768 - 1)))) > ((0))) ? (((((ge + dr)) < ((14 * 32768 - 1))) ? ((ge + dr)) : ((14 * 32768 - 1)))) : ((0)))] + black;
      out[x + 1 + (y + 1) * w] = ev2raw[(((((((ge + db)) < ((14 * 32768 - 1))) ? ((ge + db)) : ((14 * 32768 - 1)))) > ((0))) ? (((((ge + db)) < ((14 * 32768 - 1))) ? ((ge + db)) : ((14 * 32768 - 1)))) : ((0)))] + black;
    }
  }
}
```