// File: /workspace/github_c_makefile_star2_O0/markdryan[P]subtilis/frontend/parser_assignment.c
// Function: prv_assignment_local
static void prv_assignment_local(subtilis_parser_t *p, subtilis_token_t *t,
				 const char *var_name,
				 const subtilis_type_t *id_type,
				 subtilis_error_t *err)
{
	const subtilis_symbol_t *s;
	subtilis_exp_t *e;

	if ((p->current == p->main) && (p->level == 0)) {
		s = subtilis_symbol_table_lookup(p->st, var_name);
		if (s) {
			subtilis_error_set_local_obscures_global(
			    err, var_name, p->l->stream->name, p->l->line);
			return;
		}
	}

	if (subtilis_symbol_table_lookup(p->local_st, var_name)) {
		subtilis_error_set_already_defined(
		    err, var_name, p->l->stream->name, p->l->line);
		return;
	}

	if (subtilis_type_if_is_numeric(id_type)) {
		e = subtilis_parser_assign_local_num(p, t, var_name, id_type,
						     err);
		if (err->type != SUBTILIS_ERROR_OK)
			return;
		(void)subtilis_symbol_table_insert_reg(
		    p->local_st, var_name, id_type, e->exp.ir_op.reg, err);
		subtilis_exp_delete(e);
		return;
	} else if (id_type->type == SUBTILIS_TYPE_FN) {
		subtilis_parser_assign_local_fn(p, t, var_name, id_type, err);
		return;
	} else if (id_type->type == SUBTILIS_TYPE_REC) {
		subtilis_parser_assign_local_rec(p, t, var_name, id_type, err);
		return;
	} else if (!subtilis_type_if_is_reference(id_type)) {
		subtilis_error_set_assertion_failed(err);
		return;
	}

	/*
	 * We've got a reference type, e.g., a string.
	 */

	e = subtilis_parser_expression(p, t, err);
	if (err->type != SUBTILIS_ERROR_OK)
		return;

	if (e->temporary) {
		(void)subtilis_symbol_table_promote_tmp(
		    p->local_st, &e->type, e->temporary, var_name, err);
		subtilis_exp_delete(e);
		return;
	}

	s = subtilis_symbol_table_insert(p->local_st, var_name, id_type, err);
	if (err->type != SUBTILIS_ERROR_OK)
		return;

	subtilis_type_if_new_ref(p, id_type, SUBTILIS_IR_REG_LOCAL, s->loc, e,
				 err);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq -0x8(%rbp), %rax
movq 0x48(%rax), %rax
movq -0x8(%rbp), %rcx
cmpq 0x50(%rcx), %rax
jne 0x1c23e
movq -0x8(%rbp), %rax
cmpq $0x0, 0x78(%rax)
jne 0x1c23e
movq -0x8(%rbp), %rax
movq 0x60(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0x3cff0
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0x1c23c
movq -0x28(%rbp), %rdi
movq -0x18(%rbp), %rdx
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x30(%rax), %r8
movq -0x8(%rbp), %rax
movq (%rax), %rax
movl 0x38(%rax), %r9d
movl $0x52, %esi
leaq 0x8f057(%rip), %rcx     # 0xab276
leaq 0x8e396(%rip), %rax     # 0xaa5bc
movq %rax, (%rsp)
movl $0x259, 0x8(%rsp)       # imm = 0x259
callq 0x156d0
jmp 0x1c431
jmp 0x1c23e
movq -0x8(%rbp), %rax
movq 0x68(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0x3cff0
cmpq $0x0, %rax
je 0x1c29c
movq -0x28(%rbp), %rdi
movq -0x18(%rbp), %rdx
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x30(%rax), %r8
movq -0x8(%rbp), %rax
movq (%rax), %rax
movl 0x38(%rax), %r9d
movl $0x20, %esi
leaq 0x8eff7(%rip), %rcx     # 0xab276
leaq 0x8e336(%rip), %rax     # 0xaa5bc
movq %rax, (%rsp)
movl $0x260, 0x8(%rsp)       # imm = 0x260
callq 0x156d0
jmp 0x1c431
movq -0x20(%rbp), %rdi
callq 0x49d10
testb $0x1, %al
jne 0x1c2ab
jmp 0x1c308
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x1b110
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
cmpl $0x0, (%rax)
je 0x1c2d6
jmp 0x1c431
movq -0x8(%rbp), %rax
movq 0x68(%rax), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x38(%rbp), %rax
movq 0x148(%rax), %rcx
movq -0x28(%rbp), %r8
callq 0x3cc20
movq -0x38(%rbp), %rdi
callq 0x36ee0
jmp 0x1c431
movq -0x20(%rbp), %rax
cmpl $0x9, (%rax)
jne 0x1c32f
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x1b340
jmp 0x1c431
movq -0x20(%rbp), %rax
cmpl $0x16, (%rax)
jne 0x1c356
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x1b4f0
jmp 0x1c431
movq -0x20(%rbp), %rdi
callq 0x4a090
testb $0x1, %al
jne 0x1c382
movq -0x28(%rbp), %rdi
movl $0xf, %esi
leaq 0x8e249(%rip), %rdx     # 0xaa5bc
movl $0x274, %ecx            # imm = 0x274
callq 0x158e0
jmp 0x1c431
jmp 0x1c384
jmp 0x1c386
jmp 0x1c388
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x28(%rbp), %rdx
callq 0x24a20
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
cmpl $0x0, (%rax)
je 0x1c3ab
jmp 0x1c431
movq -0x38(%rbp), %rax
cmpq $0x0, 0x158(%rax)
je 0x1c3e8
movq -0x8(%rbp), %rax
movq 0x68(%rax), %rdi
movq -0x38(%rbp), %rsi
movq -0x38(%rbp), %rax
movq 0x158(%rax), %rdx
movq -0x18(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x3cac0
movq -0x38(%rbp), %rdi
callq 0x36ee0
jmp 0x1c431
movq -0x8(%rbp), %rax
movq 0x68(%rax), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x28(%rbp), %rcx
callq 0x3c480
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
cmpl $0x0, (%rax)
je 0x1c410
jmp 0x1c431
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x30(%rbp), %rax
movq (%rax), %rcx
movq -0x38(%rbp), %r8
movq -0x28(%rbp), %r9
movl $0x2, %edx
callq 0x47710
addq $0x50, %rsp
popq %rbp
retq
nopw (%rax,%rax)