// File: /workspace/github_c_makefile_star2_O0/Ihsoh[P]ilang/compiler/frontend/semantics.c
// Function: get_binary_constexpr_type
static uint8_t _get_binary_constexpr_type(
	ParserContext *ctx,
	ParserASTNode *source1,
	ParserASTNode *source2
) {
	assert(ctx);
	assert(source1);
	assert(FE_IS_EXPR_NODE(source1->type));
	assert(FE_EXPR_AST_NODE_GET_CONSTANT(source1));
	assert(source2);
	assert(FE_IS_EXPR_NODE(source2->type));
	assert(FE_EXPR_AST_NODE_GET_CONSTANT(source2));

	uint8_t source1_type = FE_EXPR_AST_NODE_GET_CONSTANT_TYPE(source1);
	int32_t source1_type_weight = _get_primitive_type_weight(source1_type);

	uint8_t source2_type = FE_EXPR_AST_NODE_GET_CONSTANT_TYPE(source2);
	int32_t source2_type_weight = _get_primitive_type_weight(source2_type);

	if (_is_signed_type(source1_type) && _is_signed_type(source2_type)) {
		return FE_TYPE_INT64;
	} else if (_is_unsigned_type(source1_type) && _is_unsigned_type(source2_type)) {
		return FE_TYPE_UINT64;
	} else if (_is_signed_type(source1_type) && _is_unsigned_type(source2_type)) {
		if (source1_type_weight > source2_type_weight) {
			return FE_TYPE_INT64;
		} else {
			return FE_TYPE_UINT64;
		}
	} else if (_is_unsigned_type(source1_type) && _is_signed_type(source2_type)) {
		if (source1_type_weight > source2_type_weight) {
			return FE_TYPE_UINT64;
		} else {
			return FE_TYPE_INT64;
		}
	} else if (source1_type == FE_TYPE_DOUBLE
			|| source2_type == FE_TYPE_DOUBLE) {
		return FE_TYPE_DOUBLE;
	} else if (source1_type == FE_TYPE_FLOAT
			|| source2_type == FE_TYPE_FLOAT) {
		return FE_TYPE_FLOAT;
	} else {
		assert(0);
		return FE_TYPE_UNKNOWN;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
cmpq $0x0, -0x10(%rbp)
je 0x5b5bd
jmp 0x5b5dc
leaq 0x20f92(%rip), %rdi     # 0x7c556
leaq 0x22c7f(%rip), %rsi     # 0x7e24a
movl $0xa63, %edx            # imm = 0xA63
leaq 0x2418c(%rip), %rcx     # 0x7f763
callq 0x30a0
cmpq $0x0, -0x18(%rbp)
je 0x5b5e5
jmp 0x5b604
leaq 0x2400e(%rip), %rdi     # 0x7f5fa
leaq 0x22c57(%rip), %rsi     # 0x7e24a
movl $0xa64, %edx            # imm = 0xA64
leaq 0x24164(%rip), %rcx     # 0x7f763
callq 0x30a0
movq -0x18(%rbp), %rax
movl (%rax), %eax
andl $0xff00, %eax           # imm = 0xFF00
cmpl $0xe00, %eax            # imm = 0xE00
jne 0x5b618
jmp 0x5b637
leaq 0x23fe3(%rip), %rdi     # 0x7f602
leaq 0x22c24(%rip), %rsi     # 0x7e24a
movl $0xa65, %edx            # imm = 0xA65
leaq 0x24131(%rip), %rcx     # 0x7f763
callq 0x30a0
movq -0x18(%rbp), %rax
testb $0x1, 0x70(%rax)
je 0x5b643
jmp 0x5b662
leaq 0x23fd7(%rip), %rdi     # 0x7f621
leaq 0x22bf9(%rip), %rsi     # 0x7e24a
movl $0xa66, %edx            # imm = 0xA66
leaq 0x24106(%rip), %rcx     # 0x7f763
callq 0x30a0
cmpq $0x0, -0x20(%rbp)
je 0x5b66b
jmp 0x5b68a
leaq 0x23fd6(%rip), %rdi     # 0x7f648
leaq 0x22bd1(%rip), %rsi     # 0x7e24a
movl $0xa67, %edx            # imm = 0xA67
leaq 0x240de(%rip), %rcx     # 0x7f763
callq 0x30a0
movq -0x20(%rbp), %rax
movl (%rax), %eax
andl $0xff00, %eax           # imm = 0xFF00
cmpl $0xe00, %eax            # imm = 0xE00
jne 0x5b69e
jmp 0x5b6bd
leaq 0x23fab(%rip), %rdi     # 0x7f650
leaq 0x22b9e(%rip), %rsi     # 0x7e24a
movl $0xa68, %edx            # imm = 0xA68
leaq 0x240ab(%rip), %rcx     # 0x7f763
callq 0x30a0
movq -0x20(%rbp), %rax
testb $0x1, 0x70(%rax)
je 0x5b6c9
jmp 0x5b6e8
leaq 0x23f9f(%rip), %rdi     # 0x7f66f
leaq 0x22b73(%rip), %rsi     # 0x7e24a
movl $0xa69, %edx            # imm = 0xA69
leaq 0x24080(%rip), %rcx     # 0x7f763
callq 0x30a0
movq -0x18(%rbp), %rax
movb 0x71(%rax), %al
movb %al, -0x21(%rbp)
movzbl -0x21(%rbp), %edi
callq 0x4d150
movl %eax, -0x28(%rbp)
movq -0x20(%rbp), %rax
movb 0x71(%rax), %al
movb %al, -0x29(%rbp)
movzbl -0x29(%rbp), %edi
callq 0x4d150
movl %eax, -0x30(%rbp)
movzbl -0x21(%rbp), %edi
callq 0x4d330
testb $0x1, %al
jne 0x5b723
jmp 0x5b73b
movzbl -0x29(%rbp), %edi
callq 0x4d330
testb $0x1, %al
jne 0x5b732
jmp 0x5b73b
movb $0x5, -0x1(%rbp)
jmp 0x5b81b
movzbl -0x21(%rbp), %edi
callq 0x4d380
testb $0x1, %al
jne 0x5b74a
jmp 0x5b762
movzbl -0x29(%rbp), %edi
callq 0x4d380
testb $0x1, %al
jne 0x5b759
jmp 0x5b762
movb $0x9, -0x1(%rbp)
jmp 0x5b81b
movzbl -0x21(%rbp), %edi
callq 0x4d330
testb $0x1, %al
jne 0x5b771
jmp 0x5b79a
movzbl -0x29(%rbp), %edi
callq 0x4d380
testb $0x1, %al
jne 0x5b780
jmp 0x5b79a
movl -0x28(%rbp), %eax
cmpl -0x30(%rbp), %eax
jle 0x5b791
movb $0x5, -0x1(%rbp)
jmp 0x5b81b
movb $0x9, -0x1(%rbp)
jmp 0x5b81b
movzbl -0x21(%rbp), %edi
callq 0x4d380
testb $0x1, %al
jne 0x5b7a9
jmp 0x5b7cc
movzbl -0x29(%rbp), %edi
callq 0x4d330
testb $0x1, %al
jne 0x5b7b8
jmp 0x5b7cc
movl -0x28(%rbp), %eax
cmpl -0x30(%rbp), %eax
jle 0x5b7c6
movb $0x9, -0x1(%rbp)
jmp 0x5b81b
movb $0x5, -0x1(%rbp)
jmp 0x5b81b
movzbl -0x21(%rbp), %eax
cmpl $0xb, %eax
je 0x5b7de
movzbl -0x29(%rbp), %eax
cmpl $0xb, %eax
jne 0x5b7e4
movb $0xb, -0x1(%rbp)
jmp 0x5b81b
movzbl -0x21(%rbp), %eax
cmpl $0xa, %eax
je 0x5b7f6
movzbl -0x29(%rbp), %eax
cmpl $0xa, %eax
jne 0x5b7fc
movb $0xa, -0x1(%rbp)
jmp 0x5b81b
leaq 0x16c58(%rip), %rdi     # 0x7245b
leaq 0x22a40(%rip), %rsi     # 0x7e24a
movl $0xa88, %edx            # imm = 0xA88
leaq 0x23f4d(%rip), %rcx     # 0x7f763
callq 0x30a0
movb -0x1(%rbp), %al
addq $0x30, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)