// File: /workspace/github_c_makefile_star2_O0/michaelforney[P]cproc/qbe.c
// Function: mkfunc
struct func *
mkfunc(struct decl *decl, char *name, struct type *t, struct scope *s)
{
	struct func *f;
	struct decl *d;
	struct value *v;

	f = xmalloc(sizeof(*f));
	f->decl = decl;
	f->name = name;
	f->type = t;
	f->start = f->end = mkblock("start");
	f->lastid = 0;
	mapinit(&f->gotos, 8);
	emittype(t->base);

	/* allocate space for parameters */
	f->paramtemps = xreallocarray(NULL, t->u.func.nparam, sizeof *f->paramtemps);
	for (d = t->u.func.params, v = f->paramtemps; d; d = d->next, ++v) {
		emittype(d->type);
		functemp(f, v);
		if(!d->name)
			continue;
		if (d->type->value) {
			d->value = v;
		} else {
			funcalloc(f, d);
			funcstore(f, d->type, QUALNONE, (struct lvalue){d->value}, v);
		}
	}

	t = mkarraytype(&typechar, QUALCONST, strlen(name) + 1);
	d = mkdecl("__func__", DECLOBJECT, t, QUALNONE, LINKNONE);
	d->u.obj.storage = SDSTATIC;
	d->value = mkglobal(d);
	scopeputdecl(s, d);
	f->namedecl = d;

	funclabel(f, mkblock("body"));

	return f;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movl $0x60, %edi
callq 0x127c0
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x18(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x20(%rax)
leaq 0x87a3(%rip), %rdi      # 0x1b4f3
callq 0x12b50
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x30(%rax)
movq -0x28(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x28(%rbp), %rax
movl $0x0, 0x58(%rax)
movq -0x28(%rbp), %rdi
addq $0x38, %rdi
movl $0x8, %esi
callq 0xd020
movq -0x18(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x12f40
movq -0x18(%rbp), %rax
movq 0x50(%rax), %rsi
xorl %eax, %eax
movl %eax, %edi
movl $0x10, %edx
callq 0x12760
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0x12e94
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0x12f40
movq -0x28(%rbp), %rdi
movq -0x38(%rbp), %rsi
callq 0x13260
movq -0x30(%rbp), %rax
cmpq $0x0, (%rax)
jne 0x12dfc
jmp 0x12e77
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
cmpq $0x0, 0x18(%rax)
je 0x12e19
movq -0x38(%rbp), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x20(%rax)
jmp 0x12e75
movq -0x28(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x132a0
movq -0x28(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x50(%rbp)
movq -0x30(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x48(%rbp)
leaq -0x48(%rbp), %rdi
addq $0x8, %rdi
xorl %esi, %esi
movl $0x4, %edx
callq 0x3110
movq -0x58(%rbp), %rdi
movq -0x50(%rbp), %rsi
movq -0x38(%rbp), %r9
movq -0x48(%rbp), %rcx
movq -0x40(%rbp), %r8
xorl %edx, %edx
callq 0x134e0
jmp 0x12e77
movq -0x30(%rbp), %rax
movq 0x38(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x38(%rbp), %rax
addq $0x10, %rax
movq %rax, -0x38(%rbp)
jmp 0x12dcb
movq -0x10(%rbp), %rdi
callq 0x30a0
movq %rax, %rdx
addq $0x1, %rdx
leaq 0xec3d(%rip), %rdi      # 0x21ae8
movl $0x2, %esi
callq 0x117e0
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rdx
leaq 0x91bb(%rip), %rdi      # 0x1c07f
movl $0x1, %esi
xorl %r8d, %r8d
movl %r8d, %ecx
callq 0x38c0
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
movl $0x0, 0x44(%rax)
movq -0x30(%rbp), %rdi
callq 0x12c00
movq %rax, %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x20(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0xfd90
movq -0x30(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x28(%rbp), %rax
movq %rax, -0x60(%rbp)
leaq 0x887e(%rip), %rdi      # 0x1b79d
callq 0x12b50
movq -0x60(%rbp), %rdi
movq %rax, %rsi
callq 0x13810
movq -0x28(%rbp), %rax
addq $0x60, %rsp
popq %rbp
retq
nopw (%rax,%rax)