// File: /workspace/github_c_makefile_star2_O0/Encryptr[P]O-plus-plus/opp/compiler/compile_stmt.c
// Function: opp_compile_call
Opp_Obj opp_compile_call(struct Opp_Context* opp, struct Opp_Node* call, bool stmt)
{
	assert(call->call_expr.callee->type != EDOT);

	if (call->call_expr.callee->type == EUNARY) {
		struct Opp_Bucket* b = call->call_expr.callee->unary_expr.bidx;

		for (int i = call->call_expr.args->length-1; i >= 0; i--) {
			Opp_Obj t = opp_compile_expr(opp, call->call_expr.args->list[i]);

			opp_type_cast(opp, &b->args->args[i].var_stmt.type, &t);
		}
		
		OPCODE_START();
			OPCODE_TYPE(OPCODE_MOV_ARG);
			opp->ir.opcodes[opp->ir.instr_idx].arg.stop = true;
		OPCODE_END();

		int Iidx = 0;
		int Fidx = 0;
		for (int i = 0; i < call->call_expr.args->length; i++) {
			int idx = 0;

			if ((b->args->args[i].var_stmt.type.decl->t_type == TYPE_FLOAT || 
				b->args->args[i].var_stmt.type.decl->t_type == TYPE_DOUBLE) &&
				b->args->args[i].var_stmt.type.depth == 0)
				idx = Fidx++;
			else
				idx = Iidx++;


			OPCODE_START();
				OPCODE_TYPE(OPCODE_MOV_ARG);
				opp->ir.opcodes[opp->ir.instr_idx].arg.idx = idx;
				opp->ir.opcodes[opp->ir.instr_idx].arg.type = 
					opp_type_to_ir(&b->args->args[i].var_stmt.type);
			OPCODE_END();
		}

		OPCODE_START();
			OPCODE_TYPE(OPCODE_CALL);
			opp->ir.opcodes[opp->ir.instr_idx].call.name = 
				call->call_expr.callee->unary_expr.val.strval;
			opp->ir.opcodes[opp->ir.instr_idx].call.imm = 1;
			if (b->sym_type.decl->t_type == TYPE_VOID) {
				opp->ir.opcodes[opp->ir.instr_idx].call.ret = 0;
			}
			else {
				opp->ir.opcodes[opp->ir.instr_idx].call.ret = stmt;
				opp->ir.opcodes[opp->ir.instr_idx].call.ret_type = 
					opp_type_to_ir(&b->sym_type);
			}
			opp->ir.opcodes[opp->ir.instr_idx].call.extra_args = 
				call->call_expr.args->length;
		OPCODE_END();

		return b->sym_type;
	}
}

