user: Translate the below assembly code into C programming language:

```asm
<drawLine>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %esi,-0x28(%rbp)
  mov    %edx,-0x2c(%rbp)
  mov    %ecx,-0x30(%rbp)
  mov    %r8,-0x38(%rbp)
  movsd  %xmm0,-0x40(%rbp)
  movsd  %xmm1,-0x48(%rbp)
  mov    %r9,-0x50(%rbp)
  movsd  %xmm2,-0x58(%rbp)
  mov    -0x2c(%rbp),%eax
  sub    -0x24(%rbp),%eax
  mov    %eax,%edx
  neg    %edx
  cmovns %edx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x24(%rbp),%eax
  cmp    -0x2c(%rbp),%eax
  jge    L131
  mov    $0x1,%eax
  jmp    L13
L131:
  mov    $0xffffffff,%eax
L13:
  mov    %eax,-0x10(%rbp)
  mov    -0x30(%rbp),%eax
  sub    -0x28(%rbp),%eax
  mov    %eax,%edx
  neg    %edx
  cmovns %edx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x28(%rbp),%eax
  cmp    -0x30(%rbp),%eax
  jge    L15
  mov    $0x1,%eax
  jmp    L86
L15:
  mov    $0xffffffff,%eax
L86:
  mov    %eax,-0x8(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jg     L50
  mov    -0xc(%rbp),%eax
  mov    %eax,%edx
  shr    $0x1f,%edx
  add    %edx,%eax
  sar    %eax
  neg    %eax
  jmp    L38
L50:
  mov    -0x14(%rbp),%eax
  mov    %eax,%edx
  shr    $0x1f,%edx
  add    %edx,%eax
  sar    %eax
L38:
  mov    %eax,-0x1c(%rbp)
L22:
  mov    -0x24(%rbp),%eax
  cmp    -0x2c(%rbp),%eax
  jne    L39
  mov    -0x28(%rbp),%eax
  cmp    -0x30(%rbp),%eax
  je     L148
L39:
  mov    -0x50(%rbp),%rcx
  movsd  -0x48(%rbp),%xmm0
  mov    -0x40(%rbp),%rdi
  mov    -0x38(%rbp),%rdx
  mov    -0x28(%rbp),%esi
  mov    -0x24(%rbp),%eax
  mov    0x10(%rbp),%r8
  movapd %xmm0,%xmm1
  movq   %rdi,%xmm0
  mov    %eax,%edi
  call   <drawPixel@plt>
  movl   $0x1,-0x18(%rbp)
  jmp    L93
L18:
  mov    -0x14(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jle    L10
  mov    -0x28(%rbp),%eax
  sub    -0x18(%rbp),%eax
  mov    %eax,%esi
  mov    -0x50(%rbp),%rcx
  movsd  -0x48(%rbp),%xmm0
  mov    -0x40(%rbp),%rdi
  mov    -0x38(%rbp),%rdx
  mov    -0x24(%rbp),%eax
  mov    0x10(%rbp),%r8
  movapd %xmm0,%xmm1
  movq   %rdi,%xmm0
  mov    %eax,%edi
  call   <drawPixel@plt>
  mov    -0x28(%rbp),%edx
  mov    -0x18(%rbp),%eax
  lea    (%rdx,%rax,1),%edi
  mov    -0x50(%rbp),%rcx
  movsd  -0x48(%rbp),%xmm0
  mov    -0x40(%rbp),%rsi
  mov    -0x38(%rbp),%rdx
  mov    -0x24(%rbp),%eax
  mov    0x10(%rbp),%r8
  movapd %xmm0,%xmm1
  movq   %rsi,%xmm0
  mov    %edi,%esi
  mov    %eax,%edi
  call   <drawPixel@plt>
  jmp    L137
L10:
  mov    -0x24(%rbp),%eax
  sub    -0x18(%rbp),%eax
  mov    -0x50(%rbp),%rcx
  movsd  -0x48(%rbp),%xmm0
  mov    -0x40(%rbp),%rdi
  mov    -0x38(%rbp),%rdx
  mov    -0x28(%rbp),%esi
  mov    0x10(%rbp),%r8
  movapd %xmm0,%xmm1
  movq   %rdi,%xmm0
  mov    %eax,%edi
  call   <drawPixel@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x18(%rbp),%eax
  lea    (%rdx,%rax,1),%edi
  mov    -0x50(%rbp),%rcx
  movsd  -0x48(%rbp),%xmm0
  mov    -0x40(%rbp),%rsi
  mov    -0x38(%rbp),%rdx
  mov    -0x28(%rbp),%eax
  mov    0x10(%rbp),%r8
  movapd %xmm0,%xmm1
  movq   %rsi,%xmm0
  mov    %eax,%esi
  call   <drawPixel@plt>
L137:
  addl   $0x1,-0x18(%rbp)
L93:
  movsd  -0x58(%rbp),%xmm0
  movsd  D7(%rip),%xmm1
  divsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <ceil@plt>
  cmp    %eax,-0x18(%rbp)
  jl     L18
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  neg    %eax
  cmp    %eax,-0x4(%rbp)
  jle    L9
  mov    -0xc(%rbp),%eax
  sub    %eax,-0x1c(%rbp)
  mov    -0x10(%rbp),%eax
  add    %eax,-0x24(%rbp)
L9:
  mov    -0x4(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jge    L22
  mov    -0x14(%rbp),%eax
  add    %eax,-0x1c(%rbp)
  mov    -0x8(%rbp),%eax
  add    %eax,-0x28(%rbp)
  jmp    L22
L148:
  nop
  nop
  leave
  ret
```

tool_calls: name: read_data
arguments: label: D7
datatype: byte[8]

tool: {"D7": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40]}

assistant: ```c
void drawLine(int x0, int y0, int x1, int y1, struct graphics *g, double bright, double hue, long long meta, double thick, struct tilecontext *tc) {
  int dx = abs(x1 - x0), sx = (x0 < x1) ? 1 : -1;
  int dy = abs(y1 - y0), sy = (y0 < y1) ? 1 : -1;
  int err = ((dx > dy) ? dx : -dy) / 2, e2;
  while (1) {
    if (x0 == x1 && y0 == y1) {
      break;
    }
    drawPixel(x0, y0, g, bright, hue, meta, tc);
    int n;
    for (n = 1; n < ceil(thick / 2); n++) {
      if (dx > dy) {
        drawPixel(x0, y0 - n, g, bright, hue, meta, tc);
        drawPixel(x0, y0 + n, g, bright, hue, meta, tc);
      } else {
        drawPixel(x0 - n, y0, g, bright, hue, meta, tc);
        drawPixel(x0 + n, y0, g, bright, hue, meta, tc);
      }
    }
    e2 = err;
    if (e2 > -dx) {
      err -= dy;
      x0 += sx;
    }
    if (e2 < dy) {
      err += dx;
      y0 += sy;
    }
  }
}
```