// File: /workspace/github_c_makefile_star2_O0/cogbee[P]vmir-latest/src/vmir_bitcode_instr.c
// Function: function_rec_handler
static void
function_rec_handler(ir_unit_t *iu, int op,
                     unsigned int argc, const int64_t *argv)
{
  ir_function_t *f = iu->iu_current_function;

  switch(op) {
  case FUNC_CODE_DECLAREBLOCKS:

    if(TAILQ_FIRST(&f->if_bbs) != NULL)
      parser_error(iu, "Multiple BB decl in function");

    unsigned int numbbs = argv[0];
    if(numbbs == 0)
      parser_error(iu, "Declareblocks: Zero basic blocks");
    if(numbbs > 65535)
      parser_error(iu, "Declareblocks: Too many basic blocks: %d", numbbs);

    for(int i = 0; i < numbbs; i++)
      bb_add(f, NULL);

    iu->iu_current_bb = TAILQ_FIRST(&f->if_bbs);
    return;

  case FUNC_CODE_INST_RET:
    parse_ret(iu, argc, argv);
    iu->iu_current_bb = TAILQ_NEXT(iu->iu_current_bb, ib_link);
    return;

  case FUNC_CODE_INST_BINOP:
    return parse_binop(iu, argc, argv);

  case FUNC_CODE_INST_CAST:
    return parse_cast(iu, argc, argv);

  case FUNC_CODE_INST_LOAD:
  case FUNC_CODE_INST_LOADATOMIC:
    return parse_load(iu, argc, argv);

  case FUNC_CODE_INST_STORE_OLD:
  case FUNC_CODE_INST_STOREATOMIC_OLD:
    return parse_store(iu, argc, argv, 1);

  case FUNC_CODE_INST_STORE:
  case FUNC_CODE_INST_STOREATOMIC:
    return parse_store(iu, argc, argv, 0);

  case FUNC_CODE_INST_INBOUNDS_GEP_OLD:
  case FUNC_CODE_INST_GEP_OLD:
  case FUNC_CODE_INST_GEP:
    return parse_gep(iu, argc, argv, op);

  case FUNC_CODE_INST_CMP2:
    return parse_cmp2(iu, argc, argv);

  case FUNC_CODE_INST_BR:
    parse_br(iu, argc, argv);
    iu->iu_current_bb = TAILQ_NEXT(iu->iu_current_bb, ib_link);
    break;

  case FUNC_CODE_INST_PHI:
    return parse_phi(iu, argc, argv);

  case FUNC_CODE_INST_INVOKE:
    parse_call_or_invoke(iu, argc, argv, IR_IC_INVOKE);
    iu->iu_current_bb = TAILQ_NEXT(iu->iu_current_bb, ib_link);
    break;

  case FUNC_CODE_INST_CALL:
    parse_call_or_invoke(iu, argc, argv, IR_IC_CALL);
    break;

  case FUNC_CODE_INST_SWITCH:
    parse_switch(iu, argc, argv);
    iu->iu_current_bb = TAILQ_NEXT(iu->iu_current_bb, ib_link);
    break;

  case FUNC_CODE_INST_ALLOCA:
    parse_alloca(iu, argc, argv);
    break;

  case FUNC_CODE_INST_UNREACHABLE:
    parse_unreachable(iu);
    iu->iu_current_bb = TAILQ_NEXT(iu->iu_current_bb, ib_link);
    break;

  case FUNC_CODE_INST_VSELECT:
    parse_vselect(iu, argc, argv);
    break;

  case FUNC_CODE_INST_VAARG:
    parse_vaarg(iu, argc, argv);
    break;

  case FUNC_CODE_INST_EXTRACTVAL:
    parse_extractval(iu, argc, argv);
    break;

  case FUNC_CODE_INST_LANDINGPAD_OLD:
    parse_landingpad(iu, argc, argv, 1);
    break;

  case FUNC_CODE_INST_LANDINGPAD:
    parse_landingpad(iu, argc, argv, 0);
    break;

  case FUNC_CODE_INST_INSERTVAL:
    parse_insertval(iu, argc, argv);
    break;

  case FUNC_CODE_INST_RESUME:
    parse_resume(iu, argc, argv);
    iu->iu_current_bb = TAILQ_NEXT(iu->iu_current_bb, ib_link);
    break;

  default:
    printargs(argv, argc);
    parser_error(iu, "Can't handle functioncode %d", op);
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movl %edx, -0x10(%rbp)
movq %rcx, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq 0x1c0(%rax), %rax
movq %rax, -0x20(%rbp)
movl -0xc(%rbp), %eax
decl %eax
movl %eax, %ecx
movq %rcx, -0x30(%rbp)
subl $0x2e, %eax
ja 0x34f6a
movq -0x30(%rbp), %rax
leaq 0x91b4(%rip), %rcx      # 0x3dde8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x20(%rbp), %rax
cmpq $0x0, 0x48(%rax)
je 0x34c66
movq -0x8(%rbp), %rdi
leaq 0xc06c(%rip), %rsi      # 0x40cbf
movl $0x312, %edx            # imm = 0x312
leaq 0xc079(%rip), %rcx      # 0x40cd8
movb $0x0, %al
callq 0x18220
movq -0x18(%rbp), %rax
movq (%rax), %rax
movl %eax, -0x24(%rbp)
cmpl $0x0, -0x24(%rbp)
jne 0x34c94
movq -0x8(%rbp), %rdi
leaq 0xc03e(%rip), %rsi      # 0x40cbf
movl $0x316, %edx            # imm = 0x316
leaq 0xc068(%rip), %rcx      # 0x40cf5
movb $0x0, %al
callq 0x18220
cmpl $0xffff, -0x24(%rbp)    # imm = 0xFFFF
jbe 0x34cbf
movq -0x8(%rbp), %rdi
movl -0x24(%rbp), %r8d
leaq 0xc013(%rip), %rsi      # 0x40cbf
movl $0x318, %edx            # imm = 0x318
leaq 0xc05e(%rip), %rcx      # 0x40d16
movb $0x0, %al
callq 0x18220
movl $0x0, -0x28(%rbp)
movl -0x28(%rbp), %eax
cmpl -0x24(%rbp), %eax
jae 0x34ce6
movq -0x20(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x20af0
movl -0x28(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x28(%rbp)
jmp 0x34cc6
movq -0x20(%rbp), %rax
movq 0x48(%rax), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x1c8(%rax)
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x36050
movq -0x8(%rbp), %rax
movq 0x1c8(%rax), %rax
movq (%rax), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x1c8(%rax)
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x360d0
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x361a0
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x36250
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
movl $0x1, %ecx
callq 0x36330
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
xorl %ecx, %ecx
callq 0x36330
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
movl -0xc(%rbp), %ecx
callq 0x36430
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x36720
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x36800
movq -0x8(%rbp), %rax
movq 0x1c8(%rax), %rax
movq (%rax), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x1c8(%rax)
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x368d0
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
movl $0xb, %ecx
callq 0x36ab0
movq -0x8(%rbp), %rax
movq 0x1c8(%rax), %rax
movq (%rax), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x1c8(%rax)
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
movl $0xa, %ecx
callq 0x36ab0
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x37110
movq -0x8(%rbp), %rax
movq 0x1c8(%rax), %rax
movq (%rax), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x1c8(%rax)
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x37320
jmp 0x34f98
movq -0x8(%rbp), %rdi
callq 0x37440
movq -0x8(%rbp), %rax
movq 0x1c8(%rax), %rax
movq (%rax), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x1c8(%rax)
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x37480
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x37560
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x37620
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
movl $0x1, %ecx
callq 0x377a0
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
xorl %ecx, %ecx
callq 0x377a0
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x378d0
jmp 0x34f98
movq -0x8(%rbp), %rdi
movl -0x10(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x379c0
movq -0x8(%rbp), %rax
movq 0x1c8(%rax), %rax
movq (%rax), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x1c8(%rax)
jmp 0x34f98
movq -0x18(%rbp), %rdi
movl -0x10(%rbp), %esi
callq 0x35d90
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %r8d
leaq 0xbd3a(%rip), %rsi      # 0x40cbf
movl $0x37d, %edx            # imm = 0x37D
leaq 0xbdae(%rip), %rcx      # 0x40d3f
movb $0x0, %al
callq 0x18220
addq $0x30, %rsp
popq %rbp
retq
nop