// Assembly:
subq $0x58, %rsp
movb %dl, %al
movq %rdi, 0x40(%rsp)
movq %rsi, 0x38(%rsp)
andb $0x1, %al
movb %al, 0x37(%rsp)
movq 0x38(%rsp), %rax
movq 0x10(%rax), %rax
cmpl $0xd, (%rax)
je 0x83b6
jmp 0x83d5
leaq 0xbe7b(%rip), %rdi      # 0x14238
leaq 0xbe99(%rip), %rsi      # 0x1425d
movl $0x55, %edx
leaq 0xbea9(%rip), %rcx      # 0x14279
callq 0x10e0
movq 0x38(%rsp), %rax
movq 0x10(%rax), %rax
cmpl $0x5, (%rax)
jne 0x874b
movq 0x38(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x20(%rax), %rax
movq %rax, 0x28(%rsp)
movq 0x38(%rsp), %rax
movq 0x18(%rax), %rax
movl (%rax), %eax
subl $0x1, %eax
movl %eax, 0x24(%rsp)
cmpl $0x0, 0x24(%rsp)
jl 0x8475
movq 0x40(%rsp), %rdi
movq 0x38(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
movslq 0x24(%rsp), %rcx
movq (%rax,%rcx,8), %rsi
callq 0x5d60
movq %rax, 0x10(%rsp)
movq %rdx, 0x18(%rsp)
movq 0x40(%rsp), %rdi
movq 0x28(%rsp), %rax
movq 0x28(%rax), %rax
movq 0x28(%rax), %rsi
movslq 0x24(%rsp), %rax
imulq $0x48, %rax, %rax
addq %rax, %rsi
addq $0x10, %rsi
leaq 0x10(%rsp), %rdx
callq 0x5820
movl 0x24(%rsp), %eax
addl $-0x1, %eax
movl %eax, 0x24(%rsp)
jmp 0x840b
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 $0x4, (%rax)
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movb $0x1, 0x10(%rax)
movq 0x40(%rsp), %rax
movq 0x48(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x48(%rax)
movl $0x0, 0xc(%rsp)
movl $0x0, 0x8(%rsp)
movl $0x0, 0x4(%rsp)
movl 0x4(%rsp), %eax
movq 0x38(%rsp), %rcx
movq 0x18(%rcx), %rcx
cmpl (%rcx), %eax
jae 0x8624
movl $0x0, (%rsp)
movq 0x28(%rsp), %rax
movq 0x28(%rax), %rax
movq 0x28(%rax), %rax
movslq 0x4(%rsp), %rcx
imulq $0x48, %rcx, %rcx
addq %rcx, %rax
movq 0x10(%rax), %rax
cmpl $0x5, 0x8(%rax)
je 0x8540
movq 0x28(%rsp), %rax
movq 0x28(%rax), %rax
movq 0x28(%rax), %rax
movslq 0x4(%rsp), %rcx
imulq $0x48, %rcx, %rcx
addq %rcx, %rax
movq 0x10(%rax), %rax
cmpl $0x6, 0x8(%rax)
jne 0x8574
movq 0x28(%rsp), %rax
movq 0x28(%rax), %rax
movq 0x28(%rax), %rax
movslq 0x4(%rsp), %rcx
imulq $0x48, %rcx, %rcx
addq %rcx, %rax
movzwl 0x18(%rax), %eax
cmpl $0x0, %eax
jne 0x8574
movl 0x8(%rsp), %eax
movl %eax, %ecx
addl $0x1, %ecx
movl %ecx, 0x8(%rsp)
movl %eax, (%rsp)
jmp 0x8584
movl 0xc(%rsp), %eax
movl %eax, %ecx
addl $0x1, %ecx
movl %ecx, 0xc(%rsp)
movl %eax, (%rsp)
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 $0x4, (%rax)
movl (%rsp), %ecx
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rdx
imulq $0x28, 0x48(%rdx), %rdx
addq %rdx, %rax
movl %ecx, 0xc(%rax)
movq 0x28(%rsp), %rax
movq 0x28(%rax), %rax
movq 0x28(%rax), %rdi
movslq 0x4(%rsp), %rax
imulq $0x48, %rax, %rax
addq %rax, %rdi
addq $0x10, %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)
movl 0x4(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x4(%rsp)
jmp 0x84de
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 $0x1, (%rax)
movq 0x38(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x18(%rax), %rcx
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rdx
imulq $0x28, 0x48(%rdx), %rdx
addq %rdx, %rax
movq %rcx, 0x18(%rax)
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movb $0x1, 0xc(%rax)
movq 0x28(%rsp), %rax
movq 0x10(%rax), %rax
cmpl $0x0, 0x8(%rax)
jne 0x86b6
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rcx
imulq $0x28, 0x48(%rcx), %rcx
addq %rcx, %rax
movb $0x0, 0xd(%rax)
jmp 0x86ff
movb 0x37(%rsp), %cl
movq 0x40(%rsp), %rax
movq 0x58(%rax), %rax
movq 0x40(%rsp), %rdx
imulq $0x28, 0x48(%rdx), %rdx
addq %rdx, %rax
andb $0x1, %cl
movb %cl, 0xd(%rax)
movq 0x28(%rsp), %rdi
addq $0x10, %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 0x38(%rsp), %rax
movq 0x18(%rax), %rax
movl (%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)
movq 0x28(%rsp), %rax
movq 0x10(%rax), %rcx
movq %rcx, 0x48(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x50(%rsp)
movq 0x48(%rsp), %rax
movq 0x50(%rsp), %rdx
addq $0x58, %rsp
retq
nopw (%rax,%rax)