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

    if (funct3 == 0x2) {
        switch (funct5) {
        case 0x00:
            ExecAmoaddw(state, instr);
            break;
        case 0x01:
            ExecAmoswapw(state, instr);
            break;
        case 0x02:
            ExecLrw(state, instr);
            break;
        case 0x03:
            ExecScw(state, instr);
            break;
        case 0x04:
            ExecAmoxorw(state, instr);
            break;
        case 0x08:
            ExecAmoorw(state, instr);
            break;
        case 0x0c:
            ExecAmoandw(state, instr);
            break;
        case 0x10:
            ExecAmominw(state, instr);
            break;
        case 0x14:
            ExecAmomaxw(state, instr);
            break;
        case 0x18:
            ExecAmominuw(state, instr);
            break;
        case 0x1c:
            ExecAmomaxuw(state, instr);
            break;
        default:
            Error("Unknown amo instruction: %.2x", funct5);
            break;
        }
    } else if (funct3 == 0x3) {
        switch (funct5) {
        case 0x00:
            ExecAmoaddd(state, instr);
            break;
        case 0x01:
            ExecAmoswapd(state, instr);
            break;
        case 0x02:
            ExecLrd(state, instr);
            break;
        case 0x03:
            ExecScd(state, instr);
            break;
        case 0x04:
            ExecAmoxord(state, instr);
            break;
        case 0x08:
            ExecAmoord(state, instr);
            break;
        case 0x0c:
            ExecAmoandd(state, instr);
            break;
        case 0x10:
            ExecAmomind(state, instr);
            break;
        case 0x14:
            ExecAmomaxd(state, instr);
            break;
        case 0x18:
            ExecAmominud(state, instr);
            break;
        case 0x1c:
            ExecAmomaxud(state, instr);
            break;
        default:
            Error("Unknown amo instruction: %.2x", funct5);
            break;
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movl -0xc(%rbp), %eax
shrl $0x1b, %eax
movl %eax, %eax
movq %rax, -0x20(%rbp)
movl $0x5, %edi
callq 0x12b0
movq %rax, %rcx
movq -0x20(%rbp), %rax
andq %rcx, %rax
movb %al, -0xd(%rbp)
movl -0xc(%rbp), %eax
shrl $0xc, %eax
movl %eax, %eax
movq %rax, -0x18(%rbp)
movl $0x3, %edi
callq 0x12b0
movq %rax, %rcx
movq -0x18(%rbp), %rax
andq %rcx, %rax
movb %al, -0xe(%rbp)
movzbl -0xe(%rbp), %eax
cmpl $0x2, %eax
jne 0xd1f2
movzbl -0xd(%rbp), %eax
movq %rax, -0x28(%rbp)
subq $0x1c, %rax
ja 0xd1db
movq -0x28(%rbp), %rax
leaq 0x21d9(%rip), %rcx      # 0xf308
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xb570
jmp 0xd1ed
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xb6b0
jmp 0xd1ed
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xb7e0
jmp 0xd1ed
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xb8c0
jmp 0xd1ed
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xb9d0
jmp 0xd1ed
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xbb10
jmp 0xd1ed
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xbc50
jmp 0xd1ed
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xbd90
jmp 0xd1ed
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xbf00
jmp 0xd1ed
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xc070
jmp 0xd1ed
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xc1e0
jmp 0xd1ed
movzbl -0xd(%rbp), %esi
leaq 0x2483(%rip), %rdi      # 0xf669
movb $0x0, %al
callq 0xd690
jmp 0xd2de
movzbl -0xe(%rbp), %eax
cmpl $0x3, %eax
jne 0xd2dc
movzbl -0xd(%rbp), %eax
movq %rax, -0x30(%rbp)
subq $0x1c, %rax
ja 0xd2c8
movq -0x30(%rbp), %rax
leaq 0x2078(%rip), %rcx      # 0xf294
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xc350
jmp 0xd2da
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xc480
jmp 0xd2da
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xc5a0
jmp 0xd2da
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xc680
jmp 0xd2da
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xc7a0
jmp 0xd2da
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xc8d0
jmp 0xd2da
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xca00
jmp 0xd2da
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xcb30
jmp 0xd2da
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xcc90
jmp 0xd2da
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xcdf0
jmp 0xd2da
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xcf50
jmp 0xd2da
movzbl -0xd(%rbp), %esi
leaq 0x2396(%rip), %rdi      # 0xf669
movb $0x0, %al
callq 0xd690
jmp 0xd2dc
jmp 0xd2de
addq $0x30, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
nop