// File: /workspace/github_c_makefile_star2_O0/Encryptr[P]O-plus-plus/opp/ir/ir.c
// Function: oppir_eval_call
static void oppir_eval_call(struct OppIr* ir, struct OppIr_Call* call)
{
	struct Register reg = {0};

	if (call->extra_args > 2) {
		oppir_check_realloc(ir, 3);
		IR_EMIT(0x4c); IR_EMIT(0x89); IR_EMIT(0xd2);
		if (call->extra_args > 3) {
			IR_EMIT(0x4c); IR_EMIT(0x89); IR_EMIT(0xd9);
		}
	}

	oppir_spill_all(ir);

	if (call->imm) {
		oppir_check_realloc(ir, 4);
		IR_EMIT(0xe8);
		make_reloc(ir->code.idx, call->name, 4);
		IR_EMIT(0x00);
		IR_EMIT(0x00);
		IR_EMIT(0x00);
		IR_EMIT(0x00);
	}
	else {
		assert(false);
	}

	if (call->ret) {
		reg.reg = 
			call->ret_type == IMM_F32 || 
			call->ret_type == IMM_F64 
			? REG_XMM0 : REG_RAX;
		reg.type = call->ret_type;
		oppir_push(ir, reg);
	}
}

// Assembly:
subq $0x28, %rsp
movq %rdi, 0x20(%rsp)
movq %rsi, 0x18(%rsp)
leaq 0x8(%rsp), %rdi
xorl %esi, %esi
movl $0x10, %edx
callq 0x10f0
movq 0x18(%rsp), %rax
cmpl $0x2, 0x8(%rax)
jle 0xa8ea
movq 0x20(%rsp), %rdi
movl $0x3, %esi
callq 0x9750
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rdx
movq 0x8(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x8(%rdx)
movb $0x4c, (%rax,%rcx)
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rdx
movq 0x8(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x8(%rdx)
movb $-0x77, (%rax,%rcx)
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rdx
movq 0x8(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x8(%rdx)
movb $-0x2e, (%rax,%rcx)
movq 0x18(%rsp), %rax
cmpl $0x3, 0x8(%rax)
jle 0xa8e8
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rdx
movq 0x8(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x8(%rdx)
movb $0x4c, (%rax,%rcx)
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rdx
movq 0x8(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x8(%rdx)
movb $-0x77, (%rax,%rcx)
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rdx
movq 0x8(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x8(%rdx)
movb $-0x27, (%rax,%rcx)
jmp 0xa8ea
movq 0x20(%rsp), %rdi
callq 0xd070
movq 0x18(%rsp), %rax
testb $0x1, 0x4(%rax)
je 0xa9d2
movq 0x20(%rsp), %rdi
movl $0x4, %esi
callq 0x9750
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rdx
movq 0x8(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x8(%rdx)
movb $-0x18, (%rax,%rcx)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movl %eax, %edi
movq 0x18(%rsp), %rax
movq 0x10(%rax), %rsi
movl $0x4, %edx
callq 0xd620
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rdx
movq 0x8(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x8(%rdx)
movb $0x0, (%rax,%rcx)
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rdx
movq 0x8(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x8(%rdx)
movb $0x0, (%rax,%rcx)
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rdx
movq 0x8(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x8(%rdx)
movb $0x0, (%rax,%rcx)
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rdx
movq 0x8(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x8(%rdx)
movb $0x0, (%rax,%rcx)
jmp 0xa9f1
leaq 0x937e(%rip), %rdi      # 0x13d57
leaq 0x9aaa(%rip), %rsi      # 0x1448a
movl $0x535, %edx            # imm = 0x535
leaq 0x9bb3(%rip), %rcx      # 0x1459f
callq 0x10e0
movq 0x18(%rsp), %rax
testb $0x1, 0x5(%rax)
je 0xaa4f
movq 0x18(%rsp), %rcx
movb $0x1, %al
cmpl $0xb, (%rcx)
movb %al, 0x7(%rsp)
je 0xaa1b
movq 0x18(%rsp), %rax
cmpl $0xc, (%rax)
sete %al
movb %al, 0x7(%rsp)
movb 0x7(%rsp), %dl
xorl %eax, %eax
movl $0x3, %ecx
testb $0x1, %dl
cmovnel %ecx, %eax
movl %eax, 0x8(%rsp)
movq 0x18(%rsp), %rax
movl (%rax), %eax
movl %eax, 0xc(%rsp)
movq 0x20(%rsp), %rdi
movq 0x8(%rsp), %rsi
movq 0x10(%rsp), %rdx
callq 0xcfa0
addq $0x28, %rsp
retq
nopw %cs:(%rax,%rax)