⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ia64-gen.c

📁 xen虚拟机源代码安装包
💻 C
📖 第 1 页 / 共 5 页
字号:
        if (m33)          return strstr (format, "M33") != NULL;      }      break;    case 'i':      if (ic->name[5] == 'n')        {          int m42 = plain_mov && irf_operand (idesc->operands[0], field);          int m43 = plain_mov && irf_operand (idesc->operands[1], field);          if (m42)            return strstr (format, "M42") != NULL;          if (m43)            return strstr (format, "M43") != NULL;        }      else if (ic->name[5] == 'p')        {          return idesc->operands[1] == IA64_OPND_IP;        }      else        abort ();      break;    case 'p':      if (ic->name[5] == 'r')        {          int i25 = plain_mov && idesc->operands[1] == IA64_OPND_PR;          int i23 = plain_mov && idesc->operands[0] == IA64_OPND_PR;          int i24 = plain_mov && idesc->operands[0] == IA64_OPND_PR_ROT;          if (i23)            return strstr (format, "I23") != NULL;          if (i24)            return strstr (format, "I24") != NULL;          if (i25)            return strstr (format, "I25") != NULL;        }      else if (ic->name[5] == 's')        {          int m35 = plain_mov && idesc->operands[0] == IA64_OPND_PSR_L;          int m36 = plain_mov && idesc->operands[1] == IA64_OPND_PSR;          if (m35)            return strstr (format, "M35") != NULL;          if (m36)            return strstr (format, "M36") != NULL;        }      else        abort ();      break;    case 'u':      {        int m35 = plain_mov && idesc->operands[0] == IA64_OPND_PSR_UM;        int m36 = plain_mov && idesc->operands[1] == IA64_OPND_PSR_UM;        if (m35)          return strstr (format, "M35") != NULL;        if (m36)          return strstr (format, "M36") != NULL;      }      break;    }  return 0;}/* Is the given opcode in the given insn class?  */static intin_iclass (struct ia64_opcode *idesc, struct iclass *ic, 	   const char *format, const char *field, int *notep){  int i;  int resolved = 0;  if (ic->comment)    {      if (!strncmp (ic->comment, "Format", 6))        {          /* Assume that the first format seen is the most restrictive, and             only keep a later one if it looks like it's more restrictive.  */          if (format)            {              if (strlen (ic->comment) < strlen (format))                {                  warn (_("most recent format '%s'\nappears more restrictive than '%s'\n"),			ic->comment, format);                  format = ic->comment;                 }            }          else            format = ic->comment;        }      else if (!strncmp (ic->comment, "Field", 5))        {          if (field)            warn (_("overlapping field %s->%s\n"),		  ic->comment, field);          field = ic->comment;        }    }  /* An insn class matches anything that is the same followed by completers,     except when the absence and presence of completers constitutes different     instructions.  */  if (ic->nsubs == 0 && ic->nxsubs == 0)    {      int is_mov = strncmp (idesc->name, "mov", 3) == 0;      int plain_mov = strcmp (idesc->name, "mov") == 0;      int len = strlen(ic->name);      resolved = ((strncmp (ic->name, idesc->name, len) == 0)                  && (idesc->name[len] == '\0'                       || idesc->name[len] == '.'));      /* All break, nop, and hint variations must match exactly.  */      if (resolved &&          (strcmp (ic->name, "break") == 0           || strcmp (ic->name, "nop") == 0	   || strcmp (ic->name, "hint") == 0))        resolved = strcmp (ic->name, idesc->name) == 0;      /* Assume restrictions in the FORMAT/FIELD negate resolution,         unless specifically allowed by clauses in this block.  */      if (resolved && field)        {          /* Check Field(sf)==sN against opcode sN.  */          if (strstr(field, "(sf)==") != NULL)            {              char *sf;              if ((sf = strstr (idesc->name, ".s")) != 0)		resolved = strcmp (sf + 1, strstr (field, "==") + 2) == 0;            }          /* Check Field(lftype)==XXX.  */          else if (strstr (field, "(lftype)") != NULL)            {              if (strstr (idesc->name, "fault") != NULL)                resolved = strstr (field, "fault") != NULL;              else                resolved = strstr (field, "fault") == NULL;            }          /* Handle Field(ctype)==XXX.  */          else if (strstr (field, "(ctype)") != NULL)            {              if (strstr (idesc->name, "or.andcm"))                resolved = strstr (field, "or.andcm") != NULL;              else if (strstr (idesc->name, "and.orcm"))                resolved = strstr (field, "and.orcm") != NULL;              else if (strstr (idesc->name, "orcm"))                resolved = strstr (field, "or orcm") != NULL;              else if (strstr (idesc->name, "or"))                resolved = strstr (field, "or orcm") != NULL;              else if (strstr (idesc->name, "andcm"))                resolved = strstr (field, "and andcm") != NULL;              else if (strstr (idesc->name, "and"))                resolved = strstr (field, "and andcm") != NULL;              else if (strstr (idesc->name, "unc"))                resolved = strstr (field, "unc") != NULL;              else                resolved = strcmp (field, "Field(ctype)==") == 0;            }        }      if (resolved && format)        {          if (strncmp (idesc->name, "dep", 3) == 0                   && strstr (format, "I13") != NULL)            resolved = idesc->operands[1] == IA64_OPND_IMM8;          else if (strncmp (idesc->name, "chk", 3) == 0                   && strstr (format, "M21") != NULL)            resolved = idesc->operands[0] == IA64_OPND_F2;          else if (strncmp (idesc->name, "lfetch", 6) == 0)            resolved = (strstr (format, "M14 M15") != NULL                        && (idesc->operands[1] == IA64_OPND_R2                            || idesc->operands[1] == IA64_OPND_IMM9b));          else if (strncmp (idesc->name, "br.call", 7) == 0                   && strstr (format, "B5") != NULL)            resolved = idesc->operands[1] == IA64_OPND_B2;          else if (strncmp (idesc->name, "br.call", 7) == 0                   && strstr (format, "B3") != NULL)            resolved = idesc->operands[1] == IA64_OPND_TGT25c;          else if (strncmp (idesc->name, "brp", 3) == 0                   && strstr (format, "B7") != NULL)            resolved = idesc->operands[0] == IA64_OPND_B2;          else if (strcmp (ic->name, "invala") == 0)            resolved = strcmp (idesc->name, ic->name) == 0;	  else if (strncmp (idesc->name, "st", 2) == 0		   && (strstr (format, "M5") != NULL		       || strstr (format, "M10") != NULL))	    resolved = idesc->flags & IA64_OPCODE_POSTINC;	  else if (strncmp (idesc->name, "ld", 2) == 0		   && (strstr (format, "M2 M3") != NULL		       || strstr (format, "M12") != NULL		       || strstr (format, "M7 M8") != NULL))	    resolved = idesc->flags & IA64_OPCODE_POSTINC;          else            resolved = 0;        }      /* Misc brl variations ('.cond' is optional);          plain brl matches brl.cond.  */      if (!resolved          && (strcmp (idesc->name, "brl") == 0              || strncmp (idesc->name, "brl.", 4) == 0)          && strcmp (ic->name, "brl.cond") == 0)        {          resolved = 1;        }      /* Misc br variations ('.cond' is optional).  */      if (!resolved           && (strcmp (idesc->name, "br") == 0              || strncmp (idesc->name, "br.", 3) == 0)          && strcmp (ic->name, "br.cond") == 0)        {          if (format)            resolved = (strstr (format, "B4") != NULL                        && idesc->operands[0] == IA64_OPND_B2)              || (strstr (format, "B1") != NULL                  && idesc->operands[0] == IA64_OPND_TGT25c);          else            resolved = 1;        }      /* probe variations.  */      if (!resolved && strncmp (idesc->name, "probe", 5) == 0)        {          resolved = strcmp (ic->name, "probe") == 0             && !((strstr (idesc->name, "fault") != NULL)                  ^ (format && strstr (format, "M40") != NULL));        }      /* mov variations.  */      if (!resolved && is_mov)        {          if (plain_mov)            {              /* mov alias for fmerge.  */              if (strcmp (ic->name, "fmerge") == 0)                {                  resolved = idesc->operands[0] == IA64_OPND_F1                    && idesc->operands[1] == IA64_OPND_F3;                }              /* mov alias for adds (r3 or imm14).  */              else if (strcmp (ic->name, "adds") == 0)                {                  resolved = (idesc->operands[0] == IA64_OPND_R1                              && (idesc->operands[1] == IA64_OPND_R3                                  || (idesc->operands[1] == IA64_OPND_IMM14)));                }              /* mov alias for addl.  */              else if (strcmp (ic->name, "addl") == 0)                {                  resolved = idesc->operands[0] == IA64_OPND_R1                    && idesc->operands[1] == IA64_OPND_IMM22;                }            }          /* Some variants of mov and mov.[im].  */          if (!resolved && strncmp (ic->name, "mov_", 4) == 0)	    resolved = in_iclass_mov_x (idesc, ic, format, field);        }      /* Keep track of this so we can flag any insn classes which aren't          mapped onto at least one real insn.  */      if (resolved)	ic->terminal_resolved = 1;    }  else for (i = 0; i < ic->nsubs; i++)    {      if (in_iclass (idesc, ics[ic->subs[i]], format, field, notep))        {          int j;          for (j = 0; j < ic->nxsubs; j++)	    if (in_iclass (idesc, ics[ic->xsubs[j]], NULL, NULL, NULL))	      return 0;          if (debug > 1)            printf ("%s is in IC %s\n", idesc->name, ic->name);          resolved = 1;          break;        }    }    /* If it's in this IC, add the IC note (if any) to the insn.  */  if (resolved)    {      if (ic->note && notep)        {          if (*notep && *notep != ic->note)	    warn (_("overwriting note %d with note %d (IC:%s)\n"),		  *notep, ic->note, ic->name);          *notep = ic->note;        }    }  return resolved;}static intlookup_regindex (const char *name, int specifier){  switch (specifier)    {    case IA64_RS_ARX:      if (strstr (name, "[RSC]"))        return 16;      if (strstr (name, "[BSP]"))        return 17;      else if (strstr (name, "[BSPSTORE]"))        return 18;      else if (strstr (name, "[RNAT]"))        return 19;      else if (strstr (name, "[FCR]"))        return 21;      else if (strstr (name, "[EFLAG]"))        return 24;      else if (strstr (name, "[CSD]"))        return 25;      else if (strstr (name, "[SSD]"))        return 26;      else if (strstr (name, "[CFLG]"))        return 27;      else if (strstr (name, "[FSR]"))        return 28;      else if (strstr (name, "[FIR]"))        return 29;      else if (strstr (name, "[FDR]"))        return 30;      else if (strstr (name, "[CCV]"))        return 32;      else if (strstr (name, "[ITC]"))        return 44;      else if (strstr (name, "[PFS]"))        return 64;      else if (strstr (name, "[LC]"))        return 65;      else if (strstr (name, "[EC]"))        return 66;      abort ();    case IA64_RS_CRX:      if (strstr (name, "[DCR]"))        return 0;      else if (strstr (name, "[ITM]"))        return 1;      else if (strstr (name, "[IVA]"))        return 2;      else if (strstr (name, "[PTA]"))        return 8;      else if (strstr (name, "[GPTA]"))        return 9;      else if (strstr (name, "[IPSR]"))        return 16;      else if (strstr (name, "[ISR]"))        return 17;      else if (strstr (name, "[IIP]"))        return 19;      else if (strstr (name, "[IFA]"))        return 20;      else if (strstr (name, "[ITIR]"))        return 21;      else if (strstr (name, "[IIPA]"))        return 22;      else if (strstr (name, "[IFS]"))        return 23;      else if (strstr (name, "[IIM]"))        return 24;      else if (strstr (name, "[IHA]"))        return 25;      else if (strstr (name, "[LID]"))        return 64;      else if (strstr (name, "[IVR]"))        return 65;      else if (strstr (name, "[TPR]"))        return 66;      else if (strstr (name, "[EOI]"))        return 67;      else if (strstr (name, "[ITV]"))        return 72;      else if (strstr (name, "[PMV]"))        return 73;      else if (strstr (name, "[CMCV]"))        return 74;      abort ();    case IA64_RS_PSR:      if (strstr (name, ".be"))        return 1;      else if (strstr (name, ".up"))        return 2;      else if (strstr (name, ".ac"))        return 3;      else if (strstr (name, ".mfl"))        return 4;      else if (strstr (name, ".mfh"))        return 5;      else if (strstr (name, ".ic"))        return 13;      else if (strstr (name, ".i"))        return 14;      else if (strstr (name, ".pk"))        return 15;      else if (strstr (name, ".dt"))        return 17;      else if (strstr (name, ".dfl"))        return 18;      else if (strstr (name, ".dfh"))        return 19;      else if (strstr (name, ".sp"))        return 20;      else if (strstr (name, ".pp"))        return 21;      else if (strstr (name, ".di"))        return 22;      else if (strstr (name, ".si"))        return 23;      else if (strstr (name, ".db"))        return 24;      else if (strstr (name, ".lp"))        return 25;      else if (strstr (name, ".tb"))        return 26;      else if (strstr (name, ".rt"))        return 27;      else if (strstr (name, ".cpl"))        return 32;      else if (strstr (name, ".rs"))        return 34;      else if (strstr (name, ".mc"))        return 35;      else if (strstr (name, ".it"))        return 36;      else if (strstr (name, ".id"))        return 37;      else if (strstr (name, ".da"))        return 38;      else if (strstr (name, ".dd"))        return 39;      else if (strstr (name, ".ss"))        return 40;      else if (strstr (name, ".ri"))        return 41;      else if (strstr (name, ".ed"))        return 43;      else if (strstr (name, ".bn"))        return 44;      else if (strstr (name, ".ia"))        return 45;      else if (strstr (name, ".vm"))        return 46;      else        abort ();    default:      break;    }  return REG_NONE;}static intlookup_specifier (const char *name){  if (strchr (name, '%'))    {      if (strstr (name, "AR[K%]") != NULL)        return IA64_RS_AR_K;      if (strstr (name, "AR[UNAT]") != NULL)        return IA64_RS_AR_UNAT;      if (strstr (name, "AR%, % in 8") != NULL)        return IA64_RS_AR;      if (strstr (name, "AR%, % in 48") != NULL)        return IA64_RS_ARb;      if (strstr (name, "BR%") != NULL)        return IA64_RS_BR;      if (strstr (name, "CR[IRR%]") != NULL)        return IA64_RS_CR_IRR;      if (strstr (name, "CR[LRR%]") != NULL)        return IA64_RS_CR_LRR;      if (strstr (name, "CR%") != NULL)        return IA64_RS_CR;      if (strstr (name, "FR%, % in 0") != NULL)        return IA64_RS_FR;      if (strstr (name, "FR%, % in 2") != NULL)        return IA64_RS_FRb;      if (strstr (name, "GR%") != NULL)        return IA64_RS_GR;      if (strstr (name, "PR%, % in 1 ") != NULL)

⌨️ 快捷键说明

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