// File: /workspace/github_c_makefile_star2_O0/Ihsoh[P]ilang/compiler/frontend/irgen.c
// Function: ir_stat_if
static void _ir_stat_if(
	IRGeneratorContext *ctx,
	ParserASTNode *node_if
) {
	assert(ctx);
	assert(node_if);
	assert(node_if->type == FE_NODE_STAT_IF);

	_TMP_LABEL_DEF(ctx, if_end)

	_TMP_LABEL_DEF(ctx, if_true)
	_TMP_LABEL_DEF(ctx, if_false)

	ParserASTNode *node_if_expr = node_if->childs[0];
	ParserASTNode *node_if_body = node_if->childs[1];

	_ExprResult result_if_expr;
	_expr_result_init(&result_if_expr);

	_ir_expr_wrapper_val(ctx, ctx->body, &result_if_expr, node_if_expr);

	ResizableString rstr_label_if_cond_expr;
	rstr_init(&rstr_label_if_cond_expr);
	_ir_cond_expr(ctx, &rstr_label_if_cond_expr, &result_if_expr, node_if_expr);
	rstr_appendf(
		ctx->body,
		"cbr %s, %s, %s;\n",
		RSTR_CSTR(&rstr_label_if_cond_expr),
		_TMP_LABEL_CSTR(if_true),
		_TMP_LABEL_CSTR(if_false)
	);

	rstr_appendf(
		ctx->body,
		"%s:\n",
		_TMP_LABEL_CSTR(if_true)
	);
	_ir_stats_block(ctx, node_if_body);
	rstr_appendf(
		ctx->body,
		"br %s;\n",
		_TMP_LABEL_CSTR(if_end)
	);
	rstr_appendf(
		ctx->body,
		"%s:\n",
		_TMP_LABEL_CSTR(if_false)
	);

	for (int i = 2; i < node_if->nchilds; i++) {
		ParserASTNode *node = node_if->childs[i];
		if (node->type == FE_NODE_STAT_ELIF) {
			ParserASTNode *node_elif_expr = node->childs[0];
			ParserASTNode *node_elif_body = node->childs[1];

			_TMP_LABEL_DEF(ctx, elif_true)
			_TMP_LABEL_DEF(ctx, elif_false)

			_ExprResult result_elif_expr;
			_expr_result_init(&result_elif_expr);

			_ir_expr_wrapper_val(ctx, ctx->body, &result_elif_expr, node_elif_expr);

			ResizableString rstr_label_elif_cond_expr;
			rstr_init(&rstr_label_elif_cond_expr);
			_ir_cond_expr(ctx, &rstr_label_elif_cond_expr, &result_elif_expr, node_elif_expr);
			rstr_appendf(
				ctx->body,
				"cbr %s, %s, %s;\n",
				RSTR_CSTR(&rstr_label_elif_cond_expr),
				_TMP_LABEL_CSTR(elif_true),
				_TMP_LABEL_CSTR(elif_false)
			);

			rstr_appendf(
				ctx->body,
				"%s:\n",
				_TMP_LABEL_CSTR(elif_true)
			);
			_ir_stats_block(ctx, node_elif_body);
			rstr_appendf(
				ctx->body,
				"br %s;\n",
				_TMP_LABEL_CSTR(if_end)
			);
			rstr_appendf(
				ctx->body,
				"%s:\n",
				_TMP_LABEL_CSTR(elif_false)
			);

			_TMP_LABEL_FREE(elif_true)
			_TMP_LABEL_FREE(elif_false)
		} else if (node->type == FE_NODE_STAT_ELSE) {
			ParserASTNode *node_else_body = node->childs[0];
			_ir_stats_block(ctx, node_else_body);
		} else {
			assert(0);
		}
	}

	rstr_appendf(
		ctx->body,
		"%s:\n",
		_TMP_LABEL_CSTR(if_end)
	);

	_TMP_LABEL_FREE(if_end)

	_TMP_LABEL_FREE(if_true)
	_TMP_LABEL_FREE(if_false)
	
	_expr_result_free(&result_if_expr);

	rstr_free(&rstr_label_if_cond_expr);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x210, %rsp            # imm = 0x210
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0x1dd9c
jmp 0x1ddbb
leaq 0x5e7b3(%rip), %rdi     # 0x7c556
leaq 0x565ea(%rip), %rsi     # 0x74394
movl $0xf79, %edx            # imm = 0xF79
leaq 0x5855d(%rip), %rcx     # 0x76313
callq 0x30a0
cmpq $0x0, -0x10(%rbp)
je 0x1ddc4
jmp 0x1dde3
leaq 0x58580(%rip), %rdi     # 0x7634b
leaq 0x565c2(%rip), %rsi     # 0x74394
movl $0xf7a, %edx            # imm = 0xF7A
leaq 0x58535(%rip), %rcx     # 0x76313
callq 0x30a0
movq -0x10(%rbp), %rax
cmpl $0xb10, (%rax)          # imm = 0xB10
jne 0x1ddf1
jmp 0x1de10
leaq 0x5855b(%rip), %rdi     # 0x76353
leaq 0x56595(%rip), %rsi     # 0x74394
movl $0xf7b, %edx            # imm = 0xF7B
leaq 0x58508(%rip), %rcx     # 0x76313
callq 0x30a0
leaq -0x20(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rsi
leaq -0x20(%rbp), %rdx
callq 0x1aa30
leaq -0x30(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rsi
leaq -0x30(%rbp), %rdx
callq 0x1aa30
leaq -0x40(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rsi
leaq -0x40(%rbp), %rdx
callq 0x1aa30
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x50(%rbp)
leaq -0x90(%rbp), %rdi
callq 0x113b0
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rsi
movq -0x48(%rbp), %rcx
leaq -0x90(%rbp), %rdx
callq 0x11420
leaq -0xa0(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x48(%rbp), %rcx
leaq -0xa0(%rbp), %rsi
leaq -0x90(%rbp), %rdx
callq 0x20480
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x140(%rbp)
cmpq $0x0, -0x98(%rbp)
jne 0x1df01
leaq 0x599bd(%rip), %rax     # 0x778b5
movq %rax, -0x148(%rbp)
jmp 0x1df0f
movq -0x98(%rbp), %rax
movq %rax, -0x148(%rbp)
movq -0x148(%rbp), %rax
movq %rax, -0x150(%rbp)
cmpq $0x0, -0x28(%rbp)
jne 0x1df34
leaq 0x5998a(%rip), %rax     # 0x778b5
movq %rax, -0x158(%rbp)
jmp 0x1df3f
movq -0x28(%rbp), %rax
movq %rax, -0x158(%rbp)
movq -0x158(%rbp), %rax
movq %rax, -0x160(%rbp)
cmpq $0x0, -0x38(%rbp)
jne 0x1df64
leaq 0x5995a(%rip), %rax     # 0x778b5
movq %rax, -0x168(%rbp)
jmp 0x1df6f
movq -0x38(%rbp), %rax
movq %rax, -0x168(%rbp)
movq -0x160(%rbp), %rcx
movq -0x150(%rbp), %rdx
movq -0x140(%rbp), %rdi
movq -0x168(%rbp), %r8
leaq 0x57daa(%rip), %rsi     # 0x75d3c
movb $0x0, %al
callq 0x94d0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x170(%rbp)
cmpq $0x0, -0x28(%rbp)
jne 0x1dfbf
leaq 0x598ff(%rip), %rax     # 0x778b5
movq %rax, -0x178(%rbp)
jmp 0x1dfca
movq -0x28(%rbp), %rax
movq %rax, -0x178(%rbp)
movq -0x170(%rbp), %rdi
movq -0x178(%rbp), %rdx
leaq 0x5b67d(%rip), %rsi     # 0x7965c
movb $0x0, %al
callq 0x94d0
movq -0x8(%rbp), %rdi
movq -0x50(%rbp), %rsi
callq 0x1d950
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x180(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0x1e019
leaq 0x598a5(%rip), %rax     # 0x778b5
movq %rax, -0x188(%rbp)
jmp 0x1e024
movq -0x18(%rbp), %rax
movq %rax, -0x188(%rbp)
movq -0x180(%rbp), %rdi
movq -0x188(%rbp), %rdx
leaq 0x57d14(%rip), %rsi     # 0x75d4d
movb $0x0, %al
callq 0x94d0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x190(%rbp)
cmpq $0x0, -0x38(%rbp)
jne 0x1e066
leaq 0x59858(%rip), %rax     # 0x778b5
movq %rax, -0x198(%rbp)
jmp 0x1e071
movq -0x38(%rbp), %rax
movq %rax, -0x198(%rbp)
movq -0x190(%rbp), %rdi
movq -0x198(%rbp), %rdx
leaq 0x5b5d6(%rip), %rsi     # 0x7965c
movb $0x0, %al
callq 0x94d0
movl $0x2, -0xa4(%rbp)
movl -0xa4(%rbp), %eax
movq -0x10(%rbp), %rcx
cmpl 0x44(%rcx), %eax
jge 0x1e3f6
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movslq -0xa4(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0xb0(%rbp)
movq -0xb0(%rbp), %rax
cmpl $0xb11, (%rax)          # imm = 0xB11
jne 0x1e389
movq -0xb0(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0xb8(%rbp)
movq -0xb0(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0xc0(%rbp)
leaq -0xd0(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rsi
leaq -0xd0(%rbp), %rdx
callq 0x1aa30
leaq -0xe0(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rsi
leaq -0xe0(%rbp), %rdx
callq 0x1aa30
leaq -0x120(%rbp), %rdi
callq 0x113b0
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rsi
movq -0xb8(%rbp), %rcx
leaq -0x120(%rbp), %rdx
callq 0x11420
leaq -0x130(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0xb8(%rbp), %rcx
leaq -0x130(%rbp), %rsi
leaq -0x120(%rbp), %rdx
callq 0x20480
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x1a0(%rbp)
cmpq $0x0, -0x128(%rbp)
jne 0x1e1c8
leaq 0x596f6(%rip), %rax     # 0x778b5
movq %rax, -0x1a8(%rbp)
jmp 0x1e1d6
movq -0x128(%rbp), %rax
movq %rax, -0x1a8(%rbp)
movq -0x1a8(%rbp), %rax
movq %rax, -0x1b0(%rbp)
cmpq $0x0, -0xc8(%rbp)
jne 0x1e1fe
leaq 0x596c0(%rip), %rax     # 0x778b5
movq %rax, -0x1b8(%rbp)
jmp 0x1e20c
movq -0xc8(%rbp), %rax
movq %rax, -0x1b8(%rbp)
movq -0x1b8(%rbp), %rax
movq %rax, -0x1c0(%rbp)
cmpq $0x0, -0xd8(%rbp)
jne 0x1e234
leaq 0x5968a(%rip), %rax     # 0x778b5
movq %rax, -0x1c8(%rbp)
jmp 0x1e242
movq -0xd8(%rbp), %rax
movq %rax, -0x1c8(%rbp)
movq -0x1c0(%rbp), %rcx
movq -0x1b0(%rbp), %rdx
movq -0x1a0(%rbp), %rdi
movq -0x1c8(%rbp), %r8
leaq 0x57ad7(%rip), %rsi     # 0x75d3c
movb $0x0, %al
callq 0x94d0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x1d0(%rbp)
cmpq $0x0, -0xc8(%rbp)
jne 0x1e295
leaq 0x59629(%rip), %rax     # 0x778b5
movq %rax, -0x1d8(%rbp)
jmp 0x1e2a3
movq -0xc8(%rbp), %rax
movq %rax, -0x1d8(%rbp)
movq -0x1d0(%rbp), %rdi
movq -0x1d8(%rbp), %rdx
leaq 0x5b3a4(%rip), %rsi     # 0x7965c
movb $0x0, %al
callq 0x94d0
movq -0x8(%rbp), %rdi
movq -0xc0(%rbp), %rsi
callq 0x1d950
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x1e0(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0x1e2f5
leaq 0x595c9(%rip), %rax     # 0x778b5
movq %rax, -0x1e8(%rbp)
jmp 0x1e300
movq -0x18(%rbp), %rax
movq %rax, -0x1e8(%rbp)
movq -0x1e0(%rbp), %rdi
movq -0x1e8(%rbp), %rdx
leaq 0x57a38(%rip), %rsi     # 0x75d4d
movb $0x0, %al
callq 0x94d0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x1f0(%rbp)
cmpq $0x0, -0xd8(%rbp)
jne 0x1e345
leaq 0x59579(%rip), %rax     # 0x778b5
movq %rax, -0x1f8(%rbp)
jmp 0x1e353
movq -0xd8(%rbp), %rax
movq %rax, -0x1f8(%rbp)
movq -0x1f0(%rbp), %rdi
movq -0x1f8(%rbp), %rdx
leaq 0x5b2f4(%rip), %rsi     # 0x7965c
movb $0x0, %al
callq 0x94d0
leaq -0xd0(%rbp), %rdi
callq 0x9310
leaq -0xe0(%rbp), %rdi
callq 0x9310
jmp 0x1e3e0
movq -0xb0(%rbp), %rax
cmpl $0xb12, (%rax)          # imm = 0xB12
jne 0x1e3bf
movq -0xb0(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x138(%rbp)
movq -0x8(%rbp), %rdi
movq -0x138(%rbp), %rsi
callq 0x1d950
jmp 0x1e3de
leaq 0x54095(%rip), %rdi     # 0x7245b
leaq 0x55fc7(%rip), %rsi     # 0x74394
movl $0xfd6, %edx            # imm = 0xFD6
leaq 0x57f3a(%rip), %rcx     # 0x76313
callq 0x30a0
jmp 0x1e3e0
jmp 0x1e3e2
movl -0xa4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xa4(%rbp)
jmp 0x1e097
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x200(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0x1e41c
leaq 0x594a2(%rip), %rax     # 0x778b5
movq %rax, -0x208(%rbp)
jmp 0x1e427
movq -0x18(%rbp), %rax
movq %rax, -0x208(%rbp)
movq -0x200(%rbp), %rdi
movq -0x208(%rbp), %rdx
leaq 0x5b220(%rip), %rsi     # 0x7965c
movb $0x0, %al
callq 0x94d0
leaq -0x20(%rbp), %rdi
callq 0x9310
leaq -0x30(%rbp), %rdi
callq 0x9310
leaq -0x40(%rbp), %rdi
callq 0x9310
leaq -0x90(%rbp), %rdi
callq 0x130a0
leaq -0xa0(%rbp), %rdi
callq 0x9310
addq $0x210, %rsp            # imm = 0x210
popq %rbp
retq
nop