// File: /workspace/github_cpp_makefile_star2_O3/logicx24[P]RayTracer/raytracer.cpp
// Function: Triangle::intersection(Ray&, float)
float intersection(Ray &ray, float eps) {
        vec3 normal = (edge2 ^ edge1).normalize();
        vec3 w0 = ray.pos - vertex1;
        float a = -(normal * w0);
        float b = normal * ray.vec;
        float r = a/b;

        if (fabs(b) < eps) {
            if (a == 0.0f) {
                return r;
            } else {
            	return MAXFLOAT;
            }
        }

        if (r < 0.0f) {
            return MAXFLOAT;
        }

        vec3 intersect = ray.pointAt(r);
        float uu, uv, vv, wu, wv, D;

        uu = edge1 * edge1;
        uv = edge1 * edge2;
        vv = edge2 * edge2;
        vec3 w = intersect - vertex1;
        wu = w * edge1;
        wv = w * edge2;
        D = uv * uv - uu * vv;

        float s, t;

        s = (uv * wv - vv * wu) / D;
        if (s < 0.0f || s > 1.0f) {
            return MAXFLOAT;
        }
        t = (uv * wu - uu * wv) / D;
        if (t < 0.0f || (s + t) > 1.0f) {
            return MAXFLOAT;
        }

        if (r < eps) {
            return MAXFLOAT;
        }
        return r;
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
movaps %xmm0, %xmm15
movsd 0x258(%rdi), %xmm4
movsd 0x248(%rdi), %xmm3
movsd 0x260(%rdi), %xmm8
movsd 0x240(%rdi), %xmm6
movapd %xmm6, %xmm0
mulsd %xmm8, %xmm0
movapd %xmm4, %xmm1
mulsd %xmm3, %xmm1
subsd %xmm0, %xmm1
movsd 0x238(%rdi), %xmm7
movsd 0x250(%rdi), %xmm5
movapd %xmm3, %xmm0
mulsd %xmm5, %xmm0
movsd %xmm8, -0x28(%rbp)
mulsd %xmm7, %xmm8
subsd %xmm0, %xmm8
movapd %xmm7, %xmm0
mulsd %xmm4, %xmm0
movapd %xmm5, %xmm9
mulsd %xmm6, %xmm9
subsd %xmm0, %xmm9
movapd %xmm8, %xmm0
mulsd %xmm8, %xmm0
movapd %xmm1, %xmm10
mulsd %xmm1, %xmm10
addsd %xmm0, %xmm10
movapd %xmm9, %xmm0
mulsd %xmm9, %xmm0
addsd %xmm10, %xmm0
sqrtsd %xmm0, %xmm0
movsd 0xf800(%rip), %xmm14    # 0x17010
divsd %xmm0, %xmm14
mulsd %xmm14, %xmm1
mulsd %xmm14, %xmm8
mulsd %xmm9, %xmm14
movsd (%rsi), %xmm9
movsd 0x8(%rsi), %xmm10
movsd 0x1f0(%rdi), %xmm11
movsd 0x1f8(%rdi), %xmm2
movapd %xmm9, %xmm0
movsd %xmm11, -0x18(%rbp)
subsd %xmm11, %xmm0
movapd %xmm10, %xmm11
movsd %xmm2, -0x20(%rbp)
subsd %xmm2, %xmm11
mulsd %xmm8, %xmm11
mulsd %xmm1, %xmm0
addsd %xmm11, %xmm0
movsd 0x10(%rsi), %xmm2
movsd 0x200(%rdi), %xmm12
movapd %xmm2, %xmm11
movsd %xmm12, -0x10(%rbp)
subsd %xmm12, %xmm11
mulsd %xmm14, %xmm11
addsd %xmm0, %xmm11
movsd 0x20(%rsi), %xmm12
mulsd %xmm12, %xmm8
movsd 0x18(%rsi), %xmm0
mulsd %xmm0, %xmm1
addsd %xmm8, %xmm1
movsd 0x28(%rsi), %xmm13
mulsd %xmm13, %xmm14
addsd %xmm1, %xmm14
xorps %xmm1, %xmm1
cvtsd2ss %xmm11, %xmm1
movaps 0xf772(%rip), %xmm8     # 0x17040
xorps %xmm1, %xmm8
xorps %xmm11, %xmm11
cvtsd2ss %xmm14, %xmm11
divss %xmm11, %xmm8
andps 0xf768(%rip), %xmm11    # 0x17050
movss %xmm15, -0x4(%rbp)
ucomiss %xmm11, %xmm15
jbe 0x7912
xorpd %xmm0, %xmm0
cmpeqss %xmm0, %xmm1
andps %xmm1, %xmm8
movss 0xf783(%rip), %xmm0     # 0x1708c
andnps %xmm0, %xmm1
orps %xmm8, %xmm1
jmp 0x7924
movss 0xf772(%rip), %xmm1     # 0x1708c
xorps %xmm11, %xmm11
ucomiss %xmm8, %xmm11
jbe 0x7929
movaps %xmm1, %xmm0
popq %rbp
retq
xorps %xmm11, %xmm11
cvtss2sd %xmm8, %xmm11
mulsd %xmm11, %xmm0
mulsd %xmm11, %xmm12
mulsd %xmm11, %xmm13
addsd %xmm0, %xmm9
addsd %xmm12, %xmm10
addsd %xmm13, %xmm2
movapd %xmm6, %xmm0
mulsd %xmm6, %xmm0
movapd %xmm7, %xmm11
mulsd %xmm7, %xmm11
addsd %xmm0, %xmm11
movapd %xmm3, %xmm14
mulsd %xmm3, %xmm14
addsd %xmm11, %xmm14
movapd %xmm4, %xmm0
mulsd %xmm6, %xmm0
movapd %xmm7, %xmm11
mulsd %xmm5, %xmm11
addsd %xmm0, %xmm11
movapd %xmm3, %xmm12
movsd -0x28(%rbp), %xmm15
mulsd %xmm15, %xmm12
addsd %xmm11, %xmm12
movapd %xmm4, %xmm0
mulsd %xmm4, %xmm0
movapd %xmm5, %xmm11
mulsd %xmm5, %xmm11
addsd %xmm0, %xmm11
movapd %xmm15, %xmm13
mulsd %xmm15, %xmm13
addsd %xmm11, %xmm13
subsd -0x18(%rbp), %xmm9
subsd -0x20(%rbp), %xmm10
subsd -0x10(%rbp), %xmm2
mulsd %xmm10, %xmm6
mulsd %xmm9, %xmm7
addsd %xmm6, %xmm7
mulsd %xmm2, %xmm3
addsd %xmm7, %xmm3
mulsd %xmm4, %xmm10
mulsd %xmm5, %xmm9
addsd %xmm10, %xmm9
xorps %xmm0, %xmm0
cvtsd2ss %xmm14, %xmm0
cvtsd2ss %xmm12, %xmm4
xorps %xmm7, %xmm7
cvtsd2ss %xmm13, %xmm7
cvtsd2ss %xmm3, %xmm3
mulsd %xmm15, %xmm2
addsd %xmm9, %xmm2
xorps %xmm6, %xmm6
cvtsd2ss %xmm2, %xmm6
movaps %xmm0, %xmm2
mulss %xmm7, %xmm2
movaps %xmm4, %xmm5
mulss %xmm4, %xmm5
subss %xmm2, %xmm5
mulss %xmm3, %xmm7
movaps %xmm4, %xmm2
mulss %xmm6, %xmm2
subss %xmm7, %xmm2
divss %xmm5, %xmm2
xorps %xmm7, %xmm7
ucomiss %xmm2, %xmm7
ja 0x7924
ucomiss 0xf630(%rip), %xmm2     # 0x17090
ja 0x7924
xorps 0xf5d3(%rip), %xmm0     # 0x17040
mulss %xmm6, %xmm0
mulss %xmm3, %xmm4
addss %xmm0, %xmm4
divss %xmm5, %xmm4
xorps %xmm0, %xmm0
ucomiss %xmm4, %xmm0
ja 0x7924
addss %xmm4, %xmm2
ucomiss 0xf5fc(%rip), %xmm2     # 0x17090
ja 0x7924
movaps %xmm8, %xmm1
cmpltss -0x4(%rbp), %xmm1
movss 0xf5e0(%rip), %xmm0     # 0x1708c
andps %xmm1, %xmm0
andnps %xmm8, %xmm1
orps %xmm0, %xmm1
jmp 0x7924
nop