user: 请将以下的汇编代码转换成C语言代码:

```asm
<bezier>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %edi,-0x44(%rbp)
  mov    %esi,-0x48(%rbp)
  mov    %edx,-0x4c(%rbp)
  mov    %ecx,-0x50(%rbp)
  mov    %r8d,-0x54(%rbp)
  mov    %r9d,-0x58(%rbp)
  mov    -0x54(%rbp),%eax
  sub    -0x4c(%rbp),%eax
  mov    %eax,-0x40(%rbp)
  mov    -0x58(%rbp),%eax
  sub    -0x50(%rbp),%eax
  mov    %eax,-0x3c(%rbp)
  mov    -0x44(%rbp),%eax
  sub    -0x4c(%rbp),%eax
  cltq
  mov    %rax,-0x38(%rbp)
  mov    -0x48(%rbp),%eax
  sub    -0x50(%rbp),%eax
  cltq
  mov    %rax,-0x30(%rbp)
  mov    -0x3c(%rbp),%eax
  cltq
  imul   -0x38(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x40(%rbp),%eax
  cltq
  imul   -0x30(%rbp),%rax
  sub    %rax,%rdx
  pxor   %xmm0,%xmm0
  cvtsi2sd %rdx,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  mov    -0x40(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%eax
  cltq
  mov    %rdx,%rcx
  imul   %rax,%rcx
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x3c(%rbp),%eax
  cltq
  imul   %rdx,%rax
  lea    (%rcx,%rax,1),%rdx
  mov    -0x38(%rbp),%rax
  imul   %rax,%rax
  mov    %rax,%rcx
  mov    -0x30(%rbp),%rax
  imul   %rax,%rax
  add    %rcx,%rax
  cmp    %rax,%rdx
  jle    L90
  mov    -0x44(%rbp),%eax
  mov    %eax,-0x54(%rbp)
  mov    -0x40(%rbp),%edx
  mov    -0x4c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x44(%rbp)
  mov    -0x48(%rbp),%eax
  mov    %eax,-0x58(%rbp)
  mov    -0x3c(%rbp),%edx
  mov    -0x50(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x48(%rbp)
  movsd  -0x8(%rbp),%xmm0
  movq   D2(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
L90:
  pxor   %xmm0,%xmm0
  ucomisd -0x8(%rbp),%xmm0
  jp     L9
  pxor   %xmm0,%xmm0
  ucomisd -0x8(%rbp),%xmm0
  je     L63
L9:
  mov    -0x40(%rbp),%eax
  cltq
  add    %rax,-0x38(%rbp)
  mov    -0x44(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jge    L29
  mov    $0x1,%eax
  jmp    L103
L29:
  mov    $0xffffffff,%eax
L103:
  mov    %eax,-0x40(%rbp)
  mov    -0x40(%rbp),%eax
  cltq
  mov    -0x38(%rbp),%rdx
  imul   %rdx,%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x3c(%rbp),%eax
  cltq
  add    %rax,-0x30(%rbp)
  mov    -0x48(%rbp),%eax
  cmp    -0x58(%rbp),%eax
  jge    L51
  mov    $0x1,%eax
  jmp    L41
L51:
  mov    $0xffffffff,%eax
L41:
  mov    %eax,-0x3c(%rbp)
  mov    -0x3c(%rbp),%eax
  cltq
  mov    -0x30(%rbp),%rdx
  imul   %rdx,%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x38(%rbp),%rax
  imul   -0x30(%rbp),%rax
  add    %rax,%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x38(%rbp),%rax
  imul   %rax,%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x30(%rbp),%rax
  imul   %rax,%rax
  mov    %rax,-0x30(%rbp)
  pxor   %xmm0,%xmm0
  cvtsi2sdl -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x8(%rbp),%xmm1
  pxor   %xmm0,%xmm0
  cvtsi2sdl -0x3c(%rbp),%xmm0
  mulsd  %xmm0,%xmm1
  pxor   %xmm0,%xmm0
  comisd %xmm1,%xmm0
  jbe    L60
  negq   -0x38(%rbp)
  negq   -0x30(%rbp)
  negq   -0x28(%rbp)
  movsd  -0x8(%rbp),%xmm0
  movq   D2(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
L60:
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0x3c(%rbp),%xmm1
  movsd  D7(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x8(%rbp),%xmm1
  mov    -0x4c(%rbp),%eax
  sub    -0x44(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  %xmm0,%xmm1
  pxor   %xmm0,%xmm0
  cvtsi2sdq -0x38(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sdq -0x28(%rbp),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0x40(%rbp),%xmm1
  movsd  D7(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x8(%rbp),%xmm1
  mov    -0x48(%rbp),%eax
  sub    -0x50(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  %xmm0,%xmm1
  pxor   %xmm0,%xmm0
  cvtsi2sdq -0x30(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sdq -0x28(%rbp),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  shlq   -0x38(%rbp)
  shlq   -0x30(%rbp)
  movsd  -0x20(%rbp),%xmm0
  movapd %xmm0,%xmm1
  addsd  -0x18(%rbp),%xmm1
  pxor   %xmm0,%xmm0
  cvtsi2sdq -0x28(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
L97:
  mov    -0x48(%rbp),%edx
  mov    -0x44(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <setPixel@plt>
  mov    -0x44(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jne    L92
  mov    -0x48(%rbp),%eax
  cmp    -0x58(%rbp),%eax
  je     L80
L92:
  movsd  -0x10(%rbp),%xmm0
  movapd %xmm0,%xmm1
  addsd  %xmm0,%xmm1
  movsd  -0x20(%rbp),%xmm0
  comisd %xmm1,%xmm0
  seta   %al
  movzbl %al,%eax
  mov    %eax,-0x50(%rbp)
  movsd  -0x10(%rbp),%xmm0
  addsd  %xmm0,%xmm0
  comisd -0x18(%rbp),%xmm0
  jbe    L109
  mov    -0x40(%rbp),%eax
  add    %eax,-0x44(%rbp)
  pxor   %xmm1,%xmm1
  cvtsi2sdq -0x28(%rbp),%xmm1
  movsd  -0x20(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  pxor   %xmm0,%xmm0
  cvtsi2sdq -0x30(%rbp),%xmm0
  movsd  -0x18(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x18(%rbp),%xmm0
  movsd  -0x10(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
L109:
  cmpl   $0x0,-0x50(%rbp)
  je     L132
  mov    -0x3c(%rbp),%eax
  add    %eax,-0x48(%rbp)
  pxor   %xmm1,%xmm1
  cvtsi2sdq -0x28(%rbp),%xmm1
  movsd  -0x18(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  pxor   %xmm0,%xmm0
  cvtsi2sdq -0x38(%rbp),%xmm0
  movsd  -0x20(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  -0x20(%rbp),%xmm0
  movsd  -0x10(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
L132:
  movsd  -0x20(%rbp),%xmm0
  comisd -0x18(%rbp),%xmm0
  ja     L97
L63:
  mov    -0x58(%rbp),%ecx
  mov    -0x54(%rbp),%edx
  mov    -0x48(%rbp),%esi
  mov    -0x44(%rbp),%eax
  mov    %eax,%edi
  call   <line@plt>
  jmp    L23
L80:
  nop
L23:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_label: D2
datatype: byte[8]
name: unpack_data
arguments: data_label: D7
datatype: f64

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

tool: D7: 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);
}
```