// File: /workspace/github_cpp_makefile_star2_O3/logicx24[P]RayTracer/raytracer.cpp
// Function: Sphere::intersection(Ray&, float)
float intersection(Ray &ray, float eps) {
		vec3 p_c = ray.pos - center;
        vec3 d = ray.vec;
        float discriminant = pow(d * p_c, 2) - ((d * d) * ((p_c * p_c) - pow(radius, 2)));
        if (discriminant < 0) {
        	return MAXFLOAT;
        }
		float t1 = (-d*(p_c) + sqrt(discriminant)) / (d * d);
		float t2 = (-d*(p_c) - sqrt(discriminant)) / (d * d);
        if (t1 < eps && t2 < eps) {
        	return MAXFLOAT;
        }
        vec3 p1 = ray.pointAt(t1);
        vec3 p2 = ray.pointAt(t2);
        float d1 = distance(ray.pos, p1);
        float d2 = distance(ray.pos, p2);
	    if (d1 < d2) {
        	return t1;
        } else {
        	return t2;
        }
	}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
subq $0x38, %rsp
movsd (%rsi), %xmm1
movsd 0x8(%rsi), %xmm5
subsd 0x1f0(%rdi), %xmm1
subsd 0x1f8(%rdi), %xmm5
movaps %xmm0, %xmm8
movsd 0x10(%rsi), %xmm3
subsd 0x200(%rdi), %xmm3
movsd 0x18(%rsi), %xmm9
movsd 0x20(%rsi), %xmm6
movsd 0x28(%rsi), %xmm10
movapd %xmm5, %xmm0
mulsd %xmm6, %xmm0
movapd %xmm9, %xmm4
mulsd %xmm1, %xmm4
addsd %xmm0, %xmm4
movapd %xmm10, %xmm2
mulsd %xmm3, %xmm2
addsd %xmm2, %xmm4
mulsd %xmm4, %xmm4
mulsd %xmm6, %xmm6
movapd %xmm9, %xmm7
mulsd %xmm9, %xmm7
addsd %xmm6, %xmm7
mulsd %xmm10, %xmm10
addsd %xmm7, %xmm10
mulsd %xmm5, %xmm5
movapd %xmm1, %xmm6
mulsd %xmm1, %xmm6
addsd %xmm5, %xmm6
mulsd %xmm3, %xmm3
addsd %xmm6, %xmm3
xorps %xmm5, %xmm5
cvtss2sd 0x208(%rdi), %xmm5
mulsd %xmm5, %xmm5
subsd %xmm5, %xmm3
mulsd %xmm10, %xmm3
subsd %xmm3, %xmm4
cvtsd2ss %xmm4, %xmm4
movss 0xeb9c(%rip), %xmm7     # 0x1708c
xorpd %xmm3, %xmm3
ucomiss %xmm4, %xmm3
ja 0x86cf
movq %rsi, %rbx
xorpd 0xeb67(%rip), %xmm9     # 0x17070
mulsd %xmm1, %xmm9
subsd %xmm0, %xmm9
subsd %xmm2, %xmm9
xorps %xmm1, %xmm1
sqrtss %xmm4, %xmm1
ucomiss %xmm3, %xmm4
movaps %xmm1, %xmm0
movss %xmm8, -0xc(%rbp)
movapd %xmm9, -0x40(%rbp)
movsd %xmm10, -0x18(%rbp)
jae 0x856f
movaps %xmm4, %xmm0
movss %xmm4, -0x30(%rbp)
movss %xmm1, -0x10(%rbp)
callq 0x3470
movss -0x10(%rbp), %xmm1
movss -0x30(%rbp), %xmm4
movsd -0x18(%rbp), %xmm10
movss 0xeb29(%rip), %xmm7     # 0x1708c
movapd -0x40(%rbp), %xmm9
movss -0xc(%rbp), %xmm8
cvtss2sd %xmm0, %xmm0
addsd %xmm9, %xmm0
divsd %xmm10, %xmm0
cvtsd2ss %xmm0, %xmm11
xorps %xmm0, %xmm0
ucomiss %xmm0, %xmm4
jae 0x85b9
movaps %xmm4, %xmm0
movaps %xmm11, -0x30(%rbp)
callq 0x3470
movsd -0x18(%rbp), %xmm10
movss 0xeae7(%rip), %xmm7     # 0x1708c
movapd -0x40(%rbp), %xmm9
movaps -0x30(%rbp), %xmm11
movss -0xc(%rbp), %xmm8
movaps %xmm0, %xmm1
xorps %xmm0, %xmm0
cvtss2sd %xmm1, %xmm0
subsd %xmm0, %xmm9
divsd %xmm10, %xmm9
xorps %xmm0, %xmm0
cvtsd2ss %xmm9, %xmm0
ucomiss %xmm11, %xmm8
jbe 0x85e2
ucomiss %xmm0, %xmm8
ja 0x86cf
xorps %xmm7, %xmm7
cvtss2sd %xmm11, %xmm7
movsd 0x18(%rbx), %xmm4
movapd %xmm4, %xmm8
mulsd %xmm7, %xmm8
movsd 0x20(%rbx), %xmm3
movapd %xmm3, %xmm9
mulsd %xmm7, %xmm9
movsd 0x28(%rbx), %xmm1
mulsd %xmm1, %xmm7
movsd (%rbx), %xmm6
movsd 0x8(%rbx), %xmm2
addsd %xmm6, %xmm8
addsd %xmm2, %xmm9
movsd 0x10(%rbx), %xmm5
addsd %xmm5, %xmm7
xorps %xmm10, %xmm10
cvtss2sd %xmm0, %xmm10
mulsd %xmm10, %xmm4
mulsd %xmm10, %xmm3
mulsd %xmm10, %xmm1
addsd %xmm6, %xmm4
addsd %xmm2, %xmm3
movapd %xmm6, %xmm10
subsd %xmm8, %xmm10
mulsd %xmm10, %xmm10
movapd %xmm2, %xmm8
subsd %xmm9, %xmm8
mulsd %xmm8, %xmm8
addsd %xmm10, %xmm8
movapd %xmm5, %xmm9
subsd %xmm7, %xmm9
mulsd %xmm9, %xmm9
addsd %xmm8, %xmm9
xorps %xmm7, %xmm7
sqrtsd %xmm9, %xmm7
cvtsd2ss %xmm7, %xmm7
addsd %xmm5, %xmm1
subsd %xmm4, %xmm6
mulsd %xmm6, %xmm6
subsd %xmm3, %xmm2
mulsd %xmm2, %xmm2
addsd %xmm6, %xmm2
subsd %xmm1, %xmm5
mulsd %xmm5, %xmm5
addsd %xmm2, %xmm5
xorps %xmm1, %xmm1
sqrtsd %xmm5, %xmm1
cvtsd2ss %xmm1, %xmm1
cmpltss %xmm1, %xmm7
andps %xmm7, %xmm11
andnps %xmm0, %xmm7
orps %xmm11, %xmm7
movaps %xmm7, %xmm0
addq $0x38, %rsp
popq %rbx
popq %rbp
retq
nop