// File: Aries-orz[P]Ari-RayTracing/src/RTBox.cpp
// Function: rt::RTBox::hit(rt::Ray const&)
double RTBox::hit(const Ray& r) {
    double tmin = 0;
    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;
    int face_in, face_out;
    if (tx_min > ty_min) {
        t0 = tx_min;
        face_in = (a >= 0.0) ? 0 : 3;
    } else {
        t0 = ty_min;
        face_in = (b >= 0.0) ? 1 : 4;
    }
    if (tz_min > t0) {
        t0 = tz_min;
        face_in = (c >= 0.0) ? 2 : 5;
    }
        
    if (tx_max < ty_max) {
        t1 = tx_max;
        face_out = (a >= 0.0) ? 3 : 0;
    } else {
        t1 = ty_max;
        face_out = (b >= 0.0) ? 4 : 1;
    }
    if (tz_max < t1) {
        t1 = tz_max;
        face_out = (c >= 0.0) ? 5 : 2;
    }
        
    if (t0 < t1 && t1 > 1e-4) {
        if (t0 > 1e-4) {
            tmin = t0;
            face = face_in;
        } else {
            tmin = t1;
            face = face_out;
        }
    }
    return tmin;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0xe0(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x18(%rbp)
movq -0x10(%rbp), %rcx
movsd (%rcx), %xmm0
movsd %xmm0, -0x20(%rbp)
movq -0x10(%rbp), %rcx
movsd 0x8(%rcx), %xmm0
movsd %xmm0, -0x28(%rbp)
movq -0x10(%rbp), %rcx
movsd 0x10(%rcx), %xmm0
movsd %xmm0, -0x30(%rbp)
movq -0x10(%rbp), %rcx
movsd 0x18(%rcx), %xmm0
movsd %xmm0, -0x38(%rbp)
movq -0x10(%rbp), %rcx
movsd 0x20(%rcx), %xmm0
movsd %xmm0, -0x40(%rbp)
movq -0x10(%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 0x389e(%rip), %xmm0     # 0xb008
divsd -0x38(%rbp), %xmm0
movsd %xmm0, -0xb0(%rbp)
movsd -0xb0(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x77bb
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 0x77ec
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 0x3814(%rip), %xmm0     # 0xb008
divsd -0x40(%rbp), %xmm0
movsd %xmm0, -0xb8(%rbp)
movsd -0xb8(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x7848
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 0x787c
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 0x3784(%rip), %xmm0     # 0xb008
divsd -0x48(%rbp), %xmm0
movsd %xmm0, -0xc0(%rbp)
movsd -0xc0(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x78d8
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 0x790c
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 0x7949
movsd -0x80(%rbp), %xmm0
movsd %xmm0, -0xc8(%rbp)
movsd -0xb0(%rbp), %xmm0
xorps %xmm1, %xmm1
movl $0x3, %eax
xorl %ecx, %ecx
ucomisd %xmm1, %xmm0
cmovael %ecx, %eax
movl %eax, -0xd4(%rbp)
jmp 0x797b
movsd -0x88(%rbp), %xmm0
movsd %xmm0, -0xc8(%rbp)
movsd -0xb8(%rbp), %xmm0
xorps %xmm1, %xmm1
movl $0x4, %eax
movl $0x1, %ecx
ucomisd %xmm1, %xmm0
cmovael %ecx, %eax
movl %eax, -0xd4(%rbp)
movsd -0x90(%rbp), %xmm0
ucomisd -0xc8(%rbp), %xmm0
jbe 0x79bf
movsd -0x90(%rbp), %xmm0
movsd %xmm0, -0xc8(%rbp)
movsd -0xc0(%rbp), %xmm0
xorps %xmm1, %xmm1
movl $0x5, %eax
movl $0x2, %ecx
ucomisd %xmm1, %xmm0
cmovael %ecx, %eax
movl %eax, -0xd4(%rbp)
movsd -0x98(%rbp), %xmm1
movsd -0xa0(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x7a06
movsd -0x98(%rbp), %xmm0
movsd %xmm0, -0xd0(%rbp)
movsd -0xb0(%rbp), %xmm0
xorps %xmm1, %xmm1
xorl %eax, %eax
movl $0x3, %ecx
ucomisd %xmm1, %xmm0
cmovael %ecx, %eax
movl %eax, -0xd8(%rbp)
jmp 0x7a38
movsd -0xa0(%rbp), %xmm0
movsd %xmm0, -0xd0(%rbp)
movsd -0xb8(%rbp), %xmm0
xorps %xmm1, %xmm1
movl $0x1, %eax
movl $0x4, %ecx
ucomisd %xmm1, %xmm0
cmovael %ecx, %eax
movl %eax, -0xd8(%rbp)
movsd -0xa8(%rbp), %xmm1
movsd -0xd0(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x7a80
movsd -0xa8(%rbp), %xmm0
movsd %xmm0, -0xd0(%rbp)
movsd -0xc0(%rbp), %xmm0
xorps %xmm1, %xmm1
movl $0x2, %eax
movl $0x5, %ecx
ucomisd %xmm1, %xmm0
cmovael %ecx, %eax
movl %eax, -0xd8(%rbp)
movsd -0xc8(%rbp), %xmm1
movsd -0xd0(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x7b00
movsd -0xd0(%rbp), %xmm0
movsd 0x38aa(%rip), %xmm1     # 0xb350
ucomisd %xmm1, %xmm0
jbe 0x7b00
movsd -0xc8(%rbp), %xmm0
movsd 0x3894(%rip), %xmm1     # 0xb350
ucomisd %xmm1, %xmm0
jbe 0x7ae1
movq -0xe0(%rbp), %rax
movsd -0xc8(%rbp), %xmm0
movsd %xmm0, -0x18(%rbp)
movl -0xd4(%rbp), %ecx
movl %ecx, 0x70(%rax)
jmp 0x7afe
movq -0xe0(%rbp), %rax
movsd -0xd0(%rbp), %xmm0
movsd %xmm0, -0x18(%rbp)
movl -0xd8(%rbp), %ecx
movl %ecx, 0x70(%rax)
jmp 0x7b00
movsd -0x18(%rbp), %xmm0
addq $0x60, %rsp
popq %rbp
retq
nopl (%rax,%rax)