예제 #1
0
static void daemon_user_init(void *data, void *dev)
{
	struct daemon_data *pri = data;
	struct timeval tv;
	struct {
		char zero;
		int pid;
		int usecs;
	} name;

	if(!strcmp(pri->sock_type, "unix"))
		pri->ctl_addr = new_addr(pri->ctl_sock, 
					 strlen(pri->ctl_sock) + 1);
	name.zero = 0;
	name.pid = os_getpid();
	gettimeofday(&tv, NULL);
	name.usecs = tv.tv_usec;
	pri->local_addr = new_addr(&name, sizeof(name));
	pri->dev = dev;
	pri->fd = connect_to_switch(pri);
	if(pri->fd < 0){
		kfree(pri->local_addr);
		pri->local_addr = NULL;
	}
}
static int umcast_user_init(void *data, void *dev)
{
	struct umcast_data *pri = data;

	pri->remote_addr = new_addr(pri->addr, pri->rport);
	if (pri->unicast)
		pri->listen_addr = new_addr(NULL, pri->lport);
	else
		pri->listen_addr = pri->remote_addr;
	pri->dev = dev;
	return 0;
}
예제 #3
0
bool monitor_breakpoint_check_checkpoint(MEMSPACE mem, WORD addr,
                                         break_list_t *list)
{
    break_list_t *ptr;
    breakpoint_t *bp;
    bool result = FALSE;
    MON_ADDR temp;
    const char *type;

    ptr = search_checkpoint_list(list, addr);

    while (ptr && mon_is_in_range(ptr->brkpt->start_addr,
           ptr->brkpt->end_addr, addr)) {
        bp = ptr->brkpt;
        ptr = ptr->next;
        if (bp && bp->enabled==e_ON) {
            /* If condition test fails, skip this checkpoint */
            if (bp->condition) {
                if (!mon_evaluate_conditional(bp->condition)) {
                    continue;
                }
            }

            /* Check if the user specified some ignores */
            if (bp->ignore_count) {
                bp->ignore_count--;
                continue;
            }

            bp->hit_count++;

            result = TRUE;

            temp = new_addr(mem,
                            (monitor_cpu_type.mon_register_get_val)(mem, e_PC));            if (bp->trace) {
                type = "Trace";
                result = FALSE;
            }
            else if (bp->watch_load)
                type = "Watch-load";
            else if (bp->watch_store)
                type = "Watch-store";
            else
                type = "Break";

            /*archdep_open_monitor_console(&mon_input, &mon_output);*/
            mon_out("#%d (%s) ", bp->brknum, type);
            mon_disassemble_instr(temp);

            if (bp->command) {
                mon_out("Executing: %s\n", bp->command);
                parse_and_execute_line(bp->command);
            }

            if (bp->temporary)
                mon_breakpoint_delete_checkpoint(bp->brknum);
        }
    }
    return result;
}
예제 #4
0
static int mcast_user_init(void *data, void *dev)
{
	struct mcast_data *pri = data;

	pri->mcast_addr = new_addr(pri->addr, pri->port);
	pri->dev = dev;
	return 0;
}
예제 #5
0
파일: mon_ui.c 프로젝트: martinpiper/VICE
void mon_disassembly_determine_popup_commands(
                                   struct mon_disassembly_private *pmdp, 
                                   int xPos, int yPos, WORD *ulMask,
                                   WORD *ulDefault)
{
    MON_ADDR CurrentAddress;
    mon_breakpoint_type_t mbt;

    int drive_true_emulation;

    resources_get_int("DriveTrueEmulation", &drive_true_emulation);

    CurrentAddress = new_addr(pmdp->memspace, determine_address_of_line(pmdp,
                              pmdp->StartAddress, yPos));
    mbt = mon_breakpoint_is(CurrentAddress);

    /* remember values to be re-used when command is executed */
    pmdp->AddrClicked = CurrentAddress;

    switch (mbt) {
      case BP_ACTIVE:
        *ulMask = MDDPC_UNSET_BREAKPOINT | MDDPC_DISABLE_BREAKPOINT;
        *ulDefault = MDDPC_UNSET_BREAKPOINT;
        break;

      case BP_INACTIVE:
        *ulMask = MDDPC_SET_BREAKPOINT | MDDPC_UNSET_BREAKPOINT
                  | MDDPC_ENABLE_BREAKPOINT;
        *ulDefault = MDDPC_SET_BREAKPOINT;
        break;

      case BP_NONE:
        *ulMask = MDDPC_SET_BREAKPOINT;
        *ulDefault = MDDPC_SET_BREAKPOINT;
        break;
    }

    if (drive_true_emulation) {
        switch (pmdp->memspace) {
          case e_comp_space:
            *ulMask |= MDDPC_SET_DRIVE8 | MDDPC_SET_DRIVE9;
            break;
          case e_disk8_space:
            *ulMask |= MDDPC_SET_COMPUTER | MDDPC_SET_DRIVE9;
            break;
          case e_disk9_space:
            *ulMask |= MDDPC_SET_COMPUTER | MDDPC_SET_DRIVE8;
            break;
          case e_disk10_space:
          case e_disk11_space:
            break;
          case e_default_space:
          case e_invalid_space:
            break;
        }
    }
}
예제 #6
0
파일: llc.c 프로젝트: StephenHamilton/gini
//=======================================================
//       FUNCTION:   conn_open
//       PURPOSE:    Setup an individual connection between UML and WGINI
//======================================================= 
void conn_open(MobileNode *node,char* pchSocket){
	struct vpl_data *psUMLConn;
	struct interface *psRet;
	struct timeval sWaitTime;
	struct {
		char zero;
		int pid;
		int usecs;
	} name;
	int ret;
	
	// Set up UML connection parameters
	psUMLConn = (struct vpl_data *) malloc(sizeof(struct vpl_data));
	bzero(psUMLConn,sizeof(struct vpl_data));
	psUMLConn->sock_type = "unix";
	psUMLConn->ctl_sock = pchSocket;
	psUMLConn->ctl_addr = new_addr(psUMLConn->ctl_sock, strlen(psUMLConn->ctl_sock) + 1);
	psUMLConn->data_addr = NULL;
	psUMLConn->fd = -1;
	psUMLConn->control = -1;
	name.zero = 0;
	name.pid = getpid();
	gettimeofday(&sWaitTime, NULL);
	name.usecs = sWaitTime.tv_usec;
	psUMLConn->local_addr = new_addr(&name, sizeof(name));
	// Connect to the UML
	if ((psUMLConn->fd = vpl_connect(psUMLConn)) < 0) {
		 free (psUMLConn);
		 printf("[LlcProcess]:: The connection from UML to LLC is failed.\n");
		 return;
	}
	// Fill the interface data structure
	psRet = (struct interface*) malloc(sizeof(struct interface));
	bzero(psRet,sizeof(struct interface));
	psRet->node_id = node->Id;
	psRet->iDescriptor = psUMLConn->fd;
	memcpy(&psRet->sVPLdata, psUMLConn, sizeof(struct vpl_data));
	free(psUMLConn);
	// Setup a thread for the new connection
	memcpy(node->nodeLlc->inf, psRet, sizeof(struct interface));
	ret=pthread_create(&(node->nodeLlc->inf->threadID), NULL, (void *)LlcUpPortRecv, (void*)(node->nodeLlc->inf));
}
예제 #7
0
파일: mon_ui.c 프로젝트: martinpiper/VICE
struct mon_disassembly *mon_dump_get_lines(
    struct mon_disassembly_private *pmdp, int lines_visible,
    int lines_full_visible)
{
    WORD loc;
    int  i;
    unsigned int  have_label = pmdp->have_label;
    struct mon_disassembly *contents = NULL;
    struct mon_disassembly *ret;

    loc = pmdp->StartAddress;
    ret = NULL;

    pmdp->Lines = lines_full_visible;

    for (i = 0; i < lines_visible; i++ ) {
        struct mon_disassembly *newcont;
        mon_breakpoint_type_t bptype;

        newcont = lib_malloc(sizeof(struct mon_disassembly));

        if (ret == NULL) {
            ret      =
            contents = newcont;
        } else {
            contents = contents->next = newcont;
        }

        contents->next = NULL;
        contents->flags.active_line = loc == pmdp->CurrentAddress ? 1 : 0;

        /* determine type of breakpoint */
        bptype = mon_breakpoint_is(new_addr(pmdp->memspace, loc));

        contents->flags.is_breakpoint = bptype != BP_NONE;
        contents->flags.breakpoint_active = bptype == BP_ACTIVE;

        contents->content =
            mon_dump_with_label(pmdp->memspace, loc, 1, &have_label);

        contents->length  = strlen(contents->content);

        pmdp->EndAddress = loc;

		// MPi: Could have labels with two bytes (lo/hi pairs for example) and display these as 16 bit quantities
		if (!have_label)
		{
			loc++;
		}
    }

    return ret;
}
예제 #8
0
파일: mon_ui.c 프로젝트: martinpiper/VICE
struct mon_disassembly *mon_disassembly_get_lines(
    struct mon_disassembly_private *pmdp, int lines_visible,
    int lines_full_visible)
{
    WORD loc;
    unsigned int size;
    int  i;
    unsigned int  have_label = pmdp->have_label;
    struct mon_disassembly *contents = NULL;
    struct mon_disassembly *ret;

    loc = pmdp->StartAddress;
    ret = NULL;

    pmdp->Lines = lines_full_visible;

    for (i = 0; i < lines_visible; i++ ) {
        struct mon_disassembly *newcont;
        mon_breakpoint_type_t bptype;

        newcont = lib_malloc(sizeof(struct mon_disassembly));

        if (ret == NULL) {
            ret      =
            contents = newcont;
        } else {
            contents = contents->next = newcont;
        }

        contents->next = NULL;
        contents->flags.active_line = loc == pmdp->CurrentAddress ? 1 : 0;

        /* determine type of breakpoint */
        bptype = mon_breakpoint_is(new_addr(pmdp->memspace, loc));

        contents->flags.is_breakpoint = bptype != BP_NONE;
        contents->flags.breakpoint_active = bptype == BP_ACTIVE;

        contents->content =
            mon_disassemble_with_label(pmdp->memspace, loc, 1, 
            &size, &have_label);

        contents->length  = strlen(contents->content);

        pmdp->EndAddress = loc;

        loc += size;
    }

    return ret;
}
예제 #9
0
파일: tt_host_equiv.C 프로젝트: juddy/edcde
// This is done here instead of in the constructor because
// gethostbyname can fail  and I don't want things that can fail
// to be in a constructor.
static int
_cache_it(_Tt_hostname_cache_ptr cache_ptr, _Tt_string & hostname)
{
        _Tt_hostname_cache_ptr	sh, lh;
	struct hostent	       *host_ret;
	_Xgethostbynameparams	host_buf;
	char			**h_addr_list;


	memset((char*) &host_buf, 0, sizeof(_Xgethostbynameparams));
	if ((host_ret = _XGethostbyname((char*) hostname, host_buf)) == NULL) {
		return 0;
	}

	// cache the parts of the entry we're
	// interested in.  We have to do this
	// since gethostbyname() returns a pointer
	// to static memory, and since struct hostent's
	// have pointers in them.

	cache_ptr->addr_length = host_ret->h_length;

	// Copy the list of IP addresses
	for (h_addr_list = host_ret->h_addr_list; 
	     h_addr_list; 
	     h_addr_list++) {

		if (! *h_addr_list) {
			break;	// no more addresses
		}

                // copy the address
		_Tt_string new_addr((const unsigned char *)h_addr_list,
				    host_ret->h_length);
		// cache it
		cache_ptr->addr_list->append(new_addr);
	}

	return 1;
}
예제 #10
0
bool mon_breakpoint_check_checkpoint(MEMSPACE mem, unsigned int addr, unsigned int lastpc, MEMORY_OP op)
{
    checkpoint_list_t *ptr;
    checkpoint_t *cp;
    checkpoint_list_t *list;
    monitor_cpu_type_t *monitor_cpu;
    bool must_stop = FALSE;
    MON_ADDR instpc;
    const char *op_str;
    const char *action_str;

    monitor_cpu = monitor_cpu_for_memspace[mem];

    switch (op) {
        case e_load:
            list   = watchpoints_load[mem];
            op_str = "load";
            instpc = new_addr(mem, lastpc);
            break;

        case e_store:
            list = watchpoints_store[mem];
            op_str = "store";
            instpc = new_addr(mem, lastpc);
            break;

        default: /* e_exec */
            list = breakpoints[mem];
            op_str = "exec";
            instpc = new_addr(mem, (monitor_cpu->mon_register_get_val)(mem, e_PC));
            break;
    }

    ptr = search_checkpoint_list(list, addr);

    while (ptr && mon_is_in_range(ptr->checkpt->start_addr,
           ptr->checkpt->end_addr, addr)) {
        cp = ptr->checkpt;
        ptr = ptr->next;
        if (cp && cp->enabled==e_ON) {
            /* If condition test fails, skip this checkpoint */
            if (cp->condition) {
                if (!mon_evaluate_conditional(cp->condition)) {
                    continue;
                }
            }

            /* Check if the user specified some ignores */
            if (cp->ignore_count) {
                cp->ignore_count--;
                continue;
            }

            cp->hit_count++;

            if (cp->stop) {
                must_stop  = TRUE;
                action_str = "Stop on";
            } else {
                action_str = "Trace";
            }

            mon_out("#%d (%s %5s %04x) ", cp->checknum, action_str, op_str, addr);

            if (mon_interfaces[mem]->get_line_cycle != NULL) {
                unsigned int line, cycle;
                int half_cycle;

                mon_interfaces[mem]->get_line_cycle(&line, &cycle, &half_cycle);

                if (half_cycle==-1)
                mon_out(" %03i %03i\n", line, cycle);
                else
                mon_out(" %03i %03i %i\n", line, cycle, half_cycle);
            } else {
                mon_out("\n");
            }

            mon_disassemble_with_regdump(mem, instpc);

            if (cp->command) {
                mon_out("Executing: %s\n", cp->command);
                parse_and_execute_line(cp->command);
            }

            if (cp->temporary) {
                mon_breakpoint_delete_checkpoint(cp->checknum);
            }
        }
    }

    return must_stop;
}
예제 #11
0
파일: vpl.c 프로젝트: akankshakmr174/gini
vpl_data_t *vpl_connect(char *vsock_name)
{
	struct timeval temp_wtime;
	struct sockaddr_un *sun;
	struct request_v3 req;
	int n, fd;

	struct name_t  		// temporary structure for providing local address
	{
		char zero;
		int pid;
		int usecs;
	} name;

	verbose(2, "[vpl_connect]:: starting connection.. ");
	vpl_data_t *pri = (vpl_data_t *)calloc(1, sizeof(vpl_data_t));
	pri->sock_type = "unix";
	pri->ctl_sock = strdup(vsock_name);
	pri->ctl_addr = new_addr(pri->ctl_sock,
				 strlen(pri->ctl_sock) + 1);
	pri->data_addr = NULL;
	pri->data = -1;
	pri->control = -1;
	name.zero = 0;
	name.pid = getpid();
	gettimeofday(&temp_wtime, NULL);
	name.usecs = temp_wtime.tv_usec;
	pri->local_addr = new_addr(&name, sizeof(struct name_t));

	if((pri->control = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
		verbose(2, "[vpl_connect]:: control socket failed, error = %s", strerror(errno));
		return NULL;
	}

	if(connect(pri->control, (struct sockaddr *) pri->ctl_addr,
		   sizeof(struct sockaddr_un)) < 0){
		verbose(2, "[vpl_connect]:: control connect failed, error = %s", strerror(errno));

		close(pri->control);
		return NULL;
	}

	verbose(2, "[vpl_connect]:: made primary connection.. ");
	if((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0){
		verbose(2, "[vpl_connect]:: data socket failed, error = %s", strerror(errno));

		close(pri->control);
		return NULL;
	}
	if(bind(fd, (struct sockaddr *) pri->local_addr, sizeof(struct sockaddr_un)) < 0){
		verbose(2, "[vpl_connect]:: data bind failed, error = %s", strerror(errno));
		close(fd);
		close(pri->control);
		return NULL;
	}

	sun = malloc(sizeof(struct sockaddr_un));
	if(sun == NULL){
		verbose(2, "[vpl_connect]:: new_addr: allocation of sockaddr_un failed");

		close(fd);
		close(pri->control);
		return NULL;
	}

	verbose(2, "[vpl_connect]:: writing local address.. ");
	req.magic = SWITCH_MAGIC;
	req.version = SWITCH_VERSION;
	req.type = REQ_NEW_CONTROL;
	memcpy(&(req.sock), pri->local_addr, sizeof(struct sockaddr_un));
	n = write(pri->control, &req, sizeof(req));
	if (n != sizeof(req))
	{
		verbose(2, "[vpl_connect]:: control setup request returned %d, error = %s", n, strerror(errno));
		close(pri->control);
		return NULL;
	}

	verbose(2, "[vpl_connect]:: reading remote address.. ");
	n = read(pri->control, sun, sizeof(*sun));
	if (n != sizeof(*sun))
	{
		verbose(2, "[vpl_connect]:: read of data socket returned %d, error = %s", n, strerror(errno));
		close(fd);
		close(pri->control);
		return NULL;
	}
	pri->data_addr = sun;
	pri->data = fd;

	return pri;
}
예제 #12
0
파일: vpl.c 프로젝트: akankshakmr174/gini
/*
 * create a vpl server socket
 * data_addr is still not set!!
 */
vpl_data_t *vpl_create_server(char *name)
{
	struct timeval temp_wtime;
	vpl_data_t *vdata;
	int one = 1;
	struct name_t  					// temporary structure for providing local address
	{
		char zero;
		int pid;
		int usecs;
	} sname;

	if ((vdata = (vpl_data_t *)malloc(sizeof(vpl_data_t))) == NULL)
	{
		verbose(2, "[vpl_create_server]:: memory allocation error ");
		return NULL;
	}
	vdata->sock_type = "unix";
	vdata->ctl_sock = strdup(name);
	vdata->data_addr = NULL;

	// setup control socket
	if((vdata->control = socket(PF_UNIX, SOCK_STREAM, 0)) <0)
	{
		verbose(2, "[vpl_create_server]:: cannot create a socket ");
		return NULL;
	}
	if(setsockopt(vdata->control, SOL_SOCKET,
		      SO_REUSEADDR, (char *) &one, sizeof(one)) <0)
	{
		verbose(2, "[vpl_create_server]:: cannot set socket options");
		return NULL;
	}

	vdata->ctl_addr = new_addr(name, strlen(name)+1);
	if(bind(vdata->control, (struct sockaddr *)vdata->ctl_addr,
		sizeof(struct sockaddr_un)) < 0)
	{
		if(errno == EADDRINUSE)
		{
			int test_fd;
			verbose(2, "[vpl_create_server]:: socket %s already exists.", name);
			if((test_fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
				verbose(2, "[vpl_create_server]:: cannot create a socket ");
			if(connect(test_fd, (struct sockaddr *)vdata->ctl_addr,
				   sizeof(struct sockaddr_un)) < 0)
			{
				if(errno == ECONNREFUSED)
				{
					verbose(2, "[vpl_create_server]:: removing unused socket %s.", name);
					if(unlink(name) < 0)
						verbose(2, "[vpl_create_server]:: unlink failed on socket");
				}
				else close(test_fd);
			}
		}
		if(bind(vdata->control, (struct sockaddr *)vdata->ctl_addr,
			sizeof(struct sockaddr_un)) < 0)
			verbose(2, "[vpl_create_server]:: error binding socket");
	}

	if(listen(vdata->control, 15) < 0)
		verbose(2, "[vpl_create_server]:: error executing listen");

	if((vdata->data = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0)
	{
		verbose(2, "[vpl_create_server]:: unable to create socket ");
		return NULL;
	}

	sname.zero = 0;
	sname.pid = getpid();
	gettimeofday(&temp_wtime, NULL);
	sname.usecs = temp_wtime.tv_usec;
	vdata->local_addr = new_addr(&sname, sizeof(struct name_t));

	if(bind(vdata->data, (struct sockaddr *)vdata->local_addr,
		sizeof(struct sockaddr_un)) < 0)
	{
		verbose(2, "[vpl_create_server]:: bind error ...");
		return NULL;
	}
	return vdata;
}
예제 #13
0
void translate_MipsCode(InterCodes IC_codes){
	InterCode IC_code = IC_codes->code;
	//MipsCode temp = new_MipsCode();
	Operand_M opm1 = NULL,opm2 = NULL,opm3 = NULL;
	int reg_no;
	switch(IC_code->kind){
		case ASSIGN:
			//x:=#k
			if(IC_code->assign.right->kind == CONSTANT){
				//temp->assign.left->kind = MIP_CONSTANT;
				opm1 = new_operand_M(0,IC_code->assign.right->value);
				reg_no = get_reg(IC_code->assign.left);
				opm2 = new_reg(reg_no);
				MipsCode temp = new_MipsCode(MIP_LI);
				temp->assign.right = opm1;
				temp->assign.left = opm2;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
				return; 
			}
			//x:=y
			else if(IC_code->assign.right->kind == VARIABLE || IC_code->assign.right->kind == TEMP){
				reg_no = get_reg(IC_code->assign.left);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->assign.right);
				opm2 = new_reg(reg_no);
				MipsCode temp = new_MipsCode(MIP_MOVE);
				temp->assign.left = opm1;
				temp->assign.right = opm2;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			//x:=*y
			else if(IC_code->assign.right->kind == ADDR_op && IC_code->assign.left->kind != ADDR_op){
				reg_no = get_reg(IC_code->assign.left);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->assign.right);
				opm2 = new_addr(reg_no,0);
				MipsCode temp = new_MipsCode(MIP_LW);
				temp->assign.left = opm1;
				temp->assign.right = opm2;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			//*x:=y
			else if(IC_code->assign.left->kind == ADDR_op && IC_code->assign.right->kind != ADDR_op){
				reg_no = get_reg(IC_code->assign.left);
				opm2 = new_reg(reg_no);
				reg_no = get_reg(IC_code->assign.right);
				opm1 = new_addr(reg_no,0);
				MipsCode temp = new_MipsCode(MIP_SW);
				temp->assign.left = opm2;
				temp->assign.right = opm1;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			break;
		case ADD:
			//x:=y+#k
			if(IC_code->binop.op1->kind != ADDR_op && IC_code->binop.op1->kind != CONSTANT&&IC_code->binop.op2->kind == CONSTANT){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_reg(reg_no);
				opm3 = new_operand_M(0,IC_code->binop.op1->value);
				MipsCode temp = new_MipsCode(MIP_ADDI);
				temp->binop.result = opm1;
				temp->binop.op1 = opm2;
				temp->binop.op2 = opm3;	
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);			
			}
			//x:=#k+y
			if(IC_code->binop.op2->kind != ADDR_op && IC_code->binop.op2->kind != CONSTANT&&IC_code->binop.op1->kind == CONSTANT){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_reg(reg_no);
				opm2 = new_operand_M(0,IC_code->binop.op1->value);
				MipsCode temp = new_MipsCode(MIP_ADDI);
				temp->binop.result = opm1;
				temp->binop.op1 = opm3;
				temp->binop.op2 = opm2;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			//x:=y+*z
			if(IC_code->binop.op2->kind == ADDR_op && IC_code->binop.op1->kind != CONSTANT&&IC_code->binop.op1->kind != ADDR_op){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_addr(reg_no,0);
				MipsCode temp = new_MipsCode(MIP_LW);		//lw reg(x) reg(z)
				temp->assign.left = opm1;
				temp->assign.right = opm3;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
				MipsCode temp1 = new_MipsCode(MIP_ADD);		//add reg(x) reg(y) reg(x)
				temp1->binop.result = opm1;
				temp1->binop.op1 = opm2;
				temp1->binop.op2 = opm1;
				MipsCodes tem1 = MipsCodes_init();
				tem1->code = temp1;
				MipsCodes_link(Mips_head,tem1);
			}
			//x:=*y+z
			if(IC_code->binop.op1->kind == ADDR_op && IC_code->binop.op2->kind != CONSTANT&&IC_code->binop.op2->kind != ADDR_op){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_addr(reg_no,0);
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_reg(reg_no);
				MipsCode temp = new_MipsCode(MIP_LW);		//lw reg(x) reg(y)
				temp->assign.left = opm1;
				temp->assign.right = opm2;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
				MipsCode temp1 = new_MipsCode(MIP_ADD);		//add reg(x) reg(x) reg(z)
				temp1->binop.result = opm1;
				temp1->binop.op1 = opm1;
				temp1->binop.op2 = opm3;
				MipsCodes tem1 = MipsCodes_init();
				tem1->code = temp1;
				MipsCodes_link(Mips_head,tem1);
			}
			//x:=*y+*z
			if(IC_code->binop.op1->kind == ADDR_op && IC_code->binop.op2->kind == ADDR_op){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_addr(reg_no,0);
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_addr(reg_no,0);
				MipsCode temp = new_MipsCode(MIP_LW);		//lw reg(x) reg(y)
				temp->assign.left = opm1;
				temp->assign.right = opm2;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
				MipsCode temp2 = new_MipsCode(MIP_LW);		//lw reg(x) reg(z)
				temp2->assign.left = opm1;
				temp2->assign.right = opm3;
				MipsCodes tem2 = MipsCodes_init();
				tem2->code = temp2;
				MipsCodes_link(Mips_head,tem2);
				MipsCode temp1 = new_MipsCode(MIP_ADD);		//add reg(x) reg(x) reg(z)
				temp1->binop.result = opm1;
				temp1->binop.op1 = opm1;
				temp1->binop.op2 = opm3;
				MipsCodes tem1 = MipsCodes_init();
				tem1->code = temp1;
				MipsCodes_link(Mips_head,tem1);
			}
			//x:=y+&z
			//x:=&y+z
			//x:=*y+#k
			if(IC_code->binop.op1->kind == ADDR_op && IC_code->binop.op2->kind == CONSTANT){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_addr(reg_no,0);
				//reg_no = get_reg();
				//opm3 = new_reg(reg_no);
				MipsCode temp = new_MipsCode(MIP_LW);		//lw reg(x) reg(y)
				temp->assign.left = opm1;
				temp->assign.right = opm2;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
				MipsCode temp1 = new_MipsCode(MIP_ADDI);		//addi reg(x) reg(x) k
				temp1->binop.result = opm1;
				temp1->binop.op1 = opm1;
				temp1->binop.op2 = new_operand_M(0,IC_code->binop.op2->value);
				MipsCodes tem1 = MipsCodes_init();
				tem1->code = temp1;
				MipsCodes_link(Mips_head,tem1);
			}
			//x:=#k+*y
			if(IC_code->binop.op1->kind == CONSTANT && IC_code->binop.op2->kind == ADDR_op){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				//reg_no = get_reg();
				//opm2 = new_addr(reg_no,0);
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_addr(reg_no,0);
				MipsCode temp = new_MipsCode(MIP_LW);		//lw reg(x) reg(y)
				temp->assign.left = opm1;
				temp->assign.right = opm3;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
				MipsCode temp1 = new_MipsCode(MIP_ADDI);		//addi reg(x) k reg(x)
				temp1->binop.result = opm1;
				temp1->binop.op1 = opm1;
				temp1->binop.op2 = new_operand_M(0,IC_code->binop.op2->value);
				MipsCodes tem1 = MipsCodes_init();
				tem1->code = temp1;
				MipsCodes_link(Mips_head,tem1);
			}//x:=y+z
			if(IC_code->binop.op1->kind != ADDR_op && IC_code->binop.op1->kind != CONSTANT&&IC_code->binop.op2->kind != ADDR_op && IC_code->binop.op2->kind != CONSTANT){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_reg(reg_no);
				MipsCode temp = new_MipsCode(MIP_ADD);
				temp->binop.result = opm1;
				temp->binop.op1 = opm2;
				temp->binop.op2 = opm3;	
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);	
			}
			//x:=#k+#k
			break;
		case SUB:
			//x:=y-#k
			if(IC_code->binop.op1->kind != ADDR_op && IC_code->binop.op1->kind != CONSTANT&&IC_code->binop.op2->kind == CONSTANT){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_reg(reg_no);
				opm3 = new_operand_M(0,IC_code->binop.op2->value);
				MipsCode temp = new_MipsCode(MIP_SUB);
				temp->binop.result = opm1;
				temp->binop.op1 = opm2;
				temp->binop.op2 = opm3;	
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);			
			}
			//x:=#k-y
			if(IC_code->binop.op2->kind != ADDR_op && IC_code->binop.op2->kind != CONSTANT&&IC_code->binop.op1->kind == CONSTANT){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_reg(reg_no);
				opm2 = new_operand_M(0,IC_code->binop.op1->value);
				MipsCode temp = new_MipsCode(MIP_SUB);
				temp->binop.result = opm1;
				temp->binop.op1 = opm2;
				temp->binop.op2 = opm3;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			//x:=y-*z
			if(IC_code->binop.op2->kind == ADDR_op && IC_code->binop.op1->kind != CONSTANT&&IC_code->binop.op1->kind != ADDR_op){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_addr(reg_no,0);
				MipsCode temp = new_MipsCode(MIP_LW);		//lw reg(x) reg(z)
				temp->assign.left = opm1;
				temp->assign.right = opm3;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
				MipsCode temp1 = new_MipsCode(MIP_SUB);		//add reg(x) reg(y) reg(x)
				temp1->binop.result = opm1;
				temp1->binop.op1 = opm2;
				temp1->binop.op2 = opm1;
				MipsCodes tem1 = MipsCodes_init();
				tem1->code = temp1;
				MipsCodes_link(Mips_head,tem1);
			}
			//x:=*y-z
			if(IC_code->binop.op1->kind == ADDR_op && IC_code->binop.op2->kind != CONSTANT&&IC_code->binop.op2->kind != ADDR_op){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_addr(reg_no,0);
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_reg(reg_no);
				MipsCode temp = new_MipsCode(MIP_LW);		//lw reg(x) reg(y)
				temp->assign.left = opm1;
				temp->assign.right = opm2;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
				MipsCode temp1 = new_MipsCode(MIP_SUB);		//SUB reg(x) reg(x) reg(z)
				temp1->binop.result = opm1;
				temp1->binop.op1 = opm1;
				temp1->binop.op2 = opm3;
				MipsCodes tem1 = MipsCodes_init();
				tem1->code = temp1;
				MipsCodes_link(Mips_head,tem1);
			}
			//x:=*y-*z
			if(IC_code->binop.op1->kind == ADDR_op && IC_code->binop.op2->kind == ADDR_op){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_addr(reg_no,0);
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_addr(reg_no,0);
				MipsCode temp = new_MipsCode(MIP_LW);		//lw reg(x) reg(y)
				temp->assign.left = opm1;
				temp->assign.right = opm2;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
				MipsCode temp2 = new_MipsCode(MIP_LW);		//lw reg(x) reg(z)
				temp2->assign.left = opm1;
				temp2->assign.right = opm3;
				MipsCodes tem2 = MipsCodes_init();
				tem2->code = temp2;
				MipsCodes_link(Mips_head,tem2);
				MipsCode temp1 = new_MipsCode(MIP_SUB);		//SUB reg(x) reg(x) reg(z)
				temp1->binop.result = opm1;
				temp1->binop.op1 = opm1;
				temp1->binop.op2 = opm3;
				MipsCodes tem1 = MipsCodes_init();
				tem1->code = temp1;
				MipsCodes_link(Mips_head,tem1);
			}
			//x:=y-&z
			//x:=&y-z
			//x:=*y-#k
			if(IC_code->binop.op1->kind == ADDR_op && IC_code->binop.op2->kind == CONSTANT){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_addr(reg_no,0);
				//reg_no = get_reg();
				//opm3 = new_reg(reg_no);
				MipsCode temp = new_MipsCode(MIP_LW);		//lw reg(x) reg(y)
				temp->assign.left = opm1;
				temp->assign.right = opm2;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
				MipsCode temp1 = new_MipsCode(MIP_ADDI);		//addi reg(x) reg(x) k
				temp1->binop.result = opm1;
				temp1->binop.op1 = opm1;
				temp1->binop.op2 = new_operand_M(0,IC_code->binop.op2->value);
				MipsCodes tem1 = MipsCodes_init();
				tem1->code = temp1;
				MipsCodes_link(Mips_head,tem1);
			}
			//x:=#k-*y				//?????????????????????????
			if(IC_code->binop.op1->kind == CONSTANT && IC_code->binop.op2->kind == ADDR_op){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				//reg_no = get_reg();
				//opm2 = new_addr(reg_no,0);
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_addr(reg_no,0);
				MipsCode temp = new_MipsCode(MIP_LW);		//lw reg(x) reg(y)
				temp->assign.left = opm1;
				temp->assign.right = opm3;
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
				MipsCode temp1 = new_MipsCode(MIP_ADDI);		//addi reg(x) k reg(x)
				temp1->binop.result = opm1;
				temp1->binop.op1 = opm1;
				temp1->binop.op2 = new_operand_M(0,IC_code->binop.op2->value);
				MipsCodes tem1 = MipsCodes_init();
				tem1->code = temp1;
				MipsCodes_link(Mips_head,tem1);
			}
//x:=y-z
			if(IC_code->binop.op1->kind != ADDR_op && IC_code->binop.op1->kind != CONSTANT&&IC_code->binop.op2->kind != ADDR_op && IC_code->binop.op2->kind != CONSTANT){
				reg_no = get_reg(IC_code->binop.result);
				opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_reg(reg_no);
				MipsCode temp = new_MipsCode(MIP_SUB);
				temp->binop.result = opm1;
				temp->binop.op1 = opm2;
				temp->binop.op2 = opm3;	
				MipsCodes tem = MipsCodes_init();
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);	
			}
			//x:=#k+#k
			break;
		case MUL:
			reg_no = get_reg(IC_code->binop.result);
			opm1 = new_reg(reg_no);
			//x:= y * #k
			if(IC_code->binop.op2->kind == CONSTANT){
				opm3 = new_operand_M(0,IC_code->binop.op2->value);
				reg_no = get_reg(IC_code->binop.op2);
				Operand_M opm_tem = new_reg(reg_no);
				MipsCodes tem = MipsCodes_init();
				MipsCode temp = new_MipsCode(MIP_LI);
				temp->assign.left = opm_tem;
				temp->assign.right = opm3;
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			//x:= #k * y
			if(IC_code->binop.op1->kind == CONSTANT){
				opm2 = new_operand_M(0,IC_code->binop.op1->value);
				reg_no = get_reg(IC_code->binop.op1);
				Operand_M opm_tem = new_reg(reg_no);
				MipsCodes tem = MipsCodes_init();
				MipsCode temp = new_MipsCode(MIP_LI);
				temp->assign.left = opm_tem;
				temp->assign.right = opm2;
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			//x:=*y*z
			if(IC_code->binop.op1->kind == CONSTANT){		// temp:=*y
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_addr(reg_no,0);
				reg_no = get_reg(IC_code->binop.op2);
				Operand_M opm_tem = new_reg(reg_no);
				MipsCodes tem = MipsCodes_init();
				MipsCode temp = new_MipsCode(MIP_LW);
				temp->assign.left = opm_tem;
				temp->assign.right = opm2;
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			//x:=y**z
			if(IC_code->binop.op2->kind == CONSTANT){		// temp:=*z
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_addr(reg_no,0);
				reg_no = get_reg(IC_code->binop.op1);
				Operand_M opm_tem = new_reg(reg_no);
				MipsCodes tem = MipsCodes_init();
				MipsCode temp = new_MipsCode(MIP_LW);
				temp->assign.left = opm_tem;
				temp->assign.right = opm3;
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			//x:=y*z
			if(IC_code->binop.op1->kind!=CONSTANT && IC_code->binop.op2->kind!=CONSTANT){
				reg_no = get_reg(IC_code->binop.op1);
				opm2 = new_reg(reg_no);
				reg_no = get_reg(IC_code->binop.op2);
				opm3 = new_reg(reg_no);
			}
			{MipsCodes tem1 = MipsCodes_init();
			MipsCode temp1 = new_MipsCode(MIP_MUL);
			temp1->binop.result = opm1;
			temp1->binop.op1 = opm2;
			temp1->binop.op2 = opm3;
			tem1->code = temp1;
			MipsCodes_link(Mips_head,tem1);}
			break;
		case DIVI:
			reg_no = get_reg(0);
			opm1 = new_reg(reg_no);
			//x:= y / #k
			/*if(IC_code->binop.op2->kind == CONSTANT){
				opm3 = new_operand_M(0,IC_code->binop.op2->value);
				reg_no = get_reg(0);
				Operand_M opm_tem = new_reg(reg_no);
				MipsCodes tem = MipsCodes_init();
				MipsCode temp = new_MipsCode(MIP_LI);
				temp->assign.left = opm_tem;
				temp->assign.right = opm3;
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			//x:= #k / y
			if(IC_code->binop.op1->kind == CONSTANT){
				opm2 = new_operand_M(0,IC_code->binop.op1->value);
				reg_no = get_reg(0);
				Operand_M opm_tem = new_reg(reg_no);
				MipsCodes tem = MipsCodes_init();
				MipsCode temp = new_MipsCode(MIP_LI);
				temp->assign.left = opm_tem;
				temp->assign.right = opm2;
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			//x:=*y/z
			if(IC_code->binop.op1->kind == ADDR_op){		// temp:=*y
				reg_no = get_reg(0);
				opm2 = new_addr(reg_no,0);
				reg_no = get_reg(0);
				Operand_M opm_tem = new_reg(reg_no);
				MipsCodes tem = MipsCodes_init();
				MipsCode temp = new_MipsCode(MIP_LW);
				temp->assign.left = opm_tem;
				temp->assign.right = opm2;
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			//x:=y/*z
			if(IC_code->binop.op2->kind == ADDR_op){		// temp:=*z
				reg_no = get_reg(0);
				opm3 = new_addr(reg_no,0);
				reg_no = get_reg(0);
				Operand_M opm_tem = new_reg(reg_no);
				MipsCodes tem = MipsCodes_init();
				MipsCode temp = new_MipsCode(MIP_LW);
				temp->assign.left = opm_tem;
				temp->assign.right = opm3;
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}*/
			//x:=y/z
			MipsCodes tem1 = MipsCodes_init();
			MipsCode temp1 = new_MipsCode(MIP_DIV);
			temp1->assign.left = opm2;
			temp1->assign.right = opm3;
			tem1->code = temp1;
			MipsCodes_link(Mips_head,tem1);
			MipsCodes tem2 = MipsCodes_init();
			MipsCode temp2 = new_MipsCode(MIP_MFLO);
			temp2->onlyop.op = opm1;
			tem2->code = temp2;
			MipsCodes_link(Mips_head,tem2);
			break;
		case LAB:;
			{MipsCodes tem = MipsCodes_init();
			MipsCode temp = new_MipsCode(MIP_LAB);
			temp->onlyop.op = new_operand_M(MIP_LABEL,IC_code->onlyop.op->label_no);
			tem->code = temp;
			MipsCodes_link(Mips_head,tem);}
			break;
		case RET:;
			{MipsCodes tem = MipsCodes_init();
			MipsCode temp = new_MipsCode(MIP_MOVE);
           	//reg_no = get_reg(IC_code->onlyop.op);
			opm1 = new_reg(2);
			temp->assign.left = opm1;
			//return #k
			if(IC_code->onlyop.op->kind == CONSTANT){
				opm2 = new_operand_M(0,IC_code->onlyop.op->value);
			}
			else {
				reg_no = get_reg(IC_code->assign.right);
				opm2 = new_reg(reg_no);
			}
			temp->assign.right = opm2;
			tem->code = temp;
			MipsCodes_link(Mips_head,tem);
			MipsCodes tem1 = MipsCodes_init();
			MipsCode temp1 = new_MipsCode(MIP_JR);
			temp1->onlyop.op = new_reg(31);
			tem1->code = temp1;
			MipsCodes_link(Mips_head,tem1);
			}
			break;
		case GOTO:;
			{MipsCodes tem = MipsCodes_init();
			MipsCode temp = new_MipsCode(MIP_J);
			temp->onlyop.op = new_operand_M(MIP_LABEL,IC_code->onlyop.op->label_no);
			tem->code = temp;
			MipsCodes_link(Mips_head,tem);}
			break;
		case ADDR:
			break;
		case COND:;

			{
			MipsCodes tem = MipsCodes_init();
			MipsCode temp = NULL;
			//if x==y GOTO z
			if(strcmp(IC_code->cond.op->op,"==") == 0){
				temp = new_MipsCode(MIP_BEQ);
			}
			//if x!=y GOTO z
			if(strcmp(IC_code->cond.op->op,"!=") == 0){
				temp = new_MipsCode(MIP_BNE);
			}
			//if x>y GOTO z
			if(strcmp(IC_code->cond.op->op,">") == 0){
				temp = new_MipsCode(MIP_BGT);
			}
			//if x<y GOTO z
			if(strcmp(IC_code->cond.op->op,"<") == 0){
				temp = new_MipsCode(MIP_BLT);
			}
			//if x>=y GOTO z
			if(strcmp(IC_code->cond.op->op,">=") == 0){
				temp = new_MipsCode(MIP_BGE);
			}
			//if x<=y GOTO z
			if(strcmp(IC_code->cond.op->op,"<=") == 0){
				temp = new_MipsCode(MIP_BLE);
			}
			if(IC_code->cond.op1->kind == CONSTANT){		// #k == y
				reg_no = get_reg(IC_code->cond.op1);
				opm1 = new_reg(reg_no);
				//reg_no = get_reg();
				//Operand_M opm_tem = new_reg(reg_no);
				MipsCodes tem1 = MipsCodes_init();
				MipsCode temp1 = new_MipsCode(MIP_LI);
				temp1->assign.left = opm1;
				temp1->assign.right = new_operand_M(0,IC_code->cond.op1->value);
				tem->code = temp1;
				MipsCodes_link(Mips_head,tem1);
				//reg_no = get_reg(IC_code->cond.op1);
				//Operand_M opm1 = new_reg(reg_no);
				reg_no = get_reg(IC_code->cond.op2);
				Operand_M opm2 = new_reg(reg_no);
				temp->binop.result = opm1;
				temp->binop.op1 = opm2;
				opm3 = new_operand_M(MIP_LABEL,IC_codes->next->code->onlyop.op->label_no);
				temp->binop.op2 = opm3;
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			else if(IC_code->cond.op2->kind == CONSTANT){		// x == #k
				reg_no = get_reg(IC_code->cond.op2);
				opm2 = new_reg(reg_no);
				//reg_no = get_reg();
				//Operand_M opm_tem = new_reg(reg_no);
				MipsCodes tem1 = MipsCodes_init();
				MipsCode temp1 = new_MipsCode(MIP_LI);
				temp1->assign.left = opm2;
				temp1->assign.right = new_operand_M(0,IC_code->cond.op2->value);
				tem1->code = temp1;
				MipsCodes_link(Mips_head,tem1);
				reg_no = get_reg(IC_code->cond.op1);
				Operand_M opm1 = new_reg(reg_no);
				//reg_no = get_reg(IC_code->cond.op2);
				//Operand_M opm2 = new_reg(reg_no);
				temp->binop.result = opm1;
				temp->binop.op1 = opm2;
				opm3 = new_operand_M(MIP_LABEL,IC_codes->next->code->onlyop.op->label_no);
				temp->binop.op2 = opm3;
				tem->code = temp;
				MipsCodes_link(Mips_head,tem);
			}
			else{
			reg_no = get_reg(IC_code->cond.op1);
			Operand_M opm1 = new_reg(reg_no);
			reg_no = get_reg(IC_code->cond.op2);
			Operand_M opm2 = new_reg(reg_no);
			temp->binop.result = opm1;
			temp->binop.op1 = opm2;
			opm3 = new_operand_M(MIP_LABEL,IC_codes->next->code->onlyop.op->label_no);
			temp->binop.op2 = opm3;
			tem->code = temp;
			MipsCodes_link(Mips_head,tem);}}
			break;
		case FUNC_I:;
			{MipsCodes tem = MipsCodes_init();
			MipsCode temp = new_MipsCode(MIP_FUNC);
			opm1 = new_operand_M(MIP_FUNC_op,0);
			strcpy(opm1->func,IC_code->onlyop.op->func);
			temp->onlyop.op = opm1;
			tem->code = temp;
			MipsCodes_link(Mips_head,tem);}
			break;
		case DEC:
			break;
		case READ:;
			{MipsCodes tem = MipsCodes_init();
                        MipsCode temp = new_MipsCode(MIP_READ);
			tem->code = temp;
			reg_no = get_reg(IC_code->onlyop.op);
			opm1 = new_reg(reg_no);
			temp->onlyop.op = opm1;
			MipsCodes_link(Mips_head,tem);}
			break;
		case WRITE:;
                        {MipsCodes tem = MipsCodes_init();
                        MipsCode temp = new_MipsCode(MIP_WRITE);
                        tem->code = temp;
			reg_no = get_reg(IC_code->onlyop.op);
			opm1 = new_reg(reg_no);
                        temp->onlyop.op = opm1;
                        MipsCodes_link(Mips_head,tem);}
			break;
		case CALL:;
			/*{MipsCodes tem = MipsCodes_init();
			MipsCode temp = new_MipsCode(MIP_ADDI);
			opm1 = new_reg(29);
			opm2 = new_reg(29);
			opm3 = new_operand_M(0,0-4*(arg_num+1));
			temp->binop.result = opm1;
			temp->binop.op1 = opm2;
			temp->binop.op2 = opm3;
			tem->code = temp;
			MipsCodes_link(Mips_head,tem);
			int i;
			for(i = 0;i<arg_num;i++){
				MipsCodes tem1 = MipsCodes_init();
				MipsCode temp1 = new_MipsCode(MIP_SW);
				temp1->assign.left = new_reg(i+4);
				temp1->assign.right = new_addr(29,4*i);
				//temp1->binop.op2 = new_Operand_M(4*i);
				tem1->code = temp1;
				MipsCodes_link(Mips_head,tem1);
			}
                        MipsCodes tem2 = MipsCodes_init();
                        MipsCode temp2 = new_MipsCode(MIP_SW);
                        temp2->assign.left = new_reg(31);
                        temp2->assign.right = new_addr(29,4*i);
                        //temp1->binop.op2 = new_Operand_M(4*i);
			tem2->code = temp2;
			MipsCodes_link(Mips_head,tem2);*/
			int i;
			MipsCodes tem3 = MipsCodes_init();
			MipsCode temp3 = new_MipsCode(MIP_JAL);
			temp3->onlyop.op = new_operand_M(MIP_FUNC_op,0);
			strcpy(temp3->onlyop.op->func,IC_code->assign.right->func);
			tem3->code = temp3;
                        MipsCodes_link(Mips_head,tem3);
			
                        for(i = 0;i<arg_num;i++){
                                MipsCodes tem1 = MipsCodes_init();
                                MipsCode temp1 = new_MipsCode(MIP_LW);
                                temp1->assign.left = new_reg(i+4);
                                temp1->assign.right = new_addr(29,4*i);
                                //temp1->binop.op2 = new_Operand_M(4*i);
                                tem1->code = temp1;
                                MipsCodes_link(Mips_head,tem1);
                        }

                        MipsCodes tem4 = MipsCodes_init();
                        MipsCode temp4 = new_MipsCode(MIP_LW);
                        temp4->assign.left = new_reg(31);
                        temp4->assign.right = new_addr(29,4*i);
                        //temp1->binop.op2 = new_Operand_M(4*i);
                        tem4->code = temp4;
                        MipsCodes_link(Mips_head,tem4);

                        MipsCodes tem5 = MipsCodes_init();

                        MipsCode temp5 = new_MipsCode(MIP_ADDI);
                        opm1 = new_reg(29);
                        opm2 = new_reg(29);
                        opm3 = new_operand_M(0,4*(arg_num+1));
                        temp5->binop.result = opm1;
                        temp5->binop.op1 = opm2;
                        temp5->binop.op2 = opm3;
                        tem5->code = temp5;
                        MipsCodes_link(Mips_head,tem5);
			MipsCodes tem6 = MipsCodes_init();
			MipsCode temp6 = new_MipsCode(MIP_MOVE);
			tem6->code = temp6;
			reg_no = get_reg(IC_code->assign.left);
			temp6->assign.left = new_reg(reg_no);
			temp6->assign.right = new_reg(2);
			MipsCodes_link(Mips_head,tem6);
			arg_num = 0;
			break;
		case ARG:
			arg_num++;
			if(IC_codes->next->code->kind == CALL){
			{MipsCodes tem = MipsCodes_init();
			MipsCode temp = new_MipsCode(MIP_ADDI);
			opm1 = new_reg(29);
			opm2 = new_reg(29);
			opm3 = new_operand_M(0,0-4*(arg_num+1));
			temp->binop.result = opm1;
			temp->binop.op1 = opm2;
			temp->binop.op2 = opm3;
			tem->code = temp;
			MipsCodes_link(Mips_head,tem);
			int i;
			for(i = 0;i<arg_num;i++){
				MipsCodes tem1 = MipsCodes_init();
				MipsCode temp1 = new_MipsCode(MIP_SW);
				temp1->assign.left = new_reg(i+4);
				temp1->assign.right = new_addr(29,4*i);
				//temp1->binop.op2 = new_Operand_M(4*i);
				tem1->code = temp1;
				MipsCodes_link(Mips_head,tem1);
			}
                        MipsCodes tem2 = MipsCodes_init();
                        MipsCode temp2 = new_MipsCode(MIP_SW);
                        temp2->assign.left = new_reg(31);
                        temp2->assign.right = new_addr(29,4*i);
                        //temp1->binop.op2 = new_Operand_M(4*i);
			tem2->code = temp2;
			MipsCodes_link(Mips_head,tem2);}

			MipsCodes tem = MipsCodes_init();
			MipsCode temp = new_MipsCode(MIP_MOVE);
			reg_no = get_reg(IC_code->onlyop.op);
			opm2 = new_reg(reg_no);
			temp->assign.left = new_reg(arg_num+3);
			temp->assign.right = opm2;
			tem->code = temp;
			MipsCodes_link(Mips_head,tem);
			break;
		case PARAM_I:;
                        {/*MipsCodes tem = MipsCodes_init();
                        MipsCode temp = new_MipsCode(MIP_LI);
                        reg_no = get_reg(IC_code->onlyop.op);
			opm1 = new_reg(reg_no);
                 	opm2 = new_operand_M(0,1);
                        temp->assign.left = opm1;
			temp->assign.right = opm2;
                        tem->code = temp;
                        MipsCodes_link(Mips_head,tem);*/
			reg_no = get_reg(IC_code->onlyop.op);
			param_num++;		
			}
			break;
		default:
			printf("Oh,no! FORGET!\n");
			break;
	}
	//return temp;
}
}
예제 #14
0
static void set_addr_location(MON_ADDR *a, unsigned l)
{
    *a = new_addr(addr_memspace(*a), addr_mask(l));
}