// File: mlugo2[P]SunshineGPU/src/gpu.cpp
// Function: gpu::geometry_processor()
void gpu::geometry_processor()
{

	// Initialize program counter
	u8 pc = 0;
	u8 opcode;
	u64 instruction;

	bool end = false;

	// Start
	while (!end)
	{
		// Fetch
		instruction = instruction_mem[pc++];

		opcode = get_opcode(instruction);

		// Decode
		switch(opcode)
		{
			case 0x01:		// MOV
				mov_instr(instruction);
				break;

			case 0x02:		// MUL
				mul_instr(instruction);
				break;

			case 0x03:		// ADD
				add_instr(instruction);
				break;

			case 0x04:		// MAD
				mad_instr(instruction);
				break;

			case 0x05:		// DST
				dst_instr(instruction);
				break;

			case 0x06:		// MIN
				min_instr(instruction);
				break;

			case 0x07:		// MAX
				max_instr(instruction);
				break;

			case 0x08:		// SLT
				slt_instr(instruction);
				break;

			case 0x09:		// SGE
				sge_instr(instruction);
				break;

			case 0x0A:		// RCP
				rcp_instr(instruction);
				break;

			case 0x0B:		// RSQ
				rsq_instr(instruction);
				break;

			case 0x0C:		// DP3
				dp3_instr(instruction);
				break;

			case 0x0D:		// DP4
				dp4_instr(instruction);
				break;

			case 0x0E:		// LOG
				log_instr(instruction);
				break;

			case 0x0F:		// EXP
				exp_instr(instruction);
				break;

			case 0x10:		// LIT
				lit_instr(instruction);
				break;

			case 0x11:		// ARL

				break;

			case 0x3F:
			default:
				end = true;
				break;
		}
	} // end of while
}

// Assembly:
subq $0x38, %rsp
movq %rdi, 0x30(%rsp)
movq 0x30(%rsp), %rax
movq %rax, 0x10(%rsp)
movb $0x0, 0x2f(%rsp)
movb $0x0, 0x1f(%rsp)
movb 0x1f(%rsp), %al
xorb $-0x1, %al
testb $0x1, %al
jne 0xcd6c
jmp 0xcefe
movq 0x10(%rsp), %rdi
movzbl 0x2f(%rsp), %eax
movb %al, %cl
incb %cl
movb %cl, 0x2f(%rsp)
movq 0x7d9c0(%rdi,%rax,8), %rax
movq %rax, 0x20(%rsp)
movq 0x20(%rsp), %rsi
callq 0xd560
movb %al, 0x2e(%rsp)
movzbl 0x2e(%rsp), %eax
decl %eax
movl %eax, %ecx
movq %rcx, 0x8(%rsp)
subl $0x3e, %eax
ja 0xcef4
movq 0x8(%rsp), %rax
leaq 0x8450(%rip), %rcx      # 0x1520c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0xd580
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0xd920
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0xdee0
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0xe4a0
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0xed90
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0xf2b0
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0xfa90
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0x10250
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0x10b20
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0x113f0
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0x11790
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0x11b10
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0x120b0
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0x126a0
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0x12a30
jmp 0xcef9
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
callq 0x12da0
jmp 0xcef9
jmp 0xcef9
jmp 0xcef4
movb $0x1, 0x1f(%rsp)
jmp 0xcd5d
addq $0x38, %rsp
retq
nopw %cs:(%rax,%rax)