// File: josh0xA[P]bf/src/bf.cc
// Function: bf::Parser::interpret_bf_instructions(bf::Environment&)
void Parser::interpret_bf_instructions(Environment& env) {
    env.bf_instruction_pointer = env.program_instruction.begin();
    while (env.bf_instruction_pointer != env.program_instruction.end()) {
      switch (*env.bf_instruction_pointer) {
        case BF_INCREMENT_VALUE: (*env.bf_memory_pointer)++; env.bf_instruction_pointer++; break;
        case BF_DECREMENT_VALUE: (*env.bf_memory_pointer)--; env.bf_instruction_pointer++; break;
        case BF_CELL_SHIFT_FRONT:
                if (env.bf_memory_pointer != (env.program_memory.end()--)) {
                  env.bf_memory_pointer++;
                }
                env.bf_instruction_pointer++;
                break;
        case BF_CELL_SHIFT_BACK:
                if (env.bf_memory_pointer != env.program_memory.begin()) {
                   env.bf_memory_pointer--;
                }
                env.bf_instruction_pointer++;
                break;
        case BF_SHOW_STDOUT_BUFFER: output_bf_stream(*env.bf_memory_pointer); env.bf_instruction_pointer++; break;
        case BF_READ_STDIN_BUFFER:
                bf_word input_word; std::cin >> input_word;
                (*env.bf_memory_pointer) = input_word;
                env.bf_instruction_pointer++;
                break;
        case BF_LOOP_BEGIN:
                if (!(*env.bf_memory_pointer))
                  get_loop_closer(env);
                env.bf_instruction_pointer++;
                break;
        case BF_LOOP_END:
               get_loop_opener(env); env.bf_instruction_pointer++; break;
        case bf::nullchar: env.bf_instruction_pointer++; break;
      }

    }
  }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xd0, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0x10(%rbp), %rdi
addq $0x18, %rdi
callq 0x3150
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq -0x18(%rbp), %rcx
movq %rcx, 0x30(%rax)
movq -0x10(%rbp), %rax
addq $0x30, %rax
movq %rax, -0xa8(%rbp)
movq -0x10(%rbp), %rdi
addq $0x18, %rdi
callq 0x3310
movq -0xa8(%rbp), %rdi
movq %rax, -0x20(%rbp)
leaq -0x20(%rbp), %rsi
callq 0x32d0
testb $0x1, %al
jne 0x2884
jmp 0x2b3c
movq -0x10(%rbp), %rdi
addq $0x30, %rdi
callq 0x3270
movsbl (%rax), %eax
movl %eax, -0xac(%rbp)
testl %eax, %eax
je 0x2b21
jmp 0x28a4
movl -0xac(%rbp), %eax
subl $0x2b, %eax
je 0x2927
jmp 0x28b1
movl -0xac(%rbp), %eax
subl $0x2c, %eax
je 0x2a7c
jmp 0x28c2
movl -0xac(%rbp), %eax
subl $0x2d, %eax
je 0x2953
jmp 0x28d3
movl -0xac(%rbp), %eax
subl $0x2e, %eax
je 0x2a48
jmp 0x28e4
movl -0xac(%rbp), %eax
subl $0x3c, %eax
je 0x29eb
jmp 0x28f5
movl -0xac(%rbp), %eax
subl $0x3e, %eax
je 0x297f
jmp 0x2902
movl -0xac(%rbp), %eax
subl $0x5b, %eax
je 0x2abf
jmp 0x2913
movl -0xac(%rbp), %eax
subl $0x5d, %eax
je 0x2af9
jmp 0x2b37
movq -0x10(%rbp), %rdi
addq $0x38, %rdi
callq 0x3270
movb (%rax), %cl
addb $0x1, %cl
movb %cl, (%rax)
movq -0x10(%rbp), %rdi
addq $0x30, %rdi
xorl %esi, %esi
callq 0x3230
movq %rax, -0x28(%rbp)
jmp 0x2b37
movq -0x10(%rbp), %rdi
addq $0x38, %rdi
callq 0x3270
movb (%rax), %cl
addb $-0x1, %cl
movb %cl, (%rax)
movq -0x10(%rbp), %rdi
addq $0x30, %rdi
xorl %esi, %esi
callq 0x3230
movq %rax, -0x30(%rbp)
jmp 0x2b37
movq -0x10(%rbp), %rax
addq $0x38, %rax
movq %rax, -0xb8(%rbp)
movq -0x10(%rbp), %rdi
callq 0x3310
movq %rax, -0x40(%rbp)
leaq -0x40(%rbp), %rdi
xorl %esi, %esi
callq 0x3290
movq -0xb8(%rbp), %rdi
movq %rax, -0x38(%rbp)
leaq -0x38(%rbp), %rsi
callq 0x32d0
testb $0x1, %al
jne 0x29c0
jmp 0x29d3
movq -0x10(%rbp), %rdi
addq $0x38, %rdi
xorl %esi, %esi
callq 0x3230
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rdi
addq $0x30, %rdi
xorl %esi, %esi
callq 0x3230
movq %rax, -0x50(%rbp)
jmp 0x2b37
movq -0x10(%rbp), %rax
addq $0x38, %rax
movq %rax, -0xc0(%rbp)
movq -0x10(%rbp), %rdi
callq 0x3150
movq -0xc0(%rbp), %rdi
movq %rax, -0x58(%rbp)
leaq -0x58(%rbp), %rsi
callq 0x32d0
testb $0x1, %al
jne 0x2a1d
jmp 0x2a30
movq -0x10(%rbp), %rdi
addq $0x38, %rdi
xorl %esi, %esi
callq 0x3290
movq %rax, -0x60(%rbp)
movq -0x10(%rbp), %rdi
addq $0x30, %rdi
xorl %esi, %esi
callq 0x3230
movq %rax, -0x68(%rbp)
jmp 0x2b37
movq -0x10(%rbp), %rdi
addq $0x38, %rdi
callq 0x3270
movq -0xa0(%rbp), %rdi
movsbl (%rax), %esi
callq 0x3340
movq -0x10(%rbp), %rdi
addq $0x30, %rdi
xorl %esi, %esi
callq 0x3230
movq %rax, -0x70(%rbp)
jmp 0x2b37
movq 0x5555(%rip), %rdi      # 0x7fd8
leaq -0x71(%rbp), %rsi
callq 0x2280
movb -0x71(%rbp), %al
movb %al, -0xc1(%rbp)
movq -0x10(%rbp), %rdi
addq $0x38, %rdi
callq 0x3270
movb -0xc1(%rbp), %cl
movb %cl, (%rax)
movq -0x10(%rbp), %rdi
addq $0x30, %rdi
xorl %esi, %esi
callq 0x3230
movq %rax, -0x80(%rbp)
jmp 0x2b37
movq -0x10(%rbp), %rdi
addq $0x38, %rdi
callq 0x3270
cmpb $0x0, (%rax)
jne 0x2ae1
movq -0xa0(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x26d0
movq -0x10(%rbp), %rdi
addq $0x30, %rdi
xorl %esi, %esi
callq 0x3230
movq %rax, -0x88(%rbp)
jmp 0x2b37
movq -0xa0(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x2770
movq -0x10(%rbp), %rdi
addq $0x30, %rdi
xorl %esi, %esi
callq 0x3230
movq %rax, -0x90(%rbp)
jmp 0x2b37
movq -0x10(%rbp), %rdi
addq $0x30, %rdi
xorl %esi, %esi
callq 0x3230
movq %rax, -0x98(%rbp)
jmp 0x284b
addq $0xd0, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)