// File: /workspace/github_c_makefile_star2_O3/goodpaul6[P]generic/script.c
// Function: compile_value_expr
static void compile_value_expr(script_t* script, expr_t* exp)
{
	compile_file_line_info(script, exp, 0);
	
	switch(exp->type)
	{
		case EXP_NULL:
		{
			append_code(script, OP_PUSH_NULL);
		} break;
		
		case EXP_STRUCT_NEW:
		{
			char* initialized_members = emalloc(exp->newx.type->ds.members.length);
			memset(initialized_members, 0, exp->newx.type->ds.members.length);
			
			int num_init = 0;
			for(int i = exp->newx.init.length - 1; i >= 0; --i)
			{
				expr_t* init = vec_get_value(&exp->newx.init, i, expr_t*);
				int index = get_struct_type_member_index(exp->newx.type, init->binx.lhs->varx.name);
				
				if(index < 0) error_exit_e(init, "Attempted to initialize non-existent member '%s' in struct %s instantiation\n", 
							  init->binx.lhs->varx.name, exp->newx.type->ds.name);
							  
				initialized_members[index] = 1;
				++num_init;
				
				append_code(script, OP_PUSH_NUMBER);
				append_int(script, register_number(script, index));
				
				compile_value_expr(script, init->binx.rhs);
			}
			
			// NOTE: iterate over all the member types, check if they've been
			// initialized; if they haven't, and they have a default initializer
			// then use that
			for(int i = exp->newx.type->ds.members.length - 1; i >= 0; --i)
			{
				if(!initialized_members[i])
				{
					type_tag_member_t* mem = vec_get(&exp->newx.type->ds.members, i);
					if(mem->default_value)
					{
						append_code(script, OP_PUSH_NUMBER);
						append_int(script, register_number(script, i));
						
						compile_value_expr(script, mem->default_value);
						++num_init;
					}
				}
			}
			
			append_code(script, OP_PUSH_STRUCT);
			// NOTE: Unions only have 1 member location
			if(exp->newx.type->ds.is_union)
				append_int(script, 1);
			else
				append_int(script, exp->newx.type->ds.members.length);
			append_int(script, num_init);
			
			free(initialized_members);
		} break;
		
		case EXP_DOT:
		{
			int index = get_struct_type_member_index(exp->dotx.value->tag, exp->dotx.name);
			if(index < 0) error_exit_e(exp, "Attempted to access non-existent member '%s' in struct %s\n", exp->dotx.name, exp->dotx.value->tag->ds.name);
			
			compile_value_expr(script, exp->dotx.value);
			append_code(script, OP_STRUCT_GET);
			append_int(script, index);		
		} break;

		case EXP_COLON:
		{
			func_decl_t* decl = get_struct_member_function(script, exp->dotx.value->tag->ds.name, exp->dotx.name);
			if (!decl)
				error_exit_e(exp, "Value of type '%s' has no member function '%s'\n", exp->dotx.value->tag->ds.name, exp->dotx.name);

			append_code(script, OP_PUSH_FUNC);
			append_int(script, decl->index);
		} break;
			
		case EXP_BOOL:
		{
			if(exp->boolean_value) append_code(script, OP_PUSH_TRUE);
			else append_code(script, OP_PUSH_FALSE);
		} break;
		
		case EXP_CHAR:
		{
			append_code(script, OP_PUSH_CHAR);
			append_int(script, exp->code);
		} break;
		
		case EXP_ARRAY_INDEX:
		{
			compile_value_expr(script, exp->array_index.index);
			compile_value_expr(script, exp->array_index.array);
			if(exp->array_index.array->tag->type == TAG_STRING)
				append_code(script, OP_STRING_GET);
			else
				append_code(script, OP_ARRAY_GET);
		} break;
		
		case EXP_ARRAY_LITERAL:
		{
			for(int i = 0; i < exp->array_literal.values.length; ++i)
			{
				expr_t* e = vec_get_value(&exp->array_literal.values, i, expr_t*);
				compile_value_expr(script, e);
			}
			append_code(script, OP_PUSH_ARRAY_BLOCK);
			append_int(script, (int)exp->array_literal.values.length);
		} break;
		
		case EXP_LEN:
		{
			compile_value_expr(script, exp->len);
			if(exp->len->tag->type == TAG_STRING) append_code(script, OP_STRING_LEN);
			else if(exp->len->tag->type == TAG_ARRAY) append_code(script, OP_ARRAY_LEN);
		} break;
		
		case EXP_VAR:
		{
			if(exp->varx.decl)
			{
				if(exp->varx.decl->parent)
					append_code(script, OP_GETLOCAL);
				else
					append_code(script, OP_GET);
					
				append_int(script, exp->varx.decl->index);
			}
			else
			{
				// NOTE: This assumes resolve_symbols checked for a function reference existing
				func_decl_t* decl = reference_function(script, exp->varx.name);
				
				// TODO: Switch here
				if(decl->type == DECL_FUNCTION) append_code(script, OP_PUSH_FUNC);
				else if (decl->type == DECL_EXTERN) append_code(script, OP_PUSH_EXTERN_FUNC);
				else error_exit_p("Invalid function declaration type\n");
				
				append_int(script, decl->index);
			}
		} break;
		
		case EXP_EXTERN:
		case EXP_EXTERN_LIST: break;
		
		case EXP_NUMBER:
		{
			append_code(script, OP_PUSH_NUMBER);
			append_int(script, exp->number_index);
		} break;
		
		case EXP_STRING:
		{
			append_code(script, OP_PUSH_STRING);
			append_int(script, exp->string_index);
		} break;
	
		case EXP_PAREN:
		{
			compile_value_expr(script, exp->paren);
		} break;
		
		case EXP_UNARY:
		{
			compile_value_expr(script, exp->unaryx.rhs);
			switch(exp->unaryx.op)
			{
				case TOK_MINUS: append_code(script, OP_NEG); break;
				case TOK_NOT: append_code(script, OP_NOT); break;
				// NOTE: perhaps error here
			}
		} break;
		
		case EXP_BINARY:
		{
			compile_value_expr(script, exp->binx.rhs);
			compile_value_expr(script, exp->binx.lhs);
			
			switch(exp->binx.op)
			{
				case TOK_PLUS: append_code(script, OP_ADD); break;
				case TOK_MINUS: append_code(script, OP_SUB); break;
				case TOK_MUL: append_code(script, OP_MUL); break;
				case TOK_DIV: append_code(script, OP_DIV); break;
				case TOK_MOD: append_code(script, OP_MOD); break;

				case TOK_LT: append_code(script, OP_LT); break;
				case TOK_GT: append_code(script, OP_GT); break;
				case TOK_LTE: append_code(script, OP_LTE); break;
				case TOK_GTE: append_code(script, OP_GTE); break;
				
				case TOK_LAND: append_code(script, OP_LAND); break;
				case TOK_LOR: append_code(script, OP_LOR); break;
				
				case TOK_EQUALS: append_code(script, OP_EQU); break;
				case TOK_NOTEQUAL: append_code(script, OP_EQU); append_code(script, OP_NOT); break;
				
				default: break;
			}
		} break;
		
		case EXP_CALL:
		{
			compile_call(script, exp);
			append_code(script, OP_PUSH_RETVAL);
			
			// NOTE: because branching
			compile_file_line_info(script, exp, 1);
		} break;
		
		default:
			error_exit_e(exp, "Non-value expression used in value context\n");
			break;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x38, %rsp
movq %rsi, %r14
movq %rdi, %r12
leaq 0x27f1(%rip), %rbx      # 0xf574
movq %r12, %rdi
movq %r14, %rsi
xorl %edx, %edx
callq 0xcc56
movl 0x28(%r14), %eax
cmpq $0x18, %rax
ja 0xd534
movslq (%rbx,%rax,4), %rax
addq %rbx, %rax
jmpq *%rax
movq 0x38(%r14), %r14
jmp 0xcd83
movq 0x40(%r14), %rsi
movq %r12, %rdi
callq 0xcd65
movq 0x38(%r14), %rsi
movq %r12, %rdi
callq 0xcd65
movl 0x48(%r14), %eax
addl $-0x25, %eax
cmpl $0xc, %eax
ja 0xd3f5
leaq 0x27fc(%rip), %rcx      # 0xf5d8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq -0x30(%rbp), %rsi
movb $0x13, (%rsi)
jmp 0xd3e6
cmpq $0x0, 0x50(%r14)
je 0xce1e
leaq 0x40(%r14), %rbx
xorl %r15d, %r15d
movq %rbx, %rdi
movq %r15, %rsi
callq 0xdcf3
movq (%rax), %rsi
movq %r12, %rdi
callq 0xcd65
incq %r15
cmpq %r15, 0x50(%r14)
ja 0xcdff
leaq -0x30(%rbp), %rbx
movb $0x9, (%rbx)
addq $0x1d8, %r12            # imm = 0x1D8
movq %r12, %rdi
movq %rbx, %rsi
callq 0xdd50
movl 0x50(%r14), %eax
movl %eax, (%rbx)
xorl %r14d, %r14d
leaq -0x29(%rbp), %rbx
movb -0x30(%rbp,%r14), %al
incq %r14
movb %al, -0x29(%rbp)
movq %r12, %rdi
movq %rbx, %rsi
callq 0xdd50
cmpq $0x4, %r14
jne 0xce44
jmp 0xd3f5
leaq -0x30(%rbp), %rbx
movb $0x5, (%rbx)
addq $0x1d8, %r12            # imm = 0x1D8
movq %r12, %rdi
movq %rbx, %rsi
callq 0xdd50
movl 0x38(%r14), %eax
movl %eax, (%rbx)
xorl %r14d, %r14d
leaq -0x29(%rbp), %rbx
movb -0x30(%rbp,%r14), %al
incq %r14
movb %al, -0x29(%rbp)
movq %r12, %rdi
movq %rbx, %rsi
callq 0xdd50
cmpq $0x4, %r14
jne 0xce8b
jmp 0xd3f5
movq %r12, %rdi
movq %r14, %rsi
callq 0xd5bc
leaq -0x30(%rbp), %rsi
movb $0xa, (%rsi)
leaq 0x1d8(%r12), %rdi
callq 0xdd50
movq %r12, %rdi
movq %r14, %rsi
movl $0x1, %edx
callq 0xcc56
jmp 0xd3f5
leaq -0x30(%rbp), %rbx
movb $0x3, (%rbx)
addq $0x1d8, %r12            # imm = 0x1D8
movq %r12, %rdi
movq %rbx, %rsi
callq 0xdd50
movsbl 0x38(%r14), %eax
movl %eax, (%rbx)
xorl %r14d, %r14d
leaq -0x29(%rbp), %rbx
movb -0x30(%rbp,%r14), %al
incq %r14
movb %al, -0x29(%rbp)
movq %r12, %rdi
movq %rbx, %rsi
callq 0xdd50
cmpq $0x4, %r14
jne 0xcf07
jmp 0xd3f5
movq 0x38(%r14), %rax
movq 0x70(%rax), %rbx
movl $0x1, %edi
movq %rbx, %rsi
callq 0x2150
movq %rax, -0x50(%rbp)
testq %rax, %rax
je 0xd56b
movl 0x50(%r14), %eax
movl %eax, -0x34(%rbp)
decl %eax
movq %r14, -0x48(%rbp)
movq %r12, -0x40(%rbp)
js 0xd280
leaq 0x40(%r14), %rcx
movq %rcx, -0x60(%rbp)
leaq 0x1d8(%r12), %r13
movl %eax, %r15d
xorl %ebx, %ebx
leaq -0x29(%rbp), %r12
movq -0x60(%rbp), %rdi
movq %r15, %rsi
callq 0xdcf3
movq (%rax), %rax
movq 0x38(%r14), %rdi
movq %rax, -0x58(%rbp)
movq 0x38(%rax), %rax
movq 0x38(%rax), %rsi
callq 0x9812
testl %eax, %eax
js 0xd545
movl %eax, %r14d
movl %eax, %eax
movq -0x50(%rbp), %rcx
movb $0x1, (%rcx,%rax)
movb $0x4, -0x30(%rbp)
movq %r13, %rdi
leaq -0x30(%rbp), %rsi
callq 0xdd50
xorps %xmm0, %xmm0
cvtsi2sd %r14d, %xmm0
movq -0x40(%rbp), %rdi
callq 0x88a2
movl %eax, -0x30(%rbp)
xorl %r14d, %r14d
movb -0x30(%rbp,%r14), %al
incq %r14
movb %al, -0x29(%rbp)
movq %r13, %rdi
movq %r12, %rsi
callq 0xdd50
cmpq $0x4, %r14
jne 0xcfda
incl %ebx
movq -0x58(%rbp), %rax
movq 0x40(%rax), %rsi
movq -0x40(%rbp), %rdi
callq 0xcd65
decq %r15
cmpl -0x34(%rbp), %ebx
movq -0x48(%rbp), %r14
jne 0xcf7a
movq 0x38(%r14), %rax
movq 0x70(%rax), %rbx
movq -0x40(%rbp), %r12
jmp 0xd287
movq 0x38(%r14), %rax
movq 0x40(%r14), %rsi
movq 0x30(%rax), %rdi
callq 0x9812
testl %eax, %eax
js 0xd579
movl %eax, %ebx
movq 0x38(%r14), %rsi
movq %r12, %rdi
callq 0xcd65
leaq -0x30(%rbp), %r14
movb $0x11, (%r14)
addq $0x1d8, %r12            # imm = 0x1D8
movq %r12, %rdi
movq %r14, %rsi
callq 0xdd50
movl %ebx, (%r14)
xorl %r14d, %r14d
leaq -0x29(%rbp), %rbx
movb -0x30(%rbp,%r14), %al
incq %r14
movb %al, -0x29(%rbp)
movq %r12, %rdi
movq %rbx, %rsi
callq 0xdd50
cmpq $0x4, %r14
jne 0xd075
jmp 0xd3f5
movq 0x40(%r14), %rax
testq %rax, %rax
je 0xd245
addq $0x1d8, %r12            # imm = 0x1D8
cmpq $0x0, (%rax)
je 0xd404
leaq -0x30(%rbp), %rsi
movb $0x28, (%rsi)
jmp 0xd40b
movq 0x38(%r14), %rsi
movq %r12, %rdi
callq 0xcd65
movq 0x38(%r14), %rax
movq 0x30(%rax), %rax
movl 0x20(%rax), %eax
cmpl $0x7, %eax
je 0xd3d6
cmpl $0x5, %eax
jne 0xd3f5
leaq -0x30(%rbp), %rsi
movb $0xc, (%rsi)
jmp 0xd3e6
movq 0x38(%r14), %rsi
movq %r12, %rdi
callq 0xcd65
movl 0x40(%r14), %eax
cmpl $0x23, %eax
je 0xd3df
cmpl $0x26, %eax
jne 0xd3f5
leaq -0x30(%rbp), %rsi
movb $0x1e, (%rsi)
jmp 0xd3e6
addq $0x1d8, %r12            # imm = 0x1D8
cmpb $0x0, 0x38(%r14)
je 0xd274
leaq -0x30(%rbp), %rsi
movb $0x1, (%rsi)
jmp 0xd3ed
leaq -0x30(%rbp), %rsi
movb $0x0, (%rsi)
jmp 0xd3e6
leaq -0x30(%rbp), %rbx
movb $0x4, (%rbx)
addq $0x1d8, %r12            # imm = 0x1D8
movq %r12, %rdi
movq %rbx, %rsi
callq 0xdd50
movl 0x38(%r14), %eax
movl %eax, (%rbx)
xorl %r14d, %r14d
leaq -0x29(%rbp), %rbx
movb -0x30(%rbp,%r14), %al
incq %r14
movb %al, -0x29(%rbp)
movq %r12, %rdi
movq %rbx, %rsi
callq 0xdd50
cmpq $0x4, %r14
jne 0xd173
jmp 0xd3f5
movq 0x38(%r14), %rax
movq 0x40(%r14), %rdx
movq 0x30(%rax), %rax
movq 0x30(%rax), %rsi
movq %r12, %rdi
callq 0x967b
testq %rax, %rax
je 0xd592
movq %rax, %rbx
leaq -0x30(%rbp), %r14
movb $0x6, (%r14)
addq $0x1d8, %r12            # imm = 0x1D8
movq %r12, %rdi
movq %r14, %rsi
callq 0xdd50
movl 0x60(%rbx), %eax
movl %eax, (%r14)
xorl %r14d, %r14d
leaq -0x29(%rbp), %rbx
movb -0x30(%rbp,%r14), %al
incq %r14
movb %al, -0x29(%rbp)
movq %r12, %rdi
movq %rbx, %rsi
callq 0xdd50
cmpq $0x4, %r14
jne 0xd1df
jmp 0xd3f5
movq 0x40(%r14), %rsi
movq %r12, %rdi
callq 0xcd65
movq 0x38(%r14), %rsi
movq %r12, %rdi
callq 0xcd65
movq 0x38(%r14), %rax
movq 0x30(%rax), %rax
addq $0x1d8, %r12            # imm = 0x1D8
cmpl $0x5, 0x20(%rax)
jne 0xd239
leaq -0x30(%rbp), %rsi
movb $0xe, (%rsi)
jmp 0xd3ed
leaq -0x30(%rbp), %rsi
movb $0xf, (%rsi)
jmp 0xd3ed
movq 0x38(%r14), %rsi
movq %r12, %rdi
callq 0x846c
movq %rax, %rbx
movl 0x8(%rax), %eax
cmpl $0x1, %eax
je 0xd442
testl %eax, %eax
jne 0xd5ae
leaq -0x30(%rbp), %rsi
movb $0x6, (%rsi)
jmp 0xd449
leaq -0x30(%rbp), %rsi
movb $0x2, (%rsi)
jmp 0xd3ed
movl $0x0, -0x34(%rbp)
decl %ebx
js 0xd329
addq $0x1d8, %r12            # imm = 0x1D8
movl %ebx, %r13d
leaq -0x29(%rbp), %r15
movq -0x50(%rbp), %rax
cmpb $0x0, (%rax,%r13)
jne 0xd319
movq 0x38(%r14), %rdi
addq $0x60, %rdi
movq %r13, %rsi
callq 0xdcf3
cmpq $0x0, 0x18(%rax)
je 0xd319
movq %rax, %rbx
movb $0x4, -0x30(%rbp)
movq %r12, %rdi
leaq -0x30(%rbp), %rsi
callq 0xdd50
xorps %xmm0, %xmm0
cvtsi2sd %r13d, %xmm0
movq -0x40(%rbp), %rdi
callq 0x88a2
movl %eax, -0x30(%rbp)
xorl %r14d, %r14d
movb -0x30(%rbp,%r14), %al
incq %r14
movb %al, -0x29(%rbp)
movq %r12, %rdi
movq %r15, %rsi
callq 0xdd50
cmpq $0x4, %r14
jne 0xd2e9
movq 0x18(%rbx), %rsi
movq -0x40(%rbp), %rdi
callq 0xcd65
incl -0x34(%rbp)
movq -0x48(%rbp), %r14
leaq -0x1(%r13), %rax
testq %r13, %r13
movq %rax, %r13
jg 0xd29d
leaq -0x30(%rbp), %rsi
movb $0xb, (%rsi)
movq -0x40(%rbp), %r15
addq $0x1d8, %r15            # imm = 0x1D8
movq %r15, %rdi
callq 0xdd50
movq 0x38(%r14), %rax
cmpb $0x0, 0x28(%rax)
je 0xd379
movl $0x1, -0x30(%rbp)
xorl %r14d, %r14d
leaq -0x29(%rbp), %rbx
movb -0x30(%rbp,%r14), %al
incq %r14
movb %al, -0x29(%rbp)
movq %r15, %rdi
movq %rbx, %rsi
callq 0xdd50
cmpq $0x4, %r14
jne 0xd35b
jmp 0xd3a2
movl 0x70(%rax), %eax
movl %eax, -0x30(%rbp)
xorl %r14d, %r14d
leaq -0x29(%rbp), %rbx
movb -0x30(%rbp,%r14), %al
incq %r14
movb %al, -0x29(%rbp)
movq %r15, %rdi
movq %rbx, %rsi
callq 0xdd50
cmpq $0x4, %r14
jne 0xd386
movl -0x34(%rbp), %eax
movl %eax, -0x30(%rbp)
xorl %r14d, %r14d
leaq -0x29(%rbp), %rbx
movb -0x30(%rbp,%r14), %al
incq %r14
movb %al, -0x29(%rbp)
movq %r15, %rdi
movq %rbx, %rsi
callq 0xdd50
cmpq $0x4, %r14
jne 0xd3af
movq -0x50(%rbp), %rdi
callq 0x2030
jmp 0xd3f5
leaq -0x30(%rbp), %rsi
movb $0xd, (%rsi)
jmp 0xd3e6
leaq -0x30(%rbp), %rsi
movb $0x1f, (%rsi)
addq $0x1d8, %r12            # imm = 0x1D8
movq %r12, %rdi
callq 0xdd50
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq -0x30(%rbp), %rsi
movb $0x26, (%rsi)
movq %r12, %rdi
callq 0xdd50
movq 0x40(%r14), %rax
movl 0x1c(%rax), %eax
movl %eax, -0x30(%rbp)
xorl %r14d, %r14d
leaq -0x29(%rbp), %rbx
movb -0x30(%rbp,%r14), %al
incq %r14
movb %al, -0x29(%rbp)
movq %r12, %rdi
movq %rbx, %rsi
callq 0xdd50
cmpq $0x4, %r14
jne 0xd424
jmp 0xd3f5
leaq -0x30(%rbp), %rsi
movb $0x7, (%rsi)
leaq 0x1d8(%r12), %rdi
callq 0xdd50
movl 0x60(%rbx), %eax
movl %eax, -0x30(%rbp)
addq $0x1d8, %r12            # imm = 0x1D8
xorl %r14d, %r14d
leaq -0x29(%rbp), %rbx
movb -0x30(%rbp,%r14), %al
incq %r14
movb %al, -0x29(%rbp)
movq %r12, %rdi
movq %rbx, %rsi
callq 0xdd50
cmpq $0x4, %r14
jne 0xd46a
jmp 0xd3f5
leaq -0x30(%rbp), %rsi
movb $0x20, (%rsi)
jmp 0xd3e6
leaq -0x30(%rbp), %rsi
movb $0x17, (%rsi)
jmp 0xd3e6
leaq -0x30(%rbp), %rbx
movb $0x20, (%rbx)
addq $0x1d8, %r12            # imm = 0x1D8
movq %r12, %rdi
movq %rbx, %rsi
callq 0xdd50
movb $0x1f, (%rbx)
leaq -0x30(%rbp), %rsi
jmp 0xd3ed
leaq -0x30(%rbp), %rsi
movb $0x1c, (%rsi)
jmp 0xd3e6
leaq -0x30(%rbp), %rsi
movb $0x15, (%rsi)
jmp 0xd3e6
leaq -0x30(%rbp), %rsi
movb $0x16, (%rsi)
jmp 0xd3e6
leaq -0x30(%rbp), %rsi
movb $0x1a, (%rsi)
jmp 0xd3e6
leaq -0x30(%rbp), %rsi
movb $0x14, (%rsi)
jmp 0xd3e6
leaq -0x30(%rbp), %rsi
movb $0x18, (%rsi)
jmp 0xd3e6
leaq -0x30(%rbp), %rsi
movb $0x19, (%rsi)
jmp 0xd3e6
leaq -0x30(%rbp), %rsi
movb $0x1d, (%rsi)
jmp 0xd3e6
leaq -0x30(%rbp), %rsi
movb $0x1b, (%rsi)
jmp 0xd3e6
leaq 0x40b4(%rip), %rsi      # 0x115ef
movq %r14, %rdi
xorl %eax, %eax
callq 0x9767
movq -0x58(%rbp), %rdi
movq 0x38(%rdi), %rax
movq 0x38(%rax), %rdx
movq -0x48(%rbp), %rax
movq 0x38(%rax), %rax
movq 0x30(%rax), %rcx
leaq 0x3feb(%rip), %rsi      # 0x1154f
xorl %eax, %eax
callq 0x9767
leaq 0x4725(%rip), %rdi      # 0x11c97
xorl %eax, %eax
callq 0x388c
movq 0x38(%r14), %rax
movq 0x40(%r14), %rdx
movq 0x30(%rax), %rax
movq 0x30(%rax), %rcx
leaq 0x32cc(%rip), %rsi      # 0x1085c
jmp 0xd5a9
movq 0x38(%r14), %rax
movq 0x40(%r14), %rcx
movq 0x30(%rax), %rax
movq 0x30(%rax), %rdx
leaq 0x3ff3(%rip), %rsi      # 0x1159c
movq %r14, %rdi
jmp 0xd564
leaq 0x4017(%rip), %rdi      # 0x115cc
xorl %eax, %eax
callq 0x878e