// File: sangwoojun[P]rv32emulator/emulator.cpp
// Function: parse_reg(char*, int, bool)
int parse_reg(char* tok, int line, bool strict = true) {
	if ( tok[0] == 'x' ) {
		int ri = atoi(tok+1);
		if ( ri < 0 || ri > 32 ) {
			if ( strict ) print_syntax_error(line, "Malformed register name");
			return -1;
		}
		return ri;
	}
	if ( streq(tok, "zero") ) return 0; 
	if ( streq(tok, "ra") ) return 1;
	if ( streq(tok, "sp") ) return 2;
	if ( streq(tok, "gp") ) return 3;
	if ( streq(tok, "tp") ) return 4;
	if ( streq(tok, "t0") ) return 5;
	if ( streq(tok, "t1") ) return 6;
	if ( streq(tok, "t2") ) return 7;
	if ( streq(tok, "s0") ) return 8;
	if ( streq(tok, "s1") ) return 9;
	if ( streq(tok, "a0") ) return 10;
	if ( streq(tok, "a1") ) return 11;
	if ( streq(tok, "a2") ) return 12;
	if ( streq(tok, "a3") ) return 13;
	if ( streq(tok, "a4") ) return 14;
	if ( streq(tok, "a5") ) return 15;
	if ( streq(tok, "a6") ) return 16;
	if ( streq(tok, "a7") ) return 17;
	if ( streq(tok, "s2") ) return 18;
	if ( streq(tok, "s3") ) return 19;
	if ( streq(tok, "s4") ) return 20;
	if ( streq(tok, "s5") ) return 21;
	if ( streq(tok, "s6") ) return 22;
	if ( streq(tok, "s7") ) return 23;
	if ( streq(tok, "s8") ) return 24;
	if ( streq(tok, "s9") ) return 25;
	if ( streq(tok, "s10") ) return 26;
	if ( streq(tok, "s11") ) return 27;
	if ( streq(tok, "t3") ) return 28;
	if ( streq(tok, "t4") ) return 29;
	if ( streq(tok, "t5") ) return 30;
	if ( streq(tok, "t6") ) return 31;

	if ( strict ) print_syntax_error(line, "Malformed register name");
	return -1;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movb %dl, %al
movq %rdi, -0x10(%rbp)
movl %esi, -0x14(%rbp)
andb $0x1, %al
movb %al, -0x15(%rbp)
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x78, %eax
jne 0x32ba
movq -0x10(%rbp), %rdi
addq $0x1, %rdi
callq 0x2380
movl %eax, -0x1c(%rbp)
cmpl $0x0, -0x1c(%rbp)
jl 0x328e
cmpl $0x20, -0x1c(%rbp)
jle 0x32af
testb $0x1, -0x15(%rbp)
je 0x32a3
movl -0x14(%rbp), %edi
leaq 0x81b9(%rip), %rsi      # 0xb457
callq 0x2c90
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x370a
movl -0x1c(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x82fb(%rip), %rsi      # 0xb5c0
callq 0x2c10
testb $0x1, %al
jne 0x32d0
jmp 0x32dc
movl $0x0, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x80f9(%rip), %rsi      # 0xb3e0
callq 0x2c10
testb $0x1, %al
jne 0x32f2
jmp 0x32fe
movl $0x1, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x8166(%rip), %rsi      # 0xb46f
callq 0x2c10
testb $0x1, %al
jne 0x3314
jmp 0x3320
movl $0x2, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x8147(%rip), %rsi      # 0xb472
callq 0x2c10
testb $0x1, %al
jne 0x3336
jmp 0x3342
movl $0x3, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x8128(%rip), %rsi      # 0xb475
callq 0x2c10
testb $0x1, %al
jne 0x3358
jmp 0x3364
movl $0x4, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x8109(%rip), %rsi      # 0xb478
callq 0x2c10
testb $0x1, %al
jne 0x337a
jmp 0x3386
movl $0x5, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x80ea(%rip), %rsi      # 0xb47b
callq 0x2c10
testb $0x1, %al
jne 0x339c
jmp 0x33a8
movl $0x6, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x80cb(%rip), %rsi      # 0xb47e
callq 0x2c10
testb $0x1, %al
jne 0x33be
jmp 0x33ca
movl $0x7, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x80ac(%rip), %rsi      # 0xb481
callq 0x2c10
testb $0x1, %al
jne 0x33e0
jmp 0x33ec
movl $0x8, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x808d(%rip), %rsi      # 0xb484
callq 0x2c10
testb $0x1, %al
jne 0x3402
jmp 0x340e
movl $0x9, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x806e(%rip), %rsi      # 0xb487
callq 0x2c10
testb $0x1, %al
jne 0x3424
jmp 0x3430
movl $0xa, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x804f(%rip), %rsi      # 0xb48a
callq 0x2c10
testb $0x1, %al
jne 0x3446
jmp 0x3452
movl $0xb, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x8030(%rip), %rsi      # 0xb48d
callq 0x2c10
testb $0x1, %al
jne 0x3468
jmp 0x3474
movl $0xc, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x8011(%rip), %rsi      # 0xb490
callq 0x2c10
testb $0x1, %al
jne 0x348a
jmp 0x3496
movl $0xd, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7ff2(%rip), %rsi      # 0xb493
callq 0x2c10
testb $0x1, %al
jne 0x34ac
jmp 0x34b8
movl $0xe, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7fd3(%rip), %rsi      # 0xb496
callq 0x2c10
testb $0x1, %al
jne 0x34ce
jmp 0x34da
movl $0xf, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7fb4(%rip), %rsi      # 0xb499
callq 0x2c10
testb $0x1, %al
jne 0x34f0
jmp 0x34fc
movl $0x10, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7f95(%rip), %rsi      # 0xb49c
callq 0x2c10
testb $0x1, %al
jne 0x3512
jmp 0x351e
movl $0x11, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7f76(%rip), %rsi      # 0xb49f
callq 0x2c10
testb $0x1, %al
jne 0x3534
jmp 0x3540
movl $0x12, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7f57(%rip), %rsi      # 0xb4a2
callq 0x2c10
testb $0x1, %al
jne 0x3556
jmp 0x3562
movl $0x13, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7f38(%rip), %rsi      # 0xb4a5
callq 0x2c10
testb $0x1, %al
jne 0x3578
jmp 0x3584
movl $0x14, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7f19(%rip), %rsi      # 0xb4a8
callq 0x2c10
testb $0x1, %al
jne 0x359a
jmp 0x35a6
movl $0x15, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7efa(%rip), %rsi      # 0xb4ab
callq 0x2c10
testb $0x1, %al
jne 0x35bc
jmp 0x35c8
movl $0x16, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7edb(%rip), %rsi      # 0xb4ae
callq 0x2c10
testb $0x1, %al
jne 0x35de
jmp 0x35ea
movl $0x17, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7ebc(%rip), %rsi      # 0xb4b1
callq 0x2c10
testb $0x1, %al
jne 0x3600
jmp 0x360c
movl $0x18, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7e9d(%rip), %rsi      # 0xb4b4
callq 0x2c10
testb $0x1, %al
jne 0x3622
jmp 0x362e
movl $0x19, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7e7e(%rip), %rsi      # 0xb4b7
callq 0x2c10
testb $0x1, %al
jne 0x3644
jmp 0x3650
movl $0x1a, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7e60(%rip), %rsi      # 0xb4bb
callq 0x2c10
testb $0x1, %al
jne 0x3666
jmp 0x3672
movl $0x1b, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7e42(%rip), %rsi      # 0xb4bf
callq 0x2c10
testb $0x1, %al
jne 0x3688
jmp 0x3691
movl $0x1c, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7e26(%rip), %rsi      # 0xb4c2
callq 0x2c10
testb $0x1, %al
jne 0x36a7
jmp 0x36b0
movl $0x1d, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7e0a(%rip), %rsi      # 0xb4c5
callq 0x2c10
testb $0x1, %al
jne 0x36c6
jmp 0x36cf
movl $0x1e, -0x4(%rbp)
jmp 0x370a
movq -0x10(%rbp), %rdi
leaq 0x7dee(%rip), %rsi      # 0xb4c8
callq 0x2c10
testb $0x1, %al
jne 0x36e5
jmp 0x36ee
movl $0x1f, -0x4(%rbp)
jmp 0x370a
testb $0x1, -0x15(%rbp)
je 0x3703
movl -0x14(%rbp), %edi
leaq 0x7d59(%rip), %rsi      # 0xb457
callq 0x2c90
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl -0x4(%rbp), %eax
addq $0x20, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)