// File: /workspace/github_c_makefile_star2_O0/Ihsoh[P]ilang/compiler/frontend/irgen_llvmir.c
// Function: fe_irgen_llvmir_generate
void fe_irgen_llvmir_generate(IRGeneratorLlvmirContext *ctx) {
	assert(ctx);
	assert(ctx->psrctx);
	assert(ctx->psrctx->ast);
	assert(ctx->psrctx->ast->type == FE_NODE_MODULE);
	assert(ctx->out);

	_OUT_CSTR(ctx, RSTR_CSTR(ctx->global));

	if (ctx->psrctx->arch == FE_ARCH_32) {
		_OUT_CSTR(ctx, "%struct.va_list = type { i8* }\n");
	} else if (ctx->psrctx->arch == FE_ARCH_64) {
		_OUT_CSTR(ctx, "%struct.va_list = type { i32, i32, i8*, i8* }\n");
	} else {
		assert(0);
	}

	_OUT_CSTR(ctx, "declare void @llvm.va_start(i8*)\n");
	_OUT_CSTR(ctx, "declare void @llvm.va_copy(i8*, i8*)\n");
	_OUT_CSTR(ctx, "declare void @llvm.va_end(i8*)\n");

	_ir_module(ctx, ctx->psrctx->ast);

	_OUT_CSTR(ctx, RSTR_CSTR(ctx->head));
	_OUT_CSTR(ctx, RSTR_CSTR(ctx->body));
	_OUT_CSTR(ctx, RSTR_CSTR(ctx->foot));
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movq %rdi, -0x8(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0x27b88
jmp 0x27ba7
leaq 0x549c7(%rip), %rdi     # 0x7c556
leaq 0x5053a(%rip), %rsi     # 0x780d0
movl $0x1479, %edx           # imm = 0x1479
leaq 0x5054f(%rip), %rcx     # 0x780f1
callq 0x30a0
movq -0x8(%rbp), %rax
cmpq $0x0, (%rax)
je 0x27bb3
jmp 0x27bd2
leaq 0x4c821(%rip), %rdi     # 0x743db
leaq 0x5050f(%rip), %rsi     # 0x780d0
movl $0x147a, %edx           # imm = 0x147A
leaq 0x50524(%rip), %rcx     # 0x780f1
callq 0x30a0
movq -0x8(%rbp), %rax
movq (%rax), %rax
cmpq $0x0, 0x8(%rax)
je 0x27be2
jmp 0x27c01
leaq 0x4c7fe(%rip), %rdi     # 0x743e7
leaq 0x504e0(%rip), %rsi     # 0x780d0
movl $0x147b, %edx           # imm = 0x147B
leaq 0x504f5(%rip), %rcx     # 0x780f1
callq 0x30a0
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x100, (%rax)          # imm = 0x100
jne 0x27c16
jmp 0x27c35
leaq 0x4c7db(%rip), %rdi     # 0x743f8
leaq 0x504ac(%rip), %rsi     # 0x780d0
movl $0x147c, %edx           # imm = 0x147C
leaq 0x504c1(%rip), %rcx     # 0x780f1
callq 0x30a0
movq -0x8(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x27c42
jmp 0x27c61
leaq 0x4c7d8(%rip), %rdi     # 0x74421
leaq 0x50480(%rip), %rsi     # 0x780d0
movl $0x147d, %edx           # imm = 0x147D
leaq 0x50495(%rip), %rcx     # 0x780f1
callq 0x30a0
movl $0x0, -0xc(%rbp)
movslq -0xc(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
cmpq $0x0, 0x8(%rax)
jne 0x27c8c
leaq 0x4fc2f(%rip), %rax     # 0x778b5
movq %rax, -0x40(%rbp)
jmp 0x27c9c
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rdi
callq 0x3070
movq %rax, %rcx
movq -0x38(%rbp), %rax
cmpq %rcx, %rax
jae 0x27d04
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
cmpq $0x0, 0x8(%rax)
jne 0x27ccd
leaq 0x4fbee(%rip), %rax     # 0x778b5
movq %rax, -0x48(%rbp)
jmp 0x27cdd
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movslq -0xc(%rbp), %rcx
movsbl (%rax,%rcx), %edi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x30d0
movl -0xc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xc(%rbp)
jmp 0x27c68
movq -0x8(%rbp), %rax
movq (%rax), %rax
cmpl $0x1, 0x30(%rax)
jne 0x27d4b
movl $0x0, -0x10(%rbp)
movslq -0x10(%rbp), %rax
cmpq $0x1f, %rax
jae 0x27d49
movslq -0x10(%rbp), %rcx
leaq 0x503fe(%rip), %rax     # 0x7812b
movsbl (%rax,%rcx), %edi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x30d0
movl -0x10(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x10(%rbp)
jmp 0x27d18
jmp 0x27db3
movq -0x8(%rbp), %rax
movq (%rax), %rax
cmpl $0x2, 0x30(%rax)
jne 0x27d92
movl $0x0, -0x14(%rbp)
movslq -0x14(%rbp), %rax
cmpq $0x2e, %rax
jae 0x27d90
movslq -0x14(%rbp), %rcx
leaq 0x503d7(%rip), %rax     # 0x7814b
movsbl (%rax,%rcx), %edi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x30d0
movl -0x14(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x14(%rbp)
jmp 0x27d5f
jmp 0x27db1
leaq 0x4a6c2(%rip), %rdi     # 0x7245b
leaq 0x50330(%rip), %rsi     # 0x780d0
movl $0x1486, %edx           # imm = 0x1486
leaq 0x50345(%rip), %rcx     # 0x780f1
callq 0x30a0
jmp 0x27db3
movl $0x0, -0x18(%rbp)
movslq -0x18(%rbp), %rax
cmpq $0x21, %rax
jae 0x27deb
movslq -0x18(%rbp), %rcx
leaq 0x503ab(%rip), %rax     # 0x7817a
movsbl (%rax,%rcx), %edi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x30d0
movl -0x18(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x18(%rbp)
jmp 0x27dba
movl $0x0, -0x1c(%rbp)
movslq -0x1c(%rbp), %rax
cmpq $0x25, %rax
jae 0x27e23
movslq -0x1c(%rbp), %rcx
leaq 0x50395(%rip), %rax     # 0x7819c
movsbl (%rax,%rcx), %edi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x30d0
movl -0x1c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1c(%rbp)
jmp 0x27df2
movl $0x0, -0x20(%rbp)
movslq -0x20(%rbp), %rax
cmpq $0x1f, %rax
jae 0x27e5b
movslq -0x20(%rbp), %rcx
leaq 0x50383(%rip), %rax     # 0x781c2
movsbl (%rax,%rcx), %edi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x30d0
movl -0x20(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x20(%rbp)
jmp 0x27e2a
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rsi
callq 0x28080
movl $0x0, -0x24(%rbp)
movslq -0x24(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
cmpq $0x0, 0x8(%rax)
jne 0x27e9a
leaq 0x4fa21(%rip), %rax     # 0x778b5
movq %rax, -0x58(%rbp)
jmp 0x27eaa
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rdi
callq 0x3070
movq %rax, %rcx
movq -0x50(%rbp), %rax
cmpq %rcx, %rax
jae 0x27f12
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
cmpq $0x0, 0x8(%rax)
jne 0x27edb
leaq 0x4f9e0(%rip), %rax     # 0x778b5
movq %rax, -0x60(%rbp)
jmp 0x27eeb
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
movslq -0x24(%rbp), %rcx
movsbl (%rax,%rcx), %edi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x30d0
movl -0x24(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x24(%rbp)
jmp 0x27e76
movl $0x0, -0x28(%rbp)
movslq -0x28(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
cmpq $0x0, 0x8(%rax)
jne 0x27f3d
leaq 0x4f97e(%rip), %rax     # 0x778b5
movq %rax, -0x70(%rbp)
jmp 0x27f4d
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rdi
callq 0x3070
movq %rax, %rcx
movq -0x68(%rbp), %rax
cmpq %rcx, %rax
jae 0x27fb5
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
cmpq $0x0, 0x8(%rax)
jne 0x27f7e
leaq 0x4f93d(%rip), %rax     # 0x778b5
movq %rax, -0x78(%rbp)
jmp 0x27f8e
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rax
movslq -0x28(%rbp), %rcx
movsbl (%rax,%rcx), %edi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x30d0
movl -0x28(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x28(%rbp)
jmp 0x27f19
movl $0x0, -0x2c(%rbp)
movslq -0x2c(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
cmpq $0x0, 0x8(%rax)
jne 0x27fe3
leaq 0x4f8db(%rip), %rax     # 0x778b5
movq %rax, -0x88(%rbp)
jmp 0x27ff6
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x88(%rbp)
movq -0x88(%rbp), %rdi
callq 0x3070
movq %rax, %rcx
movq -0x80(%rbp), %rax
cmpq %rcx, %rax
jae 0x2806a
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
cmpq $0x0, 0x8(%rax)
jne 0x2802d
leaq 0x4f891(%rip), %rax     # 0x778b5
movq %rax, -0x90(%rbp)
jmp 0x28040
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rax
movslq -0x2c(%rbp), %rcx
movsbl (%rax,%rcx), %edi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x30d0
movl -0x2c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x2c(%rbp)
jmp 0x27fbc
addq $0x90, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)