// File: /workspace/github_c_makefile_star2_O0/Encryptr[P]O-plus-plus/opp/compiler/compile_expr.c
// Function: opp_compile_elem
static Opp_Obj opp_compile_elem(struct Opp_Context* opp, struct Opp_Node* expr)
{
	bool save = opp->info.need_addr;
	NEED_ADDR();
	Opp_Obj n = opp_compile_expr(opp, expr->elem_expr.name);
	opp->info.need_addr = save;

	Opp_Obj temp = n;
	temp.depth = 0;
	temp.size = 0;

	if (expr->elem_expr.name->type == EDOT || n.decl->t_type == TYPE_STRUCT) {
		if (!opp->info.dot.inptr) {
			opp->info.dot.inptr = true;
			OPCODE_START();
				OPCODE_TYPE(OPCODE_ADDR);
				opp->ir.opcodes[opp->ir.instr_idx].constant.val.type = IMM_LOC;
				opp->ir.opcodes[opp->ir.instr_idx].constant.val.imm_i32 = 
					opp->info.dot.offset;
			OPCODE_END();
		}	
	}

	opp_compile_expr(opp, expr->elem_expr.loc);

	unsigned int size = opp_type_to_size(&temp);

	if (size > 1) {
		OPCODE_START();
			OPCODE_TYPE(OPCODE_CONST);
			opp->ir.opcodes[opp->ir.instr_idx].constant.loc_type = IMM_I64;
			opp->ir.opcodes[opp->ir.instr_idx].constant.val.type = IMM_I64;
			opp->ir.opcodes[opp->ir.instr_idx].constant.val.imm_i64 = size;
			opp->ir.opcodes[opp->ir.instr_idx].constant.nopush = false;
		OPCODE_END();

		OPCODE_START();
			OPCODE_TYPE(OPCODE_ARITH);
			opp->ir.opcodes[opp->ir.instr_idx].arith.type = TMUL;
			opp->ir.opcodes[opp->ir.instr_idx].arith.imm = false;
			opp->ir.opcodes[opp->ir.instr_idx].arith.floating = false;
		OPCODE_END();
	}

	OPCODE_START();
		OPCODE_TYPE(OPCODE_ARITH);
		opp->ir.opcodes[opp->ir.instr_idx].arith.type = TADD;
			opp->ir.opcodes[opp->ir.instr_idx].arith.imm = false;
	OPCODE_END();

	if (!opp->info.need_addr && opp->info.dot.indot == false) { // check for any errors
		OPCODE_START();
			OPCODE_TYPE(OPCODE_DEREF);
			opp->ir.opcodes[opp->ir.instr_idx].cast.type = 
				opp_type_to_ir(&temp);
		OPCODE_END();
	}

	n.depth--;
	return n;
}

// Assembly:
subq $0x58, %rsp
movq %rdi, 0x40(%rsp)
movq %rsi, 0x38(%rsp)
movq 0x40(%rsp), %rax
movb 0x40(%rax), %al
andb $0x1, %al
movb %al, 0x37(%rsp)
movq 0x40(%rsp), %rax
movb $0x1, 0x40(%rax)
movq 0x40(%rsp), %rdi
movq 0x38(%rsp), %rax
movq 0x10(%rax), %rsi
callq 0x5d60
movq %rax, 0x48(%rsp)
movq %rdx, 0x50(%rsp)
movb 0x37(%rsp), %cl
movq 0x40(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x40(%rax)
movq 0x48(%rsp), %rax
movq %rax, 0x20(%rsp)
movq 0x50(%rsp), %rax
movq %rax, 0x28(%rsp)
movw $0x0, 0x28(%rsp)
movw $0x0, 0x2a(%rsp)
movq 0x38(%rsp), %rax
movq 0x10(%rax), %rax
cmpl $0xd, (%rax)
je 0x6c40
movq 0x48(%rsp), %rax
cmpl $0x8, 0x8(%rax)
jne 0x6ccb
movq 0x40(%rsp), %rax
testb $0x1, 0x3c(%rax)
jne 0x6cc9
movq 0x40(%rsp), %rax
movb $0x1, 0x3c(%rax)
movq 0x40(%rsp), %rdi
callq 0x5600
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0xe, (%rax)
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0x2, 0x8(%rax)
movq 0x40(%rsp), %rax
movl 0x38(%rax), %ecx
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rdx
imulq $0x28, 0x48(%rdx), %rdx
addq %rdx, %rax
movl %ecx, 0x10(%rax)
movq 0x40(%rsp), %rax
movq 0x48(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x48(%rax)
jmp 0x6ccb
movq 0x40(%rsp), %rdi
movq 0x38(%rsp), %rax
movq 0x18(%rax), %rsi
callq 0x5d60
movq %rax, 0x10(%rsp)
movq %rdx, 0x18(%rsp)
leaq 0x20(%rsp), %rdi
callq 0x5750
movl %eax, 0xc(%rsp)
cmpl $0x1, 0xc(%rsp)
jbe 0x6e34
movq 0x40(%rsp), %rdi
callq 0x5600
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0x0, (%rax)
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0xa, 0x18(%rax)
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0xa, 0x8(%rax)
movl 0xc(%rsp), %eax
movl %eax, %ecx
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rdx
imulq $0x28, 0x48(%rdx), %rdx
addq %rdx, %rax
movq %rcx, 0x10(%rax)
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movb $0x0, 0x1c(%rax)
movq 0x40(%rsp), %rax
movq 0x48(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x48(%rax)
movq 0x40(%rsp), %rdi
callq 0x5600
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0x6, (%rax)
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0x16, 0x8(%rax)
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movb $0x0, 0xc(%rax)
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movb $0x0, 0xd(%rax)
movq 0x40(%rsp), %rax
movq 0x48(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x48(%rax)
movq 0x40(%rsp), %rdi
callq 0x5600
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0x6, (%rax)
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0x13, 0x8(%rax)
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movb $0x0, 0xc(%rax)
movq 0x40(%rsp), %rax
movq 0x48(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x48(%rax)
movq 0x40(%rsp), %rax
testb $0x1, 0x40(%rax)
jne 0x6f1b
movq 0x40(%rsp), %rax
movb 0x28(%rax), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
jne 0x6f1b
movq 0x40(%rsp), %rdi
callq 0x5600
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0xc, (%rax)
leaq 0x20(%rsp), %rdi
callq 0x5670
movl %eax, %ecx
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rdx
imulq $0x28, 0x48(%rdx), %rdx
addq %rdx, %rax
movl %ecx, 0x8(%rax)
movq 0x40(%rsp), %rax
movq 0x48(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x48(%rax)
movw 0x50(%rsp), %ax
decw %ax
movw %ax, 0x50(%rsp)
movq 0x48(%rsp), %rax
movq 0x50(%rsp), %rdx
addq $0x58, %rsp
retq
nopw (%rax,%rax)