user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<pointinpoly>:
  endbr64
  movsd  (%rsi),%xmm3
  movsd  D6(%rip),%xmm0
  mov    %rsi,%rax
  ucomisd %xmm0,%xmm3
  jp     L82
  je     L161
L82:
  lea    0x10(%rax),%r8
  mov    $0x1,%ecx
  mov    $0x1,%r11d
  xchg   %ax,%ax
L84:
  mov    %rcx,%r10
  mov    %r8,%rdx
  lea    0x10(%r8),%r8
  shl    $0x4,%r10
  ucomisd -0x10(%r8),%xmm0
  setp   %sil
  cmovne %r11d,%esi
  cmp    $0x64,%ecx
  setne  %r9b
  add    $0x1,%rcx
  test   %r9b,%sil
  jne    L84
  sub    $0x10,%r10
L90:
  add    %rax,%r10
  movsd  0x8(%rdi),%xmm1
  movsd  0x8(%rax),%xmm0
  movsd  0x8(%r10),%xmm5
  movsd  (%rdi),%xmm2
  comisd %xmm1,%xmm5
  setae  %sil
  comisd %xmm1,%xmm0
  setae  %cl
  xor    %r8d,%r8d
  cmp    %cl,%sil
  je     L151
  movsd  (%r10),%xmm4
  comisd %xmm2,%xmm4
  setae  %r8b
  comisd %xmm2,%xmm3
  setae  %cl
  cmp    %cl,%r8b
  je     L179
  movapd %xmm5,%xmm6
  subsd  %xmm4,%xmm3
  subsd  %xmm1,%xmm6
  mulsd  %xmm6,%xmm3
  movapd %xmm0,%xmm6
  subsd  %xmm5,%xmm6
  divsd  %xmm6,%xmm3
  subsd  %xmm3,%xmm4
  comisd %xmm2,%xmm4
  setae  %r8b
L179:
  movzbl %r8b,%r8d
L151:
  add    $0x18,%rax
  cmp    %rdx,%rax
  jae    L20
  nopl   0x0(%rax)
L45:
  comisd %xmm1,%xmm0
  jb     L189
  cs nopw 0x0(%rax,%rax,1)
L37:
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  jb     L123
  add    $0x10,%rax
  cmp    %rdx,%rax
  jb     L37
L76:
  and    $0x1,%r8d
L20:
  mov    %r8d,%eax
  ret
  nopl   0x0(%rax,%rax,1)
L189:
  comisd (%rax),%xmm1
  jbe    L104
  cs nopw 0x0(%rax,%rax,1)
L158:
  add    $0x10,%rax
  cmp    %rdx,%rax
  jae    L76
  comisd (%rax),%xmm1
  ja     L158
L104:
  cmp    %rax,%rdx
  jbe    L76
  movsd  -0x18(%rax),%xmm3
  movsd  -0x8(%rax),%xmm4
  movsd  (%rax),%xmm0
  jmp    L167
  nopl   0x0(%rax)
L123:
  cmp    %rax,%rdx
  jbe    L76
  movsd  -0x18(%rax),%xmm3
  movsd  -0x8(%rax),%xmm4
L167:
  comisd %xmm2,%xmm3
  setae  %sil
  comisd %xmm2,%xmm4
  setae  %cl
  cmp    %cl,%sil
  je     L141
  movsd  -0x10(%rax),%xmm6
  subsd  %xmm3,%xmm4
  xor    %ecx,%ecx
  movapd %xmm6,%xmm5
  subsd  %xmm1,%xmm5
  mulsd  %xmm5,%xmm4
  movapd %xmm0,%xmm5
  subsd  %xmm6,%xmm5
  divsd  %xmm5,%xmm4
  subsd  %xmm4,%xmm3
  comisd %xmm2,%xmm3
  setae  %cl
  add    %ecx,%r8d
L46:
  add    $0x10,%rax
  cmp    %rdx,%rax
  jb     L45
  jmp    L76
  xchg   %ax,%ax
L141:
  comisd %xmm2,%xmm3
  sbb    $0xffffffff,%r8d
  jmp    L46
L161:
  mov    %rsi,%rdx
  mov    $0xfffffffffffffff0,%r10
  jmp    L90
```

tool_calls: name: parse_data
arguments: tag: D6
type: byte[8]

tool: {"D6": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xbf]}

assistant: ```c
int pointinpoly(point, pgon)
double point[2], pgon[100][2];
{
  int i, numverts, inside_flag, xflag0;
  int crossings;
  double *p, *stop;
  double tx, ty, y;
  for (i = 0; pgon[i][0] != -1 && i < 100; i++)
    ;
  numverts = i;
  crossings = 0;
  tx = point[0];
  ty = point[1];
  y = pgon[numverts - 1][1];
  p = (double *)pgon + 1;
  if ((y >= ty) != (*p >= ty)) {
    if ((xflag0 = (pgon[numverts - 1][0] >= tx)) == (*(double *)pgon >= tx)) {
      if (xflag0)
        crossings++;
    } else {
      crossings += (pgon[numverts - 1][0] - (y - ty) * (*(double *)pgon - pgon[numverts - 1][0]) / (*p - y)) >= tx;
    }
  }
  stop = pgon[numverts];
  for (y = *p, p += 2; p < stop; y = *p, p += 2) {
    if (y >= ty) {
      while ((p < stop) && (*p >= ty))
        p += 2;
      if (p >= stop)
        break;
      if ((xflag0 = (*(p - 3) >= tx)) == (*(p - 1) >= tx)) {
        if (xflag0)
          crossings++;
      } else {
        crossings += (*(p - 3) - (*(p - 2) - ty) * (*(p - 1) - *(p - 3)) / (*p - *(p - 2))) >= tx;
      }
    } else {
      while ((p < stop) && (*p < ty))
        p += 2;
      if (p >= stop)
        break;
      if ((xflag0 = (*(p - 3) >= tx)) == (*(p - 1) >= tx)) {
        if (xflag0)
          crossings++;
      } else {
        crossings += (*(p - 3) - (*(p - 2) - ty) * (*(p - 1) - *(p - 3)) / (*p - *(p - 2))) >= tx;
      }
    }
  }
  inside_flag = crossings & 0x01;
  return (inside_flag);
}
```