📄 ia64-gen.c
字号:
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 + -