// File: /workspace/github_c_makefile_star2_O1/radforddc[P]icpc_siggen/detector_geometry.c
// Function: outside_detector
int outside_detector(point pt, MJD_Siggen_Setup *setup){
  float r, z, r1, z1, br, a, b;

  z = pt.z;
  if (z > setup->zmax || z < 0) return 1;

  r = sqrt(SQ(pt.x)+SQ(pt.y));
  if (r > setup->rmax) return 1;
  r1 = setup->rmax - r;  // distance from outer radius
  z1 = setup->zmax - z;  // distance from top of crystal

  /* check point contact */
  if (z < setup->pc_length && r < setup->pc_radius) {
    if (!setup->bulletize_PC) return 1;
    if (setup->pc_length > setup->pc_radius) {
      a = setup->pc_length - setup->pc_radius;
      if (z < a || SQ(z-a) + SQ(r) < SQ(setup->pc_radius)) return 1;
    } else {
      a = setup->pc_radius - setup->pc_length;
      if (r < a || SQ(z) + SQ(r-a) < SQ(setup->pc_length)) return 1;
    }
    return 0;
  }

  /* check ditch */
  if (z < setup->ditch_depth  &&
      setup->ditch_thickness > 0 && setup->wrap_around_radius > 0 &&
      r < setup->wrap_around_radius &&
      r > setup->wrap_around_radius - setup->ditch_thickness) return 1;

  /* check hole */
  if ( r < setup->hole_radius &&
      z1 < setup->hole_length) {
    b = setup->zmax - setup->hole_length + setup->hole_bullet_radius;
    if (z > b) return 1;
    a = setup->hole_radius - setup->hole_bullet_radius;
    if (r < a || SQ(b-z) + SQ(r-a) < SQ(setup->hole_bullet_radius)) return 1;
  }

  /* check inner taper of hole */
  if (z1 < setup->inner_taper_length &&
      r  < setup->hole_radius +
            ((setup->inner_taper_length - z1) *
              setup->inner_taper_width / setup->inner_taper_length)) return 1;      
  /* check outer taper of crystal */
  if (z1 < setup->outer_taper_length &&
      r1 < ((setup->outer_taper_length - z1) *
              setup->outer_taper_width / setup->outer_taper_length)) return 1;
  /* check 45-degree bottom outer taper of crystal */
  if ( z < setup->bottom_taper_length &&
      r1 < setup->bottom_taper_length - z) return 1;

  /* check bulletizations */
  br = setup->top_bullet_radius;
  // adjust top bulletization position for top outer taper
  a = 0;
  if (setup->outer_taper_length > br)
    a = ((setup->outer_taper_length - br) *
         setup->outer_taper_width / setup->outer_taper_length);
  if (z1 < br &&
      r1 < br + a &&
      SQ(br - r1 + a) + SQ(br - z1) > br*br) return 1;
  br = setup->bottom_bullet_radius;
  if ( z < br &&
      r1 < br &&
      SQ(br - r1) + SQ(br - z ) > br*br) return 1;

  return 0;
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
xorps %xmm2, %xmm2
ucomiss %xmm1, %xmm2
movl $0x1, %ebx
ja 0x7d45
movq %rdi, %r14
ucomiss 0x3c0(%rdi), %xmm1
ja 0x7d45
movaps %xmm0, %xmm2
mulps %xmm0, %xmm2
shufps $0x55, %xmm2, %xmm2     # xmm2 = xmm2[1,1,1,1]
mulss %xmm0, %xmm0
addss %xmm2, %xmm0
xorps %xmm2, %xmm2
ucomiss %xmm2, %xmm0
jb 0x7d25
sqrtss %xmm0, %xmm0
jmp 0x7d36
movss %xmm1, 0x4(%rsp)
callq 0x1170
movss 0x4(%rsp), %xmm1
movss 0x3b4(%r14), %xmm8
ucomiss %xmm8, %xmm0
jbe 0x7d4f
movl %ebx, %eax
addq $0x8, %rsp
popq %rbx
popq %r14
retq
movss 0x3c0(%r14), %xmm3
movss 0xc(%r14), %xmm2
ucomiss %xmm1, %xmm2
jbe 0x7da8
movss 0x10(%r14), %xmm4
ucomiss %xmm0, %xmm4
jbe 0x7da8
cmpl $0x0, 0x84(%r14)
je 0x7d45
ucomiss %xmm4, %xmm2
jbe 0x7f4b
subss %xmm4, %xmm2
ucomiss %xmm1, %xmm2
ja 0x7d45
subss %xmm2, %xmm1
mulss %xmm0, %xmm0
mulss %xmm1, %xmm1
addss %xmm0, %xmm1
mulss %xmm4, %xmm4
ucomiss %xmm1, %xmm4
ja 0x7d45
jmp 0x7f75
movss 0x18(%r14), %xmm2
ucomiss %xmm1, %xmm2
jbe 0x7dde
movss 0x1c(%r14), %xmm2
xorps %xmm5, %xmm5
ucomiss %xmm5, %xmm2
jbe 0x7dde
movss 0x14(%r14), %xmm4
ucomiss %xmm5, %xmm4
jbe 0x7dde
ucomiss %xmm0, %xmm4
jbe 0x7dde
subss %xmm2, %xmm4
ucomiss %xmm4, %xmm0
ja 0x7d45
movaps %xmm3, %xmm2
subss %xmm1, %xmm2
movss 0x28(%r14), %xmm4
ucomiss %xmm0, %xmm4
jbe 0x7e46
movss 0x24(%r14), %xmm5
ucomiss %xmm2, %xmm5
jbe 0x7e46
subss %xmm5, %xmm3
movss 0x48(%r14), %xmm5
addss %xmm5, %xmm3
ucomiss %xmm3, %xmm1
ja 0x7d45
movaps %xmm4, %xmm6
subss %xmm5, %xmm6
ucomiss %xmm0, %xmm6
ja 0x7d45
subss %xmm1, %xmm3
movaps %xmm0, %xmm7
subss %xmm6, %xmm7
mulss %xmm7, %xmm7
mulss %xmm3, %xmm3
addss %xmm7, %xmm3
mulss %xmm5, %xmm5
ucomiss %xmm3, %xmm5
ja 0x7d45
movss 0x34(%r14), %xmm3
ucomiss %xmm2, %xmm3
jbe 0x7e6f
movaps %xmm3, %xmm5
subss %xmm2, %xmm5
mulss 0x3c(%r14), %xmm5
divss %xmm3, %xmm5
addss %xmm5, %xmm4
ucomiss %xmm0, %xmm4
ja 0x7d45
subss %xmm0, %xmm8
movss 0x2c(%r14), %xmm3
ucomiss %xmm2, %xmm3
jbe 0x7e9a
movaps %xmm3, %xmm0
subss %xmm2, %xmm0
mulss 0x38(%r14), %xmm0
divss %xmm3, %xmm0
ucomiss %xmm8, %xmm0
ja 0x7d45
movss 0x20(%r14), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x7eb3
subss %xmm1, %xmm0
ucomiss %xmm8, %xmm0
ja 0x7d45
movss 0x40(%r14), %xmm0
xorps %xmm4, %xmm4
ucomiss %xmm0, %xmm3
jbe 0x7ed2
movaps %xmm3, %xmm4
subss %xmm0, %xmm4
mulss 0x38(%r14), %xmm4
divss %xmm3, %xmm4
ucomiss %xmm2, %xmm0
jbe 0x7f10
movaps %xmm0, %xmm3
addss %xmm4, %xmm3
ucomiss %xmm8, %xmm3
jbe 0x7f10
movaps %xmm0, %xmm3
subss %xmm8, %xmm3
addss %xmm4, %xmm3
movaps %xmm0, %xmm4
subss %xmm2, %xmm4
mulss %xmm4, %xmm4
mulss %xmm3, %xmm3
addss %xmm4, %xmm3
mulss %xmm0, %xmm0
ucomiss %xmm0, %xmm3
ja 0x7d45
movss 0x44(%r14), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x7f75
ucomiss %xmm8, %xmm0
jbe 0x7f75
movaps %xmm0, %xmm2
subss %xmm8, %xmm2
movaps %xmm0, %xmm3
subss %xmm1, %xmm3
mulss %xmm3, %xmm3
mulss %xmm2, %xmm2
addss %xmm3, %xmm2
mulss %xmm0, %xmm0
ucomiss %xmm0, %xmm2
ja 0x7d45
jmp 0x7f75
subss %xmm2, %xmm4
ucomiss %xmm0, %xmm4
ja 0x7d45
subss %xmm4, %xmm0
mulss %xmm0, %xmm0
mulss %xmm1, %xmm1
addss %xmm0, %xmm1
mulss %xmm2, %xmm2
ucomiss %xmm1, %xmm2
ja 0x7d45
xorl %ebx, %ebx
jmp 0x7d45