// File: /workspace/github_c_makefile_star2_O0/Ihsoh[P]ilang/compiler/backend/asmgen_gas64.c
// Function: asm_stat_asm_set_reg
static void _asm_stat_asm_set_reg(
	ASMGeneratorGas64Context *ctx,
	ParserASTNode *node
) {
	assert(ctx);
	assert(node);
	assert(node->type == BE_NODE_STAT_ASM_SET_REG);
	assert(node->nchilds == 2);

	ParserASTNode *node_target = node->childs[0];
	assert(node_target->type == BE_NODE_LITERAL_STRING);

	ResizableString rstr_reg_target;
	rstr_init(&rstr_reg_target);
	_out_literal_string(ctx, &rstr_reg_target, node_target);

	ParserASTNode *node_source = node->childs[1];
	if (node_source->type == BE_NODE_IDENTIFIER) {
		ParserSymbol *symbol_source = _get_symbol_by_id_node(ctx, node_source);
		if (symbol_source->type == BE_SYM_VAR) {
			_asm_inst_mov_x_sym(
				ctx,
				ctx->body,
				RSTR_CSTR(&rstr_reg_target),
				symbol_source
			);
		} else if (symbol_source->type == BE_SYM_FUNC) {
			_asm_inst_mov_x_fsym(
				ctx,
				ctx->body,
				RSTR_CSTR(&rstr_reg_target),
				symbol_source
			);
		} else {
			assert(0);
		}
	} else if (node_source->type == BE_NODE_EXPR) {
		ResizableString rstr_source;
		rstr_init(&rstr_source);

		bool target_is_not_ax = !_ASM_IS_AX(RSTR_CSTR(&rstr_reg_target));

		if (target_is_not_ax) {
			_asm_inst_push_x(
				ctx,
				ctx->body,
				BE_TYPE_UINT64,
				_ASM_REG_NAME_RAX
			);
		}

		_asm_constexpr_param(ctx, &rstr_source, node_source, _ASM_REG_AX);

		uint8_t type_source = BE_EXPR_AST_NODE_GET_TYPE(node_source);

		_asm_inst_mov_x_x(
			ctx,
			ctx->body,
			type_source,
			RSTR_CSTR(&rstr_reg_target),
			RSTR_CSTR(&rstr_source)
		);

		if (target_is_not_ax) {
			_asm_inst_pop_x(
				ctx,
				ctx->body,
				BE_TYPE_UINT64,
				_ASM_REG_NAME_RAX
			);
		}

		rstr_free(&rstr_source);
	} else {
		assert(0);
	}

	rstr_free(&rstr_reg_target);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xe0, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0x2a9ac
jmp 0x2a9cb
leaq 0x557ae(%rip), %rdi     # 0x80161
leaq 0x5014a(%rip), %rsi     # 0x7ab04
movl $0xe24, %edx            # imm = 0xE24
leaq 0x50de1(%rip), %rcx     # 0x7b7a7
callq 0x30a0
cmpq $0x0, -0x10(%rbp)
je 0x2a9d4
jmp 0x2a9f3
leaq 0x4bb81(%rip), %rdi     # 0x7655c
leaq 0x50122(%rip), %rsi     # 0x7ab04
movl $0xe25, %edx            # imm = 0xE25
leaq 0x50db9(%rip), %rcx     # 0x7b7a7
callq 0x30a0
movq -0x10(%rbp), %rax
cmpl $0xb41, (%rax)          # imm = 0xB41
jne 0x2aa01
jmp 0x2aa20
leaq 0x4c2f0(%rip), %rdi     # 0x76cf8
leaq 0x500f5(%rip), %rsi     # 0x7ab04
movl $0xe26, %edx            # imm = 0xE26
leaq 0x50d8c(%rip), %rcx     # 0x7b7a7
callq 0x30a0
movq -0x10(%rbp), %rax
cmpl $0x2, 0x44(%rax)
jne 0x2aa2c
jmp 0x2aa4b
leaq 0x58311(%rip), %rdi     # 0x82d44
leaq 0x500ca(%rip), %rsi     # 0x7ab04
movl $0xe27, %edx            # imm = 0xE27
leaq 0x50d61(%rip), %rcx     # 0x7b7a7
callq 0x30a0
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
cmpl $0x303, (%rax)          # imm = 0x303
jne 0x2aa68
jmp 0x2aa87
leaq 0x4c2b0(%rip), %rdi     # 0x76d1f
leaq 0x5008e(%rip), %rsi     # 0x7ab04
movl $0xe2a, %edx            # imm = 0xE2A
leaq 0x50d25(%rip), %rcx     # 0x7b7a7
callq 0x30a0
leaq -0x28(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rdx
leaq -0x28(%rbp), %rsi
callq 0x34590
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
cmpl $0x200, (%rax)          # imm = 0x200
jne 0x2ab98
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x32900
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
cmpl $0x1, (%rax)
jne 0x2ab22
movq -0x8(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x58(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0x2ab03
leaq 0x4b442(%rip), %rax     # 0x75f3f
movq %rax, -0x68(%rbp)
jmp 0x2ab0b
movq -0x20(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x58(%rbp), %rsi
movq -0x60(%rbp), %rdi
movq -0x68(%rbp), %rdx
movq -0x38(%rbp), %rcx
callq 0x33600
jmp 0x2ab93
movq -0x38(%rbp), %rax
cmpl $0x3, (%rax)
jne 0x2ab72
movq -0x8(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x70(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0x2ab53
leaq 0x4b3f2(%rip), %rax     # 0x75f3f
movq %rax, -0x80(%rbp)
jmp 0x2ab5b
movq -0x20(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x70(%rbp), %rsi
movq -0x78(%rbp), %rdi
movq -0x80(%rbp), %rdx
movq -0x38(%rbp), %rcx
callq 0x32b90
jmp 0x2ab91
leaq 0x488e1(%rip), %rdi     # 0x7345a
leaq 0x4ff84(%rip), %rsi     # 0x7ab04
movl $0xe42, %edx            # imm = 0xE42
leaq 0x50c1b(%rip), %rcx     # 0x7b7a7
callq 0x30a0
jmp 0x2ab93
jmp 0x2ae3f
movq -0x30(%rbp), %rax
cmpl $0xe00, (%rax)          # imm = 0xE00
jne 0x2ae1e
leaq -0x48(%rbp), %rdi
callq 0x8c90
cmpq $0x0, -0x20(%rbp)
jne 0x2abc8
leaq 0x4b380(%rip), %rax     # 0x75f3f
movq %rax, -0x88(%rbp)
jmp 0x2abd3
movq -0x20(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x88(%rbp), %rdi
leaq 0x4bb73(%rip), %rsi     # 0x76754
callq 0x346d0
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x89(%rbp)
jne 0x2ad04
cmpq $0x0, -0x20(%rbp)
jne 0x2ac10
leaq 0x4b338(%rip), %rax     # 0x75f3f
movq %rax, -0x98(%rbp)
jmp 0x2ac1b
movq -0x20(%rbp), %rax
movq %rax, -0x98(%rbp)
movq -0x98(%rbp), %rdi
leaq 0x4c122(%rip), %rsi     # 0x76d4b
callq 0x346d0
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x89(%rbp)
jne 0x2ad04
cmpq $0x0, -0x20(%rbp)
jne 0x2ac58
leaq 0x4b2f0(%rip), %rax     # 0x75f3f
movq %rax, -0xa0(%rbp)
jmp 0x2ac63
movq -0x20(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0xa0(%rbp), %rdi
leaq 0x4bae7(%rip), %rsi     # 0x76758
callq 0x346d0
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x89(%rbp)
jne 0x2ad04
cmpq $0x0, -0x20(%rbp)
jne 0x2ac9c
leaq 0x4b2ac(%rip), %rax     # 0x75f3f
movq %rax, -0xa8(%rbp)
jmp 0x2aca7
movq -0x20(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0xa8(%rbp), %rdi
leaq 0x4b730(%rip), %rsi     # 0x763e5
callq 0x346d0
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x89(%rbp)
jne 0x2ad04
cmpq $0x0, -0x20(%rbp)
jne 0x2ace0
leaq 0x4b268(%rip), %rax     # 0x75f3f
movq %rax, -0xb0(%rbp)
jmp 0x2aceb
movq -0x20(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0xb0(%rbp), %rdi
leaq 0x503c1(%rip), %rsi     # 0x7b0ba
callq 0x346d0
movb %al, -0x89(%rbp)
movb -0x89(%rbp), %al
xorb $-0x1, %al
andb $0x1, %al
movb %al, -0x49(%rbp)
testb $0x1, -0x49(%rbp)
je 0x2ad34
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x9, %edx
leaq 0x5038b(%rip), %rcx     # 0x7b0ba
callq 0x34750
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rdx
leaq -0x48(%rbp), %rsi
xorl %ecx, %ecx
callq 0x32e60
movq -0x30(%rbp), %rax
movb 0x60(%rax), %al
movb %al, -0x4a(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0xc0(%rbp)
movb -0x4a(%rbp), %al
movb %al, -0xb1(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0x2ad8b
leaq 0x4b1bd(%rip), %rax     # 0x75f3f
movq %rax, -0xd0(%rbp)
jmp 0x2ad96
movq -0x20(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0xd0(%rbp), %rax
movq %rax, -0xd8(%rbp)
cmpq $0x0, -0x40(%rbp)
jne 0x2adbb
leaq 0x4b18d(%rip), %rax     # 0x75f3f
movq %rax, -0xe0(%rbp)
jmp 0x2adc6
movq -0x40(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq -0xd8(%rbp), %rcx
movb -0xb1(%rbp), %al
movq -0xc0(%rbp), %rsi
movq -0xc8(%rbp), %rdi
movq -0xe0(%rbp), %r8
movzbl %al, %edx
callq 0x33720
testb $0x1, -0x49(%rbp)
je 0x2ae13
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x9, %edx
leaq 0x502ac(%rip), %rcx     # 0x7b0ba
callq 0x34860
leaq -0x48(%rbp), %rdi
callq 0x9310
jmp 0x2ae3d
leaq 0x48635(%rip), %rdi     # 0x7345a
leaq 0x4fcd8(%rip), %rsi     # 0x7ab04
movl $0xe6a, %edx            # imm = 0xE6A
leaq 0x5096f(%rip), %rcx     # 0x7b7a7
callq 0x30a0
jmp 0x2ae3f
leaq -0x28(%rbp), %rdi
callq 0x9310
addq $0xe0, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)