user: Please show me the C implementation that matches the assembly code listed below:

```asm
<line>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %edi,-0x14(%rbp)
  mov    %esi,-0x18(%rbp)
  mov    %edx,-0x1c(%rbp)
  mov    %ecx,-0x20(%rbp)
  mov    %r8d,%eax
  mov    %al,-0x24(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jne    L39
  mov    -0x18(%rbp),%eax
  cmp    -0x20(%rbp),%eax
  jne    L39
  movsbl -0x24(%rbp),%edx
  mov    -0x18(%rbp),%ecx
  mov    -0x14(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <pixel@plt>
  jmp    L79
L39:
  mov    -0x14(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jne    L113
  movsbl -0x24(%rbp),%ecx
  mov    -0x20(%rbp),%edx
  mov    -0x18(%rbp),%eax
  cmp    %eax,%edx
  cmovge %edx,%eax
  mov    %eax,%edi
  mov    -0x20(%rbp),%edx
  mov    -0x18(%rbp),%eax
  cmp    %eax,%edx
  cmovle %edx,%eax
  mov    %eax,%esi
  mov    -0x14(%rbp),%eax
  mov    %edi,%edx
  mov    %eax,%edi
  call   <vline@plt>
  jmp    L79
L113:
  mov    -0x18(%rbp),%eax
  cmp    -0x20(%rbp),%eax
  jne    L71
  movsbl -0x24(%rbp),%ecx
  mov    -0x1c(%rbp),%edx
  mov    -0x14(%rbp),%eax
  cmp    %eax,%edx
  cmovge %edx,%eax
  mov    %eax,%esi
  mov    -0x1c(%rbp),%edx
  mov    -0x14(%rbp),%eax
  cmp    %eax,%edx
  cmovle %edx,%eax
  mov    -0x18(%rbp),%edx
  mov    %eax,%edi
  call   <hline@plt>
  jmp    L79
L71:
  mov    -0x20(%rbp),%eax
  sub    -0x18(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  mov    -0x1c(%rbp),%eax
  sub    -0x14(%rbp),%eax
  pxor   %xmm1,%xmm1
  cvtsi2ss %eax,%xmm1
  divss  %xmm1,%xmm0
  movss  %xmm0,-0x4(%rbp)
  movss  -0x4(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  comiss %xmm1,%xmm0
  jb     L11
  movss  D7(%rip),%xmm0
  comiss -0x4(%rbp),%xmm0
  jb     L11
  movsbl -0x24(%rbp),%edi
  mov    -0x20(%rbp),%ecx
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%esi
  mov    -0x14(%rbp),%eax
  mov    %edi,%r8d
  mov    %eax,%edi
  call   <bsubline_1@plt>
  jmp    L79
L11:
  movss  -0x4(%rbp),%xmm0
  movss  D7(%rip),%xmm1
  comiss %xmm1,%xmm0
  jbe    L34
  movsbl -0x24(%rbp),%edi
  mov    -0x20(%rbp),%ecx
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%esi
  mov    -0x14(%rbp),%eax
  mov    %edi,%r8d
  mov    %eax,%edi
  call   <bsubline_2@plt>
  jmp    L79
L34:
  pxor   %xmm0,%xmm0
  comiss -0x4(%rbp),%xmm0
  jbe    L138
  movss  -0x4(%rbp),%xmm0
  movss  D12(%rip),%xmm1
  comiss %xmm1,%xmm0
  jb     L138
  movsbl -0x24(%rbp),%edi
  mov    -0x20(%rbp),%ecx
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%esi
  mov    -0x14(%rbp),%eax
  mov    %edi,%r8d
  mov    %eax,%edi
  call   <bsubline_4@plt>
  jmp    L79
L138:
  movsbl -0x24(%rbp),%edi
  mov    -0x20(%rbp),%ecx
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%esi
  mov    -0x14(%rbp),%eax
  mov    %edi,%r8d
  mov    %eax,%edi
  call   <bsubline_3@plt>
L79:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: tag: D7
type_guessed: byte[4]
name: unpack_data
arguments: tag: D12
type_guessed: byte[4]

tool: {"D7": [0x00,0x00,0x80,0x3f]}

tool: {"D12": [0x00,0x00,0x80,0xbf]}

assistant: ```c
void line(int x1, int y1, int x2, int y2, char c) {
  float k;
  if ((x1 == x2) && (y1 == y2)) {
    pixel(x1, y1, c);
    return;
  }
  if (x1 == x2) {
    vline(x1, (y1 < y2 ? y1 : y2), (y1 > y2 ? y1 : y2), c);
    return;
  }
  if (y1 == y2) {
    hline((x1 < x2 ? x1 : x2), (x1 > x2 ? x1 : x2), y1, c);
    return;
  }
  k = (float)(y2 - y1) / (float)(x2 - x1);
  if ((k >= 0) && (k <= 1)) {
    bsubline_1(x1, y1, x2, y2, c);
  } else if (k > 1) {
    bsubline_2(x1, y1, x2, y2, c);
  } else if ((k < 0) && (k >= -1)) {
    bsubline_4(x1, y1, x2, y2, c);
  } else {
    bsubline_3(x1, y1, x2, y2, c);
  }
}
```