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; }
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; }
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; }
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; } } }
//======================================================= // 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)); }
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; }
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; }
// 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; }
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; }
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; }
/* * 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; }
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; } }
static void set_addr_location(MON_ADDR *a, unsigned l) { *a = new_addr(addr_memspace(*a), addr_mask(l)); }