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

```asm
<bezier>:
  endbr64
  push   %r15
  mov    %edx,%eax
  mov    %ecx,%edx
  mov    %esi,%ecx
  push   %r14
  sub    %edx,%ecx
  pxor   %xmm2,%xmm2
  mov    %esi,%r14d
  push   %r13
  movslq %ecx,%rcx
  mov    %r9d,%r13d
  push   %r12
  mov    %r8d,%r12d
  mov    %edi,%r8d
  mov    %rcx,%r11
  push   %rbp
  mov    %r12d,%r15d
  sub    %eax,%r8d
  mov    %edi,%ebp
  push   %rbx
  mov    %r9d,%ebx
  sub    %eax,%r15d
  movslq %r8d,%r8
  sub    %edx,%ebx
  imul   %rcx,%r11
  movslq %r15d,%r15
  movslq %ebx,%rbx
  mov    %r15,%r10
  mov    %rbx,%r9
  imul   %rcx,%r10
  sub    $0x38,%rsp
  imul   %r8,%r9
  sub    %r10,%r9
  mov    %r15,%r10
  cvtsi2sd %r9,%xmm2
  mov    %rbx,%r9
  imul   %rbx,%r9
  imul   %r15,%r10
  add    %r9,%r10
  mov    %r8,%r9
  imul   %r8,%r9
  add    %r11,%r9
  cmp    %r9,%r10
  jle    L115
  xorpd  D59(%rip),%xmm2
  mov    %r13d,%r14d
  mov    %r12d,%ebp
  mov    %esi,%r13d
  mov    %edi,%r12d
L115:
  pxor   %xmm0,%xmm0
  ucomisd %xmm0,%xmm2
  jp     L108
  je     L132
L108:
  add    %r8,%r15
  movapd %xmm2,%xmm3
  cmp    %r12d,%ebp
  jl     L81
  movl   $0xffffffff,0x28(%rsp)
  xorpd  D59(%rip),%xmm3
  neg    %r15
  add    %rcx,%rbx
  movsd  D22(%rip),%xmm4
  cmp    %r13d,%r14d
  jl     L40
L80:
  movl   $0xffffffff,0x2c(%rsp)
  xorpd  D59(%rip),%xmm3
  neg    %rbx
  movsd  D22(%rip),%xmm1
L46:
  mov    %r15,%rcx
  imul   %r15,%r15
  imul   %rbx,%rcx
  imul   %rbx,%rbx
  add    %rcx,%rcx
  comisd %xmm3,%xmm0
  jbe    L103
  xorpd  D59(%rip),%xmm2
  neg    %r15
  neg    %rbx
  neg    %rcx
L103:
  mulsd  %xmm2,%xmm1
  pxor   %xmm0,%xmm0
  pxor   %xmm5,%xmm5
  sub    %ebp,%eax
  cvtsi2sd %eax,%xmm0
  mulsd  %xmm4,%xmm2
  mov    %r14d,%eax
  sub    %edx,%eax
  cvtsi2sd %rcx,%xmm5
  mulsd  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %r15,%xmm1
  movsd  %xmm5,0x20(%rsp)
  add    %r15,%r15
  addsd  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  subsd  %xmm5,%xmm0
  mulsd  %xmm2,%xmm1
  pxor   %xmm2,%xmm2
  cvtsi2sd %rbx,%xmm2
  add    %rbx,%rbx
  addsd  %xmm2,%xmm1
  movapd %xmm0,%xmm2
  subsd  %xmm5,%xmm1
  addsd  %xmm1,%xmm2
  addsd  %xmm5,%xmm2
  jmp    L94
  xchg   %ax,%ax
L123:
  pxor   %xmm0,%xmm0
  subsd  0x20(%rsp),%xmm1
  add    0x2c(%rsp),%r14d
  cvtsi2sd %r15,%xmm0
  addsd  %xmm4,%xmm0
  comisd %xmm1,%xmm0
  addsd  %xmm0,%xmm2
  jbe    L132
L94:
  mov    %r14d,%esi
  mov    %ebp,%edi
  movsd  %xmm2,0x18(%rsp)
  movsd  %xmm1,0x10(%rsp)
  movsd  %xmm0,0x8(%rsp)
  call   <setPixel@plt>
  cmp    %r12d,%ebp
  movsd  0x8(%rsp),%xmm0
  movsd  0x10(%rsp),%xmm1
  movsd  0x18(%rsp),%xmm2
  jne    L138
  cmp    %r13d,%r14d
  je     L130
L138:
  movapd %xmm2,%xmm3
  movapd %xmm0,%xmm4
  addsd  %xmm2,%xmm3
  comisd %xmm1,%xmm3
  jbe    L63
  pxor   %xmm5,%xmm5
  subsd  0x20(%rsp),%xmm4
  add    0x28(%rsp),%ebp
  cvtsi2sd %rbx,%xmm5
  addsd  %xmm5,%xmm1
  addsd  %xmm1,%xmm2
L63:
  comisd %xmm3,%xmm0
  ja     L123
  movapd %xmm4,%xmm0
  comisd %xmm1,%xmm0
  ja     L94
L132:
  add    $0x38,%rsp
  mov    %r13d,%ecx
  mov    %r12d,%edx
  mov    %r14d,%esi
  pop    %rbx
  mov    %ebp,%edi
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1060 <line@plt>
  nopl   (%rax)
L81:
  movl   $0x1,0x28(%rsp)
  movsd  D79(%rip),%xmm4
  add    %rcx,%rbx
  cmp    %r13d,%r14d
  jge    L80
L40:
  movl   $0x1,0x2c(%rsp)
  movsd  D79(%rip),%xmm1
  jmp    L46
  nopl   0x0(%rax)
L130:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: parse_data
arguments: data_label: D59
type: byte[16]
name: parse_data
arguments: data_label: D22
type: byte[8]
name: parse_data
arguments: data_label: D79
type: f64

tool: {"D59": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: {"D22": [0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xc0]}

tool: D79: 4

assistant: ```c
void bezier(int x0, int y0, int x1, int y1, int x2, int y2) {
  int sx = x2 - x1, sy = y2 - y1;
  long xx = x0 - x1, yy = y0 - y1, xy;
  double dx, dy, err, cur = xx * sy - yy * sx;
  if (sx * (long)sx + sy * (long)sy > xx * xx + yy * yy) {
    x2 = x0;
    x0 = sx + x1;
    y2 = y0;
    y0 = sy + y1;
    cur = -cur;
  }
  if (cur != 0) {
    xx += sx;
    xx *= sx = x0 < x2 ? 1 : -1;
    yy += sy;
    yy *= sy = y0 < y2 ? 1 : -1;
    xy = 2 * xx * yy;
    xx *= xx;
    yy *= yy;
    if (cur * sx * sy < 0) {
      xx = -xx;
      yy = -yy;
      xy = -xy;
      cur = -cur;
    }
    dx = 4.0 * sy * cur * (x1 - x0) + xx - xy;
    dy = 4.0 * sx * cur * (y0 - y1) + yy - xy;
    xx += xx;
    yy += yy;
    err = dx + dy + xy;
    do {
      setPixel(x0, y0);
      if (x0 == x2 && y0 == y2)
        return;
      y1 = 2 * err < dx;
      if (2 * err > dy) {
        x0 += sx;
        dx -= xy;
        err += dy += yy;
      }
      if (y1) {
        y0 += sy;
        dy -= xy;
        err += dx += xx;
      }
    } while (dy < dx);
  }
  line(x0, y0, x2, y2);
}
```