// File: /workspace/github_c_makefile_star2_O0/Encryptr[P]O-plus-plus/opp/compiler/compile_expr.c
// Function: opp_compile_dot
static Opp_Obj opp_compile_dot(struct Opp_Context* opp, struct Opp_Node* dot)
{
	bool outer = false;
	if (!opp->info.dot.indot) {
		opp->info.dot.indot = true;
		opp->info.dot.offset = 0;
		opp->info.dot.inptr = false;
		outer = true;
	}

	opp_compile_expr(opp, dot->dot_expr.left);

	if (opp->info.dot.inptr && dot->dot_expr.right->unary_expr.bidx->offset > 0) {
		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 = true;
			opp->ir.opcodes[opp->ir.instr_idx].arith.val.type = 
				(dot->dot_expr.right->unary_expr.bidx->offset > 128) 
					? IMM_I8 : IMM_I32;
			opp->ir.opcodes[opp->ir.instr_idx].arith.val.imm_i32 = 
				(int32_t)dot->dot_expr.right->unary_expr.bidx->offset;
		OPCODE_END();

		if (!outer) {
			OPCODE_START();
			OPCODE_TYPE(OPCODE_DEREF);
					opp->ir.opcodes[opp->ir.instr_idx].cast.type = 
						opp_type_to_ir(&dot->dot_expr.right->unary_expr.bidx->sym_type);
			OPCODE_END();
		}
	}
	else {
		opp->info.dot.offset += dot->dot_expr.right->unary_expr.bidx->offset;
	}

	if (outer) {
		if (!opp->info.need_addr) 
		{
			OPCODE_START();
			if (opp->info.dot.inptr) {
				OPCODE_TYPE(OPCODE_DEREF);
				opp->ir.opcodes[opp->ir.instr_idx].cast.type = 
					opp_type_to_ir(&dot->dot_expr.right->unary_expr.bidx->sym_type);
			}
			else {
				OPCODE_TYPE(OPCODE_CONST);
				opp->ir.opcodes[opp->ir.instr_idx].constant.loc_type = 
					opp_type_to_ir(&dot->dot_expr.right->unary_expr.bidx->sym_type);
				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->info.dot.indot = false;
	}

	return dot->dot_expr.right->unary_expr.bidx->sym_type;
}

// Assembly:
subq $0x48, %rsp
movq %rdi, 0x28(%rsp)
movq %rsi, 0x20(%rsp)
movb $0x0, 0x1f(%rsp)
movq 0x28(%rsp), %rax
testb $0x1, 0x28(%rax)
jne 0x60f1
movq 0x28(%rsp), %rax
movb $0x1, 0x28(%rax)
movq 0x28(%rsp), %rax
movl $0x0, 0x38(%rax)
movq 0x28(%rsp), %rax
movb $0x0, 0x3c(%rax)
movb $0x1, 0x1f(%rsp)
movq 0x28(%rsp), %rdi
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rsi
callq 0x5d60
movq %rax, 0x8(%rsp)
movq %rdx, 0x10(%rsp)
movq 0x28(%rsp), %rax
testb $0x1, 0x3c(%rax)
je 0x6278
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rax
cmpl $0x0, 0x28(%rax)
jle 0x6278
movq 0x28(%rsp), %rdi
callq 0x5600
movq 0x28(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x28(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0x6, (%rax)
movq 0x28(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x28(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0x13, 0x8(%rax)
movq 0x28(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x28(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movb $0x1, 0xc(%rax)
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rax
movl 0x28(%rax), %edx
movl $0x8, %ecx
movl $0x4, %eax
cmpl $0x80, %edx
cmovgl %eax, %ecx
movq 0x28(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x28(%rsp), %rdx
imulq $0x28, 0x48(%rdx), %rdx
addq %rdx, %rax
movl %ecx, 0x10(%rax)
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rax
movl 0x28(%rax), %ecx
movq 0x28(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x28(%rsp), %rdx
imulq $0x28, 0x48(%rdx), %rdx
addq %rdx, %rax
movl %ecx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x48(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x48(%rax)
testb $0x1, 0x1f(%rsp)
jne 0x6276
movq 0x28(%rsp), %rdi
callq 0x5600
movq 0x28(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x28(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0xc, (%rax)
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rdi
addq $0x10, %rdi
callq 0x5670
movl %eax, %ecx
movq 0x28(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x28(%rsp), %rdx
imulq $0x28, 0x48(%rdx), %rdx
addq %rdx, %rax
movl %ecx, 0x8(%rax)
movq 0x28(%rsp), %rax
movq 0x48(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x48(%rax)
jmp 0x6293
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rax
movl 0x28(%rax), %ecx
movq 0x28(%rsp), %rax
addl 0x38(%rax), %ecx
movl %ecx, 0x38(%rax)
testb $0x1, 0x1f(%rsp)
je 0x63b9
movq 0x28(%rsp), %rax
testb $0x1, 0x40(%rax)
jne 0x63b0
movq 0x28(%rsp), %rdi
callq 0x5600
movq 0x28(%rsp), %rax
testb $0x1, 0x3c(%rax)
je 0x6314
movq 0x28(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x28(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0xc, (%rax)
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rdi
addq $0x10, %rdi
callq 0x5670
movl %eax, %ecx
movq 0x28(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x28(%rsp), %rdx
imulq $0x28, 0x48(%rdx), %rdx
addq %rdx, %rax
movl %ecx, 0x8(%rax)
jmp 0x639f
movq 0x28(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x28(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0x0, (%rax)
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rdi
addq $0x10, %rdi
callq 0x5670
movl %eax, %ecx
movq 0x28(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x28(%rsp), %rdx
imulq $0x28, 0x48(%rdx), %rdx
addq %rdx, %rax
movl %ecx, 0x18(%rax)
movq 0x28(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x28(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movl $0x2, 0x8(%rax)
movq 0x28(%rsp), %rax
movl 0x38(%rax), %ecx
movq 0x28(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x28(%rsp), %rdx
imulq $0x28, 0x48(%rdx), %rdx
addq %rdx, %rax
movl %ecx, 0x10(%rax)
movq 0x28(%rsp), %rax
movq 0x48(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x48(%rax)
movq 0x28(%rsp), %rax
movb $0x0, 0x28(%rax)
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rax
movups 0x10(%rax), %xmm0
movaps %xmm0, 0x30(%rsp)
movq 0x30(%rsp), %rax
movq 0x38(%rsp), %rdx
addq $0x48, %rsp
retq
nop