// File: JohnCGriffin[P]BrainForked/bf_instruction.cpp
// Function: bf::operator<<(std::ostream&, bf::Action const&)
std::ostream& operator<<(std::ostream& os, const Action& action)
    {
#define ACTIONOUT(A) case A: return os << #A
        switch(action){
            ACTIONOUT(ADVANCE);
            ACTIONOUT(DECR1MX);
            ACTIONOUT(FALSEJUMP);
            ACTIONOUT(GIVE);
            ACTIONOUT(INCR);
            ACTIONOUT(INCR1MX);
            ACTIONOUT(M1ZERO);
            ACTIONOUT(MOVE);
            ACTIONOUT(MOVEWHILE);
            ACTIONOUT(MXDECR1);
            ACTIONOUT(MXINCR1);
            ACTIONOUT(OFFINCR);
            ACTIONOUT(PRINT);
            ACTIONOUT(READ);
            ACTIONOUT(TAKE);
            ACTIONOUT(TERMINATE);
            ACTIONOUT(TRUEJUMP);
            ACTIONOUT(VALUE);
            ACTIONOUT(WHILEDECROI2);
            ACTIONOUT(WHILEIM2);
            ACTIONOUT(WHILEIM3);
            ACTIONOUT(WHILEMGM);
            ACTIONOUT(ZERO);
            ACTIONOUT(ZERO2IF);
            ACTIONOUT(ZEROM1);
        default:
            throw std::logic_error(__FILE__ " unhandled Action case in operator<<");
        }
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x18(%rbp), %rax
movl (%rax), %eax
movq %rax, -0x30(%rbp)
subq $0x18, %rax
ja 0x7e90
movq -0x30(%rbp), %rax
leaq 0x551d(%rip), %rcx      # 0xd13c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x10(%rbp), %rdi
leaq 0x556d(%rip), %rsi      # 0xd1a0
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x555c(%rip), %rsi      # 0xd1a8
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x554b(%rip), %rsi      # 0xd1b0
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x553c(%rip), %rsi      # 0xd1ba
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x5559(%rip), %rsi      # 0xd1f0
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x550f(%rip), %rsi      # 0xd1bf
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x54fe(%rip), %rsi      # 0xd1c7
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x54ec(%rip), %rsi      # 0xd1ce
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x54d8(%rip), %rsi      # 0xd1d3
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x54c9(%rip), %rsi      # 0xd1dd
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x54b8(%rip), %rsi      # 0xd1e5
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x54a7(%rip), %rsi      # 0xd1ed
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x5496(%rip), %rsi      # 0xd1f5
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x5483(%rip), %rsi      # 0xd1fb
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x546f(%rip), %rsi      # 0xd200
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x545b(%rip), %rsi      # 0xd205
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x544c(%rip), %rsi      # 0xd20f
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x543c(%rip), %rsi      # 0xd218
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x5429(%rip), %rsi      # 0xd21e
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x541d(%rip), %rsi      # 0xd22b
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x540d(%rip), %rsi      # 0xd234
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x53fd(%rip), %rsi      # 0xd23d
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x5370(%rip), %rsi      # 0xd1c9
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x53d7(%rip), %rsi      # 0xd246
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movq -0x10(%rbp), %rdi
leaq 0x53c9(%rip), %rsi      # 0xd24e
callq 0x21a0
movq %rax, -0x8(%rbp)
jmp 0x7ee0
movl $0x10, %edi
callq 0x20b0
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x38(%rbp)
leaq 0x53aa(%rip), %rsi      # 0xd255
callq 0x22a0
jmp 0x7eb2
movq -0x38(%rbp), %rdi
movq 0xc113(%rip), %rsi      # 0x13fd0
movq 0xc0f4(%rip), %rdx      # 0x13fb8
callq 0x2320
movq -0x38(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
callq 0x2150
jmp 0x7eea
movq -0x8(%rbp), %rax
addq $0x40, %rsp
popq %rbp
retq
movq -0x20(%rbp), %rdi
callq 0x2330
nopw %cs:(%rax,%rax)