{ "CPU_I486_FLAGS",
"CPU_I386_FLAGS|Cpu486" },
{ "CPU_I586_FLAGS",
- "CPU_I486_FLAGS|CPU_387_FLAGS|Cpu586" },
+ "CPU_I486_FLAGS|Cpu387|Cpu586" },
{ "CPU_I686_FLAGS",
- "CPU_I586_FLAGS|Cpu686|Cpu687" },
+ "CPU_I586_FLAGS|Cpu686|Cpu687|CpuCMOV|CpuFXSR" },
{ "CPU_PENTIUMPRO_FLAGS",
"CPU_I686_FLAGS|CpuNop" },
{ "CPU_P2_FLAGS",
{ "CPU_AMDFAM10_FLAGS",
"CPU_K8_FLAGS|CpuFISTTP|CPU_SSE4A_FLAGS|CpuABM" },
{ "CPU_BDVER1_FLAGS",
- "CPU_GENERIC64_FLAGS|CpuFISTTP|CpuRdtscp|CpuCX16|CPU_SSE4_2_FLAGS|CpuSSE4A|CpuABM|CpuFMA4|CpuXOP|CpuLWP|CpuSVME|CpuXsave|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW" },
+ "CPU_GENERIC64_FLAGS|CpuFISTTP|CpuRdtscp|CpuCX16|CPU_XOP_FLAGS|CpuABM|CpuLWP|CpuSVME|CpuAES|CpuPCLMUL|CpuLZCNT|CpuPRFCHW" },
{ "CPU_BDVER2_FLAGS",
"CPU_BDVER1_FLAGS|CpuFMA|CpuBMI|CpuTBM|CpuF16C" },
{ "CPU_BDVER3_FLAGS",
{ "CPU_BDVER4_FLAGS",
"CPU_BDVER3_FLAGS|CpuAVX2|CpuMovbe|CpuBMI2|CpuRdRnd|CpuMWAITX" },
{ "CPU_ZNVER1_FLAGS",
- "CPU_GENERIC64_FLAGS|CpuFISTTP|CpuRdtscp|CpuCX16|CPU_SSE4_2_FLAGS|CpuSSE4A|CpuABM|CpuSVME|CpuXsave|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW|CpuFMA|CpuBMI|CpuF16C|CpuXsaveopt|CpuFSGSBase|CpuAVX2|CpuMovbe|CpuBMI2|CpuRdRnd|CpuADX|CpuRdSeed|CpuSMAP|CpuSHA|CpuXSAVEC|CpuXSAVES|CpuClflushOpt|CpuCLZERO|CpuMWAITX" },
+ "CPU_GENERIC64_FLAGS|CpuFISTTP|CpuRdtscp|CpuCX16|CPU_AVX2_FLAGS|CpuSSE4A|CpuABM|CpuSVME|CpuAES|CpuPCLMUL|CpuLZCNT|CpuPRFCHW|CpuFMA|CpuBMI|CpuF16C|CpuXsaveopt|CpuFSGSBase|CpuMovbe|CpuBMI2|CpuRdRnd|CpuADX|CpuRdSeed|CpuSMAP|CpuSHA|CpuXSAVEC|CpuXSAVES|CpuClflushOpt|CpuCLZERO|CpuMWAITX" },
+ { "CPU_ZNVER2_FLAGS",
+ "CPU_ZNVER1_FLAGS|CpuRDPID|CpuWBNOINVD|CpuCLWB" },
{ "CPU_BTVER1_FLAGS",
"CPU_GENERIC64_FLAGS|CpuFISTTP|CpuCX16|CpuRdtscp|CPU_SSSE3_FLAGS|CpuSSE4A|CpuABM|CpuPRFCHW|CpuCX16|CpuClflush|CpuFISTTP|CpuSVME|CpuLZCNT" },
{ "CPU_BTVER2_FLAGS",
- "CPU_BTVER1_FLAGS|CPU_SSE4_2_FLAGS|CpuBMI|CpuF16C|CpuAES|CpuPCLMUL|CpuAVX|CpuMovbe|CpuXsave|CpuXsaveopt|CpuPRFCHW" },
+ "CPU_BTVER1_FLAGS|CPU_AVX_FLAGS|CpuBMI|CpuF16C|CpuAES|CpuPCLMUL|CpuMovbe|CpuXsaveopt|CpuPRFCHW" },
{ "CPU_8087_FLAGS",
"Cpu8087" },
{ "CPU_287_FLAGS",
- "CPU_8087_FLAGS|Cpu287" },
+ "Cpu287" },
{ "CPU_387_FLAGS",
- "CPU_287_FLAGS|Cpu387" },
+ "Cpu387" },
{ "CPU_687_FLAGS",
"CPU_387_FLAGS|Cpu687" },
+ { "CPU_CMOV_FLAGS",
+ "CpuCMOV" },
+ { "CPU_FXSR_FLAGS",
+ "CpuFXSR" },
{ "CPU_CLFLUSH_FLAGS",
"CpuClflush" },
{ "CPU_NOP_FLAGS",
{ "CPU_SYSCALL_FLAGS",
"CpuSYSCALL" },
{ "CPU_MMX_FLAGS",
- "CpuRegMMX|CpuMMX" },
+ "CpuMMX" },
{ "CPU_SSE_FLAGS",
- "CpuRegXMM|CpuSSE" },
+ "CpuSSE" },
{ "CPU_SSE2_FLAGS",
"CPU_SSE_FLAGS|CpuSSE2" },
{ "CPU_SSE3_FLAGS",
{ "CPU_XOP_FLAGS",
"CPU_SSE4A_FLAGS|CPU_FMA4_FLAGS|CpuXOP" },
{ "CPU_LWP_FLAGS",
- "CpuLWP" },
+ "CPU_XSAVE_FLAGS|CpuLWP" },
{ "CPU_BMI_FLAGS",
"CpuBMI" },
{ "CPU_TBM_FLAGS",
{ "CPU_ABM_FLAGS",
"CpuABM" },
{ "CPU_AVX_FLAGS",
- "CPU_SSE4_2_FLAGS|CpuRegYMM|CpuAVX" },
+ "CPU_SSE4_2_FLAGS|CPU_XSAVE_FLAGS|CpuAVX" },
{ "CPU_AVX2_FLAGS",
"CPU_AVX_FLAGS|CpuAVX2" },
- /* Don't use CPU_AVX2_FLAGS on CPU_AVX512F_FLAGS since AVX512F doesn't
- support YMM registers. */
{ "CPU_AVX512F_FLAGS",
- "CpuVREX|CPU_SSE4_2_FLAGS|CpuRegZMM|CpuRegMask|CpuAVX|CpuAVX2|CpuAVX512F" },
+ "CPU_AVX2_FLAGS|CpuAVX512F" },
{ "CPU_AVX512CD_FLAGS",
"CPU_AVX512F_FLAGS|CpuAVX512CD" },
{ "CPU_AVX512ER_FLAGS",
{ "CPU_AVX512BW_FLAGS",
"CPU_AVX512F_FLAGS|CpuAVX512BW" },
{ "CPU_AVX512VL_FLAGS",
- /* Use CPU_AVX2_FLAGS on CPU_AVX512VL_FLAGS since AVX512VL supports YMM
- registers. */
- "CPU_AVX512F_FLAGS|CPU_AVX2_FLAGS|CpuAVX512VL" },
+ "CPU_AVX512F_FLAGS|CpuAVX512VL" },
{ "CPU_AVX512IFMA_FLAGS",
"CPU_AVX512F_FLAGS|CpuAVX512IFMA" },
{ "CPU_AVX512VBMI_FLAGS",
{ "CPU_SMAP_FLAGS",
"CpuSMAP" },
{ "CPU_MPX_FLAGS",
- "CpuMPX" },
+ "CPU_XSAVE_FLAGS|CpuMPX" },
{ "CPU_SHA_FLAGS",
"CPU_SSE2_FLAGS|CpuSHA" },
{ "CPU_CLFLUSHOPT_FLAGS",
{ "CPU_MWAITX_FLAGS",
"CpuMWAITX" },
{ "CPU_OSPKE_FLAGS",
- "CpuOSPKE" },
+ "CPU_XSAVE_FLAGS|CpuOSPKE" },
{ "CPU_RDPID_FLAGS",
"CpuRDPID" },
{ "CPU_PTWRITE_FLAGS",
"CpuWBNOINVD" },
{ "CPU_PCONFIG_FLAGS",
"CpuPCONFIG" },
+ { "CPU_WAITPKG_FLAGS",
+ "CpuWAITPKG" },
+ { "CPU_CLDEMOTE_FLAGS",
+ "CpuCLDEMOTE" },
+ { "CPU_MOVDIRI_FLAGS",
+ "CpuMOVDIRI" },
+ { "CPU_MOVDIR64B_FLAGS",
+ "CpuMOVDIR64B" },
{ "CPU_ANY_X87_FLAGS",
"CPU_ANY_287_FLAGS|Cpu8087" },
{ "CPU_ANY_287_FLAGS",
"CPU_ANY_687_FLAGS|Cpu387" },
{ "CPU_ANY_687_FLAGS",
"Cpu687|CpuFISTTP" },
+ { "CPU_ANY_CMOV_FLAGS",
+ "CpuCMOV" },
+ { "CPU_ANY_FXSR_FLAGS",
+ "CpuFXSR" },
{ "CPU_ANY_MMX_FLAGS",
"CPU_3DNOWA_FLAGS" },
{ "CPU_ANY_SSE_FLAGS",
{ "CPU_ANY_AVX2_FLAGS",
"CpuAVX2" },
{ "CPU_ANY_AVX512F_FLAGS",
- "CpuVREX|CpuRegZMM|CpuRegMask|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF|CpuAVX512DQ|CpuAVX512BW|CpuAVX512VL|CpuAVX512IFMA|CpuAVX512VBMI|CpuAVX512_4FMAPS|CpuAVX512_4VNNIW|CpuAVX512_VPOPCNTDQ|CpuAVX512_VBMI2|CpuAVX512_VNNI|CpuAVX512_BITALG|CpuAVX512F" },
+ "CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF|CpuAVX512DQ|CpuAVX512BW|CpuAVX512VL|CpuAVX512IFMA|CpuAVX512VBMI|CpuAVX512_4FMAPS|CpuAVX512_4VNNIW|CpuAVX512_VPOPCNTDQ|CpuAVX512_VBMI2|CpuAVX512_VNNI|CpuAVX512_BITALG" },
{ "CPU_ANY_AVX512CD_FLAGS",
"CpuAVX512CD" },
{ "CPU_ANY_AVX512ER_FLAGS",
"CpuAVX512_VNNI" },
{ "CPU_ANY_AVX512_BITALG_FLAGS",
"CpuAVX512_BITALG" },
+ { "CPU_ANY_MOVDIRI_FLAGS",
+ "CpuMOVDIRI" },
+ { "CPU_ANY_MOVDIR64B_FLAGS",
+ "CpuMOVDIR64B" },
};
static const initializer operand_type_shorthands[] =
"Reg32|Acc|Dword" },
{ "OPERAND_TYPE_ACC64",
"Reg64|Acc|Qword" },
- { "OPERAND_TYPE_INOUTPORTREG",
- "InOutPortReg" },
- { "OPERAND_TYPE_REG16_INOUTPORTREG",
- "Reg16|InOutPortReg" },
{ "OPERAND_TYPE_DISP16_32",
"Disp16|Disp32" },
{ "OPERAND_TYPE_ANYDISP",
BITFIELD (Cpu486),
BITFIELD (Cpu586),
BITFIELD (Cpu686),
+ BITFIELD (CpuCMOV),
+ BITFIELD (CpuFXSR),
BITFIELD (CpuClflush),
BITFIELD (CpuNop),
BITFIELD (CpuSYSCALL),
BITFIELD (CpuPRFCHW),
BITFIELD (CpuSMAP),
BITFIELD (CpuSHA),
- BITFIELD (CpuVREX),
BITFIELD (CpuClflushOpt),
BITFIELD (CpuXSAVES),
BITFIELD (CpuXSAVEC),
BITFIELD (CpuVPCLMULQDQ),
BITFIELD (CpuWBNOINVD),
BITFIELD (CpuPCONFIG),
- BITFIELD (CpuRegMMX),
- BITFIELD (CpuRegXMM),
- BITFIELD (CpuRegYMM),
- BITFIELD (CpuRegZMM),
- BITFIELD (CpuRegMask),
+ BITFIELD (CpuWAITPKG),
+ BITFIELD (CpuCLDEMOTE),
+ BITFIELD (CpuMOVDIRI),
+ BITFIELD (CpuMOVDIR64B),
#ifdef CpuUnused
BITFIELD (CpuUnused),
#endif
BITFIELD (JumpInterSegment),
BITFIELD (FloatMF),
BITFIELD (FloatR),
- BITFIELD (FloatD),
BITFIELD (Size16),
BITFIELD (Size32),
BITFIELD (Size64),
BITFIELD (HLEPrefixOk),
BITFIELD (ToDword),
BITFIELD (ToQword),
- BITFIELD (AddrPrefixOp0),
+ BITFIELD (AddrPrefixOpReg),
BITFIELD (IsPrefix),
BITFIELD (ImmExt),
BITFIELD (NoRex64),
BITFIELD (VexW),
BITFIELD (VexOpcode),
BITFIELD (VexSources),
- BITFIELD (VexImmExt),
BITFIELD (VecSIB),
BITFIELD (SSE2AVX),
BITFIELD (NoAVX),
BITFIELD (EVex),
BITFIELD (Masking),
- BITFIELD (VecESize),
BITFIELD (Broadcast),
BITFIELD (StaticRounding),
BITFIELD (SAE),
BITFIELD (NoDefMask),
BITFIELD (ImplicitQuadGroup),
BITFIELD (Optimize),
- BITFIELD (OldGcc),
BITFIELD (ATTMnemonic),
BITFIELD (ATTSyntax),
BITFIELD (IntelSyntax),
BITFIELD (JumpAbsolute),
BITFIELD (EsSeg),
BITFIELD (RegMem),
- BITFIELD (Mem),
BITFIELD (Byte),
BITFIELD (Word),
BITFIELD (Dword),
va_list args;
va_start (args, message);
- fprintf (stderr, _("%s: Error: "), program_name);
+ fprintf (stderr, _("%s: error: "), program_name);
vfprintf (stderr, message, args);
va_end (args);
xexit (1);
return;
if (lineno != -1)
- fail (_("%s: %d: Unknown bitfield: %s\n"), filename, lineno, f);
+ fail (_("%s: %d: unknown bitfield: %s\n"), filename, lineno, f);
else
- fail (_("Unknown bitfield: %s\n"), f);
+ fail (_("unknown bitfield: %s\n"), f);
}
static void
last -= 1;
next = flag + 2;
if (*last != ')')
- fail (_("%s: %d: Missing `)' in bitfield: %s\n"), filename,
+ fail (_("%s: %d: missing `)' in bitfield: %s\n"), filename,
lineno, flag);
*last = '\0';
}
fprintf (table, "%d },\n", modifier[i].value);
}
+static int
+adjust_broadcast_modifier (char **opnd)
+{
+ char *str, *next, *last, *op;
+ int bcst_type = INT_MAX;
+
+ /* Skip the immediate operand. */
+ op = opnd[0];
+ if (strcasecmp(op, "Imm8") == 0)
+ op = opnd[1];
+
+ op = xstrdup (op);
+ last = op + strlen (op);
+ for (next = op; next && next < last; )
+ {
+ str = next_field (next, '|', &next, last);
+ if (str)
+ {
+ if (strcasecmp(str, "Byte") == 0)
+ {
+ /* The smalest broadcast type, no need to check
+ further. */
+ bcst_type = BYTE_BROADCAST;
+ break;
+ }
+ else if (strcasecmp(str, "Word") == 0)
+ {
+ if (bcst_type > WORD_BROADCAST)
+ bcst_type = WORD_BROADCAST;
+ }
+ else if (strcasecmp(str, "Dword") == 0)
+ {
+ if (bcst_type > DWORD_BROADCAST)
+ bcst_type = DWORD_BROADCAST;
+ }
+ else if (strcasecmp(str, "Qword") == 0)
+ {
+ if (bcst_type > QWORD_BROADCAST)
+ bcst_type = QWORD_BROADCAST;
+ }
+ }
+ }
+ free (op);
+
+ if (bcst_type == INT_MAX)
+ fail (_("unknown broadcast operand: %s\n"), op);
+
+ return bcst_type;
+}
+
static void
-process_i386_opcode_modifier (FILE *table, char *mod, int lineno)
+process_i386_opcode_modifier (FILE *table, char *mod, char **opnd, int lineno)
{
char *str, *next, *last;
bitfield modifiers [ARRAY_SIZE (opcode_modifiers)];
str = next_field (next, '|', &next, last);
if (str)
{
- set_bitfield (str, modifiers, 1, ARRAY_SIZE (modifiers),
+ int val = 1;
+ if (strcasecmp(str, "Broadcast") == 0)
+ val = adjust_broadcast_modifier (opnd);
+ set_bitfield (str, modifiers, val, ARRAY_SIZE (modifiers),
lineno);
if (strcasecmp(str, "IsString") == 0)
active_isstring = 1;
process_i386_cpu_flag (table, cpu_flags, 0, ",", " ", lineno);
- process_i386_opcode_modifier (table, opcode_modifier, lineno);
+ process_i386_opcode_modifier (table, opcode_modifier, operand_types, lineno);
fprintf (table, " { ");
htab_t opcode_hash_table;
struct opcode_hash_entry **opcode_array;
unsigned int opcode_array_size = 1024;
- int lineno = 0;
+ int lineno = 0, marker = 0;
filename = "i386-opc.tbl";
- fp = fopen (filename, "r");
-
- if (fp == NULL)
- fail (_("can't find i386-opc.tbl for reading, errno = %s\n"),
- xstrerror (errno));
+ fp = stdin;
i = 0;
opcode_array = (struct opcode_hash_entry **)
switch (p[0])
{
case '#':
+ if (!strcmp("### MARKER ###", buf))
+ marker = 1;
+ else
+ {
+ /* Since we ignore all included files (we only care about their
+ #define-s here), we don't need to monitor filenames. The final
+ line number directive is going to refer to the main source file
+ again. */
+ char *end;
+ unsigned long ln;
+
+ p = remove_leading_whitespaces (p + 1);
+ if (!strncmp(p, "line", 4))
+ p += 4;
+ ln = strtoul (p, &end, 10);
+ if (ln > 1 && ln < INT_MAX
+ && *remove_leading_whitespaces (end) == '"')
+ lineno = ln - 1;
+ }
/* Ignore comments. */
case '\0':
continue;
break;
default:
+ if (!marker)
+ continue;
break;
}
process_i386_cpu_flag (table, "0", 0, ",", " ", -1);
- process_i386_opcode_modifier (table, "0", -1);
+ process_i386_opcode_modifier (table, "0", NULL, -1);
fprintf (table, " { ");
process_i386_operand_type (table, "0", stage_opcodes, "\t ", -1);