user: 请从给定的汇编指令推导出C源代码:

```asm
<SNPHWE_t>:
  endbr64
  mov    %rsi,%rcx
  cmp    %rdx,%rsi
  jl     L243
  mov    %rdx,%rax
  mov    %rsi,%rdx
  mov    %rax,%rcx
L243:
  lea    (%rdx,%rdi,1),%rax
  add    %rcx,%rax
  je     L119
  add    %rax,%rax
  lea    (%rdi,%rcx,2),%rsi
  pxor   %xmm2,%xmm2
  mov    %rdi,%r8
  movsd  D58(%rip),%xmm1
  imul   %rax,%r8
  sub    %rsi,%rax
  pxor   %xmm3,%xmm3
  imul   %rsi,%rax
  pxor   %xmm4,%xmm4
  movapd %xmm1,%xmm12
  cvtsi2sd %rdi,%xmm2
  cvtsi2sd %rcx,%xmm3
  subsd  %xmm0,%xmm12
  cmp    %rax,%r8
  cvtsi2sd %rdx,%xmm4
  mov    $0x0,%eax
  movapd %xmm12,%xmm5
  divsd  %xmm0,%xmm5
  movsd  %xmm5,-0x10(%rsp)
  jle    L348
  cmp    $0x1,%rdi
  jle    L119
  pxor   %xmm7,%xmm7
  movapd %xmm4,%xmm6
  movsd  D151(%rip),%xmm14
  movsd  D51(%rip),%xmm10
  movsd  D47(%rip),%xmm8
  cvtsi2sd %rsi,%xmm7
  mov    D56(%rip),%rsi
  movsd  D3(%rip),%xmm9
  movapd %xmm10,%xmm0
  movsd  D17(%rip),%xmm11
  movq   %rsi,%xmm12
  mulsd  %xmm5,%xmm7
  movapd %xmm3,%xmm5
  mulsd  %xmm14,%xmm7
  jmp    L143
  nopl   (%rax)
L269:
  addsd  %xmm0,%xmm12
  comisd %xmm7,%xmm12
  ja     L381
  comisd %xmm11,%xmm2
  jbe    L178
L143:
  addsd  %xmm1,%xmm5
  movapd %xmm2,%xmm13
  addsd  %xmm1,%xmm6
  subsd  %xmm1,%xmm13
  movapd %xmm5,%xmm15
  mulsd  %xmm8,%xmm15
  mulsd  %xmm2,%xmm13
  subsd  %xmm9,%xmm2
  mulsd  %xmm6,%xmm15
  divsd  %xmm15,%xmm13
  mulsd  %xmm13,%xmm0
  comisd %xmm0,%xmm14
  jbe    L269
  movapd %xmm0,%xmm13
  movapd %xmm0,%xmm11
  addsd  %xmm10,%xmm13
L162:
  movapd %xmm12,%xmm7
  xor    %eax,%eax
  divsd  -0x10(%rsp),%xmm7
  comisd %xmm7,%xmm13
  jae    L119
  movapd %xmm5,%xmm13
  movapd %xmm2,%xmm12
  movapd %xmm6,%xmm14
  add    $0x2,%rdi
  addsd  %xmm1,%xmm13
  addsd  %xmm1,%xmm14
  mov    $0x1,%eax
  subsd  %xmm1,%xmm12
  mulsd  %xmm8,%xmm13
  mulsd  %xmm2,%xmm12
  mulsd  %xmm14,%xmm13
  movapd %xmm11,%xmm14
  divsd  %xmm13,%xmm12
  movapd %xmm1,%xmm13
  subsd  %xmm12,%xmm13
  divsd  %xmm13,%xmm14
  movapd %xmm3,%xmm13
  mulsd  %xmm8,%xmm13
  mulsd  %xmm4,%xmm13
  movsd  %xmm14,-0x10(%rsp)
  pxor   %xmm14,%xmm14
  cvtsi2sd %rdi,%xmm14
  movapd %xmm14,%xmm12
  subsd  %xmm1,%xmm12
  mulsd  %xmm14,%xmm12
  divsd  %xmm12,%xmm13
  movapd %xmm1,%xmm12
  subsd  %xmm13,%xmm12
  movapd %xmm12,%xmm15
  movapd %xmm10,%xmm12
  divsd  %xmm15,%xmm12
  addsd  -0x10(%rsp),%xmm12
  comisd %xmm12,%xmm7
  ja     L119
  mulsd  %xmm10,%xmm13
  addsd  %xmm13,%xmm10
  cmp    $0x1,%rcx
  jle    L127
  movapd %xmm7,%xmm12
  movsd  %xmm2,-0x8(%rsp)
  subsd  %xmm11,%xmm12
  movapd %xmm12,%xmm2
  jmp    L293
  nop
L304:
  comisd %xmm10,%xmm12
  jae    L372
  comisd D17(%rip),%xmm3
  jbe    L372
L293:
  subsd  %xmm1,%xmm3
  addsd  %xmm9,%xmm14
  subsd  %xmm1,%xmm4
  movapd %xmm3,%xmm12
  movapd %xmm14,%xmm15
  mulsd  %xmm8,%xmm12
  subsd  %xmm1,%xmm15
  mulsd  %xmm14,%xmm15
  mulsd  %xmm4,%xmm12
  divsd  %xmm15,%xmm12
  mulsd  %xmm12,%xmm13
  movapd %xmm10,%xmm12
  addsd  %xmm13,%xmm10
  comisd %xmm2,%xmm10
  jbe    L304
L384:
  xor    %eax,%eax
  ret
  nopw   0x0(%rax,%rax,1)
L348:
  test   %rcx,%rcx
  je     L119
  pxor   %xmm13,%xmm13
  movapd %xmm2,%xmm0
  movsd  D151(%rip),%xmm14
  movsd  D51(%rip),%xmm10
  movsd  D47(%rip),%xmm8
  cvtsi2sd %rsi,%xmm13
  mulsd  -0x10(%rsp),%xmm13
  mov    D56(%rip),%rsi
  movapd %xmm10,%xmm5
  movsd  D3(%rip),%xmm9
  movsd  D126(%rip),%xmm15
  movq   %rsi,%xmm11
  mulsd  %xmm14,%xmm13
  jmp    L205
  nopl   0x0(%rax,%rax,1)
L11:
  addsd  %xmm5,%xmm11
  comisd %xmm13,%xmm11
  ja     L381
  comisd %xmm15,%xmm3
  jbe    L88
L205:
  addsd  %xmm9,%xmm0
  movapd %xmm3,%xmm7
  subsd  %xmm1,%xmm3
  mulsd  %xmm8,%xmm7
  movapd %xmm0,%xmm6
  subsd  %xmm1,%xmm6
  mulsd  %xmm4,%xmm7
  subsd  %xmm1,%xmm4
  mulsd  %xmm0,%xmm6
  divsd  %xmm6,%xmm7
  mulsd  %xmm7,%xmm5
  comisd %xmm5,%xmm14
  jbe    L11
  movapd %xmm5,%xmm7
  movsd  %xmm5,-0x8(%rsp)
  addsd  %xmm10,%xmm7
L282:
  movapd %xmm11,%xmm6
  xor    %eax,%eax
  divsd  -0x10(%rsp),%xmm6
  comisd %xmm6,%xmm7
  jae    L119
  movapd %xmm3,%xmm7
  movapd %xmm0,%xmm13
  movapd %xmm0,%xmm12
  movsd  -0x8(%rsp),%xmm11
  mulsd  %xmm8,%xmm7
  addsd  %xmm1,%xmm13
  add    $0x1,%rcx
  add    $0x1,%rdx
  addsd  %xmm9,%xmm12
  pxor   %xmm14,%xmm14
  movapd %xmm1,%xmm15
  mov    $0x1,%eax
  cvtsi2sd %rdx,%xmm14
  mulsd  %xmm13,%xmm12
  pxor   %xmm13,%xmm13
  mulsd  %xmm4,%xmm7
  cvtsi2sd %rcx,%xmm13
  divsd  %xmm12,%xmm7
  movapd %xmm1,%xmm12
  subsd  %xmm7,%xmm12
  movapd %xmm11,%xmm7
  divsd  %xmm12,%xmm7
  movapd %xmm2,%xmm12
  subsd  %xmm1,%xmm12
  mulsd  %xmm2,%xmm12
  movsd  %xmm7,-0x10(%rsp)
  movapd %xmm13,%xmm7
  mulsd  %xmm8,%xmm7
  mulsd  %xmm14,%xmm7
  divsd  %xmm7,%xmm12
  movapd %xmm10,%xmm7
  subsd  %xmm12,%xmm15
  divsd  %xmm15,%xmm7
  addsd  -0x10(%rsp),%xmm7
  comisd %xmm7,%xmm6
  ja     L119
  mulsd  %xmm10,%xmm12
  addsd  %xmm12,%xmm10
  cmp    $0x3,%rdi
  jg     L222
L380:
  movsd  -0x10(%rsp),%xmm2
  mov    $0x1,%eax
  addsd  %xmm10,%xmm2
  comisd %xmm2,%xmm6
  ja     L119
  subsd  %xmm10,%xmm6
  movsd  -0x8(%rsp),%xmm11
  movsd  D126(%rip),%xmm10
  jmp    L86
  nopl   0x0(%rax,%rax,1)
L369:
  addsd  %xmm9,%xmm0
  movapd %xmm3,%xmm2
  subsd  %xmm1,%xmm3
  mulsd  %xmm8,%xmm2
  movapd %xmm0,%xmm7
  subsd  %xmm1,%xmm7
  mulsd  %xmm4,%xmm2
  subsd  %xmm1,%xmm4
  mulsd  %xmm0,%xmm7
  divsd  %xmm7,%xmm2
  mulsd  %xmm2,%xmm5
  movapd %xmm11,%xmm2
  addsd  %xmm5,%xmm2
  comisd %xmm6,%xmm2
  jae    L384
  comisd %xmm2,%xmm11
  jae    L381
  movapd %xmm2,%xmm11
L86:
  comisd %xmm10,%xmm3
  ja     L369
  nopl   0x0(%rax)
L381:
  mov    $0x1,%eax
L119:
  ret
  xchg   %ax,%ax
L372:
  movsd  -0x8(%rsp),%xmm2
L127:
  movsd  -0x10(%rsp),%xmm3
  mov    $0x1,%eax
  addsd  %xmm10,%xmm3
  comisd %xmm3,%xmm7
  ja     L119
  comisd %xmm1,%xmm2
  subsd  %xmm10,%xmm7
  ja     L43
  jmp    L119
  nopl   0x0(%rax)
L40:
  comisd %xmm11,%xmm3
  jae    L381
  subsd  %xmm9,%xmm2
  comisd %xmm1,%xmm2
  jbe    L381
L43:
  addsd  %xmm1,%xmm5
  movapd %xmm2,%xmm3
  addsd  %xmm1,%xmm6
  subsd  %xmm1,%xmm3
  movapd %xmm5,%xmm4
  mulsd  %xmm8,%xmm4
  mulsd  %xmm2,%xmm3
  mulsd  %xmm6,%xmm4
  divsd  %xmm4,%xmm3
  mulsd  %xmm3,%xmm0
  movapd %xmm11,%xmm3
  addsd  %xmm0,%xmm11
  comisd %xmm7,%xmm11
  jb     L40
  jmp    L384
  nopl   0x0(%rax)
L178:
  movapd %xmm10,%xmm13
  movq   %rsi,%xmm11
  jmp    L162
  nopw   0x0(%rax,%rax,1)
L88:
  mov    %rsi,-0x8(%rsp)
  movapd %xmm10,%xmm7
  jmp    L282
  nop
L222:
  movapd %xmm6,%xmm7
  subsd  %xmm11,%xmm7
  movapd %xmm7,%xmm11
  jmp    L306
L72:
  comisd %xmm10,%xmm7
  jae    L380
  comisd D94(%rip),%xmm2
  jbe    L380
L306:
  addsd  %xmm1,%xmm13
  subsd  %xmm9,%xmm2
  addsd  %xmm1,%xmm14
  movapd %xmm13,%xmm15
  movapd %xmm2,%xmm7
  mulsd  %xmm8,%xmm15
  subsd  %xmm1,%xmm7
  mulsd  %xmm2,%xmm7
  mulsd  %xmm14,%xmm15
  divsd  %xmm15,%xmm7
  mulsd  %xmm7,%xmm12
  movapd %xmm10,%xmm7
  addsd  %xmm12,%xmm10
  comisd %xmm11,%xmm10
  jbe    L72
  jmp    L384
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D58
data_type: f64
name: extract_symbolic_data
arguments: data_label: D151
data_type: f64
name: extract_symbolic_data
arguments: data_label: D51
data_type: byte[8]
name: extract_symbolic_data
arguments: data_label: D47
data_type: f32[2]
name: extract_symbolic_data
arguments: data_label: D56
data_type: f32[2]
name: extract_symbolic_data
arguments: data_label: D3
data_type: f32[2]
name: extract_symbolic_data
arguments: data_label: D17
data_type: f64[2]
name: extract_symbolic_data
arguments: data_label: D126
data_type: f64
name: extract_symbolic_data
arguments: data_label: D94
data_type: f64

tool: D58: 1

tool: D151: 1.0339757656912846e-25

tool: {"D51": [0x00,0xfe,0xff,0xff,0xff,0xff,0xbf,0x3a]}

tool: {"D47": [0.0,2.25]}

tool: {"D56": [0.0,0.0]}

tool: {"D3": [0.0,2.0]}

tool: {"D17": [1.5,0.5]}

tool: D126: 0.5

tool: D94: 3.5

assistant: ```c
int32_t SNPHWE_t(int32_t obs_hets, int32_t obs_hom1, int32_t obs_hom2, double thresh) {
  intptr_t obs_homc;
  intptr_t obs_homr;
  if (obs_hom1 < obs_hom2) {
    obs_homc = obs_hom2;
    obs_homr = obs_hom1;
  } else {
    obs_homc = obs_hom1;
    obs_homr = obs_hom2;
  }
  int64_t rare_copies = 2LL * obs_homr + obs_hets;
  int64_t genotypes2 = (obs_hets + obs_homc + obs_homr) * 2LL;
  double curr_hets_t2 = obs_hets;
  double curr_homr_t2 = obs_homr;
  double curr_homc_t2 = obs_homc;
  double tailp1 = (1 - 0.00000000000005684341886080801486968994140625) * 0.00000000000000000000000010339757656912845935892608650874535669572651386260986328125;
  double centerp = 0;
  double lastp2 = tailp1;
  double tailp2 = 0;
  double tail1_ceil;
  double tail2_ceil;
  double lastp1;
  double curr_hets_t1;
  double curr_homr_t1;
  double curr_homc_t1;
  double exit_thresh;
  double exit_threshx;
  double ratio;
  double preaddp;
  if (!genotypes2) {
    return 0;
  }
  thresh = (1 - thresh) / thresh;
  if (obs_hets * genotypes2 > rare_copies * (genotypes2 - rare_copies)) {
    if (obs_hets < 2) {
      return 0;
    }
    exit_thresh = rare_copies * thresh * 0.00000000000000000000000010339757656912845935892608650874535669572651386260986328125;
    do {
      curr_homr_t2 += 1;
      curr_homc_t2 += 1;
      lastp2 *= (curr_hets_t2 * (curr_hets_t2 - 1)) / (4 * curr_homr_t2 * curr_homc_t2);
      curr_hets_t2 -= 2;
      if (lastp2 < 0.00000000000000000000000010339757656912845935892608650874535669572651386260986328125) {
        tailp2 = lastp2;
        break;
      }
      centerp += lastp2;
      if (centerp > exit_thresh) {
        return 1;
      }
    } while (curr_hets_t2 > 1.5);
    exit_thresh = centerp / thresh;
    if (tailp1 + tailp2 >= exit_thresh) {
      return 0;
    }
    ratio = (curr_hets_t2 * (curr_hets_t2 - 1)) / (4 * (curr_homr_t2 + 1) * (curr_homc_t2 + 1));
    tail2_ceil = tailp2 / (1 - ratio);
    curr_hets_t1 = obs_hets + 2;
    curr_homr_t1 = obs_homr;
    curr_homc_t1 = obs_homc;
    lastp1 = (4 * curr_homr_t1 * curr_homc_t1) / (curr_hets_t1 * (curr_hets_t1 - 1));
    tail1_ceil = tailp1 / (1 - lastp1);
    if (tail1_ceil + tail2_ceil < exit_thresh) {
      return 1;
    }
    lastp1 *= tailp1;
    tailp1 += lastp1;
    if (obs_homr > 1) {
      exit_threshx = exit_thresh - tailp2;
      do {
        curr_hets_t1 += 2;
        curr_homr_t1 -= 1;
        curr_homc_t1 -= 1;
        lastp1 *= (4 * curr_homr_t1 * curr_homc_t1) / (curr_hets_t1 * (curr_hets_t1 - 1));
        preaddp = tailp1;
        tailp1 += lastp1;
        if (tailp1 > exit_threshx) {
          return 0;
        }
        if (tailp1 <= preaddp) {
          break;
        }
      } while (curr_homr_t1 > 1.5);
    }
    if (tailp1 + tail2_ceil < exit_thresh) {
      return 1;
    }
    exit_threshx = exit_thresh - tailp1;
    while (curr_hets_t2 > 1) {
      curr_homr_t2 += 1;
      curr_homc_t2 += 1;
      lastp2 *= (curr_hets_t2 * (curr_hets_t2 - 1)) / (4 * curr_homr_t2 * curr_homc_t2);
      preaddp = tailp2;
      tailp2 += lastp2;
      if (tailp2 >= exit_threshx) {
        return 0;
      }
      if (tailp2 <= preaddp) {
        return 1;
      }
      curr_hets_t2 -= 2;
    }
    return 1;
  } else {
    if (!obs_homr) {
      return 0;
    }
    exit_thresh = rare_copies * thresh * 0.00000000000000000000000010339757656912845935892608650874535669572651386260986328125;
    do {
      curr_hets_t2 += 2;
      lastp2 *= (4 * curr_homr_t2 * curr_homc_t2) / (curr_hets_t2 * (curr_hets_t2 - 1));
      curr_homr_t2 -= 1;
      curr_homc_t2 -= 1;
      if (lastp2 < 0.00000000000000000000000010339757656912845935892608650874535669572651386260986328125) {
        tailp2 = lastp2;
        break;
      }
      centerp += lastp2;
      if (centerp > exit_thresh) {
        return 1;
      }
    } while (curr_homr_t2 > 0.5);
    exit_thresh = centerp / thresh;
    if (tailp1 + tailp2 >= exit_thresh) {
      return 0;
    }
    ratio = (4 * curr_homr_t2 * curr_homc_t2) / ((curr_hets_t2 + 2) * (curr_hets_t2 + 1));
    tail2_ceil = tailp2 / (1 - ratio);
    curr_hets_t1 = obs_hets;
    curr_homr_t1 = obs_homr + 1;
    curr_homc_t1 = obs_homc + 1;
    lastp1 = (curr_hets_t1 * (curr_hets_t1 - 1)) / (4 * curr_homr_t1 * curr_homc_t1);
    tail1_ceil = tailp1 / (1 - lastp1);
    lastp1 *= tailp1;
    tailp1 += lastp1;
    if (tail1_ceil + tail2_ceil < exit_thresh) {
      return 1;
    }
    if (obs_hets >= 4) {
      exit_threshx = exit_thresh - tailp2;
      do {
        curr_hets_t1 -= 2;
        curr_homr_t1 += 1;
        curr_homc_t1 += 1;
        lastp1 *= (curr_hets_t1 * (curr_hets_t1 - 1)) / (4 * curr_homr_t1 * curr_homc_t1);
        preaddp = tailp1;
        tailp1 += lastp1;
        if (tailp1 > exit_threshx) {
          return 0;
        }
        if (tailp1 <= preaddp) {
          break;
        }
      } while (curr_hets_t1 > 3.5);
    }
    if (tailp1 + tail2_ceil < exit_thresh) {
      return 1;
    }
    exit_threshx = exit_thresh - tailp1;
    while (curr_homr_t2 > 0.5) {
      curr_hets_t2 += 2;
      lastp2 *= (4 * curr_homr_t2 * curr_homc_t2) / (curr_hets_t2 * (curr_hets_t2 - 1));
      curr_homr_t2 -= 1;
      curr_homc_t2 -= 1;
      preaddp = tailp2;
      tailp2 += lastp2;
      if (tailp2 >= exit_threshx) {
        return 0;
      }
      if (tailp2 <= preaddp) {
        return 1;
      }
    }
    return 1;
  }
}
```