Пример #1
0
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,
		&reg->offset,
		&reg->size,
		&reg->window,
		&reg->depth);
	 reg_cnt++;
      }
   }
   print_regs(1);
   print_regs(2);
   printf("Device:%s %d:reg descriptions read\n",dev_name, reg_cnt);
}
Пример #2
0
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);
}
Пример #3
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 );
}
Пример #4
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;
}
}