// File: /workspace/github_c_makefile_star2_O1/Ihsoh[P]ilang/compiler/frontend/irgen_llvmir.c
// Function: expr_result_cast
static void _expr_result_cast(
	IRGeneratorLlvmirContext *ctx,
	_ExprResult *target_result,
	ParserASTNode *target_type_node,
	_ExprResult *source_result,
	ParserASTNode *source_type_node
) {
	assert(ctx);
	assert(target_result);
	assert(target_type_node);
	assert(source_result);
	assert(source_type_node);

	if (fe_sem_is_compatible_type(ctx->psrctx, target_type_node, source_type_node, true)) {
		goto not_need_to_cast;
	}

	uint8_t target_type = fe_sem_get_type_by_type_node(ctx->psrctx, target_type_node);
	uint8_t source_type = fe_sem_get_type_by_type_node(ctx->psrctx, source_type_node);

	if (fe_sem_is_integer_type(target_type)
			&& fe_sem_is_integer_type(source_type)
			&& fe_sem_get_primitive_type_size(target_type) == fe_sem_get_primitive_type_size(source_type)) {
		goto not_need_to_cast;
	}

	ParserSymbol *func_symbol = ctx->func_symbol;
	assert(func_symbol);

	ResizableString rstr_tmp_label_val;
	rstr_init(&rstr_tmp_label_val);
	_generate_func_tmp(ctx, func_symbol, &rstr_tmp_label_val);

	ResizableString rstr_target_type;
	rstr_init(&rstr_target_type);
	_ir_type(ctx, &rstr_target_type, target_type_node);

	#define	_A(cmd)	\
		rstr_appendf(	\
			&(target_result->rstr_for_result),	\
			"%s = "cmd" %s to %s\n",	\
			RSTR_CSTR(&rstr_tmp_label_val),	\
			RSTR_CSTR(&(source_result->rstr_result)),	\
			RSTR_CSTR(&rstr_target_type)	\
		);	\
		_expr_result_set_result(	\
			target_result,	\
			RSTR_CSTR(&rstr_target_type),	\
			RSTR_CSTR(&rstr_tmp_label_val)	\
		);

	if (fe_sem_is_signed_type(source_type)) {
		if (fe_sem_is_signed_type(target_type)) {
			if (fe_sem_get_primitive_type_size(target_type) < fe_sem_get_primitive_type_size(source_type)) {
				// 小的有符号整数 <- 大的有符号整数。
				_A("trunc")
			} else {
				// 大的有符号整数 <- 小的有符号整数。
				_A("sext")
			}
		} else if (fe_sem_is_unsigned_type(target_type)) {
			if (fe_sem_get_primitive_type_size(target_type) < fe_sem_get_primitive_type_size(source_type)) {
				// 小的无符号整数 <- 大的有符号整数。
				_A("trunc")
			} else {
				// 大的无符号整数 <- 小的有符号整数。
				_A("sext")
			}
		} else if (target_type == FE_TYPE_FLOAT) {
			// float <- 有符号整数。
			_A("sitofp")
		} else if (target_type == FE_TYPE_DOUBLE) {
			// double <- 有符号整数。
			_A("sitofp")
		} else if (target_type == FE_TYPE_POINTER) {
			// T* <- 有符号整数。
			_A("inttoptr")
		} else {
			assert(0);
		}
	} else if (fe_sem_is_unsigned_type(source_type)) {
		if (fe_sem_is_signed_type(target_type)) {
			if (fe_sem_get_primitive_type_size(target_type) < fe_sem_get_primitive_type_size(source_type)) {
				// 小的有符号整数 <- 大的无符号整数。
				_A("trunc")
			} else {
				// 大的有符号整数 <- 小的无符号整数。
				_A("zext")
			}
		} else if (fe_sem_is_unsigned_type(target_type)) {
			if (fe_sem_get_primitive_type_size(target_type) < fe_sem_get_primitive_type_size(source_type)) {
				// 小的无符号整数 <- 大的无符号整数。
				_A("trunc")
			} else {
				// 大的无符号整数 <- 小的无符号整数。
				_A("zext")
			}
		} else if (target_type == FE_TYPE_FLOAT) {
			// float <- 无符号整数。
			_A("uitofp")
		} else if (target_type == FE_TYPE_DOUBLE) {
			// double <- 无符号整数。
			_A("uitofp")
		} else if (target_type == FE_TYPE_POINTER) {
			// T* <- 无符号整数。
			_A("inttoptr")
		} else {
			assert(0);
		}
	} else if (source_type == FE_TYPE_FLOAT) {
		if (fe_sem_is_signed_type(target_type)) {
			// 有符号整数 <- float。
			_A("fptosi")
		} else if (fe_sem_is_unsigned_type(target_type)) {
			// 无符号整数 <- float。
			_A("fptoui")
		} else if (target_type == FE_TYPE_FLOAT) {
			// float <- float，不存在的。
			assert(0);
		} else if (target_type == FE_TYPE_DOUBLE) {
			// double <- float。
			_A("fpext")
		} else if (target_type == FE_TYPE_POINTER) {
			// T* <- float，不存在的。
			assert(0);
		} else {
			assert(0);
		}
	} else if (source_type == FE_TYPE_DOUBLE) {
		if (fe_sem_is_signed_type(target_type)) {
			// 有符号整数 <- double。
			_A("fptosi")
		} else if (fe_sem_is_unsigned_type(target_type)) {
			// 无符号整数 <- double。
			_A("fptoui")
		} else if (target_type == FE_TYPE_FLOAT) {
			// float <- double。
			_A("fptrunc")
		} else if (target_type == FE_TYPE_DOUBLE) {
			// double <- double，不存在的。
			assert(0);
		} else if (target_type == FE_TYPE_POINTER) {
			// T* <- double，不存在的。
			assert(0);
		} else {
			assert(0);
		}
	} else if (source_type == FE_TYPE_POINTER) {
		if (fe_sem_is_signed_type(target_type)) {
			// 有符号整数 <- T*。
			_A("ptrtoint")
		} else if (fe_sem_is_unsigned_type(target_type)) {
			// 无符号整数 <- T*。
			_A("ptrtoint")
		} else if (target_type == FE_TYPE_FLOAT) {
			// float <- T*，不存在的。
			assert(0);
		} else if (target_type == FE_TYPE_DOUBLE) {
			// double <- T*，不存在的。
			assert(0);
		} else if (target_type == FE_TYPE_POINTER) {
			// T* <- T*。
			_A("bitcast")
		} else {
			assert(0);
		}
	} else {
		assert(0);
	}

	rstr_free(&rstr_tmp_label_val);
	rstr_free(&rstr_target_type);
	return;

not_need_to_cast:
	_expr_result_set_result(
		target_result,
		RSTR_CSTR(&(source_result->rstr_result_type)),
		RSTR_CSTR(&(source_result->rstr_result_val))
	);
	_expr_result_set_result_ptr(
		target_result,
		RSTR_CSTR(&(source_result->rstr_result_ptr_type)),
		RSTR_CSTR(&(source_result->rstr_result_ptr_val))
	);

	#undef	_A
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x48, %rsp
movq %rcx, -0x38(%rbp)
testq %rsi, %rsi
je 0x1a563
movq %rdx, %rbx
testq %rdx, %rdx
je 0x1a582
movq %rsi, -0x40(%rbp)
cmpq $0x0, -0x38(%rbp)
je 0x1a5a1
movq %r8, %r12
testq %r8, %r8
je 0x1a5c0
movq %rdi, %r15
movq (%rdi), %rdi
movq %rbx, %rsi
movq %r12, %rdx
movl $0x1, %ecx
callq 0x2ad9d
testb %al, %al
je 0x1a029
movq -0x38(%rbp), %r14
movq 0x38(%r14), %rsi
testq %rsi, %rsi
leaq 0x29ed8(%rip), %rbx     # 0x43eba
cmoveq %rbx, %rsi
movq 0x48(%r14), %rdx
testq %rdx, %rdx
cmoveq %rbx, %rdx
movq -0x40(%rbp), %r15
movq %r15, %rdi
callq 0x1e280
movq 0x68(%r14), %rsi
testq %rsi, %rsi
cmoveq %rbx, %rsi
movq 0x78(%r14), %rdx
testq %rdx, %rdx
cmoveq %rbx, %rdx
movq %r15, %rdi
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x1e382
movq (%r15), %rdi
movq %rbx, %rsi
callq 0x2b043
movl %eax, %r13d
movq (%r15), %rdi
movq %r12, %rsi
callq 0x2b043
movl %eax, %r14d
movb %r13b, -0x29(%rbp)
movzbl %r13b, %r13d
movl %r13d, %edi
callq 0x2ad50
movb %r14b, -0x41(%rbp)
movzbl %r14b, %r14d
testb %al, %al
je 0x1a089
movl %r14d, %edi
callq 0x2ad50
testb %al, %al
je 0x1a089
movl %r13d, %edi
callq 0x2acf3
movq %rax, %r12
movl %r14d, %edi
callq 0x2acf3
cmpq %rax, %r12
je 0x19fd0
movl %r13d, -0x48(%rbp)
movq 0x40(%r15), %r12
testq %r12, %r12
je 0x1a5df
leaq -0x68(%rbp), %r15
movq %r15, %rdi
callq 0x7548
movl 0x54(%r12), %edx
leal 0x1(%rdx), %eax
movl %eax, 0x54(%r12)
leaq 0x2bfe0(%rip), %rsi     # 0x4609a
movq %r15, %rdi
xorl %eax, %eax
callq 0x7b31
leaq -0x58(%rbp), %r15
movq %r15, %rdi
callq 0x7548
movq %r15, %rdi
movq %rbx, %rsi
callq 0x198ea
movl %r14d, %edi
callq 0x2ad2f
testb %al, %al
je 0x1a153
movl -0x48(%rbp), %ebx
movl %ebx, %edi
callq 0x2ad2f
testb %al, %al
jne 0x1a104
movl %ebx, %edi
callq 0x2ad3f
testb %al, %al
je 0x1a238
movl %ebx, %edi
callq 0x2acf3
movq %rax, %rbx
movl %r14d, %edi
callq 0x2acf3
movq -0x60(%rbp), %rdx
testq %rdx, %rdx
leaq 0x29d96(%rip), %rsi     # 0x43eba
cmoveq %rsi, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rsi, %rcx
movq -0x50(%rbp), %r8
testq %r8, %r8
cmoveq %rsi, %r8
cmpq %rax, %rbx
jb 0x1a1c3
leaq 0x2ce2a(%rip), %rsi     # 0x46f78
jmp 0x1a3a6
movl %r14d, %edi
callq 0x2ad3f
testb %al, %al
movl -0x48(%rbp), %ebx
je 0x1a1cf
movl %ebx, %edi
callq 0x2ad2f
testb %al, %al
jne 0x1a17c
movl %ebx, %edi
callq 0x2ad3f
testb %al, %al
je 0x1a326
movl %ebx, %edi
callq 0x2acf3
movq %rax, %rbx
movl %r14d, %edi
callq 0x2acf3
movq -0x60(%rbp), %rdx
testq %rdx, %rdx
leaq 0x29d1e(%rip), %rsi     # 0x43eba
cmoveq %rsi, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rsi, %rcx
movq -0x50(%rbp), %r8
testq %r8, %r8
cmoveq %rsi, %r8
cmpq %rax, %rbx
jae 0x1a28c
leaq 0x2cd99(%rip), %rsi     # 0x46f63
jmp 0x1a3a6
cmpb $0x10, -0x41(%rbp)
je 0x1a2df
cmpl $0xb, %r14d
je 0x1a298
cmpl $0xa, %r14d
jne 0x1a5fe
movl %ebx, %edi
callq 0x2ad2f
testb %al, %al
movq -0x40(%rbp), %r15
je 0x1a49c
movq -0x60(%rbp), %rdx
testq %rdx, %rdx
leaq 0x29cac(%rip), %rax     # 0x43eba
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x50(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2cdb1(%rip), %rsi     # 0x46fe4
jmp 0x1a3aa
cmpb $0x10, -0x29(%rbp)
je 0x1a373
cmpl $0xb, %ebx
movq -0x40(%rbp), %r15
je 0x1a254
cmpl $0xa, %ebx
jne 0x1a6b3
movq -0x60(%rbp), %rdx
testq %rdx, %rdx
leaq 0x29c58(%rip), %rax     # 0x43eba
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x50(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2cd05(%rip), %rsi     # 0x46f8c
jmp 0x1a3aa
leaq 0x2cd27(%rip), %rsi     # 0x46fba
jmp 0x1a3a6
movl %ebx, %edi
callq 0x2ad2f
testb %al, %al
je 0x1a400
movq -0x60(%rbp), %rdx
testq %rdx, %rdx
leaq 0x29c05(%rip), %rax     # 0x43eba
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x50(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2cd0a(%rip), %rsi     # 0x46fe4
jmp 0x1a3a6
movl %ebx, %edi
callq 0x2ad2f
testb %al, %al
je 0x1a455
movq -0x60(%rbp), %rdx
testq %rdx, %rdx
leaq 0x29bbe(%rip), %rax     # 0x43eba
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x50(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2cd1b(%rip), %rsi     # 0x4703c
jmp 0x1a3a6
cmpb $0x10, -0x29(%rbp)
je 0x1a373
cmpl $0xb, %ebx
movq -0x40(%rbp), %r15
je 0x1a33e
cmpl $0xa, %ebx
jne 0x1a6d2
movq -0x60(%rbp), %rdx
testq %rdx, %rdx
leaq 0x29b6e(%rip), %rax     # 0x43eba
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x50(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2cc5d(%rip), %rsi     # 0x46fce
jmp 0x1a3aa
movq -0x60(%rbp), %rdx
testq %rdx, %rdx
leaq 0x29b39(%rip), %rax     # 0x43eba
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x50(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2cbfc(%rip), %rsi     # 0x46fa2
movq -0x40(%rbp), %r15
movq %r15, %rdi
xorl %eax, %eax
callq 0x7b31
leaq -0x58(%rbp), %rbx
movq 0x8(%rbx), %rsi
testq %rsi, %rsi
leaq 0x29af4(%rip), %rax     # 0x43eba
cmoveq %rax, %rsi
leaq -0x68(%rbp), %r14
movq 0x8(%r14), %rdx
testq %rdx, %rdx
cmoveq %rax, %rdx
movq %r15, %rdi
callq 0x1e280
movq %r14, %rdi
callq 0x7a38
movq %rbx, %rdi
callq 0x7a38
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movl %ebx, %edi
callq 0x2ad3f
testb %al, %al
movq -0x40(%rbp), %r15
jne 0x1a4a7
cmpb $0xa, -0x29(%rbp)
jne 0x1a61d
movq -0x60(%rbp), %rdx
testq %rdx, %rdx
leaq 0x29a8f(%rip), %rax     # 0x43eba
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x50(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2cbd5(%rip), %rsi     # 0x47025
jmp 0x1a3aa
movl %ebx, %edi
callq 0x2ad3f
testb %al, %al
movq -0x40(%rbp), %r15
je 0x1a4df
movq -0x60(%rbp), %rdx
testq %rdx, %rdx
leaq 0x29a48(%rip), %rax     # 0x43eba
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x50(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2cba5(%rip), %rsi     # 0x4703c
jmp 0x1a3aa
movl %ebx, %edi
callq 0x2ad3f
testb %al, %al
je 0x1a521
movq -0x60(%rbp), %rdx
testq %rdx, %rdx
leaq 0x29a05(%rip), %rax     # 0x43eba
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x50(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2cb20(%rip), %rsi     # 0x46ffa
jmp 0x1a3aa
cmpb $0x10, -0x29(%rbp)
jne 0x1a64f
movq -0x60(%rbp), %rdx
testq %rdx, %rdx
leaq 0x299c3(%rip), %rax     # 0x43eba
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x50(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2cb38(%rip), %rsi     # 0x47054
jmp 0x1a3aa
cmpb $0xb, -0x29(%rbp)
jne 0x1a681
movq -0x60(%rbp), %rdx
testq %rdx, %rdx
leaq 0x29981(%rip), %rax     # 0x43eba
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x50(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2cab2(%rip), %rsi     # 0x47010
jmp 0x1a3aa
leaq 0x297f3(%rip), %rdi     # 0x43d5d
leaq 0x2b303(%rip), %rsi     # 0x45874
leaq 0x2c978(%rip), %rcx     # 0x46ef0
movl $0x177, %edx            # imm = 0x177
callq 0x30a0
leaq 0x297e2(%rip), %rdi     # 0x43d6b
leaq 0x2b2e4(%rip), %rsi     # 0x45874
leaq 0x2c959(%rip), %rcx     # 0x46ef0
movl $0x178, %edx            # imm = 0x178
callq 0x30a0
leaq 0x297d4(%rip), %rdi     # 0x43d7c
leaq 0x2b2c5(%rip), %rsi     # 0x45874
leaq 0x2c93a(%rip), %rcx     # 0x46ef0
movl $0x179, %edx            # imm = 0x179
callq 0x30a0
leaq 0x297c3(%rip), %rdi     # 0x43d8a
leaq 0x2b2a6(%rip), %rsi     # 0x45874
leaq 0x2c91b(%rip), %rcx     # 0x46ef0
movl $0x17a, %edx            # imm = 0x17A
callq 0x30a0
leaq 0x29935(%rip), %rdi     # 0x43f1b
leaq 0x2b287(%rip), %rsi     # 0x45874
leaq 0x2c8fc(%rip), %rcx     # 0x46ef0
movl $0x18a, %edx            # imm = 0x18A
callq 0x30a0
leaq 0x25d7f(%rip), %rdi     # 0x40384
leaq 0x2b268(%rip), %rsi     # 0x45874
leaq 0x2c8dd(%rip), %rcx     # 0x46ef0
movl $0x216, %edx            # imm = 0x216
callq 0x30a0
cmpl $0xb, %ebx
je 0x1a6f1
cmpl $0x10, -0x48(%rbp)
jne 0x1a710
leaq 0x25d4d(%rip), %rdi     # 0x40384
leaq 0x2b236(%rip), %rsi     # 0x45874
leaq 0x2c8ab(%rip), %rcx     # 0x46ef0
movl $0x1fe, %edx            # imm = 0x1FE
callq 0x30a0
cmpl $0xb, %ebx
je 0x1a72f
cmpl $0xa, -0x48(%rbp)
jne 0x1a74e
leaq 0x25d1b(%rip), %rdi     # 0x40384
leaq 0x2b204(%rip), %rsi     # 0x45874
leaq 0x2c879(%rip), %rcx     # 0x46ef0
movl $0x20b, %edx            # imm = 0x20B
callq 0x30a0
cmpl $0x10, %ebx
je 0x1a76d
cmpl $0xa, -0x48(%rbp)
jne 0x1a78c
leaq 0x25ce9(%rip), %rdi     # 0x40384
leaq 0x2b1d2(%rip), %rsi     # 0x45874
leaq 0x2c847(%rip), %rcx     # 0x46ef0
movl $0x1e5, %edx            # imm = 0x1E5
callq 0x30a0
leaq 0x25cca(%rip), %rdi     # 0x40384
leaq 0x2b1b3(%rip), %rsi     # 0x45874
leaq 0x2c828(%rip), %rcx     # 0x46ef0
movl $0x1bd, %edx            # imm = 0x1BD
callq 0x30a0
leaq 0x25cab(%rip), %rdi     # 0x40384
leaq 0x2b194(%rip), %rsi     # 0x45874
leaq 0x2c809(%rip), %rcx     # 0x46ef0
movl $0x1da, %edx            # imm = 0x1DA
callq 0x30a0
leaq 0x25c8c(%rip), %rdi     # 0x40384
leaq 0x2b175(%rip), %rsi     # 0x45874
leaq 0x2c7ea(%rip), %rcx     # 0x46ef0
movl $0x1fb, %edx            # imm = 0x1FB
callq 0x30a0
leaq 0x25c6d(%rip), %rdi     # 0x40384
leaq 0x2b156(%rip), %rsi     # 0x45874
leaq 0x2c7cb(%rip), %rcx     # 0x46ef0
movl $0x200, %edx            # imm = 0x200
callq 0x30a0
leaq 0x25c4e(%rip), %rdi     # 0x40384
leaq 0x2b137(%rip), %rsi     # 0x45874
leaq 0x2c7ac(%rip), %rcx     # 0x46ef0
movl $0x20e, %edx            # imm = 0x20E
callq 0x30a0
leaq 0x25c2f(%rip), %rdi     # 0x40384
leaq 0x2b118(%rip), %rsi     # 0x45874
leaq 0x2c78d(%rip), %rcx     # 0x46ef0
movl $0x213, %edx            # imm = 0x213
callq 0x30a0
leaq 0x25c10(%rip), %rdi     # 0x40384
leaq 0x2b0f9(%rip), %rsi     # 0x45874
leaq 0x2c76e(%rip), %rcx     # 0x46ef0
movl $0x1eb, %edx            # imm = 0x1EB
callq 0x30a0
leaq 0x25bf1(%rip), %rdi     # 0x40384
leaq 0x2b0da(%rip), %rsi     # 0x45874
leaq 0x2c74f(%rip), %rcx     # 0x46ef0
movl $0x1ed, %edx            # imm = 0x1ED
callq 0x30a0