// File: chuckwolber[P]Cube/test/../Cube.cpp
// Function: Cube::turn(Turn)
void Cube::turn(Turn t) {
    switch (t.layer) {
        case Layer::F:
            rotateLayer(t.layer, t.clockwise);
            rotateEdges(Edges::UpFace, t.clockwise);
            break;
        case Layer::U:
            rotateLayer(t.layer, t.clockwise);
            rotateEdges(Edges::FaceUp, t.clockwise);
            break;
        case Layer::R:
            rotateLayer(t.layer, t.clockwise);
            rotateEdges(Edges::UpRight, t.clockwise);
            break;
        case Layer::D:
            rotateLayer(t.layer, t.clockwise);
            rotateEdges(Edges::FaceDown, t.clockwise);
            break;
        case Layer::L:
            rotateLayer(t.layer, t.clockwise);
            rotateEdges(Edges::UpLeft, t.clockwise);
            break;
        case Layer::B:
            rotateLayer(t.layer, t.clockwise);
            rotateEdges(Edges::UpBack, t.clockwise);
            break;
        case Layer::M:
            turn({Layer::R, t.clockwise});
            turn({Layer::L, !t.clockwise});
            break;
        case Layer::E:
            turn({Layer::U, t.clockwise});
            turn({Layer::D, !t.clockwise});
            break;
        case Layer::S:
            turn({Layer::F, !t.clockwise});
            turn({Layer::B, t.clockwise});
            break;
        case Layer::NOLAYER:
        default:
            break;
   }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rsi, -0x8(%rbp)
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x50(%rbp)
movl -0x8(%rbp), %eax
decl %eax
movl %eax, %ecx
movq %rcx, -0x48(%rbp)
subl $0xc, %eax
ja 0x87fd
movq -0x48(%rbp), %rax
leaq 0x7bd9(%rip), %rcx      # 0x10200
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x50(%rbp), %rdi
movl -0x8(%rbp), %esi
movb -0x4(%rbp), %al
andb $0x1, %al
movzbl %al, %edx
callq 0x8810
movq -0x50(%rbp), %rdi
movb -0x4(%rbp), %al
xorl %esi, %esi
andb $0x1, %al
movzbl %al, %edx
callq 0x89b0
jmp 0x87ff
movq -0x50(%rbp), %rdi
movl -0x8(%rbp), %esi
movb -0x4(%rbp), %al
andb $0x1, %al
movzbl %al, %edx
callq 0x8810
movq -0x50(%rbp), %rdi
movb -0x4(%rbp), %al
movl $0x4, %esi
andb $0x1, %al
movzbl %al, %edx
callq 0x89b0
jmp 0x87ff
movq -0x50(%rbp), %rdi
movl -0x8(%rbp), %esi
movb -0x4(%rbp), %al
andb $0x1, %al
movzbl %al, %edx
callq 0x8810
movq -0x50(%rbp), %rdi
movb -0x4(%rbp), %al
movl $0xc, %esi
andb $0x1, %al
movzbl %al, %edx
callq 0x89b0
jmp 0x87ff
movq -0x50(%rbp), %rdi
movl -0x8(%rbp), %esi
movb -0x4(%rbp), %al
andb $0x1, %al
movzbl %al, %edx
callq 0x8810
movq -0x50(%rbp), %rdi
movb -0x4(%rbp), %al
movl $0x10, %esi
andb $0x1, %al
movzbl %al, %edx
callq 0x89b0
jmp 0x87ff
movq -0x50(%rbp), %rdi
movl -0x8(%rbp), %esi
movb -0x4(%rbp), %al
andb $0x1, %al
movzbl %al, %edx
callq 0x8810
movq -0x50(%rbp), %rdi
movb -0x4(%rbp), %al
movl $0x8, %esi
andb $0x1, %al
movzbl %al, %edx
callq 0x89b0
jmp 0x87ff
movq -0x50(%rbp), %rdi
movl -0x8(%rbp), %esi
movb -0x4(%rbp), %al
andb $0x1, %al
movzbl %al, %edx
callq 0x8810
movq -0x50(%rbp), %rdi
movb -0x4(%rbp), %al
movl $0x14, %esi
andb $0x1, %al
movzbl %al, %edx
callq 0x89b0
jmp 0x87ff
movq -0x50(%rbp), %rdi
movl $0x6, -0x18(%rbp)
movb -0x4(%rbp), %al
andb $0x1, %al
movb %al, -0x14(%rbp)
movq -0x18(%rbp), %rsi
callq 0x85f0
movq -0x50(%rbp), %rdi
movl $0x4, -0x20(%rbp)
movb -0x4(%rbp), %al
xorb $-0x1, %al
andb $0x1, %al
movb %al, -0x1c(%rbp)
movq -0x20(%rbp), %rsi
callq 0x85f0
jmp 0x87ff
movq -0x50(%rbp), %rdi
movl $0x1, -0x28(%rbp)
movb -0x4(%rbp), %al
andb $0x1, %al
movb %al, -0x24(%rbp)
movq -0x28(%rbp), %rsi
callq 0x85f0
movq -0x50(%rbp), %rdi
movl $0x9, -0x30(%rbp)
movb -0x4(%rbp), %al
xorb $-0x1, %al
andb $0x1, %al
movb %al, -0x2c(%rbp)
movq -0x30(%rbp), %rsi
callq 0x85f0
jmp 0x87ff
movq -0x50(%rbp), %rdi
movl $0x5, -0x38(%rbp)
movb -0x4(%rbp), %al
xorb $-0x1, %al
andb $0x1, %al
movb %al, -0x34(%rbp)
movq -0x38(%rbp), %rsi
callq 0x85f0
movq -0x50(%rbp), %rdi
movl $0x7, -0x40(%rbp)
movb -0x4(%rbp), %al
andb $0x1, %al
movb %al, -0x3c(%rbp)
movq -0x40(%rbp), %rsi
callq 0x85f0
jmp 0x87ff
jmp 0x87fd
jmp 0x87ff
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)