Beispiel #1
0
static inline void JIT_visit(ASTNode *node, int regs[], int reg) {
  switch(node->type) {
    case AST_BINARY_OP: {
      ASTBinaryOp *binary_op = (ASTBinaryOp*)node;

      int a_reg = alloc_reg(regs);
      JIT_visit(binary_op->lhs, regs, a_reg);
      int b_reg = alloc_reg(regs);
      JIT_visit(binary_op->rhs, regs, b_reg);

      switch(binary_op->op) {
        case '+': jit_addr_i(reg, a_reg, b_reg); break;
        case '-': jit_subr_i(reg, a_reg, b_reg); break;
        case '*': jit_mulr_i(reg, a_reg, b_reg); break;
        case '/': jit_divr_i(reg, a_reg, b_reg); break;
      }

      free_reg(regs, a_reg);
      free_reg(regs, b_reg);
      break;
    }
    case AST_INT: {
      jit_movi_i(reg, ((ASTInt*)node)->value);
      break;
    }
  }
}
Beispiel #2
0
void CRegRequirementList::Free()
{
	reglist::iterator it;
	varlist::iterator vit;
	reg_item	*item;
	var_item	*vitem;
	int i;
	
	for(i = m_rlist.size(), it = m_rlist.begin(); i; i--, it++){
		item = &(*it);
		free_reg(&item->addr, item->length);
	}

	for(i = m_vlist.size(), vit = m_vlist.begin(); i; i--, vit++){
		vitem = &(vit->second);
		if(vitem->var->blk == sections){
			//
			// reference to a global variable
			//
			vitem->var->ref_count -= vitem->ref_count;
		}else{
			vitem->var->blk_uuid = vitem->blk_id;
			delete_variable(vitem->var);
		}
	}

	m_rlist.clear();
	m_vlist.clear();
}
Beispiel #3
0
int main(int argc, char *argv[])
{
    FILE *binfile;
    int max_steps = MAX_STEP;
    y86sim_t *sim;
    mem_t *saver, *savem;
    int step = 0;
    stat_t e = STAT_AOK;

    if (argc < 2 || argc > 3)
        usage(argv[0]);

    /* set max steps */
    if (argc > 2)
        max_steps = atoi(argv[2]);

    /* load binary file to memory */
    if (strcmp(argv[1]+(strlen(argv[1])-4), ".bin"))
        usage(argv[0]); /* only support *.bin file */
    
    binfile = fopen(argv[1], "rb");
    if (!binfile) {
        err_print("Can't open binary file '%s'", argv[1]);
        exit(1);
    }

    sim = new_y86sim(MEM_SIZE);
    if (load_binfile(sim->m, binfile) < 0) {
        err_print("Failed to load binary file '%s'", argv[1]);
        free_y86sim(sim);
        exit(1);
    }
    fclose(binfile);

    /* save initial register and memory stat */
    saver = dup_reg(sim->r);
    savem = dup_mem(sim->m);

    /* execute binary code step-by-step */
    for (step = 0; step < max_steps && e == STAT_AOK; step++)
        e = nexti(sim);

    /* print final stat of y86sim */
    printf("Stopped in %d steps at PC = 0x%x.  Status '%s', CC %s\n",
            step, sim->pc, stat_name(e), cc_name(sim->cc));

    printf("Changes to registers:\n");
    diff_reg(saver, sim->r, stdout);

    printf("\nChanges to memory:\n");
    diff_mem(savem, sim->m, stdout);

    free_y86sim(sim);
    free_reg(saver);
    free_mem(savem);

    return 0;
}
int main(int argc, char *argv[])
{
    FILE *code_file;
    int max_steps = 10000;

    // edit by leo
    init_sharemem();
    // edit end
	

    state_ptr s = new_state(MEM_SIZE);
    
    mem_t saver = copy_reg(s->r);
    mem_t savem;
    int step = 0;

    stat_t e = STAT_AOK;

    if (argc < 2 || argc > 3)
	usage(argv[0]);
    code_file = fopen(argv[1], "r");
    if (!code_file) {
	fprintf(stderr, "Can't open code file '%s'\n", argv[1]);
	exit(1);
    }
    
    if (!load_mem(s->m, code_file, 1)) {
	printf("Exiting\n");
	return 1;
    }    
    savem = copy_mem(s->m);
  
    // edit by leo
    // printf("error happen after here!\n");
    // edit end
    if (argc > 2)
	max_steps = atoi(argv[2]);

    for (step = 0; step < max_steps && e == STAT_AOK; step++)
	e = step_state(s, stdout);
    
    
    printf("Stopped in %d steps at PC = 0x%x.  Status '%s', CC %s\n",
	   step, s->pc, stat_name(e), cc_name(s->cc));

    printf("Changes to registers:\n");
    diff_reg(saver, s->r, stdout);

    printf("\nChanges to memory:\n");
    diff_mem(savem, s->m, stdout);

    free_state(s);
    free_reg(saver);
    free_mem(savem);

    return 0;
}
Beispiel #5
0
void function_gen(char *name,struct ASTNode *body) {

  int r1;
  struct Gsymbol *g=GLookup(name);   
  fprintf(fp,"LL%d:\n",g->binding);
  fprintf(fp,"PUSH BP\n");
  fprintf(fp,"MOV BP SP\n");
  struct Lsymbol *temp=LSymbolHead;
  free_all_regs();
  r1=get_reg();
  
  
  while(temp) {
    if(temp->ref==0) {
      fprintf(fp,"PUSH R%d\n",r1);
    }
    temp=temp->next;
  }
  free_reg();
  printf("ffefwefwef1\n");

  code_gen(body);

  
  r1=get_reg();
  temp=LSymbolHead;

  while(temp) {
    if(temp->ref==0) {
      fprintf(fp,"POP R%d\n",r1);
    }
    temp=temp->next;
  }
  free_reg();
  free_all_regs();
  fprintf(fp,"POP BP\n");
  fprintf(fp,"RET\n");

}
int main(int argc, char *argv[])
{
    FILE *code_file;
    int max_steps = 10000;

    state_ptr s = new_state(MEM_SIZE);
    mem_t saver = copy_reg(s->r);
    mem_t savem;
    int step = 0;

    exc_t e = EXC_NONE;

    if (argc < 2 || argc > 3)
	usage(argv[0]);
    code_file = fopen(argv[1], "r");
    if (!code_file) {
	fprintf(stderr, "Can't open code file '%s'\n", argv[1]);
	exit(1);
    }

    if (!load_mem(s->m, code_file, 1)) {
	printf("Exiting\n");
	return 1;
    }

    savem = copy_mem(s->m);
  
    if (argc > 2)
	max_steps = atoi(argv[2]);

    for (step = 0; step < max_steps && e == EXC_NONE; step++)
	e = step_state(s, stdout);

    printf("Stopped in %d steps at PC = 0x%x.  Exception '%s', CC %s\n",
	   step, s->pc, exc_name(e), cc_name(s->cc));

    printf("Changes to registers:\n");
    diff_reg(saver, s->r, stdout);

    printf("\nChanges to memory:\n");
    diff_mem(savem, s->m, stdout);

    free_state(s);
    free_reg(saver);
    free_mem(savem);

    return 0;
}
Beispiel #7
0
int main(int argc,char** argv) {

    if (argc != 3) {
        fprintf(stderr,"usage: RE216_CLIENT hostname port\n");
        return 1;
    }
    
	// -----------------------------------------------------------------
	// ------------------------ Variables ------------------------------
	
	// Buffer
	char *input = NULL;		// Taille d'entrée dynamique
	char output[TAILLE_MSG];// Taille de réception fixée
    
	// Liste chaînée pour l'envoi de fichiers
	struct file fichiers;
		memset(&fichiers, 0, sizeof(struct file));

	// Récupération de la structure sockaddr_in6 pour l'adresse du serveur
	struct sockaddr_in6* server_add = get_addr_info(atoi(argv[2]), argv[1]);

	// Création de la socket
	int sckt = do_socket();  

	// Connexion de la socket à l'adresse server_add
	int conn = do_connect(sckt, *server_add);

	// Initialisation des tableaux pour utliser select ------------------
    
    fd_set fd_set_read; // Ici seront stockés les descripteurs de fichier
    
    int i, select_ret_val;
    
    // Socket du serveur quand elle existe
    int socket_fichier = -1;
    
    // Eventuellement : timeout du select
	//~ struct timeval tv;
	//~ tv.tv_sec = 5;
	//~ tv.tv_usec = 0;
	
	init_reg();
	// -----------------------------------------------------------------
	// -----------------------------------------------------------------
	
	start_line();

	// Boucle jusqu'à recevoir le "/quit" final
	do {
		
		// ------------------------ R.A.Z ------------------------------
		// clean the set before adding file descriptors
		FD_ZERO(&fd_set_read);
		
		// add the fd for server connection
		FD_SET(sckt, &fd_set_read);

		// add the fd for user-input
		FD_SET(fileno(stdin), &fd_set_read);
		// -------------------------------------------------------------
		 
		// we now wait for any file descriptor to be available for reading
        select_ret_val = select(sckt + 1, &fd_set_read, NULL, NULL, NULL);//&tv);
        
        if (select_ret_val == -1) {
			error("Erreur concernant le select ");
		}
        
        //printf("Le retour de la fonction select est : %i", select_ret_val);
		
		for (i = 0; i < (sckt+1) && select_ret_val > 0; i++) {
	
            // Le buffer est nettoyé avec memset directement dans les fonctions
            
            //printf("Bonjour je suis le i n°%i. Retour => %i\n", i, select_ret_val);

            // Si le file descripteur i est dans le set mis en écoute, c'est qu'il y a une activité
            if (FD_ISSET(i, &fd_set_read)) {
				
				// printf("Descripteur trouvé : %i\n", i);

                if (i == fileno(stdin)) // C'est une entrée utilisateur
					client_write(&input, sckt, &fichiers);
				
				else // Les données viennent du serveur
					if (!client_read(sckt, output, &fichiers, &socket_fichier))
						break;

                // Select_ret_val est le nombre de descripteurs où il y 
                // a eu une activité, on diminue donc sa valeur au fur
                // et à mesure.
                select_ret_val--;

            }
        }

	} while(notquit(input) && notquit(output));

	//printf("Extinction.\n");

	free(input);
	
	free_file(&fichiers);

	free_reg();

	// Fermeture de la socket
    close_socket(sckt);
    
	printf("Fin du tchat\n");
	
    return 0;
}
Beispiel #8
0
void free_y86sim(y86sim_t *sim)
{
    free_reg(sim->r);
    free_mem(sim->m);
    free((void *) sim);
}
Beispiel #9
0
void free_state(state_ptr s)
{
    free_reg(s->r);
    free_mem(s->m);
    free((void *) s);
}
Beispiel #10
0
/* 
 * run_tty_sim - Run the simulator in TTY mode
 */
