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

	_TMP_LABEL_DEF(ctx, do_repeat)

	_TMP_LABEL_DEF(ctx, do_true)
	_TMP_LABEL_DEF(ctx, do_false)

	rstr_append_with_rstr(
		FE_LOOP_AST_NODE_GET_LABEL_REPEAT(node_stat_do),
		&_TMP_LABEL(do_repeat)
	);
	rstr_append_with_rstr(
		FE_LOOP_AST_NODE_GET_LABEL_END(node_stat_do),
		&_TMP_LABEL(do_false)
	);

	ParserASTNode *node_do_body = node_stat_do->childs[0];
	ParserASTNode *node_do_expr = node_stat_do->childs[1];

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

	_ir_stats_block(ctx, node_do_body);

	rstr_appendf(
		ctx->body,
		"%s:\n",
		_TMP_LABEL_CSTR(do_repeat)
	);
	
	_ExprResult result_do_expr;
	_expr_result_init(&result_do_expr);

	_ir_expr_wrapper_val(ctx, ctx->body, &result_do_expr, node_do_expr);

	ResizableString rstr_label_do_cond_expr;
	rstr_init(&rstr_label_do_cond_expr);
	_ir_cond_expr(ctx, &rstr_label_do_cond_expr, &result_do_expr, node_do_expr);

	rstr_appendf(
		ctx->body,
		"cbr %s, %s, %s;\n",
		RSTR_CSTR(&rstr_label_do_cond_expr),
		_TMP_LABEL_CSTR(do_true),
		_TMP_LABEL_CSTR(do_false)
	);

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

	_TMP_LABEL_FREE(do_repeat)

	_TMP_LABEL_FREE(do_true)
	_TMP_LABEL_FREE(do_false)

	_expr_result_free(&result_do_expr);

	rstr_free(&rstr_label_do_cond_expr);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x100, %rsp            # imm = 0x100
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0x1e85c
jmp 0x1e87b
leaq 0x5dcf3(%rip), %rdi     # 0x7c556
leaq 0x55b2a(%rip), %rsi     # 0x74394
movl $0x103c, %edx           # imm = 0x103C
leaq 0x57b75(%rip), %rcx     # 0x763eb
callq 0x30a0
cmpq $0x0, -0x10(%rbp)
je 0x1e884
jmp 0x1e8a3
leaq 0x57b98(%rip), %rdi     # 0x76423
leaq 0x55b02(%rip), %rsi     # 0x74394
movl $0x103d, %edx           # imm = 0x103D
leaq 0x57b4d(%rip), %rcx     # 0x763eb
callq 0x30a0
movq -0x10(%rbp), %rax
cmpl $0xb30, (%rax)          # imm = 0xB30
jne 0x1e8b1
jmp 0x1e8d0
leaq 0x57b78(%rip), %rdi     # 0x76430
leaq 0x55ad5(%rip), %rsi     # 0x74394
movl $0x103e, %edx           # imm = 0x103E
leaq 0x57b20(%rip), %rcx     # 0x763eb
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), %rdi
addq $0x60, %rdi
leaq -0x20(%rbp), %rsi
callq 0x9100
movq -0x10(%rbp), %rdi
addq $0x60, %rdi
addq $0x10, %rdi
leaq -0x40(%rbp), %rsi
callq 0x9100
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)
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0xa8(%rbp)
cmpq $0x0, -0x28(%rbp)
jne 0x1e995
leaq 0x58f29(%rip), %rax     # 0x778b5
movq %rax, -0xb0(%rbp)
jmp 0x1e9a0
movq -0x28(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0xa8(%rbp), %rdi
movq -0xb0(%rbp), %rdx
leaq 0x5aca7(%rip), %rsi     # 0x7965c
movb $0x0, %al
callq 0x94d0
movq -0x8(%rbp), %rdi
movq -0x48(%rbp), %rsi
callq 0x1d950
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0xb8(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0x1e9ef
leaq 0x58ecf(%rip), %rax     # 0x778b5
movq %rax, -0xc0(%rbp)
jmp 0x1e9fa
movq -0x18(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0xb8(%rbp), %rdi
movq -0xc0(%rbp), %rdx
leaq 0x5ac4d(%rip), %rsi     # 0x7965c
movb $0x0, %al
callq 0x94d0
leaq -0x90(%rbp), %rdi
callq 0x113b0
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rsi
movq -0x50(%rbp), %rcx
leaq -0x90(%rbp), %rdx
callq 0x11420
leaq -0xa0(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x50(%rbp), %rcx
leaq -0xa0(%rbp), %rsi
leaq -0x90(%rbp), %rdx
callq 0x20480
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0xc8(%rbp)
cmpq $0x0, -0x98(%rbp)
jne 0x1ea8e
leaq 0x58e30(%rip), %rax     # 0x778b5
movq %rax, -0xd0(%rbp)
jmp 0x1ea9c
movq -0x98(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0xd0(%rbp), %rax
movq %rax, -0xd8(%rbp)
cmpq $0x0, -0x28(%rbp)
jne 0x1eac1
leaq 0x58dfd(%rip), %rax     # 0x778b5
movq %rax, -0xe0(%rbp)
jmp 0x1eacc
movq -0x28(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq -0xe0(%rbp), %rax
movq %rax, -0xe8(%rbp)
cmpq $0x0, -0x38(%rbp)
jne 0x1eaf1
leaq 0x58dcd(%rip), %rax     # 0x778b5
movq %rax, -0xf0(%rbp)
jmp 0x1eafc
movq -0x38(%rbp), %rax
movq %rax, -0xf0(%rbp)
movq -0xe8(%rbp), %rcx
movq -0xd8(%rbp), %rdx
movq -0xc8(%rbp), %rdi
movq -0xf0(%rbp), %r8
leaq 0x5721d(%rip), %rsi     # 0x75d3c
movb $0x0, %al
callq 0x94d0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0xf8(%rbp)
cmpq $0x0, -0x38(%rbp)
jne 0x1eb4c
leaq 0x58d72(%rip), %rax     # 0x778b5
movq %rax, -0x100(%rbp)
jmp 0x1eb57
movq -0x38(%rbp), %rax
movq %rax, -0x100(%rbp)
movq -0xf8(%rbp), %rdi
movq -0x100(%rbp), %rdx
leaq 0x5aaf0(%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 $0x100, %rsp            # imm = 0x100
popq %rbp
retq
nop