// File: /workspace/github_c_makefile_star2_O0/Encryptr[P]O-plus-plus/opp/ir/ir.c
// Function: oppir_eval_mov_arg
static void oppir_eval_mov_arg(struct OppIr* ir, struct OppIr_Arg* arg)
{
	if (arg->stop) {
		oppir_spill_all(ir);
		return;
	}

	struct Register reg = oppir_pop_reg(ir);

	if (arg->type != IMM_F64 && arg->type != IMM_F32) 
	{
		oppir_check_realloc(ir, 3);
		if (arg->idx < 2)
			IR_EMIT(0x48);
		else 
			IR_EMIT(0x49);
		IR_EMIT(0x89);
		switch (arg->idx)
		{
			case 0:
			case 1:
				IR_EMIT((0xc7 - arg->idx) +  (reg.reg*8));
				break;

			case 2:
			case 3:
				IR_EMIT((0xc2 + (arg->idx-2)) + (reg.reg*8));
				break;
			
			case 4:
			case 5:
				IR_EMIT((0xc0 + (arg->idx-4)) + (reg.reg*8));
				break;
		}
	}
	else 
	{
		if ((reg.reg-3) == arg->idx)
			return;

		oppir_check_realloc(ir, 4);
		if (arg->type == IMM_F64)
			IR_EMIT(0xf2);
		else
			IR_EMIT(0xf3);
		IR_EMIT(0x0f);
		IR_EMIT(0x10);
		IR_EMIT((0xc0 + (arg->idx*8)) + reg.reg-3);
	}
}

// Assembly:
subq $0x28, %rsp
movq %rdi, 0x20(%rsp)
movq %rsi, 0x18(%rsp)
movq 0x18(%rsp), %rax
testb $0x1, 0x8(%rax)
je 0xaa88
movq 0x20(%rsp), %rdi
callq 0xd070
jmp 0xacfd
movq 0x20(%rsp), %rdi
callq 0xc780
movq %rax, 0x8(%rsp)
movq %rdx, 0x10(%rsp)
movq 0x18(%rsp), %rax
cmpl $0xc, (%rax)
je 0xac14
movq 0x18(%rsp), %rax
cmpl $0xb, (%rax)
je 0xac14
movq 0x20(%rsp), %rdi
movl $0x3, %esi
callq 0x9750
movq 0x18(%rsp), %rax
cmpl $0x2, 0x4(%rax)
jae 0xaaf4
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 $0x48, (%rax,%rcx)
jmp 0xab14
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 $0x49, (%rax,%rcx)
movq 0x20(%rsp), %rdx
movq (%rdx), %rax
movq 0x8(%rdx), %rcx
movq %rcx, %rsi
incq %rsi
movq %rsi, 0x8(%rdx)
movb $-0x77, (%rax,%rcx)
movq 0x18(%rsp), %rax
movl 0x4(%rax), %eax
movl %eax, 0x4(%rsp)
subl $0x2, %eax
jb 0xab60
jmp 0xab41
movl 0x4(%rsp), %eax
addl $-0x2, %eax
subl $0x2, %eax
jb 0xab99
jmp 0xab4f
movl 0x4(%rsp), %eax
addl $-0x4, %eax
subl $0x2, %eax
jb 0xabd5
jmp 0xac0f
movq 0x18(%rsp), %rcx
movl $0xc7, %eax
subl 0x4(%rcx), %eax
movl 0x8(%rsp), %ecx
shll $0x3, %ecx
addl %ecx, %eax
movb %al, %dl
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rsi
movq 0x8(%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, 0x8(%rsi)
movb %dl, (%rax,%rcx)
jmp 0xac0f
movq 0x18(%rsp), %rax
movl 0x4(%rax), %eax
subl $0x2, %eax
addl $0xc2, %eax
movl 0x8(%rsp), %ecx
shll $0x3, %ecx
addl %ecx, %eax
movb %al, %dl
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rsi
movq 0x8(%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, 0x8(%rsi)
movb %dl, (%rax,%rcx)
jmp 0xac0f
movq 0x18(%rsp), %rax
movl 0x4(%rax), %eax
subl $0x4, %eax
addl $0xc0, %eax
movl 0x8(%rsp), %ecx
shll $0x3, %ecx
addl %ecx, %eax
movb %al, %dl
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rsi
movq 0x8(%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, 0x8(%rsi)
movb %dl, (%rax,%rcx)
jmp 0xacfd
movl 0x8(%rsp), %eax
subl $0x3, %eax
movq 0x18(%rsp), %rcx
cmpl 0x4(%rcx), %eax
jne 0xac2a
jmp 0xacfd
movq 0x20(%rsp), %rdi
movl $0x4, %esi
callq 0x9750
movq 0x18(%rsp), %rax
cmpl $0xc, (%rax)
jne 0xac65
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 $-0xe, (%rax,%rcx)
jmp 0xac85
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 $-0xd, (%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 $0xf, (%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 $0x10, (%rax,%rcx)
movq 0x18(%rsp), %rax
movl 0x4(%rax), %eax
shll $0x3, %eax
addl $0xc0, %eax
addl 0x8(%rsp), %eax
subl $0x3, %eax
movb %al, %dl
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq 0x20(%rsp), %rsi
movq 0x8(%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, 0x8(%rsi)
movb %dl, (%rax,%rcx)
addq $0x28, %rsp
retq
nopw %cs:(%rax,%rax)