// File: /workspace/github_c_makefile_star2_O0/Ihsoh[P]ilang/compiler/backend/semantics.c
// Function: stat_func_call
static ParserASTNode * _stat_func_call(
	ParserContext *ctx,
	ParserASTNode *node
) {
	assert(ctx);
	assert(node);
	assert(node->type == BE_NODE_STAT_FUNC_CALL);
	assert(node->nchilds == 2);

	ParserASTNode *node_func = node->childs[0];
	ParserASTNode *node_func_pointer_type = NULL;
	if (node_func->type == BE_NODE_IDENTIFIER) {
		ParserSymbol *symbol_func = _get_symbol_by_id_node(ctx, node_func);
		if (symbol_func->type == BE_SYM_FUNC) {
			node_func_pointer_type = BE_FUNC_SYMBOL_GET_FUNC_POINTER_TYPE_NODE(symbol_func);
		} else if (symbol_func->type == BE_SYM_VAR) {
			node_func_pointer_type = BE_VAR_SYMBOL_GET_TYPE_NODE(symbol_func);
		} else {
			_SYNERR_NODE(ctx, node_func, "must be a function or variable.");
		}
	} else if (node_func->type == BE_NODE_EXPR) {
		_expr_wrapper(ctx, node_func);
		node_func_pointer_type = BE_EXPR_AST_NODE_GET_TYPE_NODE(node_func);
	} else {
		assert(0);
	}
	if (node_func_pointer_type->type != BE_NODE_TYPE_POINTER
			|| node_func_pointer_type->childs[0]->type != BE_NODE_TYPE_FUNC) {
		_SYNERR_NODE(ctx, node_func, "must be function pointer type.");
	}
	ParserASTNode *node_func_type = node_func_pointer_type->childs[0];
	ParserASTNode *node_func_params = node_func_type->childs[0];

	ParserASTNode *node_func_call_params = node->childs[1];
	_check_fncall_params(ctx, node, node_func_params, node_func_call_params);

	if (node_func_type->nchilds == 1) {
		return _NODE_TYPE_VOID;
	} else if (node_func_type->nchilds == 2) {
		return node_func_type->childs[1];
	} else {
		assert(0);
		return NULL;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x850, %rsp            # imm = 0x850
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
cmpq $0x0, -0x10(%rbp)
je 0x5f86c
jmp 0x5f88b
leaq 0x208ee(%rip), %rdi     # 0x80161
leaq 0x23006(%rip), %rsi     # 0x82880
movl $0x1348, %edx           # imm = 0x1348
leaq 0x25c33(%rip), %rcx     # 0x854b9
callq 0x30a0
cmpq $0x0, -0x18(%rbp)
je 0x5f894
jmp 0x5f8b3
leaq 0x16cc1(%rip), %rdi     # 0x7655c
leaq 0x22fde(%rip), %rsi     # 0x82880
movl $0x1349, %edx           # imm = 0x1349
leaq 0x25c0b(%rip), %rcx     # 0x854b9
callq 0x30a0
movq -0x18(%rbp), %rax
cmpl $0xbd2, (%rax)          # imm = 0xBD2
jne 0x5f8c1
jmp 0x5f8e0
leaq 0x18fc6(%rip), %rdi     # 0x7888e
leaq 0x22fb1(%rip), %rsi     # 0x82880
movl $0x134a, %edx           # imm = 0x134A
leaq 0x25bde(%rip), %rcx     # 0x854b9
callq 0x30a0
movq -0x18(%rbp), %rax
cmpl $0x2, 0x44(%rax)
jne 0x5f8ec
jmp 0x5f90b
leaq 0x23451(%rip), %rdi     # 0x82d44
leaq 0x22f86(%rip), %rsi     # 0x82880
movl $0x134b, %edx           # imm = 0x134B
leaq 0x25bb3(%rip), %rcx     # 0x854b9
callq 0x30a0
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x20(%rbp)
movq $0x0, -0x28(%rbp)
movq -0x20(%rbp), %rax
cmpl $0x200, (%rax)          # imm = 0x200
jne 0x5f99f
movq -0x10(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x5f300
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
cmpl $0x3, (%rax)
jne 0x5f956
movq -0x30(%rbp), %rax
movq 0x48(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x5f99d
movq -0x30(%rbp), %rax
cmpl $0x1, (%rax)
jne 0x5f96d
movq -0x30(%rbp), %rax
movq 0x38(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x5f99b
leaq -0x430(%rbp), %rdi
leaq 0x25b7f(%rip), %rsi     # 0x854fa
movb $0x0, %al
callq 0x3160
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x10(%rbp), %rdi
movq -0x20(%rbp), %rsi
leaq -0x430(%rbp), %rdx
callq *%rax
jmp 0x5f99d
jmp 0x5f9e7
movq -0x20(%rbp), %rax
cmpl $0xe00, (%rax)          # imm = 0xE00
jne 0x5f9c6
movq -0x10(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x4f5d0
movq -0x20(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x5f9e5
leaq 0x13a8d(%rip), %rdi     # 0x7345a
leaq 0x22eac(%rip), %rsi     # 0x82880
movl $0x135c, %edx           # imm = 0x135C
leaq 0x25ad9(%rip), %rcx     # 0x854b9
callq 0x30a0
jmp 0x5f9e7
movq -0x28(%rbp), %rax
cmpl $0x440, (%rax)          # imm = 0x440
jne 0x5fa06
movq -0x28(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
cmpl $0x430, (%rax)          # imm = 0x430
je 0x5fa34
leaq -0x830(%rbp), %rdi
leaq 0x25b06(%rip), %rsi     # 0x8551a
movb $0x0, %al
callq 0x3160
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x10(%rbp), %rdi
movq -0x20(%rbp), %rsi
leaq -0x830(%rbp), %rdx
callq *%rax
movq -0x28(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x838(%rbp)
movq -0x838(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x840(%rbp)
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x848(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x840(%rbp), %rdx
movq -0x848(%rbp), %rcx
callq 0x5fb00
movq -0x838(%rbp), %rax
cmpl $0x1, 0x44(%rax)
jne 0x5faa3
leaq 0x3535b(%rip), %rax     # 0x94df8
movq %rax, -0x8(%rbp)
jmp 0x5fae4
movq -0x838(%rbp), %rax
cmpl $0x2, 0x44(%rax)
jne 0x5fac5
movq -0x838(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x8(%rbp)
jmp 0x5fae4
leaq 0x1398e(%rip), %rdi     # 0x7345a
leaq 0x22dad(%rip), %rsi     # 0x82880
movl $0x136d, %edx           # imm = 0x136D
leaq 0x259da(%rip), %rcx     # 0x854b9
callq 0x30a0
movq -0x8(%rbp), %rax
addq $0x850, %rsp            # imm = 0x850
popq %rbp
retq
nopw %cs:(%rax,%rax)