// File: /workspace/github_c_makefile_star2_O0/Ihsoh[P]ilang/compiler/frontend/semantics.c
// Function: expr_add
static void _expr_add(
	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_ADD: {
			_CHECK
			ParserASTNode *node_oprd1 = node->childs[0];
			ParserASTNode *node_oprd2 = node->childs[1];
			_expr_unary(ctx, node_oprd1);
			_expr_unary(ctx, node_oprd2);

			_check_expr_add_operands(
				ctx, node, node_oprd1, node_oprd2, "+", true
			);

			FE_EXPR_AST_NODE_COPY_CONSTANT2(node, node_oprd1, node_oprd2);
			if (FE_EXPR_AST_NODE_GET_CONSTANT(node)) {
				_calc_binary_constexpr(ctx, node_type, node, node_oprd1, node_oprd2);
			}
			break;
		}
		case FE_NODE_EXPR_SUB: {
			_CHECK
			ParserASTNode *node_oprd1 = node->childs[0];
			ParserASTNode *node_oprd2 = node->childs[1];
			_expr_unary(ctx, node_oprd1);
			_expr_unary(ctx, node_oprd2);

			_check_expr_sub_operands(
				ctx, node, node_oprd1, node_oprd2, "-", true
			);

			FE_EXPR_AST_NODE_COPY_CONSTANT2(node, node_oprd1, node_oprd2);
			if (FE_EXPR_AST_NODE_GET_CONSTANT(node)) {
				_calc_binary_constexpr(ctx, node_type, node, node_oprd1, node_oprd2);
			}
			break;
		}
		default: {
			_expr_mul(ctx, node);
			break;
		}
	}

	#undef	_CHECK
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0x55a79
jmp 0x55a98
leaq 0x26ad6(%rip), %rdi     # 0x7c556
leaq 0x287c3(%rip), %rsi     # 0x7e24a
movl $0x100f, %edx           # imm = 0x100F
leaq 0x291b8(%rip), %rcx     # 0x7ec4b
callq 0x30a0
cmpq $0x0, -0x10(%rbp)
je 0x55aa1
jmp 0x55ac0
leaq 0x2052b(%rip), %rdi     # 0x75fd3
leaq 0x2879b(%rip), %rsi     # 0x7e24a
movl $0x1010, %edx           # imm = 0x1010
leaq 0x29190(%rip), %rcx     # 0x7ec4b
callq 0x30a0
movq -0x10(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x14(%rbp)
movl -0x14(%rbp), %eax
movl %eax, -0x3c(%rbp)
subl $0xea0, %eax            # imm = 0xEA0
je 0x55aeb
jmp 0x55ad8
movl -0x3c(%rbp), %eax
subl $0xea1, %eax            # imm = 0xEA1
je 0x55bbe
jmp 0x55c8e
movq -0x10(%rbp), %rax
cmpl $0x2, 0x44(%rax)
jne 0x55af7
jmp 0x55b16
leaq 0x28b76(%rip), %rdi     # 0x7e674
leaq 0x28745(%rip), %rsi     # 0x7e24a
movl $0x101b, %edx           # imm = 0x101B
leaq 0x2913a(%rip), %rcx     # 0x7ec4b
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 0x56220
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x56220
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x28(%rbp), %rcx
leaq 0x218ab(%rip), %r8      # 0x77411
movl $0x1, %r9d
callq 0x51630
movq -0x20(%rbp), %rcx
xorl %eax, %eax
testb $0x1, 0x70(%rcx)
movb %al, -0x3d(%rbp)
je 0x55b8a
movq -0x28(%rbp), %rax
movb 0x70(%rax), %al
movb %al, -0x3d(%rbp)
movb -0x3d(%rbp), %cl
movq -0x10(%rbp), %rax
andb $0x1, %cl
movb %cl, 0x70(%rax)
movq -0x10(%rbp), %rax
testb $0x1, 0x70(%rax)
je 0x55bb9
movq -0x8(%rbp), %rdi
movl -0x14(%rbp), %esi
movq -0x10(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x52e70
jmp 0x55c9b
movq -0x10(%rbp), %rax
cmpl $0x2, 0x44(%rax)
jne 0x55bca
jmp 0x55be9
leaq 0x28aa3(%rip), %rdi     # 0x7e674
leaq 0x28672(%rip), %rsi     # 0x7e24a
movl $0x102c, %edx           # imm = 0x102C
leaq 0x29067(%rip), %rcx     # 0x7ec4b
callq 0x30a0
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x56220
movq -0x8(%rbp), %rdi
movq -0x38(%rbp), %rsi
callq 0x56220
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x30(%rbp), %rdx
movq -0x38(%rbp), %rcx
leaq 0x217db(%rip), %r8      # 0x77414
movl $0x1, %r9d
callq 0x51840
movq -0x30(%rbp), %rcx
xorl %eax, %eax
testb $0x1, 0x70(%rcx)
movb %al, -0x3e(%rbp)
je 0x55c5d
movq -0x38(%rbp), %rax
movb 0x70(%rax), %al
movb %al, -0x3e(%rbp)
movb -0x3e(%rbp), %cl
movq -0x10(%rbp), %rax
andb $0x1, %cl
movb %cl, 0x70(%rax)
movq -0x10(%rbp), %rax
testb $0x1, 0x70(%rax)
je 0x55c8c
movq -0x8(%rbp), %rdi
movl -0x14(%rbp), %esi
movq -0x10(%rbp), %rdx
movq -0x30(%rbp), %rcx
movq -0x38(%rbp), %r8
callq 0x52e70
jmp 0x55c9b
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x57050
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)