user: Demonstrate the C code that generates the assembly output below:

```asm
<IMAGE_STRETCH2XPLUS>:
  endbr64
  push   %r15
  movslq %ecx,%r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %esi,0x18(%rsp)
  mov    %edx,0x14(%rsp)
  mov    %r15d,0x10(%rsp)
  test   %edx,%edx
  je     L15
  mov    0x88(%rsp),%eax
  mov    %rdi,%r14
  mov    %edx,%edi
  mov    %edx,%ebx
  sar    %edi
  imul   %esi,%r8d
  mov    0x80(%rsp),%ecx
  mov    %r9,%rbp
  lea    (%rax,%rax,1),%r13d
  lea    (%rdx,%rdx,1),%eax
  mov    %edi,0x1c(%rsp)
  sub    %edi,%eax
  mov    %r14,%rdi
  cltd
  mov    %r8d,%r12d
  idiv   %r13d
  mov    %r9,%rdx
  mov    %eax,0xc(%rsp)
  call   *0xa0(%rsp)
  sub    0xc(%rsp),%ebx
  je     L6
  movslq 0x90(%rsp),%rax
  add    %rax,%rbp
  mov    %rax,0x28(%rsp)
  mov    %rbp,0x20(%rsp)
L151:
  sub    $0x1,%ebx
  je     L138
  mov    0x1c(%rsp),%ebp
  jmp    L14
  nopl   0x0(%rax,%rax,1)
L130:
  mov    %r14,%rsi
  add    %r15,%r14
  mov    %r12d,%edx
  mov    %r14,%rdi
  call   <memcpy@plt>
  sub    $0x1,%ebx
  je     L138
L14:
  sub    %r13d,%ebp
  jns    L130
  add    0x14(%rsp),%ebp
  mov    %r14,%r10
  jmp    L70
  nopl   0x0(%rax)
L154:
  sub    %r13d,%ebp
  js     L38
L70:
  add    %r15,%r10
  sub    $0x1,%ebx
  jne    L154
  mov    %r10,%rbx
  cmp    %r14,%r10
  je     L138
  nopl   (%rax)
L99:
  mov    %r14,%rsi
  add    %r15,%r14
  mov    %r12d,%edx
  mov    %r14,%rdi
  call   <memcpy@plt>
  cmp    %rbx,%r14
  jne    L99
  jmp    L138
L6:
  subl   $0x1,0xc(%rsp)
L138:
  mov    0xc(%rsp),%ebx
  movslq 0x10(%rsp),%rbp
  test   %ebx,%ebx
  je     L15
  nopw   0x0(%rax,%rax,1)
L111:
  mov    %r14,%rsi
  add    %rbp,%r14
  mov    %r12d,%edx
  mov    %r14,%rdi
  call   <memcpy@plt>
  sub    $0x1,%ebx
  jne    L111
L15:
  add    $0x48,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L38:
  add    0x14(%rsp),%ebp
  lea    (%r10,%r15,1),%rax
  mov    %r10,0x38(%rsp)
  mov    %r14,%rdi
  mov    0x18(%rsp),%ecx
  mov    0x20(%rsp),%r8
  mov    %ebp,0x1c(%rsp)
  mov    %rax,%rdx
  lea    (%r14,%r15,1),%rbp
  mov    %rax,0x30(%rsp)
  mov    0x80(%rsp),%r9d
  mov    %rbp,%rsi
  call   *0xa8(%rsp)
  mov    0x38(%rsp),%r10
  mov    0x28(%rsp),%rcx
  add    %rcx,0x20(%rsp)
  mov    %r10,%r14
  cmp    %r10,%rbp
  je     L74
  nopw   0x0(%rax,%rax,1)
L25:
  mov    %rbp,%rsi
  add    %r15,%rbp
  mov    %r12d,%edx
  mov    %rbp,%rdi
  call   <memcpy@plt>
  cmp    %r14,%rbp
  jne    L25
L74:
  mov    0x30(%rsp),%r14
  jmp    L151
```

assistant: ```c
void IMAGE_STRETCH2XPLUS(unsigned char *dest_ptr, int dest_dx, int dest_dy, int dest_pitch, int dest_bpp, unsigned char *src_ptr, int src_dx, int src_dy, int src_pitch, int src_bpp, void (*row_func)(unsigned char *, int, unsigned char *, int), void (*row2x_func)(unsigned char *, unsigned char *, unsigned char *, int, unsigned char *, int)) {
  register unsigned char *d = dest_ptr, *d1;
  register unsigned char *s = src_ptr;
  register int dest_dx_bytes = dest_dx * dest_bpp;
  register int count = dest_dy;
  register int limit = dest_dy >> 1;
  register int step = src_dy << 1;
  register int remainder = (2 * dest_dy - limit) / step;
  if (count) {
    (*row_func)(d, dest_dx, s, src_dx);
    s += src_pitch;
    if (!(count -= remainder)) {
      remainder--;
      goto end;
    }
    while (1) {
      goto start;
      do {
        memcpy(d + dest_pitch, d, dest_dx_bytes);
        d += dest_pitch;
      start:
        if (!(--count))
          goto end;
      } while ((limit -= step) >= 0);
      limit += dest_dy;
      d1 = d;
      do {
        d += dest_pitch;
        if (!(--count))
          goto end_2;
      } while ((limit -= step) >= 0);
      limit += dest_dy;
      (*row2x_func)(d1, d1 + dest_pitch, d + dest_pitch, dest_dx, s, src_dx);
      d1 += dest_pitch;
      s += src_pitch;
      while (d1 != d) {
        memcpy(d1 + dest_pitch, d1, dest_dx_bytes);
        d1 += dest_pitch;
      }
      d += dest_pitch;
    }
  end_2:
    while (d1 != d) {
      memcpy(d1 + dest_pitch, d1, dest_dx_bytes);
      d1 += dest_pitch;
    }
  end:
    while (remainder--) {
      memcpy(d + dest_pitch, d, dest_dx_bytes);
      d += dest_pitch;
    }
  }
}
```