// File: /workspace/github_c_makefile_star2_O0/anuwu[P]ERPLAG-Compiler/codegen.c
// Function: codeGeneration
void codeGeneration(astNode *node)
{
	if (node == NULL)
		return;

	switch (node->id)
	{
		case program :
			codeGeneration (node->child->next) ;		// <otherModules>
			break ;

		case otherModules :
			codeGeneration (node->child) ;					// Do module definitions
			codeGeneration (node->next) ;					// <driverModule> or NULL
			break ;

		case module :
			codePrint ("\n%s:\n", strcmp(node->child->tok->lexeme , "main") ? node->child->tok->lexeme : "@main") ;
			codePrint ("\t\tPUSH RBP\n") ;
			codePrint ("\t\tMOV RBP, RSP\n\n") ;

			moduleGeneration (node->child->next->next->next, NULL) ;
			codeGeneration (node->next) ;					// Moving on to the next module

			break ;

		case driverModule :
			#ifdef __linux__
				codePrint ("\nmain:\n") ;
			#endif

			#ifdef __MACH__
				codePrint ("\n_main:\n") ;
			#endif

			#ifdef _WIN64
				codePrint ("\nWinMain:\n") ;
			#endif

			codePrint ("\t\tPUSH RBP\n") ;
			codePrint ("\t\tMOV RBP, RSP\n\n") ;

			moduleGeneration(node->child, NULL); 				// <statements>
			codeGeneration(node->next); 				// Move to the next child of program

			break ;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movq %rdi, -0x8(%rbp)
cmpq $0x0, -0x8(%rbp)
jne 0x49c8
jmp 0x4b4f
movq -0x8(%rbp), %rax
movl (%rax), %eax
movq %rax, -0x10(%rbp)
subq $0x9, %rax
ja 0x4b4f
movq -0x10(%rbp), %rax
leaq 0x10989(%rip), %rcx     # 0x15370
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq 0x38(%rax), %rdi
callq 0x49b0
jmp 0x4b4f
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rdi
callq 0x49b0
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rdi
callq 0x49b0
jmp 0x4b4f
leaq 0x188fc(%rip), %rax     # 0x1d328
movq (%rax), %rax
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
leaq 0x1133d(%rip), %rsi     # 0x15d87
callq 0x10c0
cmpl $0x0, %eax
je 0x4a6a
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
jmp 0x4a77
leaq 0x11315(%rip), %rax     # 0x15d86
movq %rax, -0x20(%rbp)
jmp 0x4a77
movq -0x18(%rbp), %rdi
movq -0x20(%rbp), %rdx
leaq 0x1131c(%rip), %rsi     # 0x15da2
movb $0x0, %al
callq 0x10d0
leaq 0x18894(%rip), %rax     # 0x1d328
movq (%rax), %rdi
leaq 0x1130a(%rip), %rsi     # 0x15da8
movb $0x0, %al
callq 0x10d0
leaq 0x1887c(%rip), %rax     # 0x1d328
movq (%rax), %rdi
leaq 0x112fe(%rip), %rsi     # 0x15db4
movb $0x0, %al
callq 0x10d0
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq 0x38(%rax), %rax
movq 0x38(%rax), %rax
movq 0x38(%rax), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x34f0
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rdi
callq 0x49b0
jmp 0x4b4f
leaq 0x18838(%rip), %rax     # 0x1d328
movq (%rax), %rdi
leaq 0x112cb(%rip), %rsi     # 0x15dc5
movb $0x0, %al
callq 0x10d0
leaq 0x18820(%rip), %rax     # 0x1d328
movq (%rax), %rdi
leaq 0x11296(%rip), %rsi     # 0x15da8
movb $0x0, %al
callq 0x10d0
leaq 0x18808(%rip), %rax     # 0x1d328
movq (%rax), %rdi
leaq 0x1128a(%rip), %rsi     # 0x15db4
movb $0x0, %al
callq 0x10d0
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x34f0
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rdi
callq 0x49b0
addq $0x20, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)