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

```asm
<cro_GenMipMapMinMaxI>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %esi,-0x7c(%rbp)
  mov    %edx,-0x80(%rbp)
  mov    %rcx,-0x88(%rbp)
  mov    %r8,-0x90(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  cmpl   $0x0,-0x7c(%rbp)
  je     L17
  cmpl   $0x0,-0x80(%rbp)
  je     L17
  mov    -0x88(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x90(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  lea    -0x64(%rbp),%rcx
  lea    -0x68(%rbp),%rdx
  mov    -0x80(%rbp),%esi
  mov    -0x7c(%rbp),%eax
  mov    %eax,%edi
  call   <cro_GetMipMapSize@plt>
  movl   $0x0,-0x40(%rbp)
  jmp    L59
L30:
  mov    -0x40(%rbp),%eax
  imul   -0x7c(%rbp),%eax
  add    %eax,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x40(%rbp),%eax
  add    %eax,%eax
  add    $0x1,%eax
  imul   -0x7c(%rbp),%eax
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  movl   $0x0,-0x3c(%rbp)
  jmp    L77
L64:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x38(%rbp)
  mov    -0x10(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x10(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  mov    %eax,-0x2c(%rbp)
  lea    -0x50(%rbp),%r8
  mov    -0x2c(%rbp),%ecx
  mov    -0x30(%rbp),%edx
  mov    -0x34(%rbp),%esi
  mov    -0x38(%rbp),%eax
  sub    $0x8,%rsp
  lea    -0x60(%rbp),%rdi
  push   %rdi
  mov    %r8,%r9
  mov    $0x18,%r8d
  mov    %eax,%edi
  call   <cro_MinMaxBits@plt>
  add    $0x10,%rsp
  lea    -0x4c(%rbp),%r8
  mov    -0x2c(%rbp),%ecx
  mov    -0x30(%rbp),%edx
  mov    -0x34(%rbp),%esi
  mov    -0x38(%rbp),%eax
  sub    $0x8,%rsp
  lea    -0x5c(%rbp),%rdi
  push   %rdi
  mov    %r8,%r9
  mov    $0x10,%r8d
  mov    %eax,%edi
  call   <cro_MinMaxBits@plt>
  add    $0x10,%rsp
  lea    -0x48(%rbp),%r8
  mov    -0x2c(%rbp),%ecx
  mov    -0x30(%rbp),%edx
  mov    -0x34(%rbp),%esi
  mov    -0x38(%rbp),%eax
  sub    $0x8,%rsp
  lea    -0x58(%rbp),%rdi
  push   %rdi
  mov    %r8,%r9
  mov    $0x8,%r8d
  mov    %eax,%edi
  call   <cro_MinMaxBits@plt>
  add    $0x10,%rsp
  lea    -0x44(%rbp),%r8
  mov    -0x2c(%rbp),%ecx
  mov    -0x30(%rbp),%edx
  mov    -0x34(%rbp),%esi
  mov    -0x38(%rbp),%eax
  sub    $0x8,%rsp
  lea    -0x54(%rbp),%rdi
  push   %rdi
  mov    %r8,%r9
  mov    $0x0,%r8d
  mov    %eax,%edi
  call   <cro_MinMaxBits@plt>
  add    $0x10,%rsp
  mov    -0x50(%rbp),%eax
  shl    $0x18,%eax
  mov    %eax,%edx
  mov    -0x4c(%rbp),%eax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x48(%rbp),%eax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x44(%rbp),%eax
  or     %eax,%edx
  mov    -0x88(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x60(%rbp),%eax
  shl    $0x18,%eax
  mov    %eax,%edx
  mov    -0x5c(%rbp),%eax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x58(%rbp),%eax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x54(%rbp),%eax
  or     %eax,%edx
  mov    -0x90(%rbp),%rax
  mov    %edx,(%rax)
  addl   $0x1,-0x3c(%rbp)
  addq   $0x4,-0x28(%rbp)
  addq   $0x4,-0x20(%rbp)
  addq   $0x8,-0x18(%rbp)
  addq   $0x8,-0x10(%rbp)
L77:
  mov    -0x68(%rbp),%eax
  cmp    %eax,-0x3c(%rbp)
  jb     L64
  addl   $0x1,-0x40(%rbp)
L59:
  mov    -0x64(%rbp),%eax
  cmp    %eax,-0x40(%rbp)
  jb     L30
  jmp    L26
L17:
  nop
L26:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L68
  call   <__stack_chk_fail@plt>
L68:
  leave
  ret
```

assistant: ```c
void cro_GenMipMapMinMaxI(const int *image, unsigned int width, unsigned int height, int *minMip, int *maxMip) {
  if (width == 0 || height == 0)
    return;
  unsigned int newWidth, newHeight;
  int *minPixel = minMip;
  int *maxPixel = maxMip;
  cro_GetMipMapSize(width, height, &newWidth, &newHeight);
  for (unsigned int h = 0; h < newHeight; ++h) {
    const int *row1 = &image[width * (2 * h + 0)];
    const int *row2 = &image[width * (2 * h + 1)];
    for (unsigned int w = 0; w < newWidth; ++w, ++minPixel, ++maxPixel, row1 += 2, row2 += 2) {
      int p1 = row1[0];
      int p2 = row2[0];
      int p3 = row1[1];
      int p4 = row2[1];
      int max1, max2, max3, max4;
      int min1, min2, min3, min4;
      cro_MinMaxBits(p1, p2, p3, p4, 24, &min1, &max1);
      cro_MinMaxBits(p1, p2, p3, p4, 16, &min2, &max2);
      cro_MinMaxBits(p1, p2, p3, p4, 8, &min3, &max3);
      cro_MinMaxBits(p1, p2, p3, p4, 0, &min4, &max4);
      *minMip = (min1 << 24) | (min2 << 16) | (min3 << 8) | (min4 << 0);
      *maxMip = (max1 << 24) | (max2 << 16) | (max3 << 8) | (max4 << 0);
    }
  }
}
```