static void run_tty_sim() 
{
    int icount = 0;
    byte_t run_status = STAT_AOK;
    cc_t result_cc = 0;
    int byte_cnt = 0;
    mem_t mem0, reg0;
    state_ptr isa_state = NULL;


    /* In TTY mode, the default object file comes from stdin */
    if (!object_file) {
        object_file = stdin;
    }

    if (verbosity >= 2)
        sim_set_dumpfile(stdout);
    sim_init();

    /* Emit simulator name */
    if (verbosity >= 2)
        printf("%s\n", simname);

    byte_cnt = load_mem(mem, object_file, 1, START_PLACE);
    if (byte_cnt == 0) {
        fprintf(stderr, "No lines of code found\n");
        exit(1);
    } else if (verbosity >= 2) {
        printf("%d bytes of code read\n", byte_cnt);
    }
    fclose(object_file);
    if (do_check) {
        isa_state = new_state(0);
        free_reg(isa_state->r);
        free_mem(isa_state->m);
        isa_state->m = copy_mem(mem);
        isa_state->r = copy_reg(reg);
        isa_state->cc = cc;
    }

    if(verbosity > 0){
        mem0 = copy_mem(mem);
        reg0 = copy_reg(reg);
    }

    icount = sim_run_pipe(instr_limit, 5*instr_limit, &run_status, &result_cc);
    if (verbosity > 0) {
        printf("%d instructions executed\n", icount);
        printf("Status = %s\n", stat_name(run_status));
        printf("Condition Codes: %s\n", cc_name(result_cc));
        printf("Changed Register State:\n");
        diff_reg(reg0, reg, stdout);
        printf("Changed Memory State:\n");
        diff_mem(mem0, mem, stdout);
    }
    if (do_check) {
        exit(0);
        byte_t e = STAT_AOK;
        int step;
        bool_t match = TRUE;

        for (step = 0; step < instr_limit && e == STAT_AOK; step++) {
            e = step_state(isa_state, stdout);
        }

        if (diff_reg(isa_state->r, reg, NULL)) {
            match = FALSE;
            if (verbosity > 0) {
                printf("ISA Register != Pipeline Register File\n");
                diff_reg(isa_state->r, reg, stdout);
            }
        }
        if (diff_mem(isa_state->m, mem, NULL)) {
            match = FALSE;
            if (verbosity > 0) {
                printf("ISA Memory != Pipeline Memory\n");
                diff_mem(isa_state->m, mem, stdout);
            }
        }
        if (isa_state->cc != result_cc) {
            match = FALSE;
            if (verbosity > 0) {
                printf("ISA Cond. Codes (%s) != Pipeline Cond. Codes (%s)\n",
                        cc_name(isa_state->cc), cc_name(result_cc));
            }
        }
        if (match) {
            printf("ISA Check Succeeds\n");
        } else {
            printf("ISA Check Fails\n");
        }
    }

    /* Emit CPI statistics */
    {
        double cpi = instructions > 0 ? (double) cycles/instructions : 1.0;
        printf("%d CPI: %d cycles/%d instructions = %.2f\n", PSIM_ID,
                cycles, instructions, cpi);
    }
}
Beispiel #11
0
int code_gen (struct ASTNode * root) {
  int l1,l2,r,r1,r2,r3,r4,bind;
  struct Fieldlist *field;
    if(!root) 
      return 0;
    
      switch(root->node) {

      
          case NODETYPE_MUL :

                r1=code_gen(root->ptr1);
                GetVal(root->ptr1,r1);
                r2=code_gen(root->ptr2);
                 GetVal(root->ptr2,r2);

                fprintf(fp,"MUL R%d R%d\n",r1,r2);
                free_reg();
                return r1;

           case NODETYPE_PLUS :
                r1=code_gen(root->ptr1);
                 GetVal(root->ptr1,r1);
                r2=code_gen(root->ptr2);
                 GetVal(root->ptr2,r2);

                fprintf(fp,"ADD R%d R%d\n",r1,r2);
                free_reg();
                return r1;

           
            case NODETYPE_MINUS :
                r1=code_gen(root->ptr1);
              GetVal(root->ptr1,r1);
                r2=code_gen(root->ptr2);
                GetVal(root->ptr2,r2);

                fprintf(fp,"SUB R%d R%d\n",r1,r2);
                free_reg();
                return r1;

            case NODETYPE_MOD :
                r1=code_gen(root->ptr1);
                 GetVal(root->ptr1,r1);
                r2=code_gen(root->ptr2);
                 GetVal(root->ptr2,r2);

                fprintf(fp,"MOD R%d R%d\n",r1,r2);

                free_reg();
                return r1;    

            case NODETYPE_DIV :
                r1=code_gen(root->ptr1);
                 GetVal(root->ptr1,r1);
                r2=code_gen(root->ptr2);
                 GetVal(root->ptr2,r2);

                fprintf(fp,"DIV R%d R%d\n",r1,r2);
                free_reg();
                return r1;
            
            
            case NODETYPE_FIELD_END:
                r1=code_gen(root->ptr1);
                field=IsField(root->ptr1->type,root->ptr2->name);
                r2=get_reg();
                fprintf(fp,"MOV R%d %d\n",r2,field->field_num);
                fprintf(fp,"ADD R%d R%d\n",r1,r2);
               
                free_reg();
                return r1;
               
           case NODETYPE_FIELD:
                r1=code_gen(root->ptr1);
                field=IsField(root->ptr1->type,root->ptr2->name);
                r2=get_reg();
                fprintf(fp,"MOV R%d %d\n",r2,field->field_num);
                fprintf(fp,"ADD R%d R%d\n",r1,r2);
                fprintf(fp,"MOV R%d [R%d]\n",r1,r1);
                
      
                free_reg();
                return r1;

           case NODETYPE_ASGN_PAIR:
              printf("frienas");
                if(root->ptr2->node==NODETYPE_FUNC)
                {
                	r1=code_gen(root->ptr2);
                	fprintf(fp, "// im here\n");

                		if(root->ptr1->Lentry)
                		{
                			r2=get_reg();
                   			r3=get_reg();
                   			fprintf(fp,"MOV R%d %d\n",r2,root->ptr1->Lentry->binding);
                   			fprintf(fp,"MOV R%d BP\n",r3);
           					fprintf(fp,"ADD R%d R%d\n",r2,r3);
           					fprintf(fp,"MOV [R%d] [R%d]\n",r2,r1);
           					fprintf(fp,"INR R%d\n",r2);
           					fprintf(fp,"INR R%d\n",r1);
           					fprintf(fp,"MOV [R%d] [R%d]\n",r2,r1);

           					free_reg();
           					free_reg();

                		}
                		else
                		{	r2=get_reg();
                   			fprintf(fp,"MOV R%d %d\n",r2,root->ptr1->Lentry->binding);
                   				fprintf(fp,"MOV [R%d] [R%d]\n",r2,r1);
           					fprintf(fp,"INR R%d\n",r2);
           					fprintf(fp,"INR R%d\n",r1);
           					fprintf(fp,"MOV [R%d] [R%d]\n",r2,r1);

           					free_reg();

                		}	


                }
                 if(root->ptr1->Lentry && root->ptr2->Lentry)
                   {
                   	printf("sfsf\n");
                   			r1=get_reg();
                   			r2=get_reg();
                   			fprintf(fp,"MOV R%d %d\n",r1,root->ptr1->Lentry->binding);
                   			fprintf(fp,"MOV R%d BP\n",r2);
           					fprintf(fp,"ADD R%d R%d\n",r1,r2);
           					 r3=get_reg();
           					fprintf(fp,"MOV R%d %d\n",r2,root->ptr2->Lentry->binding);
                   			fprintf(fp,"MOV R%d BP\n",r3);
           					fprintf(fp,"ADD R%d R%d\n",r2,r3);
           					free_reg();
                   			fprintf(fp,"MOV [R%d] [R%d]\n",r1,r2);
                   			fprintf(fp,"INR R%d\n",r1);
                   			fprintf(fp,"INR R%d\n",r2);

                   			fprintf(fp,"MOV [R%d] [R%d]\n",r1,r2);
                   			free_reg();
                   			free_reg();

           					 
                   }
                  else if(root->ptr1->Gentry && root->ptr2->Lentry)
                  {
                  		r1=get_reg();
                   			r2=get_reg();
                   			fprintf(fp,"MOV R%d %d\n",r1,root->ptr1->Gentry->binding);
           					 r3=get_reg();
           					fprintf(fp,"MOV R%d %d\n",r2,root->ptr2->Lentry->binding);
                   			fprintf(fp,"MOV R%d BP\n",r3);
           					fprintf(fp,"ADD R%d R%d\n",r2,r3);
           					free_reg();
                   			fprintf(fp,"MOV [R%d] [R%d]\n",r1,r2);
                   			fprintf(fp,"INR R%d\n",r1);
                   			fprintf(fp,"INR R%d\n",r2);

                   			fprintf(fp,"MOV [R%d] [R%d]\n",r1,r2);
                   			free_reg();
                   			free_reg();
                  }
                  else if(root->ptr1->Lentry && root->ptr2->Gentry)
                  {
                   	printf("sfsf44\n");

                  		r1=get_reg();
                   			r2=get_reg();
                   			fprintf(fp,"MOV R%d %d\n",r1,root->ptr1->Lentry->binding);
                   			fprintf(fp,"MOV R%d BP\n",r2);
           					fprintf(fp,"ADD R%d R%d\n",r1,r2);
           					fprintf(fp,"MOV R%d %d\n",r2,root->ptr2->Gentry->binding);
                   			
                   			fprintf(fp,"MOV [R%d] [R%d]\n",r1,r2);
                   			fprintf(fp,"INR R%d\n",r1);
                   			fprintf(fp,"INR R%d\n",r2);

                   			fprintf(fp,"MOV [R%d] [R%d]\n",r1,r2);
                   			free_reg();
                   			free_reg();
                  } 
                  else if(root->ptr1->Gentry && root->ptr2->Gentry)
                  {
                  		r1=get_reg();
                   			r2=get_reg();
                   			fprintf(fp,"MOV R%d %d\n",r1,root->ptr1->Gentry->binding);
                   		
           					fprintf(fp,"MOV R%d %d\n",r2,root->ptr2->Gentry->binding);
                   			
                   			fprintf(fp,"MOV [R%d] [R%d]\n",r1,r2);
                   			fprintf(fp,"INR R%d\n",r1);
                   			fprintf(fp,"INR R%d\n",r2);

                   			fprintf(fp,"MOV [R%d] [R%d]\n",r1,r2);
                   			free_reg();
                   			free_reg();
                  }  
               return 0;  

           case NODETYPE_FST:
           			printf("sfs\n");

              if(root->ptr1->Lentry)
           		{
           				r1=get_reg();
           				r2=get_reg();
           			printf("sfs\n");

           			fprintf(fp,"MOV R%d %d\n",r1,root->ptr1->Lentry->binding);
           			fprintf(fp,"MOV R%d BP\n",r2);
           			fprintf(fp,"ADD R%d R%d\n",r1,r2);
           			free_reg();
           		}
           		else if(root->ptr1->Gentry)
           		{	r1=get_reg();
           			printf("sfs2\n");
           			fprintf(fp,"MOV R%d %d\n",r1,root->ptr1->Gentry->binding);


           		}	
           			if(root->ptr2->Lentry)
           			{
           				printf("erewr\n");
           				r2=get_reg();
           				r3=get_reg();
           		
           		fprintf(fp,"MOV R%d %d\n",r2,root->ptr2->Lentry->binding);
           			fprintf(fp,"MOV R%d BP\n",r3);
           			fprintf(fp,"ADD R%d R%d\n",r2,r3);
           			free_reg();
           			if(root->ptr2->Lentry->ref=1)
           			 {
           			 	fprintf(fp,"MOV R%d [R%d]\n",r2,r2);
           			 }	
           		fprintf(fp,"MOV [R%d] [R%d]\n",r1,r2);
           			free_reg();
           			free_reg();

           			}

           		else if(root->ptr2->Gentry)

           		{
           				printf("erewr2\n");

           			r2=get_reg();
           		
           		fprintf(fp,"MOV R%d %d\n",r2,root->ptr2->Gentry->binding);
           			free_reg();
           		fprintf(fp,"MOV [R%d] [R%d]\n",r1,r2);
           			free_reg();
           			free_reg();


           		}
           	return 0;

             case NODETYPE_SND:

              if(root->ptr1->Lentry)
           		{
           				r1=get_reg();
           				r2=get_reg();

           			fprintf(fp,"MOV R%d %d\n",r1,root->ptr1->Lentry->binding);
           			fprintf(fp,"MOV R%d BP\n",r2);
           			fprintf(fp,"ADD R%d R%d\n",r1,r2);
           			free_reg();
           		}
           		else if(root->ptr1->Gentry)
           		{	r1=get_reg();
           			fprintf(fp,"MOV R%d %d\n",r1,root->ptr1->Gentry->binding);

           		}	
           			if(root->ptr2->Lentry)
           			{
           				r2=get_reg();
           				r3=get_reg();
           		
           		fprintf(fp,"MOV R%d %d\n",r2,root->ptr2->Lentry->binding);
           			fprintf(fp,"MOV R%d BP\n",r3);
           			fprintf(fp,"ADD R%d R%d\n",r2,r3);
           			if(root->ptr2->Lentry->ref=1)
           			 {
           			 	fprintf(fp,"MOV R%d [R%d]\n",r2,r2);
           			fprintf(fp, "DCR R%d\n",r2);

           			 }	
           			 else
           			fprintf(fp, "INR R%d\n",r2);
           			free_reg();

           		fprintf(fp,"MOV [R%d] [R%d]\n",r1,r2);
           			free_reg();
           			free_reg();

           			}

           		else if(root->ptr2->Gentry)

           		{
           			r2=get_reg();
           		
           		fprintf(fp,"MOV R%d %d\n",r2,root->ptr2->Gentry->binding);
           			fprintf(fp, "INR R%d\n",r2);

           			free_reg();
           		fprintf(fp,"MOV [R%d] [R%d]\n",r1,r2);
           			free_reg();
           			free_reg();


           		}
           	return 0; 


           case NODETYPE_PAIR:

           		r1=code_gen(root->ptr2);
           		r2=code_gen(root->ptr3);
           		r3=get_reg();

           		if(root->ptr1->Lentry)
           		{

           				r4=get_reg();

           			fprintf(fp,"MOV R%d %d\n",r3,root->ptr1->Lentry->binding);
           			fprintf(fp,"MOV R%d BP\n",r4);
           			fprintf(fp,"ADD R%d R%d\n",r3,r4);
           			free_reg();

           			fprintf(fp,"MOV [R%d] R%d\n",r3,r1);
           			fprintf(fp,"INR R%d\n",r3);
           			fprintf(fp,"MOV [R%d] R%d\n",r3,r2);
           			   free_reg();
                    free_reg();
                    free_reg();
           		}
           		else if(root->ptr1->Gentry)

           		{

           				fprintf(fp,"MOV R%d %d\n",r3,root->ptr1->Gentry->binding);
           			fprintf(fp,"MOV [R%d] R%d\n",r3,r1);
           			fprintf(fp,"INR R%d\n",r3);
           			fprintf(fp,"MOV [R%d] R%d\n",r3,r2);
           			   free_reg();
                    free_reg();
           		}

           			return 0;

            case NODETYPE_MAIN:
  printf("ffefwefwef\n");

              fprintf(fp,"START\n");
              fprintf(fp,"MOV SP 1750\n");
              fprintf(fp,"MOV BP SP\n");
              r1 = get_reg();
              struct Lsymbol *Ltemp = LSymbolHead;
              while(Ltemp != NULL){
                  if(Ltemp->ref==0){

                    fprintf(fp,"PUSH R%d\n",r1); 
                    Ltemp = Ltemp->next;
                  } 
              }
              fprintf(fp,"MAIN:\n");
              free_reg();

              code_gen(root->ptr1);
              fprintf(fp,"HALT\n");
              return 0;

        
              case NODETYPE_ALLOC:
                
                 if(root->ptr1->node==NODETYPE_FIELD_END) {
                    r1=code_gen(root->ptr1);
                    fprintf(fp,"PUSH R0\n");
                    fprintf(fp,"PUSH R0\nPUSH R1\nPUSH R2\n");
                    fprintf(fp,"CALL LL2\n");
                    fprintf(fp,"POP R2\nPOP R1\nPOP R0\n");  
                    r2=get_reg();
                    fprintf(fp,"POP R%d\n",r2);
                    fprintf(fp,"MOV [R%d] R%d\n",r1,r2);
                    free_reg();
                    free_reg();
                 }
                 else {
                      r1=get_reg();
                      r2=get_reg();
                    if(root->ptr1->Lentry) {
                     
                      fprintf(fp,"MOV R%d BP\n",r1);
                      fprintf(fp,"MOV R%d %d\n",r2,root->ptr1->Lentry->binding);
                      fprintf(fp,"ADD R%d R%d\n",r1,r2);
                      if(root->ptr1->Lentry->ref==2)
                        fprintf(fp,"MOV R%d [R%d]\n",r1,r1);
                      
                    }

                    else {

                      fprintf(fp,"MOV R%d %d\n",r1,root->ptr1->Gentry->binding);
                      if(root->ptr1->ptr1) {
                      r2=code_gen(root->ptr1->ptr1);
                      fprintf(fp,"ADD R%d R%d\n",r1,r2);}

                      
                    }

                      fprintf(fp,"PUSH R0\n");
                      fprintf(fp,"PUSH R0\nPUSH R1\nPUSH R2\n");
                    
                      fprintf(fp,"CALL LL2\n"); 
                      fprintf(fp,"POP R2\nPOP R1\nPOP R0\n");   
              
                      fprintf(fp,"POP R%d\n",r2);
                      fprintf(fp,"MOV [R%d] R%d\n ",r1,r2);
                      free_reg();
                      free_reg();

                 }


              return 0;

              case NODETYPE_INITIAL:
                  fprintf(fp,"PUSH R0\nPUSH R1\nPUSH R2\n");
                  fprintf(fp,"CALL LL0\n");
                  fprintf(fp,"POP R2\nPOP R1\nPOP R0\n");
              return 0;


              case NODETYPE_FREE:
                  if(root->ptr1->node==NODETYPE_FIELD_END) {

                      r1=code_gen(root->ptr1);
                    
                      fprintf(fp,"PUSH R0\n");
                      fprintf(fp,"PUSH R1\nPUSH R2\nPUSH R3\n");
                      fprintf(fp,"PUSH R%d\n",r1);
                      fprintf(fp,"MOV R%d [R%d]\n",r1,r1);
                      fprintf(fp,"PUSH R%d\n",r1);
                    
                      fprintf(fp,"CALL LL1\n");
                      fprintf(fp,"POP R%d\n",r1);
                      fprintf(fp,"POP R%d\n",r1);
                      fprintf(fp,"POP R3\nPOP R2\nPOP R1\nPOP R0\n");

                      free_reg();
                    

                  }

                 else {
                      r1=get_reg();
                      r2=get_reg();
                
                    if(root->ptr1->Lentry) {
                    
                      fprintf(fp,"MOV R%d BP\n",r1);
                      fprintf(fp,"MOV R%d %d\n",r2,root->ptr1->Lentry->binding);
                      fprintf(fp,"ADD R%d R%d\n",r1,r2);
                      if(root->ptr1->Lentry->ref==2) {
                        fprintf(fp,"MOV R%d [R%d]\n",r1,r1);
                      }

                    }

                    else {
                       
                      fprintf(fp,"MOV R%d %d\n",r1,root->ptr1->Gentry->binding);
                      if(root->ptr1->ptr1) {
                      r2=code_gen(root->ptr1->ptr1);
                      fprintf(fp,"ADD R%d R%d\n",r1,r2);}

                      
                    }

                      fprintf(fp,"PUSH R0\n");
                      fprintf(fp,"PUSH R1\nPUSH R2\nPUSH R3\n");
                      fprintf(fp,"PUSH R%d\n",r1);
                      fprintf(fp,"MOV R%d [R%d]\n",r1,r1);
                      fprintf(fp,"PUSH R%d\n",r1);
                    
                      fprintf(fp,"CALL LL1\n");
                      fprintf(fp,"POP R%d\n",r1);
                      fprintf(fp,"POP R%d\n",r1);
                      fprintf(fp,"POP R3\nPOP R2\nPOP R1\nPOP R0\n");

                      free_reg();
                      free_reg();
                 }
                 


              return 0;

              case NODETYPE_LT  :
                r1=code_gen(root->ptr1);
                 GetVal(root->ptr1,r1);
                r2=code_gen(root->ptr2);
                 GetVal(root->ptr2,r2);
                fprintf(fp,"LT R%d R%d\n",r1,r2);
                free_reg();
                return r1;


              case NODETYPE_FUNC:
            ;
                fprintf(fp," // Before funtion call\n\n\n");
                r=functioncall_gen(root);
                return r;

              case NODETYPE_LEAF:
                r1=get_reg();
                fprintf(fp,"MOV R%d %d\n",r1,root->val);
                return r1;

            case NODETYPE_LE  :
                r1=code_gen(root->ptr1);
                GetVal(root->ptr1,r1);
                r2=code_gen(root->ptr2);
                GetVal(root->ptr2,r2);
                fprintf(fp,"LE R%d R%d\n",r1,r2);
                free_reg();
                return r1;
            
            case NODETYPE_AND:
                r1 = code_gen(root->ptr1);
                GetVal(root->ptr1,r1);
                r2 = code_gen(root->ptr2);
                GetVal(root->ptr2,r2);        
                fprintf(fp,"ADD R%d R%d\n",r1,r2);
                fprintf(fp,"MOV R%d 2\n",r2);
                fprintf(fp,"EQ R%d R%d\n",r1,r2);
                free_reg();
                return r1;                 
                break;

        case NODETYPE_OR:
                r1 = code_gen(root->ptr1);
                GetVal(root->ptr1,r1);
                r2 = code_gen(root->ptr2);
                GetVal(root->ptr2,r2);        
                fprintf(fp,"ADD R%d R%d\n",r1,r2);
                fprintf(fp,"MOV R%d 0\n",r2);
                fprintf(fp,"GE R%d R%d\n",r1,r2);
                free_reg();
                return r1;                 
                break;
                

            case NODETYPE_GE  :
                
                r1=code_gen(root->ptr1);
                GetVal(root->ptr1,r1);
                r2=code_gen(root->ptr2);
                GetVal(root->ptr2,r2);
                fprintf(fp,"GE R%d R%d\n",r1,r2);
                free_reg();
                return r1;

             case NODETYPE_EQ :
                r1=code_gen(root->ptr1);
                GetVal(root->ptr1,r1);
                r2=code_gen(root->ptr2);
                GetVal(root->ptr2,r2);
                fprintf(fp,"EQ R%d R%d\n",r1,r2);
                free_reg();
                return r1;

            case NODETYPE_NE  :
                
                r1=code_gen(root->ptr1);
                GetVal(root->ptr1,r1);
               
                r2=code_gen(root->ptr2);
                GetVal(root->ptr2,r2);
                
                fprintf(fp,"NE R%d R%d\n",r1,r2);
                free_reg();
                return r1;

             case NODETYPE_GT :
               
                r1=code_gen(root->ptr1);
                GetVal(root->ptr1,r1);
                r2=code_gen(root->ptr2);
                GetVal(root->ptr2,r2);
                fprintf(fp,"GT R%d R%d\n",r1,r2);
                free_reg();
                return r1; 
            
            case NODETYPE_ID:
                r1=get_reg();     
               if(root->ptr1==NULL) {

                   if(root->Lentry) {
                    bind=root->Lentry->binding;
               
                    r2=get_reg();
                    fprintf(fp,"MOV R%d BP\n",r1);
                    fprintf(fp,"MOV R%d %d\n",r2,bind);
                    fprintf(fp,"ADD R%d R%d\n",r1,r2);
                    
                    
                    fprintf(fp,"MOV R%d [R%d]\n",r1,r1);
                
                    if(root->Lentry->ref==2){
                      fprintf(fp,"MOV R%d [R%d]\n",r1,r1);
                    } 

                    
                    free_reg();
                    return r1;
                   }
                   else {
                     bind=root->Gentry->binding;
                     
                     r2=get_reg();
                     fprintf(fp,"MOV R%d %d\n",r2,bind);
                     fprintf(fp,"MOV R%d [R%d]\n",r1,r2);
      

                     free_reg();
                     return r1;
                   }

               }

               else {
                     bind=root->Gentry->binding;
                     r2=code_gen(root->ptr1);
                     fprintf(fp,"MOV R%d %d\n",r1,bind);
                     fprintf(fp,"ADD R%d R%d\n",r1,r2);
                     free_reg();
                     fprintf(fp,"MOV R%d [R%d]\n",r1,r1);
                     return r1;
               }
              break;



  
            case NODETYPE_BODY:
            printf("hi1\n");
             code_gen(root->ptr1);
            printf("hi2\n");

             code_gen(root->ptr2);
            printf("hi3\n");

             break;


             case NODETYPE_ASGN:
                r2=code_gen(root->ptr2);
                if(root->ptr2->node==NODETYPE_FIELD_END) {
                  fprintf(fp,"MOV R%d [R%d]\n",r2,r2);
                }

              if(root->ptr1->node!=NODETYPE_FIELD_END) {
                if(root->ptr1->ptr1) {
                    bind=root->ptr1->Gentry->binding;
                    r1=code_gen(root->ptr1->ptr1);
                    r3=get_reg();
                    fprintf(fp,"MOV R%d %d\n",r3,bind);
                    fprintf(fp,"ADD R%d R%d\n",r1,r3);
                    fprintf(fp,"MOV [R%d] R%d\n ",r1,r2);
                    free_reg();
                    free_reg();
                    free_reg();
                  
                }else {
                  if(root->ptr1->Lentry) {
                
                     bind=root->ptr1->Lentry->binding;
                     r1=get_reg();
                     r3=get_reg();
                     fprintf(fp,"MOV R%d BP\n",r1);
                     fprintf(fp,"MOV R%d %d\n",r3,bind);
                     fprintf(fp,"ADD R%d R%d\n",r1,r3);
                     if(root->ptr1->Lentry->ref==2)
                     fprintf(fp,"MOV R%d [R%d] \n",r1,r1);
                     free_reg();
                     fprintf(fp,"MOV [R%d] R%d\n",r1,r2);
                     
                     free_reg();
                     free_reg();
                  }
                  else {
                    bind=root->ptr1->Gentry->binding;
                    fprintf(fp,"MOV [%d] R%d\n ",bind,r2);
                    free_reg();
                  }
                }
              }


                else {
                    r1=code_gen(root->ptr1);
                    fprintf(fp,"MOV [R%d] R%d\n  ",r1,r2);
                    free_reg();
                    free_reg();
                }

                return 0;
                break;

          case NODETYPE_READ:
        
              if(root->ptr1->node==NODETYPE_FIELD_END) {
                r1=code_gen(root->ptr1);
                r2=get_reg();
                fprintf(fp,"IN R%d\n",r2);
                fprintf(fp,"MOV [R%d] R%d\n",r1,r2);
                free_reg();
                free_reg();
                return 0;
              }

              if(root->ptr1->Lentry) {
                r1=get_reg();
                r2=get_reg();
              
                fprintf(fp,"MOV R%d BP\n",r1);
                bind=root->ptr1->Lentry->binding;
                fprintf(fp,"MOV R%d %d\n",r2,bind);
                fprintf(fp,"ADD R%d R%d\n",r1,r2);
                fprintf(fp,"IN R%d\n",r2);
                if(root->ptr1->Lentry->ref == 2){
                  fprintf(fp,"MOV R%d [R%d]\n",r1,r1);
                }
                fprintf(fp,"MOV [R%d] R%d\n",r1,r2);
                free_reg();
                free_reg();
              }
              else {
                if(root->ptr1->ptr1) {
                  bind=root->ptr1->Gentry->binding;
                  r3=get_reg();
                  fprintf(fp,"MOV R%d %d\n",r3,bind);
                  r1=code_gen(root->ptr1->ptr1);
                  fprintf(fp,"ADD R%d R%d\n",r3,r1);
                  r2=get_reg();
                  fprintf(fp,"IN R%d\n",r2);
                  fprintf(fp,"MOV [R%d] R%d\n",r3,r2);
                  free_reg();
                  free_reg();
                  free_reg();
                }
                else {
                  bind=root->ptr1->Gentry->binding;
                  r1=get_reg();

                  fprintf(fp,"MOV R%d %d\n",r1,bind);
                  
                  r2=get_reg();
                  fprintf(fp,"IN R%d\n",r2);
                  fprintf(fp,"MOV [R%d] R%d\n",r1,r2);
                  free_reg();
                  free_reg();
                }
              }
              return 0;
              break;

        case NODETYPE_WRITE:
              r1=code_gen(root->ptr1);
              if(root->ptr1->node==NODETYPE_FIELD_END) 
                fprintf(fp,"MOV R%d [R%d]\n",r1,r1);
              
              fprintf(fp,"OUT R%d\n",r1);
              free_reg();
              return 0;
		case NODETYPE_RET_PAIR:

		   printf("//oooopp\n");
                 r1=get_reg();     
             
                 printf("hello\n");
                    bind=root->ptr1->Lentry->binding;
                 printf(fp,"//hell00o\n");
               
                    r2=get_reg();
                    r3=get_reg();
                    fprintf(fp,"MOV R%d BP\n",r2);
                    fprintf(fp,"MOV R%d %d\n",r1,bind);
                    fprintf(fp,"ADD R%d R%d\n",r1,r2);
                    fprintf(fp,"MOV R%d %d\n",r3,2);
                	fprintf(fp,"SUB R%d R%d\n",r2,r3);
               		 fprintf(fp,"MOV [R%d] R%d\n",r2,r1);


                    free_reg();
                    free_reg();
                    free_reg();
                 printf("hello1\n");
                   
                 break;
         case NODETYPE_RET:
                r=code_gen(root->ptr1);
                if(root->ptr1->node==NODETYPE_FIELD_END)
                  fprintf(fp,"MOV R%d [R%d]\n",r,r);
                r1=get_reg();
                fprintf(fp,"MOV R%d BP\n",r1);
                r2=get_reg();
                fprintf(fp,"MOV R%d 2\n",r2);
                fprintf(fp,"SUB R%d R%d\n",r1,r2);
                free_reg();
                fprintf(fp,"MOV [R%d] R%d\n",r1,r);
                free_reg();
                free_reg();
                break;

        case NODETYPE_WHILE :
              l1=get_label();
              l2=get_label();
              fprintf(fp,"\n//while\n");
              fprintf(fp,"label%d:\n",l1);
              r1=code_gen(root->ptr1);              
              fprintf(fp,"JZ R%d,label%d\n",r1,l2);
              free_reg();
              code_gen(root->ptr2);
              fprintf(fp,"JMP label%d\n",l1);
              fprintf(fp,"\n\n");
              fprintf(fp,"label%d:\n",l2);
              break;
              
      case NODETYPE_IF :

              fprintf(fp,"\n\n//if\n");
              l1=get_label();
              r1=code_gen(root->ptr1);
              fprintf(fp,"JZ R%d label%d\n",r1,l1);
              free_reg();
              code_gen(root->ptr2);
              fprintf(fp,"label%d:\n",l1);
              break;

               
         case NODETYPE_IFELSE :
              fprintf(fp, "\n\n //ifelse\n\n");
              l1=get_label();
              l2=get_label();
              r1=code_gen(root->ptr1);

            
              fprintf(fp,"JZ R%d label%d\n",r1,l1);
              free_reg();
              code_gen(root->ptr2);

              fprintf(fp,"JMP label%d\n",l2);
              fprintf(fp,"label%d:\n",l1);

              code_gen(root->ptr3);
              fprintf(fp,"label%d:\n",l2);
              break;

        case NODETYPE_SLIST :
              code_gen(root->ptr1);
              code_gen(root->ptr2);
              break;
          
  }
}
Beispiel #12
0
int functioncall_gen(struct ASTNode *root) {

  int r,r1,r2,r3,r4,c=0;
  struct Gsymbol *g=GLookup(root->name);
  struct ArgStruct *list=g->arglist;
  struct ASTNode *templist=root->arglist;

  //Saving the values in the registers;
  
  while(c<=reg) {
    fprintf(fp,"PUSH R%d\n",c);
    c++;
  }

  c--;


  while(templist) {

    if(list->passType==1) {
       
      r=code_gen(templist->ptr2);
      if(templist->ptr2->node==NODETYPE_FIELD_END)
        fprintf(fp,"MOV R%d [R%d]\n",r,r);
      fprintf(fp,"PUSH R%d\n",r);
       
      free_reg();
    }

    else {

      if(templist->ptr2->node==NODETYPE_FIELD_END) {
        r=code_gen(templist->ptr2);

        fprintf(fp,"PUSH R%d\n",r);
       
        free_reg();
      }

      else if(templist->ptr2->Lentry) {
      		if(strcmp(templist->ptr2->type->name,"pair")==0)
      		{
      				   r1=get_reg();
				        r2=get_reg();
				        fprintf(fp,"MOV R%d BP\n",r1);
				        fprintf(fp,"MOV R%d %d\n",r2,templist->ptr2->Lentry->binding);
				        fprintf(fp,"ADD R%d R%d\n",r1,r2);
       					 fprintf(fp,"PUSH R%d\n",r1);


      		}
      		else
      		{
        
        r1=get_reg();
        r2=get_reg();
        fprintf(fp,"MOV R%d BP\n",r1);
        fprintf(fp,"MOV R%d %d\n",r2,templist->ptr2->Lentry->binding);
        fprintf(fp,"ADD R%d R%d\n",r1,r2);
        free_reg();

        if(templist->ptr2->Lentry->ref==2) {
          fprintf(fp,"MOV R%d [R%d]\n",r1,r1);
        }  
        fprintf(fp,"PUSH R%d\n",r1);
        free_reg();
    }
      }
      
      else {    
         r=get_reg();
         fprintf(fp,"MOV R%d %d\n",r,templist->ptr2->Gentry->binding);
         if(templist->ptr2->ptr1) {
         	r2=code_gen(templist->ptr2->ptr1);
         	fprintf(fp,"ADD R%d R%d\n",r,r2);
         	free_reg();
         }
         fprintf(fp,"PUSH R%d\n",r);
         free_reg();
      }
      
    }

    templist=templist->ptr1;
    list=list->next;
  }

 
  r=get_reg();                  
  fprintf(fp,"PUSH R%d\n",r);
  free_reg();

  fprintf(fp,"CALL LL%d\n",g->binding);
  reg=c;
  r=get_reg();
  fprintf(fp,"POP R%d\n",r);  
  r1=get_reg();
  list=g->arglist;
  while(list) {
    fprintf(fp,"POP R%d\n",r1);
    list=list->next;
  }
  free_reg();
  
  
  while(c>=0) {
    fprintf(fp,"POP R%d\n",c);
    c--;
  }

  return r;
}