// File: sangwoojun[P]rv32emulator/emulator.cpp
// Function: parse_instr(char*)
instr_type parse_instr(char* tok) {
	// 2r->1r
	if ( streq(tok, "add") ) return ADD;
	if ( streq(tok, "sub") ) return SUB;
	if ( streq(tok, "slt") ) return SLT;
	if ( streq(tok, "sltu") ) return SLTU;
	if ( streq(tok, "and") ) return AND;
	if ( streq(tok, "or") ) return OR;
	if ( streq(tok, "xor") ) return XOR;
	if ( streq(tok, "sll") ) return SLL;
	if ( streq(tok, "srl") ) return SRL;
	if ( streq(tok, "sra") ) return SRA;

	// 1r, imm -> 1r
	if ( streq(tok, "addi") ) return ADDI;
	if ( streq(tok, "slti") ) return SLTI;
	if ( streq(tok, "sltiu") ) return SLTIU;
	if ( streq(tok, "andi") ) return ANDI;
	if ( streq(tok, "ori") ) return ORI;
	if ( streq(tok, "xori") ) return XORI;
	if ( streq(tok, "slli") ) return SLLI;
	if ( streq(tok, "srli") ) return SRLI;
	if ( streq(tok, "srai") ) return SRAI;

	//load/store
	if ( streq(tok, "lb") ) return LB;
	if ( streq(tok, "lbu") ) return LBU;
	if ( streq(tok, "lh") ) return LH;
	if ( streq(tok, "lhu") ) return LHU;
	if ( streq(tok, "lw") ) return LW;
	if ( streq(tok, "sb") ) return SB;
	if ( streq(tok, "sh") ) return SH;
	if ( streq(tok, "sw") ) return SW;

	//branch
	if ( streq(tok, "beq") ) return BEQ;
	if ( streq(tok, "bge") ) return BGE;
	if ( streq(tok, "bgeu") ) return BGEU;
	if ( streq(tok, "blt") ) return BLT;
	if ( streq(tok, "bltu") ) return BLTU;
	if ( streq(tok, "bne") ) return BNE;

	// jal
	if ( streq(tok, "jal") ) return JAL;
	if ( streq(tok, "jalr") ) return JALR;

	// lui
	if ( streq(tok, "auipc") ) return AUIPC;
	if ( streq(tok, "lui") ) return LUI;

	// unimpl
	//if ( streq(tok, "unimpl") ) return UNIMPL;
	if ( streq(tok, "hcf") ) return HCF;
	return UNIMPL;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rdi
leaq 0x8677(%rip), %rsi      # 0xb3be
callq 0x2c10
testb $0x1, %al
jne 0x2d52
jmp 0x2d5e
movl $0x1, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8659(%rip), %rsi      # 0xb3c2
callq 0x2c10
testb $0x1, %al
jne 0x2d74
jmp 0x2d80
movl $0x22, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x863b(%rip), %rsi      # 0xb3c6
callq 0x2c10
testb $0x1, %al
jne 0x2d96
jmp 0x2da2
movl $0x1a, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x861d(%rip), %rsi      # 0xb3ca
callq 0x2c10
testb $0x1, %al
jne 0x2db8
jmp 0x2dc4
movl $0x1d, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8600(%rip), %rsi      # 0xb3cf
callq 0x2c10
testb $0x1, %al
jne 0x2dda
jmp 0x2de6
movl $0x3, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x85e3(%rip), %rsi      # 0xb3d4
callq 0x2c10
testb $0x1, %al
jne 0x2dfc
jmp 0x2e08
movl $0x14, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x85c0(%rip), %rsi      # 0xb3d3
callq 0x2c10
testb $0x1, %al
jne 0x2e1e
jmp 0x2e2a
movl $0x24, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x85a2(%rip), %rsi      # 0xb3d7
callq 0x2c10
testb $0x1, %al
jne 0x2e40
jmp 0x2e4c
movl $0x18, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8584(%rip), %rsi      # 0xb3db
callq 0x2c10
testb $0x1, %al
jne 0x2e62
jmp 0x2e6e
movl $0x20, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8566(%rip), %rsi      # 0xb3df
callq 0x2c10
testb $0x1, %al
jne 0x2e84
jmp 0x2e90
movl $0x1e, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8548(%rip), %rsi      # 0xb3e3
callq 0x2c10
testb $0x1, %al
jne 0x2ea6
jmp 0x2eb2
movl $0x2, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x852b(%rip), %rsi      # 0xb3e8
callq 0x2c10
testb $0x1, %al
jne 0x2ec8
jmp 0x2ed4
movl $0x1b, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x850e(%rip), %rsi      # 0xb3ed
callq 0x2c10
testb $0x1, %al
jne 0x2eea
jmp 0x2ef6
movl $0x1c, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x84f2(%rip), %rsi      # 0xb3f3
callq 0x2c10
testb $0x1, %al
jne 0x2f0c
jmp 0x2f18
movl $0x4, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x84d6(%rip), %rsi      # 0xb3f9
callq 0x2c10
testb $0x1, %al
jne 0x2f2e
jmp 0x2f3a
movl $0x15, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x84b3(%rip), %rsi      # 0xb3f8
callq 0x2c10
testb $0x1, %al
jne 0x2f50
jmp 0x2f5c
movl $0x25, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8496(%rip), %rsi      # 0xb3fd
callq 0x2c10
testb $0x1, %al
jne 0x2f72
jmp 0x2f7e
movl $0x19, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8479(%rip), %rsi      # 0xb402
callq 0x2c10
testb $0x1, %al
jne 0x2f94
jmp 0x2fa0
movl $0x21, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x845c(%rip), %rsi      # 0xb407
callq 0x2c10
testb $0x1, %al
jne 0x2fb6
jmp 0x2fc2
movl $0x1f, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x843f(%rip), %rsi      # 0xb40c
callq 0x2c10
testb $0x1, %al
jne 0x2fd8
jmp 0x2fe4
movl $0xe, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8420(%rip), %rsi      # 0xb40f
callq 0x2c10
testb $0x1, %al
jne 0x2ffa
jmp 0x3006
movl $0xf, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8402(%rip), %rsi      # 0xb413
callq 0x2c10
testb $0x1, %al
jne 0x301c
jmp 0x3028
movl $0x10, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x83e3(%rip), %rsi      # 0xb416
callq 0x2c10
testb $0x1, %al
jne 0x303e
jmp 0x304a
movl $0x11, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x83c5(%rip), %rsi      # 0xb41a
callq 0x2c10
testb $0x1, %al
jne 0x3060
jmp 0x306c
movl $0x13, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x83a6(%rip), %rsi      # 0xb41d
callq 0x2c10
testb $0x1, %al
jne 0x3082
jmp 0x308e
movl $0x16, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8387(%rip), %rsi      # 0xb420
callq 0x2c10
testb $0x1, %al
jne 0x30a4
jmp 0x30b0
movl $0x17, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8368(%rip), %rsi      # 0xb423
callq 0x2c10
testb $0x1, %al
jne 0x30c6
jmp 0x30d2
movl $0x23, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8349(%rip), %rsi      # 0xb426
callq 0x2c10
testb $0x1, %al
jne 0x30e8
jmp 0x30f4
movl $0x6, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x832b(%rip), %rsi      # 0xb42a
callq 0x2c10
testb $0x1, %al
jne 0x310a
jmp 0x3116
movl $0x7, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x830d(%rip), %rsi      # 0xb42e
callq 0x2c10
testb $0x1, %al
jne 0x312c
jmp 0x3138
movl $0x8, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x82f0(%rip), %rsi      # 0xb433
callq 0x2c10
testb $0x1, %al
jne 0x314e
jmp 0x315a
movl $0x9, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x82d2(%rip), %rsi      # 0xb437
callq 0x2c10
testb $0x1, %al
jne 0x3170
jmp 0x317c
movl $0xa, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x82b5(%rip), %rsi      # 0xb43c
callq 0x2c10
testb $0x1, %al
jne 0x3192
jmp 0x319e
movl $0xb, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8297(%rip), %rsi      # 0xb440
callq 0x2c10
testb $0x1, %al
jne 0x31b4
jmp 0x31c0
movl $0xc, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8279(%rip), %rsi      # 0xb444
callq 0x2c10
testb $0x1, %al
jne 0x31d6
jmp 0x31df
movl $0xd, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x825f(%rip), %rsi      # 0xb449
callq 0x2c10
testb $0x1, %al
jne 0x31f5
jmp 0x31fe
movl $0x5, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x8246(%rip), %rsi      # 0xb44f
callq 0x2c10
testb $0x1, %al
jne 0x3214
jmp 0x321d
movl $0x12, -0x4(%rbp)
jmp 0x3243
movq -0x10(%rbp), %rdi
leaq 0x822b(%rip), %rsi      # 0xb453
callq 0x2c10
testb $0x1, %al
jne 0x3233
jmp 0x323c
movl $0x26, -0x4(%rbp)
jmp 0x3243
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x10, %rsp
popq %rbp
retq
nopl (%rax)