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

```asm
<TkBezierPoints>:
  endbr64
  test   %esi,%esi
  jle    L35
  mov    %rdx,%rcx
  movslq %esi,%rdx
  pxor   %xmm2,%xmm2
  sub    $0x40,%rsp
  shl    $0x4,%rdx
  cvtsi2sd %esi,%xmm2
  mov    %rdi,%rax
  add    %rcx,%rdx
  cmp    %rdx,%rdi
  lea    0x40(%rdi),%rdi
  setae  %dl
  cmp    %rdi,%rcx
  setae  %dil
  movsd  %xmm2,0x30(%rsp)
  or     %dil,%dl
  je     L52
  lea    -0x1(%rsi),%edx
  cmp    $0x2,%edx
  jbe    L52
  movapd %xmm2,%xmm5
  movsd  0x8(%rax),%xmm2
  mov    %esi,%edi
  movsd  0x38(%rax),%xmm4
  unpcklpd %xmm5,%xmm5
  shr    $0x2,%edi
  mov    %rcx,%rdx
  movapd D5(%rip),%xmm12
  movaps %xmm5,-0x38(%rsp)
  movsd  (%rax),%xmm5
  unpcklpd %xmm2,%xmm2
  sub    $0x1,%edi
  movaps %xmm2,-0x18(%rsp)
  movsd  0x28(%rax),%xmm2
  unpcklpd %xmm4,%xmm4
  shl    $0x6,%rdi
  unpcklpd %xmm5,%xmm5
  movaps %xmm4,0x18(%rsp)
  lea    0x40(%rcx,%rdi,1),%rdi
  movaps %xmm5,-0x68(%rsp)
  movsd  0x10(%rax),%xmm5
  unpcklpd %xmm2,%xmm2
  movaps %xmm2,0x8(%rsp)
  unpcklpd %xmm5,%xmm5
  movaps %xmm5,-0x28(%rsp)
  movsd  0x20(%rax),%xmm5
  unpcklpd %xmm5,%xmm5
  movaps %xmm5,-0x58(%rsp)
  movsd  0x30(%rax),%xmm5
  unpcklpd %xmm5,%xmm5
  movaps %xmm5,-0x48(%rsp)
  movsd  0x18(%rax),%xmm5
  unpcklpd %xmm5,%xmm5
  movaps %xmm5,-0x8(%rsp)
  movdqa D62(%rip),%xmm5
  movaps %xmm5,-0x78(%rsp)
  nopw   0x0(%rax,%rax,1)
L69:
  movdqa -0x78(%rsp),%xmm6
  movapd -0x38(%rsp),%xmm4
  add    $0x40,%rdx
  movapd D42(%rip),%xmm10
  movapd -0x28(%rsp),%xmm15
  movdqa %xmm6,%xmm0
  movapd -0x58(%rsp),%xmm3
  paddd  D4(%rip),%xmm6
  cvtdq2pd %xmm0,%xmm1
  divpd  %xmm4,%xmm1
  pshufd $0xee,%xmm0,%xmm0
  movapd %xmm15,%xmm7
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm6,-0x78(%rsp)
  movapd D42(%rip),%xmm9
  divpd  %xmm4,%xmm0
  movapd %xmm1,%xmm6
  subpd  %xmm1,%xmm10
  movapd %xmm1,%xmm4
  mulpd  %xmm1,%xmm6
  mulpd  %xmm1,%xmm7
  movapd %xmm10,%xmm14
  movapd %xmm10,%xmm8
  mulpd  %xmm10,%xmm14
  mulpd  %xmm6,%xmm3
  mulpd  %xmm6,%xmm4
  mulpd  %xmm14,%xmm7
  mulpd  %xmm14,%xmm8
  mulpd  %xmm10,%xmm3
  addpd  %xmm3,%xmm7
  movapd -0x68(%rsp),%xmm3
  mulpd  %xmm8,%xmm3
  mulpd  %xmm12,%xmm7
  movapd %xmm0,%xmm5
  subpd  %xmm0,%xmm9
  movapd %xmm0,%xmm11
  mulpd  %xmm0,%xmm5
  movapd %xmm9,%xmm13
  movapd %xmm9,%xmm2
  addpd  %xmm7,%xmm3
  movapd -0x48(%rsp),%xmm7
  mulpd  %xmm9,%xmm13
  mulpd  %xmm4,%xmm7
  mulpd  %xmm5,%xmm11
  mulpd  %xmm13,%xmm2
  addpd  %xmm7,%xmm3
  movapd %xmm15,%xmm7
  movapd -0x58(%rsp),%xmm15
  mulpd  %xmm0,%xmm7
  mulpd  %xmm5,%xmm15
  mulpd  %xmm13,%xmm7
  mulpd  %xmm9,%xmm15
  addpd  %xmm15,%xmm7
  movapd -0x68(%rsp),%xmm15
  mulpd  %xmm2,%xmm15
  mulpd  %xmm12,%xmm7
  addpd  %xmm7,%xmm15
  movapd -0x48(%rsp),%xmm7
  mulpd  %xmm11,%xmm7
  addpd  %xmm15,%xmm7
  movapd -0x8(%rsp),%xmm15
  mulpd  %xmm15,%xmm1
  mulpd  %xmm15,%xmm0
  mulpd  %xmm14,%xmm1
  movapd 0x8(%rsp),%xmm14
  mulpd  %xmm13,%xmm0
  mulpd  %xmm14,%xmm6
  mulpd  %xmm14,%xmm5
  mulpd  %xmm10,%xmm6
  mulpd  %xmm9,%xmm5
  addpd  %xmm6,%xmm1
  movapd -0x18(%rsp),%xmm6
  addpd  %xmm5,%xmm0
  mulpd  %xmm6,%xmm8
  mulpd  %xmm12,%xmm1
  mulpd  %xmm12,%xmm0
  mulpd  %xmm6,%xmm2
  addpd  %xmm1,%xmm8
  movapd 0x18(%rsp),%xmm1
  mulpd  %xmm1,%xmm4
  addpd  %xmm0,%xmm2
  movapd %xmm3,%xmm0
  mulpd  %xmm1,%xmm11
  addpd  %xmm8,%xmm4
  addpd  %xmm11,%xmm2
  unpcklpd %xmm4,%xmm0
  unpckhpd %xmm4,%xmm3
  movups %xmm0,-0x40(%rdx)
  movapd %xmm7,%xmm0
  unpckhpd %xmm2,%xmm7
  unpcklpd %xmm2,%xmm0
  movups %xmm3,-0x30(%rdx)
  movups %xmm0,-0x20(%rdx)
  movups %xmm7,-0x10(%rdx)
  cmp    %rdx,%rdi
  jne    L69
  mov    %esi,%edi
  and    $0xfffffffc,%edi
  mov    %edi,%edx
  shl    $0x4,%rdx
  add    %rcx,%rdx
  lea    0x1(%rdi),%ecx
  cmp    %edi,%esi
  je     L57
  pxor   %xmm0,%xmm0
  movsd  0x10(%rax),%xmm3
  movsd  0x20(%rax),%xmm2
  cvtsi2sd %ecx,%xmm0
  movsd  0x30(%rsp),%xmm12
  movsd  (%rax),%xmm9
  lea    0x2(%rdi),%ecx
  movsd  D42(%rip),%xmm1
  movapd %xmm1,%xmm5
  divsd  %xmm12,%xmm0
  movapd %xmm0,%xmm4
  subsd  %xmm0,%xmm5
  movapd %xmm0,%xmm6
  mulsd  %xmm0,%xmm4
  mulsd  %xmm0,%xmm3
  movapd %xmm5,%xmm8
  movapd %xmm5,%xmm7
  mulsd  %xmm5,%xmm8
  mulsd  %xmm4,%xmm2
  mulsd  %xmm4,%xmm6
  mulsd  %xmm8,%xmm3
  mulsd  %xmm8,%xmm7
  mulsd  %xmm5,%xmm2
  mulsd  %xmm7,%xmm9
  addsd  %xmm2,%xmm3
  movsd  D5(%rip),%xmm2
  mulsd  %xmm2,%xmm3
  addsd  %xmm9,%xmm3
  movsd  0x30(%rax),%xmm9
  mulsd  %xmm6,%xmm9
  addsd  %xmm9,%xmm3
  movsd  %xmm3,(%rdx)
  mulsd  0x18(%rax),%xmm0
  mulsd  0x28(%rax),%xmm4
  mulsd  0x8(%rax),%xmm7
  mulsd  0x38(%rax),%xmm6
  mulsd  %xmm8,%xmm0
  mulsd  %xmm5,%xmm4
  addsd  %xmm4,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm7,%xmm0
  addsd  %xmm6,%xmm0
  movsd  %xmm0,0x8(%rdx)
  cmp    %ecx,%esi
  jl     L57
  pxor   %xmm0,%xmm0
  movapd %xmm1,%xmm5
  movsd  0x10(%rax),%xmm3
  add    $0x3,%edi
  cvtsi2sd %ecx,%xmm0
  movsd  0x20(%rax),%xmm9
  divsd  %xmm12,%xmm0
  movapd %xmm0,%xmm4
  subsd  %xmm0,%xmm5
  movapd %xmm0,%xmm6
  mulsd  %xmm0,%xmm4
  mulsd  %xmm0,%xmm3
  movapd %xmm5,%xmm8
  movapd %xmm5,%xmm7
  mulsd  %xmm5,%xmm8
  mulsd  %xmm4,%xmm9
  mulsd  %xmm4,%xmm6
  mulsd  %xmm8,%xmm3
  mulsd  %xmm8,%xmm7
  mulsd  %xmm5,%xmm9
  addsd  %xmm9,%xmm3
  movsd  (%rax),%xmm9
  mulsd  %xmm7,%xmm9
  mulsd  %xmm2,%xmm3
  addsd  %xmm9,%xmm3
  movsd  0x30(%rax),%xmm9
  mulsd  %xmm6,%xmm9
  addsd  %xmm9,%xmm3
  movsd  %xmm3,0x10(%rdx)
  mulsd  0x18(%rax),%xmm0
  mulsd  0x28(%rax),%xmm4
  mulsd  0x8(%rax),%xmm7
  mulsd  0x38(%rax),%xmm6
  mulsd  %xmm8,%xmm0
  mulsd  %xmm5,%xmm4
  addsd  %xmm4,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm7,%xmm0
  addsd  %xmm6,%xmm0
  movsd  %xmm0,0x18(%rdx)
  cmp    %edi,%esi
  jl     L57
  pxor   %xmm0,%xmm0
  movsd  0x10(%rax),%xmm3
  movsd  0x20(%rax),%xmm8
  cvtsi2sd %edi,%xmm0
  divsd  %xmm12,%xmm0
  movapd %xmm0,%xmm4
  subsd  %xmm0,%xmm1
  movapd %xmm0,%xmm5
  mulsd  %xmm0,%xmm4
  mulsd  %xmm0,%xmm3
  movapd %xmm1,%xmm7
  movapd %xmm1,%xmm6
  mulsd  %xmm1,%xmm7
  mulsd  %xmm4,%xmm8
  mulsd  %xmm4,%xmm5
  mulsd  %xmm7,%xmm3
  mulsd  %xmm7,%xmm6
  mulsd  %xmm1,%xmm8
  addsd  %xmm8,%xmm3
  movsd  (%rax),%xmm8
  mulsd  %xmm6,%xmm8
  mulsd  %xmm2,%xmm3
  addsd  %xmm8,%xmm3
  movsd  0x30(%rax),%xmm8
  mulsd  %xmm5,%xmm8
  addsd  %xmm8,%xmm3
  movsd  %xmm3,0x20(%rdx)
  mulsd  0x18(%rax),%xmm0
  mulsd  0x28(%rax),%xmm4
  mulsd  0x8(%rax),%xmm6
  mulsd  0x38(%rax),%xmm5
  mulsd  %xmm7,%xmm0
  mulsd  %xmm1,%xmm4
  addsd  %xmm4,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm6,%xmm0
  addsd  %xmm5,%xmm0
  movsd  %xmm0,0x28(%rdx)
L57:
  add    $0x40,%rsp
  ret
  cs nopw 0x0(%rax,%rax,1)
L52:
  movsd  D42(%rip),%xmm4
  movsd  D5(%rip),%xmm3
  add    $0x1,%esi
  mov    $0x1,%edx
  movsd  0x30(%rsp),%xmm6
  xchg   %ax,%ax
L62:
  pxor   %xmm1,%xmm1
  movapd %xmm4,%xmm0
  movsd  0x20(%rax),%xmm2
  movsd  0x10(%rax),%xmm9
  cvtsi2sd %edx,%xmm1
  add    $0x1,%edx
  add    $0x10,%rcx
  divsd  %xmm6,%xmm1
  subsd  %xmm1,%xmm0
  mulsd  %xmm1,%xmm9
  movapd %xmm1,%xmm5
  mulsd  %xmm1,%xmm5
  movapd %xmm0,%xmm10
  mulsd  %xmm0,%xmm10
  mulsd  %xmm5,%xmm2
  movapd %xmm5,%xmm7
  mulsd  %xmm1,%xmm7
  mulsd  %xmm10,%xmm9
  movapd %xmm10,%xmm8
  mulsd  %xmm0,%xmm8
  mulsd  %xmm0,%xmm2
  addsd  %xmm9,%xmm2
  movsd  (%rax),%xmm9
  mulsd  %xmm8,%xmm9
  mulsd  %xmm3,%xmm2
  addsd  %xmm9,%xmm2
  movsd  0x30(%rax),%xmm9
  mulsd  %xmm7,%xmm9
  addsd  %xmm9,%xmm2
  movsd  %xmm2,-0x10(%rcx)
  mulsd  0x28(%rax),%xmm5
  mulsd  0x18(%rax),%xmm1
  mulsd  0x8(%rax),%xmm8
  mulsd  0x38(%rax),%xmm7
  mulsd  %xmm5,%xmm0
  mulsd  %xmm10,%xmm1
  addsd  %xmm1,%xmm0
  mulsd  %xmm3,%xmm0
  addsd  %xmm8,%xmm0
  addsd  %xmm7,%xmm0
  movsd  %xmm0,-0x8(%rcx)
  cmp    %esi,%edx
  jne    L62
  add    $0x40,%rsp
  ret
  nopw   0x0(%rax,%rax,1)
L35:
  ret
```

tool_calls: name: read_data
arguments: data_label: D5
type_guessed: f64[2]
name: read_data
arguments: data_label: D62
type_guessed: byte[16]
name: read_data
arguments: data_label: D42
type_guessed: f64[2]
name: read_data
arguments: data_label: D4
type_guessed: byte[16]

tool: {"D5": [3.0,3.0]}

tool: {"D62": [0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00]}

tool: {"D42": [1.0,1.0]}

tool: {"D4": [0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00]}

assistant: ```c
void TkBezierPoints(control, numSteps, coordPtr) double control[];
int numSteps;
register double *coordPtr;
{
  int i;
  double u, u2, u3, t, t2, t3;
  for (i = 1; i <= numSteps; i++, coordPtr += 2) {
    t = ((double)i) / ((double)numSteps);
    t2 = t * t;
    t3 = t2 * t;
    u = 1.0 - t;
    u2 = u * u;
    u3 = u2 * u;
    coordPtr[0] = control[0] * u3 + 3.0 * (control[2] * t * u2 + control[4] * t2 * u) + control[6] * t3;
    coordPtr[1] = control[1] * u3 + 3.0 * (control[3] * t * u2 + control[5] * t2 * u) + control[7] * t3;
  }
}
```