// File: /workspace/github_c_makefile_star2_O1/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
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movzbl 0x1(%rdi), %eax
shll $0x8, %eax
cmpl $0xe00, %eax            # imm = 0xE00
jne 0x32f1f
cmpb $0x0, 0x70(%rdi)
je 0x32f3e
movq %rsi, %r14
movzbl 0x1(%rsi), %eax
shll $0x8, %eax
cmpl $0xe00, %eax            # imm = 0xE00
jne 0x32f5d
cmpb $0x0, 0x70(%r14)
je 0x32f7c
movb 0x71(%rdi), %r12b
movzbl %r12b, %r15d
movl %r15d, %edi
callq 0x2acb8
movl %eax, %ebx
movb 0x71(%r14), %r13b
movzbl %r13b, %r14d
movl %r14d, %edi
callq 0x2acb8
decb %r15b
cmpb $0x5, %r15b
setb %dl
decb %r14b
cmpb $0x5, %r14b
setb %sil
movb $0x5, %cl
testb %sil, %dl
jne 0x32ec7
leal -0x6(%r12), %edx
leal -0x6(%r13), %esi
movl %esi, %edi
orb %dl, %dil
movb $0x9, %cl
cmpb $0x4, %dil
jb 0x32ec7
cmpb $0x5, %r15b
setae %cl
cmpb $0x4, %sil
setae %sil
orb %cl, %sil
jne 0x32eab
cmpl %eax, %ebx
setbe %cl
jmp 0x32ec1
cmpb $0x4, %dl
setae %cl
cmpb $0x5, %r14b
setae %dl
orb %cl, %dl
jne 0x32ed8
cmpl %eax, %ebx
seta %cl
shlb $0x2, %cl
addb $0x5, %cl
movl %ecx, %eax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
cmpb $0xb, %r12b
sete %al
cmpb $0xb, %r13b
sete %cl
orb %al, %cl
movb $0xb, %cl
jne 0x32ec7
cmpb $0xa, %r12b
sete %al
cmpb $0xa, %r13b
sete %cl
orb %al, %cl
movb $0xa, %cl
jne 0x32ec7
leaq 0xd47d(%rip), %rdi      # 0x40384
leaq 0x1894c(%rip), %rsi     # 0x4b85a
leaq 0x19e30(%rip), %rcx     # 0x4cd45
movl $0xa88, %edx            # imm = 0xA88
callq 0x30a0
leaq 0x19cbe(%rip), %rdi     # 0x4cbe4
leaq 0x1892d(%rip), %rsi     # 0x4b85a
leaq 0x19e11(%rip), %rcx     # 0x4cd45
movl $0xa65, %edx            # imm = 0xA65
callq 0x30a0
leaq 0x19cbe(%rip), %rdi     # 0x4cc03
leaq 0x1890e(%rip), %rsi     # 0x4b85a
leaq 0x19df2(%rip), %rcx     # 0x4cd45
movl $0xa66, %edx            # imm = 0xA66
callq 0x30a0
leaq 0x19cce(%rip), %rdi     # 0x4cc32
leaq 0x188ef(%rip), %rsi     # 0x4b85a
leaq 0x19dd3(%rip), %rcx     # 0x4cd45
movl $0xa68, %edx            # imm = 0xA68
callq 0x30a0
leaq 0x19cce(%rip), %rdi     # 0x4cc51
leaq 0x188d0(%rip), %rsi     # 0x4b85a
leaq 0x19db4(%rip), %rcx     # 0x4cd45
movl $0xa69, %edx            # imm = 0xA69
callq 0x30a0