// File: Aries-orz[P]Ari-RayTracing/src/RTBBox.cpp
// Function: rt::RTBBox::hit(rt::Ray const&)
double RTBBox::hit(const Ray& r) {
    double ox = r.o.x, oy = r.o.y, oz = r.o.z;
    double dx = r.d.x, dy = r.d.y, dz = r.d.z;
    double x0 = p0.x, y0 = p0.y, z0 = p0.z;
    double x1 = p1.x, y1 = p1.y, z1 = p1.z;
    
    double tx_min, ty_min, tz_min;
    double tx_max, ty_max, tz_max;
    
    double a = 1.0/dx;
    if (a >= 0) {
        tx_min = (x0 - ox) * a;
        tx_max = (x1 - ox) * a;
    } else {
        tx_min = (x1 - ox) * a;
        tx_max = (x0 - ox) * a;
    }
    
    double b = 1.0/dy;
    if (b >= 0) {
        ty_min = (y0 - oy) * b;
        ty_max = (y1 - oy) * b;
    } else {
        ty_min = (y1 - oy) * b;
        ty_max = (y0 - oy) * b;
    }
    
    double c = 1.0/dz;
    if (c >= 0) {
        tz_min = (z0 - oz) * c;
        tz_max = (z1 - oz) * c;
    } else {
        tz_min = (z1 - oz) * c;
        tz_max = (z0 - oz) * c;
    }
    
    double t0, t1;
    if (tx_min > ty_min)
        t0 = tx_min;
    else
        t0 = ty_min;
    if (tz_min > t0)
        t0 = tz_min;
    
    if (tx_max < ty_max)
        t1 = tx_max;
    else
        t1 = ty_max;
    if (tz_max < t1)
        t1 = tz_max;
    
    if (t0 < t1 && t1 > 1e-4) return 1;
    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq -0x18(%rbp), %rcx
movsd (%rcx), %xmm0
movsd %xmm0, -0x20(%rbp)
movq -0x18(%rbp), %rcx
movsd 0x8(%rcx), %xmm0
movsd %xmm0, -0x28(%rbp)
movq -0x18(%rbp), %rcx
movsd 0x10(%rcx), %xmm0
movsd %xmm0, -0x30(%rbp)
movq -0x18(%rbp), %rcx
movsd 0x18(%rcx), %xmm0
movsd %xmm0, -0x38(%rbp)
movq -0x18(%rbp), %rcx
movsd 0x20(%rcx), %xmm0
movsd %xmm0, -0x40(%rbp)
movq -0x18(%rbp), %rcx
movsd 0x28(%rcx), %xmm0
movsd %xmm0, -0x48(%rbp)
movsd 0x40(%rax), %xmm0
movsd %xmm0, -0x50(%rbp)
movsd 0x48(%rax), %xmm0
movsd %xmm0, -0x58(%rbp)
movsd 0x50(%rax), %xmm0
movsd %xmm0, -0x60(%rbp)
movsd 0x58(%rax), %xmm0
movsd %xmm0, -0x68(%rbp)
movsd 0x60(%rax), %xmm0
movsd %xmm0, -0x70(%rbp)
movsd 0x68(%rax), %xmm0
movsd %xmm0, -0x78(%rbp)
movsd 0x3d8d(%rip), %xmm0     # 0xb008
divsd -0x38(%rbp), %xmm0
movsd %xmm0, -0xb0(%rbp)
movsd -0xb0(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x72cc
movsd -0x50(%rbp), %xmm0
subsd -0x20(%rbp), %xmm0
mulsd -0xb0(%rbp), %xmm0
movsd %xmm0, -0x80(%rbp)
movsd -0x68(%rbp), %xmm0
subsd -0x20(%rbp), %xmm0
mulsd -0xb0(%rbp), %xmm0
movsd %xmm0, -0x98(%rbp)
jmp 0x72fd
movsd -0x68(%rbp), %xmm0
subsd -0x20(%rbp), %xmm0
mulsd -0xb0(%rbp), %xmm0
movsd %xmm0, -0x80(%rbp)
movsd -0x50(%rbp), %xmm0
subsd -0x20(%rbp), %xmm0
mulsd -0xb0(%rbp), %xmm0
movsd %xmm0, -0x98(%rbp)
movsd 0x3d03(%rip), %xmm0     # 0xb008
divsd -0x40(%rbp), %xmm0
movsd %xmm0, -0xb8(%rbp)
movsd -0xb8(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x7359
movsd -0x58(%rbp), %xmm0
subsd -0x28(%rbp), %xmm0
mulsd -0xb8(%rbp), %xmm0
movsd %xmm0, -0x88(%rbp)
movsd -0x70(%rbp), %xmm0
subsd -0x28(%rbp), %xmm0
mulsd -0xb8(%rbp), %xmm0
movsd %xmm0, -0xa0(%rbp)
jmp 0x738d
movsd -0x70(%rbp), %xmm0
subsd -0x28(%rbp), %xmm0
mulsd -0xb8(%rbp), %xmm0
movsd %xmm0, -0x88(%rbp)
movsd -0x58(%rbp), %xmm0
subsd -0x28(%rbp), %xmm0
mulsd -0xb8(%rbp), %xmm0
movsd %xmm0, -0xa0(%rbp)
movsd 0x3c73(%rip), %xmm0     # 0xb008
divsd -0x48(%rbp), %xmm0
movsd %xmm0, -0xc0(%rbp)
movsd -0xc0(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x73e9
movsd -0x60(%rbp), %xmm0
subsd -0x30(%rbp), %xmm0
mulsd -0xc0(%rbp), %xmm0
movsd %xmm0, -0x90(%rbp)
movsd -0x78(%rbp), %xmm0
subsd -0x30(%rbp), %xmm0
mulsd -0xc0(%rbp), %xmm0
movsd %xmm0, -0xa8(%rbp)
jmp 0x741d
movsd -0x78(%rbp), %xmm0
subsd -0x30(%rbp), %xmm0
mulsd -0xc0(%rbp), %xmm0
movsd %xmm0, -0x90(%rbp)
movsd -0x60(%rbp), %xmm0
subsd -0x30(%rbp), %xmm0
mulsd -0xc0(%rbp), %xmm0
movsd %xmm0, -0xa8(%rbp)
movsd -0x80(%rbp), %xmm0
ucomisd -0x88(%rbp), %xmm0
jbe 0x743b
movsd -0x80(%rbp), %xmm0
movsd %xmm0, -0xc8(%rbp)
jmp 0x744b
movsd -0x88(%rbp), %xmm0
movsd %xmm0, -0xc8(%rbp)
movsd -0x90(%rbp), %xmm0
ucomisd -0xc8(%rbp), %xmm0
jbe 0x746d
movsd -0x90(%rbp), %xmm0
movsd %xmm0, -0xc8(%rbp)
movsd -0x98(%rbp), %xmm1
movsd -0xa0(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x7495
movsd -0x98(%rbp), %xmm0
movsd %xmm0, -0xd0(%rbp)
jmp 0x74a5
movsd -0xa0(%rbp), %xmm0
movsd %xmm0, -0xd0(%rbp)
movsd -0xa8(%rbp), %xmm1
movsd -0xd0(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x74cb
movsd -0xa8(%rbp), %xmm0
movsd %xmm0, -0xd0(%rbp)
movsd -0xc8(%rbp), %xmm1
movsd -0xd0(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x7506
movsd -0xd0(%rbp), %xmm0
movsd 0x3e5f(%rip), %xmm1     # 0xb350
ucomisd %xmm1, %xmm0
jbe 0x7506
movsd 0x3b09(%rip), %xmm0     # 0xb008
movsd %xmm0, -0x8(%rbp)
jmp 0x750e
xorps %xmm0, %xmm0
movsd %xmm0, -0x8(%rbp)
movsd -0x8(%rbp), %xmm0
addq $0x50, %rsp
popq %rbp
retq
nopl (%rax)