z8kgen.c

来自「基于4个mips核的noc设计」· C语言 代码 · 共 1,314 行 · 第 1/4 页

C
1,314
字号
  "11I0", "CLASS_BIT_1OR2+0xe", 1,  "11I0", "CLASS_BIT_1OR2+0xf", 1,  "ssss", "CLASS_REG+(ARG_RS)", 1,  "dddd", "CLASS_REG+(ARG_RD)", 1,  "aaaa", "CLASS_REG+(ARG_RA)", 1,  "bbbb", "CLASS_REG+(ARG_RB)", 1,  "rrrr", "CLASS_REG+(ARG_RR)", 1,  "ssN0", "CLASS_REGN0+(ARG_RS)", 1,  "ddN0", "CLASS_REGN0+(ARG_RD)", 1,  "aaN0", "CLASS_REGN0+(ARG_RA)", 1,  "bbN0", "CLASS_REGN0+(ARG_RB)", 1,  "rrN0", "CLASS_REGN0+(ARG_RR)", 1,  "cccc", "CLASS_CC", 1,  "nnnn", "CLASS_IMM+(ARG_IMMN)", 1,  "xxxx", "CLASS_REG+(ARG_RX)", 1,  "xxN0", "CLASS_REGN0+(ARG_RX)", 1,  "nminus1", "CLASS_IMM+(ARG_IMMNMINUS1)", 1,  "disp16", "CLASS_DISP+(ARG_DISP16)", 4,  "disp12", "CLASS_DISP+(ARG_DISP12)", 3,  "flags", "CLASS_FLAGS", 1,  "address_dst", "CLASS_ADDRESS+(ARG_DST)", 4,  "address_src", "CLASS_ADDRESS+(ARG_SRC)", 4,  "imm4m1", "CLASS_IMM+(ARG_IMM4M1)", 1,  "imm4", "CLASS_IMM+(ARG_IMM4)", 1,  "imm8", "CLASS_IMM+(ARG_IMM8)", 2,  "imm16", "CLASS_IMM+(ARG_IMM16)", 4,  "imm32", "CLASS_IMM+(ARG_IMM32)", 8,  "nim8", "CLASS_IMM+(ARG_NIM8)", 2,  "0ccc", "CLASS_0CCC", 1,  "1ccc", "CLASS_1CCC", 1,  "disp8", "CLASS_DISP8", 2,  "0disp7", "CLASS_0DISP7", 2,  "1disp7", "CLASS_1DISP7", 2,  "01ii", "CLASS_01II", 1,  "00ii", "CLASS_00II", 1,  0, 0};char *translate (table, x, length)     struct tok_struct *table;     char *x;     int *length;{  int found;  found = 0;  while (table->match)    {      int l = strlen (table->match);      if (strncmp (table->match, x, l) == 0)	{	  /* Got a hit */	  printf ("%s", table->token);	  *length += table->length;	  return x + l;	}      table++;    }  fprintf (stderr, "Can't find %s\n", x);  printf ("**** Can't find %s\n", x);  while (*x)    x++;  return x;}voidchewbits (bits, length)     char *bits;     int *length;{  int n = 0;  *length = 0;  printf ("{");  while (*bits)    {      while (*bits == ' ')	{	  bits++;	}      bits = translate (toks, bits, length);      n++;      printf (",");    }  while (n < BYTE_INFO_LEN - 1)    {      printf ("0,");      n++;    }  printf ("}");}staticintchewname (name)     char *name;{  char *n;  int nargs = 0;  n = name;  printf ("\"");  while (*n && !iswhite (*n))    {      printf ("%c", *n);      n++;    }  printf ("\",");		/* Scan the operands and make entires for				   them -remember indirect things */  n = name;  printf ("OPC_");  while (*n && !iswhite (*n))    {      printf ("%c", *n);      n++;    }  printf (",0,{");  while (*n)    {      int d;      while (*n == ',' || iswhite (*n))	n++;      nargs++;      n = translate (args, n, &d);      printf (",");    }  if (nargs == 0)    {      printf ("0");    }  printf ("},");  return nargs;}static voidsub (x, c)     char *x;     char c;{  while (*x)    {      if (x[0] == c && x[1] == c &&	  x[2] == c && x[3] == c)	{	  x[2] = 'N';	  x[3] = '0';	}      x++;    }}#if 0#define D(x) ((x) == '1' || (x) =='0')#define M(y) (strncmp(y,x,4)==0)printmangled (x)     char *x;{  return;  while (*x)    {      if (D (x[0]) && D (x[1]) && D (x[2]) && D (x[3]))	{	  printf ("XXXX");	}      else if (M ("ssss"))	{	  printf ("ssss");	}      else if (M ("dddd"))	{	  printf ("dddd");	}      else	printf ("____");      x += 4;      if (x[0] == ' ')	{	  printf ("_");	  x++;	}    }}#endif/*#define WORK_TYPE*/voidprint_type (n)     struct op *n;{#ifdef WORK_TYPE  while (*s && !iswhite (*s))    {      l = *s;      s++;    }  switch (l)    {    case 'l':      printf ("32,");      break;    case 'b':      printf ("8,");      break;    default:      printf ("16,");      break;    }#else  printf ("%2d,", n->type);#endif}voidinternal (){  int c = count ();  struct op *new = xmalloc (sizeof (struct op) * c);  struct op *p = opt;  memcpy (new, p, c * sizeof (struct op));  /* sort all names in table alphabetically */  qsort (new, c, sizeof (struct op), func);  p = new;  while (p->flags[0] != '*')  {    /* If there are any @rs, sub the ssss into a ssn0,       (rs), (ssn0)       */    int loop = 1;    printf ("\"%s\",%2d, ", p->flags, p->cycles);    while (loop)    {      char *s = p->name;      loop = 0;      while (*s)      {	if (s[0] == '@')	{	  char c;	  /* skip the r and sub the string */	  s++;	  c = s[1];	  sub (p->bits, c);	}	if (s[0] == '(' && s[3] == ')')	{	  sub (p->bits, s[2]);	}	if (s[0] == '(')	{	  sub (p->bits, s[-1]);	}	s++;      }    }    print_type (p);    printf ("\"%s\",\"%s\",0,\n", p->bits, p->name);    p++;  }}static voidgas (){  int c = count ();  struct op *p = opt;  int idx = 0;  char *oldname = "";  struct op *new = xmalloc (sizeof (struct op) * c);  memcpy (new, p, c * sizeof (struct op));  /* sort all names in table alphabetically */  qsort (new, c, sizeof (struct op), func);  printf ("			/* THIS FILE IS AUTOMAGICALLY GENERATED, DON'T EDIT IT */\n");  printf ("#define ARG_MASK 0x0f\n");  printf ("#define ARG_SRC 0x01\n");  printf ("#define ARG_DST 0x02\n");  printf ("#define ARG_RS 0x01\n");  printf ("#define ARG_RD 0x02\n");  printf ("#define ARG_RA 0x03\n");  printf ("#define ARG_RB 0x04\n");  printf ("#define ARG_RR 0x05\n");  printf ("#define ARG_RX 0x06\n");  printf ("#define ARG_IMM4 0x01\n");  printf ("#define ARG_IMM8 0x02\n");  printf ("#define ARG_IMM16 0x03\n");  printf ("#define ARG_IMM32 0x04\n");  printf ("#define ARG_IMMN 0x05\n");  printf ("#define ARG_IMMNMINUS1 0x05\n");  printf ("#define ARG_IMM_1 0x06\n");  printf ("#define ARG_IMM_2 0x07\n");  printf ("#define ARG_DISP16 0x08\n");  printf ("#define ARG_NIM8 0x09\n");  printf ("#define ARG_IMM2 0x0a\n");  printf ("#define ARG_IMM1OR2 0x0b\n");

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?