// File: /workspace/github_c_makefile_star2_O0/Oric4ever[P]lcc65/6502/build/../src/stmt.c
// Function: retcode
void retcode(Tree p, int lab) {
	if (p == 0) {
		if (events.returns)
			apply(events.returns, (Generic)cfunc, (Generic)0);
		p = tree(RET+V, voidtype, 0, 0);
	} else {
		Type ty;
		p = pointer(p);
		ty = assign(freturn(cfunc->type), p);
		if (ty)
			p = cast(p, ty);
		else
			error("illegal return type; found `%t' expected `%t'\n",
				p->type, freturn(cfunc->type));
		if (retv) {
			if (p->op == RIGHT && p->kids[0]->op == CALL+B
			&& p->kids[1]->op == INDIR+B) {
				p = p->kids[0];
				p->kids[1] = idnode(retv);
			} else
				p = asgnnode(ASGN, rvalue(idnode(retv)), p);
			walk(p, 0, 0);
			if (events.returns)
				apply(events.returns, (Generic)cfunc, (Generic)rvalue(idnode(retv)));
			p = tree(RET+V, voidtype, 0, 0);
		} else {
			if (events.returns) {
				Symbol t1 = genident(AUTO, p->type, level);
				addlocal(t1);
				walk(asgn(t1, p), 0, 0);
				apply(events.returns, (Generic)cfunc, (Generic)idnode(t1));
				p = idnode(t1);
			}
			p = cast(p, promote(p->type));
			if (isptr(p->type)) {
				Symbol q = localaddr(p);
				if (q && (q->computed || q->generated))
					warning("pointer to a %s is an illegal return value\n",
						q->scope == PARAM ? "parameter" : "local");
				else if (q)
					warning("pointer to %s `%s' is an illegal return value\n",
						q->scope == PARAM ? "parameter" : "local", q->name);
				p = cast(p, unsignedtype);
			}
			p = tree(RET + widen(p->type), p->type, p, 0);
		}
	}
	walk(p, 0, 0);
	branch(lab);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
cmpq $0x0, -0x8(%rbp)
jne 0x20dd9
leaq 0x1ce40(%rip), %rax     # 0x3dbd0
cmpq $0x0, 0x10(%rax)
je 0x20db5
leaq 0x1ce32(%rip), %rax     # 0x3dbd0
movq 0x10(%rax), %rdi
leaq 0x1ac5f(%rip), %rax     # 0x3ba08
movq (%rax), %rsi
xorl %eax, %eax
movl %eax, %edx
callq 0x18640
leaq 0x23484(%rip), %rax     # 0x44240
movq (%rax), %rsi
movl $0xf8, %edi
xorl %eax, %eax
movl %eax, %ecx
movq %rcx, %rdx
callq 0x256f0
movq %rax, -0x8(%rbp)
jmp 0x211f1
movq -0x8(%rbp), %rdi
callq 0xf9f0
movq %rax, -0x8(%rbp)
leaq 0x1ac1b(%rip), %rax     # 0x3ba08
movq (%rax), %rax
movq 0x20(%rax), %rdi
callq 0x28a30
movq %rax, %rdi
movq -0x8(%rbp), %rsi
callq 0xe2d0
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
je 0x20e23
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xe9b0
movq %rax, -0x8(%rbp)
jmp 0x20e57
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x30(%rbp)
leaq 0x1abd2(%rip), %rax     # 0x3ba08
movq (%rax), %rax
movq 0x20(%rax), %rdi
callq 0x28a30
movq -0x30(%rbp), %rsi
movq %rax, %rdx
leaq 0x10ebb(%rip), %rdi     # 0x31d0b
movb $0x0, %al
callq 0xd530
leaq 0x1abca(%rip), %rax     # 0x3ba28
cmpq $0x0, (%rax)
je 0x20f68
movq -0x8(%rbp), %rax
cmpl $0x2a0, (%rax)          # imm = 0x2A0
jne 0x20eb9
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
cmpl $0xd9, (%rax)
jne 0x20eb9
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x49, (%rax)
jne 0x20eb9
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x8(%rbp)
leaq 0x1ab84(%rip), %rax     # 0x3ba28
movq (%rax), %rdi
callq 0xddf0
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x18(%rax)
jmp 0x20ee5
leaq 0x1ab68(%rip), %rax     # 0x3ba28
movq (%rax), %rdi
callq 0xddf0
movq %rax, %rdi
callq 0xf780
movq %rax, %rsi
movq -0x8(%rbp), %rdx
movl $0x30, %edi
callq 0xc050
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rdi
xorl %edx, %edx
movl %edx, %esi
callq 0x3a80
leaq 0x1ccd7(%rip), %rax     # 0x3dbd0
cmpq $0x0, 0x10(%rax)
je 0x20f44
leaq 0x1ccc9(%rip), %rax     # 0x3dbd0
movq 0x10(%rax), %rax
movq %rax, -0x40(%rbp)
leaq 0x1aaf2(%rip), %rax     # 0x3ba08
movq (%rax), %rax
movq %rax, -0x38(%rbp)
leaq 0x1ab04(%rip), %rax     # 0x3ba28
movq (%rax), %rdi
callq 0xddf0
movq %rax, %rdi
callq 0xf780
movq -0x40(%rbp), %rdi
movq -0x38(%rbp), %rsi
movq %rax, %rdx
callq 0x18640
leaq 0x232f5(%rip), %rax     # 0x44240
movq (%rax), %rsi
movl $0xf8, %edi
xorl %eax, %eax
movl %eax, %ecx
movq %rcx, %rdx
callq 0x256f0
movq %rax, -0x8(%rbp)
jmp 0x211ef
leaq 0x1cc61(%rip), %rax     # 0x3dbd0
cmpq $0x0, 0x10(%rax)
je 0x20ffe
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
leaq 0x20007(%rip), %rax     # 0x40f90
movl (%rax), %edx
movl $0x43, %edi
callq 0x24b00
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rdi
callq 0x3290
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
callq 0xe0f0
movq %rax, %rdi
xorl %edx, %edx
movl %edx, %esi
callq 0x3a80
leaq 0x1cc0e(%rip), %rax     # 0x3dbd0
movq 0x10(%rax), %rax
movq %rax, -0x50(%rbp)
leaq 0x1aa37(%rip), %rax     # 0x3ba08
movq (%rax), %rax
movq %rax, -0x48(%rbp)
movq -0x20(%rbp), %rdi
callq 0xddf0
movq -0x50(%rbp), %rdi
movq -0x48(%rbp), %rsi
movq %rax, %rdx
callq 0x18640
movq -0x20(%rbp), %rdi
callq 0xddf0
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0xfae0
movq -0x58(%rbp), %rdi
movq %rax, %rsi
callq 0xe9b0
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpl $0xf, (%rax)
jb 0x21042
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x60(%rbp)
jmp 0x2104e
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
cmpl $0x7, (%rax)
jne 0x21117
movq -0x8(%rbp), %rdi
callq 0x21210
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0x210c4
movq -0x28(%rbp), %rax
movb 0x1b(%rax), %al
shrb $0x3, %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
jne 0x21097
movq -0x28(%rbp), %rax
movb 0x1b(%rax), %al
shrb $0x2, %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
je 0x210c4
movq -0x28(%rbp), %rax
movzwl 0x18(%rax), %ecx
leaq 0x10cc0(%rip), %rsi     # 0x31d66
leaq 0xe70c(%rip), %rax      # 0x2f7b9
cmpl $0x4, %ecx
cmoveq %rax, %rsi
leaq 0x10c7f(%rip), %rdi     # 0x31d3a
movb $0x0, %al
callq 0xdba0
jmp 0x21100
cmpq $0x0, -0x28(%rbp)
je 0x210fe
movq -0x28(%rbp), %rax
movzwl 0x18(%rax), %ecx
leaq 0x10c8c(%rip), %rsi     # 0x31d66
leaq 0xe6d8(%rip), %rax      # 0x2f7b9
cmpl $0x4, %ecx
cmoveq %rax, %rsi
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rdx
leaq 0x10c75(%rip), %rdi     # 0x31d6c
movb $0x0, %al
callq 0xdba0
jmp 0x21100
movq -0x8(%rbp), %rdi
leaq 0x2312d(%rip), %rax     # 0x44238
movq (%rax), %rsi
callq 0xe9b0
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpl $0xf, (%rax)
jb 0x21136
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x68(%rbp)
jmp 0x21142
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
cmpl $0x3, (%rax)
jb 0x2117f
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpl $0xf, (%rax)
jb 0x2116a
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x70(%rbp)
jmp 0x21176
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpl $0x6, (%rax)
jbe 0x211b3
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpl $0xf, (%rax)
jb 0x2119e
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x78(%rbp)
jmp 0x211aa
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rax
cmpl $0xd, (%rax)
jne 0x211bd
movl $0x5, %eax
movl %eax, -0x7c(%rbp)
jmp 0x211cd
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x29e30
movl %eax, -0x7c(%rbp)
movl -0x7c(%rbp), %edi
addl $0xf0, %edi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
movq -0x8(%rbp), %rdx
xorl %eax, %eax
movl %eax, %ecx
callq 0x256f0
movq %rax, -0x8(%rbp)
jmp 0x211f1
movq -0x8(%rbp), %rdi
xorl %edx, %edx
movl %edx, %esi
callq 0x3a80
movl -0xc(%rbp), %edi
callq 0x21370
addq $0x80, %rsp
popq %rbp
retq
nop