// File: /workspace/github_c_makefile_star2_O0/Ihsoh[P]ilang/compiler/frontend/semantics.c
// Function: expr_lt
static void _expr_lt(
	ParserContext *ctx,
	ParserASTNode *node
) {
	assert(ctx);
	assert(node);

	#define	_CHECK	\
	{	\
		assert(node->nchilds == 2);	\
	}

	uint32_t node_type = node->type;

	switch (node_type) {
		case FE_NODE_EXPR_LT:
		case FE_NODE_EXPR_LE:
		case FE_NODE_EXPR_GT:
		case FE_NODE_EXPR_GE: {
			_CHECK
			ParserASTNode *node_oprd1 = node->childs[0];
			ParserASTNode *node_oprd2 = node->childs[1];
			_expr_shift(ctx, node_oprd1);
			_expr_shift(ctx, node_oprd2);

			FE_EXPR_AST_NODE_COPY_CONSTANT2(node, node_oprd1, node_oprd2);

			if (_is_primitive_type_node(ctx, node_oprd1) && _is_primitive_type_node(ctx, node_oprd2)) {
				if (ctx->arch == FE_ARCH_32) {
					FE_EXPR_AST_NODE_SET_TYPE(node, FE_TYPE_INT32);
					FE_EXPR_AST_NODE_SET_TYPE_NODE(node, _NODE_TYPE_INT32);

					if (FE_EXPR_AST_NODE_GET_CONSTANT(node)) {
						_calc_binary_constexpr(ctx, node_type, node, node_oprd1, node_oprd2);
					}
				} else if (ctx->arch == FE_ARCH_64) {
					FE_EXPR_AST_NODE_SET_TYPE(node, FE_TYPE_INT64);
					FE_EXPR_AST_NODE_SET_TYPE_NODE(node, _NODE_TYPE_INT64);

					if (FE_EXPR_AST_NODE_GET_CONSTANT(node)) {
						_calc_binary_constexpr(ctx, node_type, node, node_oprd1, node_oprd2);
					}
				} else {
					assert(0);
				}
			} else {
				_SYNERR_NODE(ctx, node, "binary operator '<' and '<=' and '>' and '>=' do not support this operand combination.");
			}

			break;
		}
		case FE_NODE_EXPR_INSTANCEOF: {
			assert(node->nchilds == 2);

			ParserASTNode *node_expr = node->childs[0];
			ParserASTNode *node_type = node->childs[1];

			_expr(ctx, node_expr);
			_type(ctx, node_type, NULL);

			ParserASTNode *node_expr_type = FE_EXPR_AST_NODE_GET_TYPE_NODE(node_expr);

			bool same = fe_sem_is_compatible_type(ctx, node_expr_type, node_type, true);

			FE_EXPR_AST_NODE_SET_CONSTANT(node, true);

			if (ctx->arch == FE_ARCH_32) {
				FE_EXPR_AST_NODE_SET_TYPE(node, FE_TYPE_INT32);
				FE_EXPR_AST_NODE_SET_TYPE_NODE(node, _NODE_TYPE_INT32);

				if (same) {
					FE_EXPR_AST_NODE_SET_CONSTEXPR_RESULT_INT32_VAL(node, 1);
				} else {
					FE_EXPR_AST_NODE_SET_CONSTEXPR_RESULT_INT32_VAL(node, 0);
				}
			} else if (ctx->arch == FE_ARCH_64) {
				FE_EXPR_AST_NODE_SET_TYPE(node, FE_TYPE_INT64);
				FE_EXPR_AST_NODE_SET_TYPE_NODE(node, _NODE_TYPE_INT64);

				if (same) {
					FE_EXPR_AST_NODE_SET_CONSTEXPR_RESULT_INT64_VAL(node, 1);
				} else {
					FE_EXPR_AST_NODE_SET_CONSTEXPR_RESULT_INT64_VAL(node, 0);
				}
			} else {
				assert(0);
			}

			break;
		}
		default: {
			_expr_shift(ctx, node);
			break;
		}
	}

	#undef	_CHECK
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x460, %rsp            # imm = 0x460
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0x554dc
jmp 0x554fb
leaq 0x27073(%rip), %rdi     # 0x7c556
leaq 0x28d60(%rip), %rsi     # 0x7e24a
movl $0x1098, %edx           # imm = 0x1098
leaq 0x2969b(%rip), %rcx     # 0x7eb91
callq 0x30a0
cmpq $0x0, -0x10(%rbp)
je 0x55504
jmp 0x55523
leaq 0x20ac8(%rip), %rdi     # 0x75fd3
leaq 0x28d38(%rip), %rsi     # 0x7e24a
movl $0x1099, %edx           # imm = 0x1099
leaq 0x29673(%rip), %rcx     # 0x7eb91
callq 0x30a0
movq -0x10(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x14(%rbp)
movl -0x14(%rbp), %eax
movl %eax, -0x450(%rbp)
addl $0xfffff180, %eax       # imm = 0xFFFFF180
subl $0x4, %eax
jb 0x55557
jmp 0x55541
movl -0x450(%rbp), %eax
subl $0xe84, %eax            # imm = 0xE84
je 0x556f6
jmp 0x55881
movq -0x10(%rbp), %rax
cmpl $0x2, 0x44(%rax)
jne 0x55563
jmp 0x55582
leaq 0x2910a(%rip), %rdi     # 0x7e674
leaq 0x28cd9(%rip), %rsi     # 0x7e24a
movl $0x10a7, %edx           # imm = 0x10A7
leaq 0x29614(%rip), %rcx     # 0x7eb91
callq 0x30a0
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x558a0
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x558a0
movq -0x20(%rbp), %rcx
xorl %eax, %eax
testb $0x1, 0x70(%rcx)
movb %al, -0x451(%rbp)
je 0x555da
movq -0x28(%rbp), %rax
movb 0x70(%rax), %al
movb %al, -0x451(%rbp)
movb -0x451(%rbp), %cl
movq -0x10(%rbp), %rax
andb $0x1, %cl
movb %cl, 0x70(%rax)
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x52820
testb $0x1, %al
jne 0x55600
jmp 0x556c3
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x52820
testb $0x1, %al
jne 0x55616
jmp 0x556c3
movq -0x8(%rbp), %rax
cmpl $0x1, 0x30(%rax)
jne 0x5565b
movq -0x10(%rbp), %rax
movb $0x4, 0x60(%rax)
movq -0x10(%rbp), %rax
leaq 0x3828d(%rip), %rcx     # 0x8d8c0
movq %rcx, 0x68(%rax)
movq -0x10(%rbp), %rax
testb $0x1, 0x70(%rax)
je 0x55659
movq -0x8(%rbp), %rdi
movl -0x14(%rbp), %esi
movq -0x10(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x52e70
jmp 0x556c1
movq -0x8(%rbp), %rax
cmpl $0x2, 0x30(%rax)
jne 0x556a0
movq -0x10(%rbp), %rax
movb $0x5, 0x60(%rax)
movq -0x10(%rbp), %rax
leaq 0x382a8(%rip), %rcx     # 0x8d920
movq %rcx, 0x68(%rax)
movq -0x10(%rbp), %rax
testb $0x1, 0x70(%rax)
je 0x5569e
movq -0x8(%rbp), %rdi
movl -0x14(%rbp), %esi
movq -0x10(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x52e70
jmp 0x556bf
leaq 0x1cdb4(%rip), %rdi     # 0x7245b
leaq 0x28b9c(%rip), %rsi     # 0x7e24a
movl $0x10bf, %edx           # imm = 0x10BF
leaq 0x294d7(%rip), %rcx     # 0x7eb91
callq 0x30a0
jmp 0x556c1
jmp 0x556f1
leaq -0x430(%rbp), %rdi
leaq 0x294f0(%rip), %rsi     # 0x7ebc1
movb $0x0, %al
callq 0x3160
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
leaq -0x430(%rbp), %rdx
callq *%rax
jmp 0x5588e
movq -0x10(%rbp), %rax
cmpl $0x2, 0x44(%rax)
jne 0x55702
jmp 0x55721
leaq 0x28f6b(%rip), %rdi     # 0x7e674
leaq 0x28b3a(%rip), %rsi     # 0x7e24a
movl $0x10c8, %edx           # imm = 0x10C8
leaq 0x29475(%rip), %rcx     # 0x7eb91
callq 0x30a0
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x438(%rbp)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x440(%rbp)
movq -0x8(%rbp), %rdi
movq -0x438(%rbp), %rsi
callq 0x4f4b0
movq -0x8(%rbp), %rdi
movq -0x440(%rbp), %rsi
xorl %eax, %eax
movl %eax, %edx
callq 0x4f0d0
movq -0x438(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x448(%rbp)
movq -0x8(%rbp), %rdi
movq -0x448(%rbp), %rsi
movq -0x440(%rbp), %rdx
movl $0x1, %ecx
callq 0x4d530
andb $0x1, %al
movb %al, -0x449(%rbp)
movq -0x10(%rbp), %rax
movb $0x1, 0x70(%rax)
movq -0x8(%rbp), %rax
cmpl $0x1, 0x30(%rax)
jne 0x55802
movq -0x10(%rbp), %rax
movb $0x4, 0x60(%rax)
movq -0x10(%rbp), %rax
leaq 0x380fb(%rip), %rcx     # 0x8d8c0
movq %rcx, 0x68(%rax)
testb $0x1, -0x449(%rbp)
je 0x557ea
movq -0x10(%rbp), %rax
movl $0x1, 0x88(%rax)
movq -0x10(%rbp), %rax
movb $0x4, 0x71(%rax)
jmp 0x55800
movq -0x10(%rbp), %rax
movl $0x0, 0x88(%rax)
movq -0x10(%rbp), %rax
movb $0x4, 0x71(%rax)
jmp 0x5587f
movq -0x8(%rbp), %rax
cmpl $0x2, 0x30(%rax)
jne 0x5585e
movq -0x10(%rbp), %rax
movb $0x5, 0x60(%rax)
movq -0x10(%rbp), %rax
leaq 0x38101(%rip), %rcx     # 0x8d920
movq %rcx, 0x68(%rax)
testb $0x1, -0x449(%rbp)
je 0x55845
movq -0x10(%rbp), %rax
movq $0x1, 0x88(%rax)
movq -0x10(%rbp), %rax
movb $0x5, 0x71(%rax)
jmp 0x5585c
movq -0x10(%rbp), %rax
movq $0x0, 0x88(%rax)
movq -0x10(%rbp), %rax
movb $0x5, 0x71(%rax)
jmp 0x5587d
leaq 0x1cbf6(%rip), %rdi     # 0x7245b
leaq 0x289de(%rip), %rsi     # 0x7e24a
movl $0x10e9, %edx           # imm = 0x10E9
leaq 0x29319(%rip), %rcx     # 0x7eb91
callq 0x30a0
jmp 0x5587f
jmp 0x5588e
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x558a0
addq $0x460, %rsp            # imm = 0x460
popq %rbp
retq
nopw (%rax,%rax)