📄 tc-hppa.c
字号:
} INSERT_FIELD_AND_CONTINUE (opcode, flag, 6); /* Handle MFCTL wide completer. */ case 'W': if (strncasecmp (s, ",w", 2) != 0) break; s += 2; continue; /* Handle an RFI restore completer. */ case 'r': flag = 0; if (!strncasecmp (s, ",r", 2)) { flag = 5; s += 2; } INSERT_FIELD_AND_CONTINUE (opcode, flag, 5); /* Handle a system control completer. */ case 'Z': if (*s == ',' && (*(s + 1) == 'm' || *(s + 1) == 'M')) { flag = 1; s += 2; } else flag = 0; INSERT_FIELD_AND_CONTINUE (opcode, flag, 5); /* Handle intermediate/final completer for DCOR. */ case 'i': flag = 0; if (!strncasecmp (s, ",i", 2)) { flag = 1; s += 2; } INSERT_FIELD_AND_CONTINUE (opcode, flag, 6); /* Handle zero/sign extension completer. */ case 'z': flag = 1; if (!strncasecmp (s, ",z", 2)) { flag = 0; s += 2; } INSERT_FIELD_AND_CONTINUE (opcode, flag, 10); /* Handle add completer. */ case 'a': flag = 1; if (!strncasecmp (s, ",l", 2)) { flag = 2; s += 2; } else if (!strncasecmp (s, ",tsv", 4)) { flag = 3; s += 4; } INSERT_FIELD_AND_CONTINUE (opcode, flag, 10); /* Handle 64 bit carry for ADD. */ case 'Y': flag = 0; if (!strncasecmp (s, ",dc,tsv", 7) || !strncasecmp (s, ",tsv,dc", 7)) { flag = 1; s += 7; } else if (!strncasecmp (s, ",dc", 3)) { flag = 0; s += 3; } else break; INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); /* Handle 32 bit carry for ADD. */ case 'y': flag = 0; if (!strncasecmp (s, ",c,tsv", 6) || !strncasecmp (s, ",tsv,c", 6)) { flag = 1; s += 6; } else if (!strncasecmp (s, ",c", 2)) { flag = 0; s += 2; } else break; INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); /* Handle trap on signed overflow. */ case 'v': flag = 0; if (!strncasecmp (s, ",tsv", 4)) { flag = 1; s += 4; } INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); /* Handle trap on condition and overflow. */ case 't': flag = 0; if (!strncasecmp (s, ",tc,tsv", 7) || !strncasecmp (s, ",tsv,tc", 7)) { flag = 1; s += 7; } else if (!strncasecmp (s, ",tc", 3)) { flag = 0; s += 3; } else break; INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); /* Handle 64 bit borrow for SUB. */ case 'B': flag = 0; if (!strncasecmp (s, ",db,tsv", 7) || !strncasecmp (s, ",tsv,db", 7)) { flag = 1; s += 7; } else if (!strncasecmp (s, ",db", 3)) { flag = 0; s += 3; } else break; INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); /* Handle 32 bit borrow for SUB. */ case 'b': flag = 0; if (!strncasecmp (s, ",b,tsv", 6) || !strncasecmp (s, ",tsv,b", 6)) { flag = 1; s += 6; } else if (!strncasecmp (s, ",b", 2)) { flag = 0; s += 2; } else break; INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); /* Handle trap condition completer for UADDCM. */ case 'T': flag = 0; if (!strncasecmp (s, ",tc", 3)) { flag = 1; s += 3; } INSERT_FIELD_AND_CONTINUE (opcode, flag, 6); /* Handle signed/unsigned at 21. */ case 'S': { int sign = 1; if (strncasecmp (s, ",s", 2) == 0) { sign = 1; s += 2; } else if (strncasecmp (s, ",u", 2) == 0) { sign = 0; s += 2; } INSERT_FIELD_AND_CONTINUE (opcode, sign, 10); } /* Handle left/right combination at 17:18. */ case 'h': if (*s++ == ',') { int lr = 0; if (*s == 'r') lr = 2; else if (*s == 'l') lr = 0; else as_bad(_("Invalid left/right combination completer")); s++; INSERT_FIELD_AND_CONTINUE (opcode, lr, 13); } else as_bad(_("Invalid left/right combination completer")); break; /* Handle saturation at 24:25. */ case 'H': { int sat = 3; if (strncasecmp (s, ",ss", 3) == 0) { sat = 1; s += 3; } else if (strncasecmp (s, ",us", 3) == 0) { sat = 0; s += 3; } INSERT_FIELD_AND_CONTINUE (opcode, sat, 6); } /* Handle permutation completer. */ case '*': if (*s++ == ',') { int permloc[4]; int perm = 0; int i = 0; permloc[0] = 13; permloc[1] = 10; permloc[2] = 8; permloc[3] = 6; for (; i < 4; i++) { switch (*s++) { case '0': perm = 0; break; case '1': perm = 1; break; case '2': perm = 2; break; case '3': perm = 3; break; default: as_bad(_("Invalid permutation completer")); } opcode |= perm << permloc[i]; } continue; } else as_bad(_("Invalid permutation completer")); break; default: abort (); } break; /* Handle all conditions. */ case '?': { args++; switch (*args) { /* Handle FP compare conditions. */ case 'f': cond = pa_parse_fp_cmp_cond (&s); INSERT_FIELD_AND_CONTINUE (opcode, cond, 0); /* Handle an add condition. */ case 'A': case 'a': cmpltr = 0; flag = 0; if (*s == ',') { s++; /* 64 bit conditions. */ if (*args == 'A') { if (*s == '*') s++; else break; } else if (*s == '*') break; name = s; name = s; while (*s != ',' && *s != ' ' && *s != '\t') s += 1; c = *s; *s = 0x00; if (strcmp (name, "=") == 0) cmpltr = 1; else if (strcmp (name, "<") == 0) cmpltr = 2; else if (strcmp (name, "<=") == 0) cmpltr = 3; else if (strcasecmp (name, "nuv") == 0) cmpltr = 4; else if (strcasecmp (name, "znv") == 0) cmpltr = 5; else if (strcasecmp (name, "sv") == 0) cmpltr = 6; else if (strcasecmp (name, "od") == 0) cmpltr = 7; else if (strcasecmp (name, "tr") == 0) { cmpltr = 0; flag = 1; } else if (strcmp (name, "<>") == 0) { cmpltr = 1; flag = 1; } else if (strcmp (name, ">=") == 0) { cmpltr = 2; flag = 1; } else if (strcmp (name, ">") == 0) { cmpltr = 3; flag = 1; } else if (strcasecmp (name, "uv") == 0) { cmpltr = 4; flag = 1; } else if (strcasecmp (name, "vnz") == 0) { cmpltr = 5; flag = 1; } else if (strcasecmp (name, "nsv") == 0) { cmpltr = 6; flag = 1; } else if (strcasecmp (name, "ev") == 0) { cmpltr = 7; flag = 1; } /* ",*" is a valid condition. */ else if (*args == 'a') as_bad (_("Invalid Add Condition: %s"), name); *s = c; } opcode |= cmpltr << 13; INSERT_FIELD_AND_CONTINUE (opcode, flag, 12); /* Handle non-negated add and branch condition. */ case 'd': cmpltr = pa_parse_nonneg_add_cmpltr (&s, 1); if (cmpltr < 0) { as_bad (_("Invalid Add and Branch Condition: %c"), *s); cmpltr = 0; } INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); /* Handle 64 bit wide-mode add and branch condition. */ case 'W': cmpltr = pa_parse_addb_64_cmpltr (&s); if (cmpltr < 0) { as_bad (_("Invalid Add and Branch Condition: %c"), *s); cmpltr = 0; } else { /* Negated condition requires an opcode change. */ opcode |= (cmpltr & 8) << 24; } INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13); /* Handle a negated or non-negated add and branch condition. */ case '@': save_s = s; cmpltr = pa_parse_nonneg_add_cmpltr (&s, 1); if (cmpltr < 0) { s = save_s; cmpltr = pa_parse_neg_add_cmpltr (&s, 1); if (cmpltr < 0) { as_bad (_("Invalid Compare/Subtract Condition")); cmpltr = 0; } else { /* Negated condition requires an opcode change. */ opcode |= 1 << 27; } } INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); /* Handle branch on bit conditions. */ case 'B': case 'b': cmpltr = 0; if (*s == ',') { s++; if (*args == 'B') { if (*s == '*') s++; else break; } else if (*s == '*') break; if (strncmp (s, "<", 1) == 0) { cmpltr = 0; s++; } else if (strncmp (s, ">=", 2) == 0) { cmpltr = 1; s += 2; } else as_bad (_("Invalid Bit Branch Condition: %c"), *s); } INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 15); /* Handle a compare/subtract condition. */ case 'S': case 's': cmpltr = 0; flag = 0; if (*s == ',') { s++; /* 64 bit conditions. */ if (*args == 'S') { if (*s == '*') s++; else break; } else if (*s == '*') break; name = s; name = s; while (*s != ',' && *s != ' ' && *s != '\t') s += 1; c = *s; *s = 0x00; if (strcmp (name, "=") == 0) cmpltr = 1; else if (strcmp (name, "<") == 0) cmpltr = 2; else if (strcmp (name, "<=") == 0) cmpltr = 3; else if (strcasecmp (name, "<<") == 0) cmpltr = 4; else if (strcasecmp (name, "<<=") == 0) cmpltr = 5; else if (strcasecmp (name, "sv") == 0) cmpltr = 6; else if (strcasecmp (name, "o
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -