// File: /workspace/github_c_makefile_star2_O0/hobo0xcc[P]rve/src/cpu.c
// Function: ExecOpInstr
void ExecOpInstr(State *state, uint32_t instr) {
    uint8_t funct3 = (instr >> 12) & SetNBits(3);
    uint8_t funct7 = (instr >> 25) & SetNBits(7);

    switch (funct3) {
    case 0x0:
        if (funct7 == 0x00) {
            ExecAdd(state, instr);
        } else if (funct7 == 0x01) {
            ExecMul(state, instr);
        } else if (funct7 == 0x20) {
            ExecSub(state, instr);
        }
        break;
    case 0x1:
        if (funct7 == 0x00) {
            ExecSll(state, instr);
        } else if (funct7 == 0x01) {
            ExecMulh(state, instr);
        }
        break;
    case 0x2:
        if (funct7 == 0x00) {
            ExecSlt(state, instr);
        } else if (funct7 == 0x01) {
            ExecMulhsu(state, instr);
        }
        break;
    case 0x3:
        if (funct7 == 0x00) {
            ExecSltu(state, instr);
        } else if (funct7 == 0x01) {
            ExecMulhu(state, instr);
        }
        break;
    case 0x4:
        if (funct7 == 0x00) {
            ExecXor(state, instr);
        } else if (funct7 == 0x01) {
            ExecDiv(state, instr);
        }
        break;
    case 0x5:
        if (funct7 == 0x00) {
            ExecSrl(state, instr);
        } else if (funct7 == 0x01) {
            ExecDivu(state, instr);
        } else if (funct7 == 0x20) {
            ExecSra(state, instr);
        }
        break;
    case 0x6:
        if (funct7 == 0x00) {
            ExecOr(state, instr);
        } else if (funct7 == 0x01) {
            ExecRem(state, instr);
        }
        break;
    case 0x7:
        if (funct7 == 0x00) {
            ExecAnd(state, instr);
        } else if (funct7 == 0x01) {
            ExecRemu(state, instr);
        }
        break;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movl -0xc(%rbp), %eax
shrl $0xc, %eax
movl %eax, -0x20(%rbp)
movl $0x3, %edi
callq 0x12b0
movq %rax, %rcx
movl -0x20(%rbp), %eax
andl %ecx, %eax
movb %al, -0xd(%rbp)
movl -0xc(%rbp), %eax
shrl $0x19, %eax
movl %eax, -0x1c(%rbp)
movl $0x7, %edi
callq 0x12b0
movq %rax, %rcx
movl -0x1c(%rbp), %eax
andl %ecx, %eax
movb %al, -0xe(%rbp)
movzbl -0xd(%rbp), %eax
movq %rax, -0x18(%rbp)
subq $0x7, %rax
ja 0x5de2
movq -0x18(%rbp), %rax
leaq 0x95d0(%rip), %rcx      # 0xf1e8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movzbl -0xe(%rbp), %eax
cmpl $0x0, %eax
jne 0x5c38
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x4d80
jmp 0x5c68
movzbl -0xe(%rbp), %eax
cmpl $0x1, %eax
jne 0x5c4f
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x4e30
jmp 0x5c66
movzbl -0xe(%rbp), %eax
cmpl $0x20, %eax
jne 0x5c64
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x4ee0
jmp 0x5c66
jmp 0x5c68
jmp 0x5de2
movzbl -0xe(%rbp), %eax
cmpl $0x0, %eax
jne 0x5c84
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x4f90
jmp 0x5c9b
movzbl -0xe(%rbp), %eax
cmpl $0x1, %eax
jne 0x5c99
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x5050
jmp 0x5c9b
jmp 0x5de2
movzbl -0xe(%rbp), %eax
cmpl $0x0, %eax
jne 0x5cb7
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x50f0
jmp 0x5cce
movzbl -0xe(%rbp), %eax
cmpl $0x1, %eax
jne 0x5ccc
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x51b0
jmp 0x5cce
jmp 0x5de2
movzbl -0xe(%rbp), %eax
cmpl $0x0, %eax
jne 0x5cea
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x5270
jmp 0x5d01
movzbl -0xe(%rbp), %eax
cmpl $0x1, %eax
jne 0x5cff
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x5330
jmp 0x5d01
jmp 0x5de2
movzbl -0xe(%rbp), %eax
cmpl $0x0, %eax
jne 0x5d1d
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x53d0
jmp 0x5d34
movzbl -0xe(%rbp), %eax
cmpl $0x1, %eax
jne 0x5d32
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x5480
jmp 0x5d34
jmp 0x5de2
movzbl -0xe(%rbp), %eax
cmpl $0x0, %eax
jne 0x5d50
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x55b0
jmp 0x5d80
movzbl -0xe(%rbp), %eax
cmpl $0x1, %eax
jne 0x5d67
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x5680
jmp 0x5d7e
movzbl -0xe(%rbp), %eax
cmpl $0x20, %eax
jne 0x5d7c
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x5760
jmp 0x5d7e
jmp 0x5d80
jmp 0x5de2
movzbl -0xe(%rbp), %eax
cmpl $0x0, %eax
jne 0x5d99
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x5830
jmp 0x5db0
movzbl -0xe(%rbp), %eax
cmpl $0x1, %eax
jne 0x5dae
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x58e0
jmp 0x5db0
jmp 0x5de2
movzbl -0xe(%rbp), %eax
cmpl $0x0, %eax
jne 0x5dc9
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x5a10
jmp 0x5de0
movzbl -0xe(%rbp), %eax
cmpl $0x1, %eax
jne 0x5dde
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0x5ac0
jmp 0x5de0
jmp 0x5de2
addq $0x20, %rsp
popq %rbp
retq
nopl (%rax,%rax)