void read_regs(char *name) { int i, j; char fn[32], txt[128], c, *cp; FILE *nf = NULL; struct regdesc *reg; if (regs) return; bzero((void *) fn, 32); for (i=0; i<31; i++) { if (i<strlen(name)) fn[i]=toupper(name[i]); else break; } strcat(fn,".regs"); nf = fopen(GetFile(fn),"r"); if (nf == NULL) { printf("%s:not available\n",fn); return; } while (1) { if (fgets(txt,128,nf) == NULL) break; cp = "NAME"; if (strncmp(cp, txt, strlen(cp)) == 0) { cp = &txt[strlen(cp)]; bzero((void *) dev_name, 32); for (i=0, j=0; i<31; i++) { c = *cp++; if ((c == '\n') || (c == 0)) break; if (isspace(c)) continue; dev_name[j++] = c; } } if (strncmp("$", txt, 1) == 0) { reg = new_reg(); sscanf(txt,"$ %s %s 0x%X %d %d %d", reg->name, reg->flags, ®->offset, ®->size, ®->window, ®->depth); reg_cnt++; } } print_regs(1); print_regs(2); printf("Device:%s %d:reg descriptions read\n",dev_name, reg_cnt); }
int main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ const char *reg_file = NULL, /* Registration file/URL to use */ *reg_standard = NULL; /* Which standard to extract */ mxml_node_t *reg_xml, /* Registration XML data */ *reg_2, /* ipp-registrations-2 */ *reg_record, /* <record> */ *reg_collection, /* <collection> */ *reg_name, /* <name> */ *reg_member, /* <member_attribute> */ *reg_sub_member, /* <sub-member_attribute> */ *reg_syntax, /* <syntax> */ *reg_xref; /* <xref> */ cups_array_t *attrs; /* Attribute registrations */ _cups_reg_t *current; /* Current attribute registration */ ipp_tag_t group = IPP_TAG_ZERO, /* Which attributes to test */ reg_group; /* Group for registration */ /* * Parse command-line... */ for (i = 1; i < argc; i ++) { if (!strcmp(argv[i], "--job") && group == IPP_TAG_ZERO) group = IPP_TAG_JOB; else if (!strcmp(argv[i], "--ref")) { i ++; if (i >= argc) return (usage()); reg_standard = argv[i]; } else if (!strcmp(argv[i], "--printer") && group == IPP_TAG_ZERO) group = IPP_TAG_PRINTER; else if (argv[i][0] == '-' || reg_file) return (usage()); else reg_file = argv[i]; } if (group == IPP_TAG_ZERO) return (usage()); /* * Read registrations... */ if (!reg_file) reg_file = "http://www.iana.org/assignments/ipp-registrations/" "ipp-registrations.xml"; if ((reg_xml = load_xml(reg_file)) == NULL) return (1); /* * Scan registrations for attributes... */ if ((reg_2 = mxmlFindElement(reg_xml, reg_xml, "registry", "id", "ipp-registrations-2", MXML_DESCEND)) == NULL) { fprintf(stderr, "xmltotest: No IPP attribute registrations in \"%s\".\n", reg_file); return (1); } attrs = cupsArrayNew((cups_array_func_t)compare_reg, NULL); for (reg_record = mxmlFindElement(reg_2, reg_2, "record", NULL, NULL, MXML_DESCEND); reg_record; reg_record = mxmlFindElement(reg_record, reg_2, "record", NULL, NULL, MXML_NO_DESCEND)) { /* * Get the values from the current record... */ reg_collection = mxmlFindElement(reg_record, reg_record, "collection", NULL, NULL, MXML_DESCEND); reg_name = mxmlFindElement(reg_record, reg_record, "name", NULL, NULL, MXML_DESCEND); reg_member = mxmlFindElement(reg_record, reg_record, "member_attribute", NULL, NULL, MXML_DESCEND); reg_sub_member = mxmlFindElement(reg_record, reg_record, "sub-member_attribute", NULL, NULL, MXML_DESCEND); reg_syntax = mxmlFindElement(reg_record, reg_record, "syntax", NULL, NULL, MXML_DESCEND); reg_xref = mxmlFindElement(reg_record, reg_record, "xref", NULL, NULL, MXML_DESCEND); if (!reg_collection || !reg_name || !reg_syntax || !reg_xref) continue; /* * Filter based on group and standard... */ if (!strcmp(reg_collection->child->value.opaque, "Printer Description")) reg_group = IPP_TAG_PRINTER; else if (!strcmp(reg_collection->child->value.opaque, "Job Description")) reg_group = IPP_TAG_JOB; else if (!strcmp(reg_collection->child->value.opaque, "Job Template")) { if (strstr(reg_name->child->value.opaque, "-default") || strstr(reg_name->child->value.opaque, "-supported")) reg_group = IPP_TAG_PRINTER; else reg_group = IPP_TAG_JOB; } else reg_group = IPP_TAG_ZERO; if (reg_group != group) continue; if (reg_standard && !match_xref(reg_xref, reg_standard)) continue; /* * Add the record to the array... */ if ((current = new_reg(reg_name, reg_member, reg_sub_member, reg_syntax)) != NULL) cupsArrayAdd(attrs, current); } /* * Write out a test for all of the selected attributes... */ puts("{"); if (group == IPP_TAG_PRINTER) { puts("\tOPERATION Get-Printer-Attributes"); puts("\tGROUP operation-attributes-tag"); puts("\tATTR charset attributes-charset utf-8"); puts("\tATTR naturalLanguage attributes-natural-language en"); puts("\tATTR uri printer-uri $uri"); puts("\tATTR name requesting-user-name $user"); puts("\tATTR keyword requested-attributes all,media-col-database"); puts(""); puts("\tSTATUS successful-ok"); puts("\tSTATUS successful-ok-ignored-or-substituted-attributes"); puts(""); } else { puts("\tOPERATION Get-Job-Attributes"); puts("\tGROUP operation-attributes-tag"); puts("\tATTR charset attributes-charset utf-8"); puts("\tATTR naturalLanguage attributes-natural-language en"); puts("\tATTR uri printer-uri $uri"); puts("\tATTR integer job-id $job-id"); puts("\tATTR name requesting-user-name $user"); puts(""); puts("\tSTATUS successful-ok"); puts(""); } for (current = cupsArrayFirst(attrs); current; current = cupsArrayNext(attrs)) write_expect(current, group); puts("}"); return (0); }
OutReg *Codegen::new_reg( Type *type, String name ) { if ( not name.size() ) return new_reg( type, "R" + to_string( num_reg++ ) ); return out_regs.push_back( type, name ); }
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; } }