user: What is the c source code of the assembly code below:

```asm
<SNPHWE_t>:
  endbr64
  mov    %rsi,%rcx
  cmp    %rdx,%rsi
  jl     L246
  mov    %rdx,%rax
  mov    %rsi,%rdx
  mov    %rax,%rcx
L246:
  lea    (%rdx,%rdi,1),%rax
  add    %rcx,%rax
  je     L373
  add    %rax,%rax
  lea    (%rdi,%rcx,2),%rsi
  pxor   %xmm2,%xmm2
  mov    %rdi,%r8
  movsd  D60(%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    L234
  cmp    $0x1,%rdi
  jle    L373
  pxor   %xmm7,%xmm7
  movapd %xmm4,%xmm6
  movsd  D0(%rip),%xmm14
  movsd  D15(%rip),%xmm10
  movsd  D152(%rip),%xmm8
  cvtsi2sd %rsi,%xmm7
  mov    D66(%rip),%rsi
  movsd  D32(%rip),%xmm9
  movapd %xmm10,%xmm0
  movsd  D9(%rip),%xmm11
  movq   %rsi,%xmm12
  mulsd  %xmm5,%xmm7
  movapd %xmm3,%xmm5
  mulsd  %xmm14,%xmm7
  jmp    L275
  nopl   (%rax)
L220:
  addsd  %xmm0,%xmm12
  comisd %xmm7,%xmm12
  ja     L5
  comisd %xmm11,%xmm2
  jbe    L174
L275:
  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    L220
  movapd %xmm0,%xmm13
  movapd %xmm0,%xmm11
  addsd  %xmm10,%xmm13
L161:
  movapd %xmm12,%xmm7
  xor    %eax,%eax
  divsd  -0x10(%rsp),%xmm7
  comisd %xmm7,%xmm13
  jae    L373
  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     L373
  mulsd  %xmm10,%xmm13
  addsd  %xmm13,%xmm10
  cmp    $0x1,%rcx
  jle    L171
  movapd %xmm7,%xmm12
  movsd  %xmm2,-0x8(%rsp)
  subsd  %xmm11,%xmm12
  movapd %xmm12,%xmm2
  jmp    L292
  nop
L283:
  comisd %xmm10,%xmm12
  jae    L386
  comisd D9(%rip),%xmm3
  jbe    L386
L292:
  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    L283
L159:
  xor    %eax,%eax
  ret
  nopw   0x0(%rax,%rax,1)
L234:
  test   %rcx,%rcx
  je     L373
  pxor   %xmm13,%xmm13
  movapd %xmm2,%xmm0
  movsd  D0(%rip),%xmm14
  movsd  D15(%rip),%xmm10
  movsd  D152(%rip),%xmm8
  cvtsi2sd %rsi,%xmm13
  mulsd  -0x10(%rsp),%xmm13
  mov    D66(%rip),%rsi
  movapd %xmm10,%xmm5
  movsd  D32(%rip),%xmm9
  movsd  D34(%rip),%xmm15
  movq   %rsi,%xmm11
  mulsd  %xmm14,%xmm13
  jmp    L313
  nopl   0x0(%rax,%rax,1)
L168:
  addsd  %xmm5,%xmm11
  comisd %xmm13,%xmm11
  ja     L5
  comisd %xmm15,%xmm3
  jbe    L248
L313:
  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    L168
  movapd %xmm5,%xmm7
  movsd  %xmm5,-0x8(%rsp)
  addsd  %xmm10,%xmm7
L162:
  movapd %xmm11,%xmm6
  xor    %eax,%eax
  divsd  -0x10(%rsp),%xmm6
  comisd %xmm6,%xmm7
  jae    L373
  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     L373
  mulsd  %xmm10,%xmm12
  addsd  %xmm12,%xmm10
  cmp    $0x3,%rdi
  jg     L398
L215:
  movsd  -0x10(%rsp),%xmm2
  mov    $0x1,%eax
  addsd  %xmm10,%xmm2
  comisd %xmm2,%xmm6
  ja     L373
  subsd  %xmm10,%xmm6
  movsd  -0x8(%rsp),%xmm11
  movsd  D34(%rip),%xmm10
  jmp    L20
  nopl   0x0(%rax,%rax,1)
L181:
  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    L159
  comisd %xmm2,%xmm11
  jae    L5
  movapd %xmm2,%xmm11
L20:
  comisd %xmm10,%xmm3
  ja     L181
  nopl   0x0(%rax)
L5:
  mov    $0x1,%eax
L373:
  ret
  xchg   %ax,%ax
L386:
  movsd  -0x8(%rsp),%xmm2
L171:
  movsd  -0x10(%rsp),%xmm3
  mov    $0x1,%eax
  addsd  %xmm10,%xmm3
  comisd %xmm3,%xmm7
  ja     L373
  comisd %xmm1,%xmm2
  subsd  %xmm10,%xmm7
  ja     L125
  jmp    L373
  nopl   0x0(%rax)
L196:
  comisd %xmm11,%xmm3
  jae    L5
  subsd  %xmm9,%xmm2
  comisd %xmm1,%xmm2
  jbe    L5
L125:
  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     L196
  jmp    L159
  nopl   0x0(%rax)
L174:
  movapd %xmm10,%xmm13
  movq   %rsi,%xmm11
  jmp    L161
  nopw   0x0(%rax,%rax,1)
L248:
  mov    %rsi,-0x8(%rsp)
  movapd %xmm10,%xmm7
  jmp    L162
  nop
L398:
  movapd %xmm6,%xmm7
  subsd  %xmm11,%xmm7
  movapd %xmm7,%xmm11
  jmp    L115
L35:
  comisd %xmm10,%xmm7
  jae    L215
  comisd D95(%rip),%xmm2
  jbe    L215
L115:
  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    L35
  jmp    L159
```

tool_calls: name: unpack_data
arguments: data_label: D60
type_infered: f64
name: unpack_data
arguments: data_label: D0
type_infered: f64
name: unpack_data
arguments: data_label: D15
type_infered: byte[8]
name: unpack_data
arguments: data_label: D152
type_infered: f32[2]
name: unpack_data
arguments: data_label: D66
type_infered: f32[2]
name: unpack_data
arguments: data_label: D32
type_infered: f32[2]
name: unpack_data
arguments: data_label: D9
type_infered: f64[2]
name: unpack_data
arguments: data_label: D34
type_infered: f64
name: unpack_data
arguments: data_label: D95
type_infered: f64

tool: D60: 1

tool: D0: 1.0339757656912846e-25

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

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

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

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

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

tool: D34: 0.5

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