// File: /workspace/github_c_makefile_star2_O2/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 $0x38, %rsp
testq %rsi, %rsi
je 0x18f94
movq %rdx, %rbx
testq %rdx, %rdx
je 0x18fb3
testq %rcx, %rcx
je 0x18fd2
movq %r8, %r15
movq %rcx, -0x38(%rbp)
testq %r8, %r8
je 0x18ff1
movq %rsi, %r14
movq %rdi, %r12
movq (%rdi), %rdi
pushq $0x1
popq %rcx
movq %rbx, %rsi
movq %r15, %rdx
callq 0x28347
testb %al, %al
je 0x18a1d
movq -0x38(%rbp), %r15
movq 0x38(%r15), %rsi
testq %rsi, %rsi
leaq 0x2753c(%rip), %rbx     # 0x3ff16
cmoveq %rbx, %rsi
movq 0x48(%r15), %rdx
testq %rdx, %rdx
cmoveq %rbx, %rdx
movq %r14, %rdi
callq 0x1cba4
movq 0x68(%r15), %rsi
testq %rsi, %rsi
cmoveq %rbx, %rsi
movq 0x78(%r15), %rdx
testq %rdx, %rdx
cmoveq %rbx, %rdx
movq %r14, %rdi
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x1cc9e
movq (%r12), %rdi
movq %rbx, %rsi
callq 0x2859e
movl %eax, %r13d
movq (%r12), %rdi
movq %r15, %rsi
callq 0x2859e
movl %eax, %r15d
movb %r13b, -0x29(%rbp)
movzbl %r13b, %edi
movl %edi, -0x30(%rbp)
callq 0x282fa
movzbl %r15b, %r13d
testb %al, %al
je 0x18a7d
movl %r13d, %edi
callq 0x282fa
testb %al, %al
je 0x18a7d
movl -0x30(%rbp), %edi
callq 0x2829d
movq %rax, -0x60(%rbp)
movl %r13d, %edi
callq 0x2829d
cmpq %rax, -0x60(%rbp)
je 0x189c8
movq %r14, -0x60(%rbp)
movq 0x40(%r12), %r12
testq %r12, %r12
je 0x19010
leaq -0x58(%rbp), %r14
movq %r14, %rdi
callq 0x6e1c
movq %r12, %rdi
movq %r14, %rsi
callq 0x1cc34
leaq -0x48(%rbp), %r14
movq %r14, %rdi
callq 0x6e1c
movq %r14, %rdi
movq %rbx, %rsi
callq 0x18312
movl %r13d, %edi
callq 0x282d9
testb %al, %al
je 0x18b32
movl -0x30(%rbp), %ebx
movl %ebx, %edi
callq 0x282d9
testb %al, %al
je 0x18bb2
movl %ebx, %edi
callq 0x2829d
movq %rax, %rbx
movl %r13d, %edi
callq 0x2829d
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x2741b(%rip), %rsi     # 0x3ff16
cmoveq %rsi, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rsi, %rcx
movq -0x40(%rbp), %r8
testq %r8, %r8
cmoveq %rsi, %r8
cmpq %rax, %rbx
movq -0x60(%rbp), %rbx
jae 0x18c6d
leaq 0x2a54a(%rip), %rsi     # 0x43077
jmp 0x18f3e
movl %r13d, %edi
callq 0x282e9
testb %al, %al
je 0x18c18
movl -0x30(%rbp), %ebx
movl %ebx, %edi
callq 0x282d9
testb %al, %al
movq -0x60(%rbp), %r14
jne 0x18b63
movl %ebx, %edi
callq 0x282e9
testb %al, %al
je 0x18d40
movl %ebx, %edi
callq 0x2829d
movq %rax, %rbx
movl %r13d, %edi
callq 0x2829d
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x27393(%rip), %rsi     # 0x3ff16
cmoveq %rsi, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rsi, %rcx
movq -0x40(%rbp), %r8
testq %r8, %r8
cmoveq %rsi, %r8
cmpq %rax, %rbx
jb 0x18c0c
leaq 0x2a521(%rip), %rsi     # 0x430ce
jmp 0x18dc5
movl %ebx, %edi
callq 0x282e9
testb %al, %al
movq -0x60(%rbp), %r14
je 0x18c79
movl %ebx, %edi
callq 0x2829d
movq %rax, %rbx
movl %r13d, %edi
callq 0x2829d
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x27331(%rip), %rsi     # 0x3ff16
cmoveq %rsi, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rsi, %rcx
movq -0x40(%rbp), %r8
testq %r8, %r8
cmoveq %rsi, %r8
cmpq %rax, %rbx
jae 0x18d89
leaq 0x2a464(%rip), %rsi     # 0x43077
jmp 0x18dc5
cmpb $0x10, %r15b
movq -0x60(%rbp), %rbx
je 0x18d11
cmpl $0xb, %r13d
movl -0x30(%rbp), %r15d
je 0x18cc9
cmpl $0xa, %r13d
jne 0x1902f
movl %r15d, %edi
callq 0x282d9
testb %al, %al
movq -0x38(%rbp), %r14
je 0x18e4b
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x272b6(%rip), %rax     # 0x3ff16
cmoveq %rax, %rdx
movq 0x28(%r14), %rcx
jmp 0x18cf3
leaq 0x2a418(%rip), %rsi     # 0x4308c
jmp 0x18f3e
cmpb $0x10, -0x29(%rbp)
je 0x18d92
cmpl $0xb, %ebx
movq -0x38(%rbp), %rcx
je 0x18c95
cmpl $0xa, %ebx
jne 0x190e7
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x27273(%rip), %rax     # 0x3ff16
cmoveq %rax, %rdx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x40(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2a3dc(%rip), %rsi     # 0x430a0
jmp 0x18dc5
movl %r15d, %edi
callq 0x282d9
testb %al, %al
je 0x18dd7
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x2722f(%rip), %rax     # 0x3ff16
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x40(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2a3ec(%rip), %rsi     # 0x430f8
jmp 0x18f3e
movl -0x30(%rbp), %r14d
movl %r14d, %edi
callq 0x282d9
testb %al, %al
je 0x18e03
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x271e3(%rip), %rax     # 0x3ff16
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
jmp 0x18e29
cmpb $0x10, -0x29(%rbp)
je 0x18d92
cmpl $0xb, %ebx
movq -0x38(%rbp), %rcx
je 0x18d58
cmpl $0xa, %ebx
jne 0x19106
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x271b0(%rip), %rax     # 0x3ff16
cmoveq %rax, %rdx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x40(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2a35b(%rip), %rsi     # 0x430e2
jmp 0x18dc5
leaq 0x2a2fc(%rip), %rsi     # 0x4308c
jmp 0x18dc5
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x27176(%rip), %rax     # 0x3ff16
cmoveq %rax, %rdx
movq -0x38(%rbp), %rcx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x40(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2a2f1(%rip), %rsi     # 0x430b6
movq %r14, %rdi
xorl %eax, %eax
callq 0x739a
movq %r14, %rdi
jmp 0x18f4b
movl %r15d, %edi
callq 0x282e9
testb %al, %al
movq -0x38(%rbp), %rcx
je 0x18e8f
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x2711d(%rip), %rax     # 0x3ff16
cmoveq %rax, %rdx
movq 0x28(%rcx), %rcx
jmp 0x18e71
movl %r14d, %edi
callq 0x282e9
testb %al, %al
movq -0x38(%rbp), %rcx
je 0x18eca
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x270f1(%rip), %rax     # 0x3ff16
cmoveq %rax, %rdx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x40(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2a30a(%rip), %rsi     # 0x43150
jmp 0x18f3e
movl %r15d, %edi
callq 0x282e9
testb %al, %al
je 0x18f05
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x270ad(%rip), %rax     # 0x3ff16
cmoveq %rax, %rdx
movq 0x28(%r14), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x40(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2a284(%rip), %rsi     # 0x4310e
jmp 0x18f3e
cmpb $0xa, -0x29(%rbp)
jne 0x1904e
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x2706f(%rip), %rax     # 0x3ff16
cmoveq %rax, %rdx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x40(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2a271(%rip), %rsi     # 0x43139
jmp 0x18f3e
cmpb $0x10, -0x29(%rbp)
jne 0x19081
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x27034(%rip), %rax     # 0x3ff16
cmoveq %rax, %rdx
movq 0x28(%rcx), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x40(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2a265(%rip), %rsi     # 0x43168
jmp 0x18f3e
cmpb $0xb, -0x29(%rbp)
jne 0x190b4
movq -0x50(%rbp), %rdx
testq %rdx, %rdx
leaq 0x26ff9(%rip), %rax     # 0x3ff16
cmoveq %rax, %rdx
movq 0x28(%r14), %rcx
testq %rcx, %rcx
cmoveq %rax, %rcx
movq -0x40(%rbp), %r8
testq %r8, %r8
cmoveq %rax, %r8
leaq 0x2a1e6(%rip), %rsi     # 0x43124
movq %rbx, %rdi
xorl %eax, %eax
callq 0x739a
movq %rbx, %rdi
leaq -0x48(%rbp), %rbx
movq 0x8(%rbx), %rsi
testq %rsi, %rsi
leaq 0x26fb9(%rip), %rax     # 0x3ff16
cmoveq %rax, %rsi
leaq -0x58(%rbp), %r14
movq 0x8(%r14), %rdx
testq %rdx, %rdx
cmoveq %rax, %rdx
callq 0x1cba4
movq %r14, %rdi
callq 0x72b9
movq %rbx, %rdi
callq 0x72b9
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0x26e1e(%rip), %rdi     # 0x3fdb9
leaq 0x289e6(%rip), %rsi     # 0x41988
leaq 0x2a05b(%rip), %rcx     # 0x43004
movl $0x177, %edx            # imm = 0x177
callq 0x30a0
leaq 0x26e0d(%rip), %rdi     # 0x3fdc7
leaq 0x289c7(%rip), %rsi     # 0x41988
leaq 0x2a03c(%rip), %rcx     # 0x43004
movl $0x178, %edx            # imm = 0x178
callq 0x30a0
leaq 0x26dff(%rip), %rdi     # 0x3fdd8
leaq 0x289a8(%rip), %rsi     # 0x41988
leaq 0x2a01d(%rip), %rcx     # 0x43004
movl $0x179, %edx            # imm = 0x179
callq 0x30a0
leaq 0x26dee(%rip), %rdi     # 0x3fde6
leaq 0x28989(%rip), %rsi     # 0x41988
leaq 0x29ffe(%rip), %rcx     # 0x43004
movl $0x17a, %edx            # imm = 0x17A
callq 0x30a0
leaq 0x26f60(%rip), %rdi     # 0x3ff77
leaq 0x2896a(%rip), %rsi     # 0x41988
leaq 0x29fdf(%rip), %rcx     # 0x43004
movl $0x18a, %edx            # imm = 0x18A
callq 0x30a0
leaq 0x2332a(%rip), %rdi     # 0x3c360
leaq 0x2894b(%rip), %rsi     # 0x41988
leaq 0x29fc0(%rip), %rcx     # 0x43004
movl $0x216, %edx            # imm = 0x216
callq 0x30a0
cmpl $0xb, %r15d
je 0x19125
cmpl $0x10, -0x30(%rbp)
jne 0x19144
leaq 0x232f7(%rip), %rdi     # 0x3c360
leaq 0x28918(%rip), %rsi     # 0x41988
leaq 0x29f8d(%rip), %rcx     # 0x43004
movl $0x1fe, %edx            # imm = 0x1FE
callq 0x30a0
cmpl $0xb, %r14d
je 0x19163
cmpl $0xa, -0x30(%rbp)
jne 0x19182
leaq 0x232c4(%rip), %rdi     # 0x3c360
leaq 0x288e5(%rip), %rsi     # 0x41988
leaq 0x29f5a(%rip), %rcx     # 0x43004
movl $0x20b, %edx            # imm = 0x20B
callq 0x30a0
cmpl $0x10, %r15d
je 0x191a1
cmpl $0xa, -0x30(%rbp)
jne 0x191c0
leaq 0x23291(%rip), %rdi     # 0x3c360
leaq 0x288b2(%rip), %rsi     # 0x41988
leaq 0x29f27(%rip), %rcx     # 0x43004
movl $0x1e5, %edx            # imm = 0x1E5
callq 0x30a0
leaq 0x23272(%rip), %rdi     # 0x3c360
leaq 0x28893(%rip), %rsi     # 0x41988
leaq 0x29f08(%rip), %rcx     # 0x43004
movl $0x1bd, %edx            # imm = 0x1BD
callq 0x30a0
leaq 0x23253(%rip), %rdi     # 0x3c360
leaq 0x28874(%rip), %rsi     # 0x41988
leaq 0x29ee9(%rip), %rcx     # 0x43004
movl $0x1da, %edx            # imm = 0x1DA
callq 0x30a0
leaq 0x23234(%rip), %rdi     # 0x3c360
leaq 0x28855(%rip), %rsi     # 0x41988
leaq 0x29eca(%rip), %rcx     # 0x43004
movl $0x1fb, %edx            # imm = 0x1FB
callq 0x30a0
leaq 0x23215(%rip), %rdi     # 0x3c360
leaq 0x28836(%rip), %rsi     # 0x41988
leaq 0x29eab(%rip), %rcx     # 0x43004
movl $0x200, %edx            # imm = 0x200
callq 0x30a0
leaq 0x231f6(%rip), %rdi     # 0x3c360
leaq 0x28817(%rip), %rsi     # 0x41988
leaq 0x29e8c(%rip), %rcx     # 0x43004
movl $0x20e, %edx            # imm = 0x20E
callq 0x30a0
leaq 0x231d7(%rip), %rdi     # 0x3c360
leaq 0x287f8(%rip), %rsi     # 0x41988
leaq 0x29e6d(%rip), %rcx     # 0x43004
movl $0x213, %edx            # imm = 0x213
callq 0x30a0
leaq 0x231b8(%rip), %rdi     # 0x3c360
leaq 0x287d9(%rip), %rsi     # 0x41988
leaq 0x29e4e(%rip), %rcx     # 0x43004
movl $0x1eb, %edx            # imm = 0x1EB
callq 0x30a0
leaq 0x23199(%rip), %rdi     # 0x3c360
leaq 0x287ba(%rip), %rsi     # 0x41988
leaq 0x29e2f(%rip), %rcx     # 0x43004
movl $0x1ed, %edx            # imm = 0x1ED
callq 0x30a0