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

```asm
<draw_line>:
  endbr64
  push   %r15
  sub    %esi,%ecx
  mov    %edx,%r9d
  push   %r14
  mov    %ecx,%edx
  mov    %r8,%r14
  push   %r13
  push   %r12
  mov    %esi,%r12d
  push   %rbp
  mov    %edi,%ebp
  push   %rbx
  mov    %r9d,%ebx
  sub    $0x18,%rsp
  neg    %edx
  cmovs  %ecx,%edx
  sub    %edi,%ebx
  mov    %ebx,%eax
  neg    %eax
  cmovs  %ebx,%eax
  xor    %r15d,%r15d
  cmp    %eax,%edx
  jle    L110
  mov    %ecx,%esi
  mov    $0x1,%r15d
  mov    %ebx,%ecx
  mov    %esi,%ebx
L110:
  pxor   %xmm3,%xmm3
  mov    %ebx,%r13d
  cvtsi2ss %ebx,%xmm3
  sar    $0x1f,%r13d
  or     $0x1,%r13d
  movss  %xmm3,0x8(%rsp)
  test   %ecx,%ecx
  je     L32
  pxor   %xmm0,%xmm0
  cvtsi2ss %ecx,%xmm0
  divss  %xmm0,%xmm3
  movss  %xmm3,0x8(%rsp)
L32:
  movl   $0x7c,0xc(%rsp)
  test   %r15d,%r15d
  je     L124
  cmp    $0x2,%eax
  jg     L123
  xor    %r15d,%r15d
  test   %ebx,%ebx
  je     L35
  nopl   0x0(%rax)
L112:
  pxor   %xmm0,%xmm0
  mov    0xc(%rsp),%edi
  lea    (%r15,%r12,1),%edx
  mov    %r14,%rcx
  cvtsi2ss %r15d,%xmm0
  divss  0x8(%rsp),%xmm0
  add    %r13d,%r15d
  cvttss2si %xmm0,%esi
  add    %ebp,%esi
  call   <put_char@plt>
  cmp    %r15d,%ebx
  jne    L112
L35:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L124:
  cmp    $0x2,%eax
  jg     L126
  test   %ebx,%ebx
  je     L35
  nopl   0x0(%rax)
L53:
  pxor   %xmm0,%xmm0
  mov    0xc(%rsp),%edi
  lea    (%r15,%rbp,1),%esi
  mov    %r14,%rcx
  cvtsi2ss %r15d,%xmm0
  divss  0x8(%rsp),%xmm0
  add    %r13d,%r15d
  cvttss2si %xmm0,%edx
  add    %r12d,%edx
  call   <put_char@plt>
  cmp    %r15d,%ebx
  jne    L53
  jmp    L35
  nopl   0x0(%rax,%rax,1)
L126:
  cmp    $0x3,%edx
  mov    $0x5c,%eax
  mov    $0x2d,%edx
  cmovl  %edx,%eax
  mov    %eax,0xc(%rsp)
  test   %ebx,%ebx
  jne    L53
  jmp    L35
  nopw   0x0(%rax,%rax,1)
L123:
  xor    %eax,%eax
  cmp    $0x3,%edx
  setge  %al
  xor    %r15d,%r15d
  lea    0x2d(%rax,%rax,1),%eax
  mov    %eax,0xc(%rsp)
  test   %ebx,%ebx
  jne    L112
  jmp    L35
```

assistant: ```c
void draw_line(int x1, int y1, int x2, int y2, char *buffer) {
  int yLonger = 0;
  int incrementVal;
  int i;
  int shortLen = y2 - y1;
  int a_shortLen = (shortLen >= 0 ? shortLen : shortLen * -1);
  int longLen = x2 - x1;
  int a_longLen = (longLen >= 0 ? longLen : longLen * -1);
  char c;
  float divDiff;
  if (a_shortLen > a_longLen) {
    int swap = shortLen;
    shortLen = longLen;
    longLen = swap;
    yLonger = 1;
  }
  incrementVal = (longLen < 0 ? -1 : 1);
  divDiff = (shortLen == 0 ? longLen : (float)longLen / (float)shortLen);
  if (yLonger) {
    if (a_longLen <= 2)
      c = '|';
    else if (a_shortLen <= 2)
      c = '-';
    else
      c = '/';
    for (i = 0; i != longLen; i += incrementVal)
      put_char(c, x1 + (int)((float)i / divDiff), y1 + i, buffer);
  } else {
    if (a_longLen <= 2)
      c = '|';
    else if (a_shortLen <= 2)
      c = '-';
    else
      c = '\\';
    for (i = 0; i != longLen; i += incrementVal)
      put_char(c, x1 + i, y1 + (int)((float)i / divDiff), buffer);
  }
}
```