-/* Copyright (C) 2007-2018 Free Software Foundation, Inc.
+/* Copyright (C) 2007-2019 Free Software Foundation, Inc.
This file is part of the GNU opcodes library.
#include <libintl.h>
#define _(String) gettext (String)
+/* Build-time checks are preferrable over runtime ones. Use this construct
+ in preference where possible. */
+#define static_assert(e) ((void)sizeof (struct { int _:1 - 2 * !(e); }))
+
static const char *program_name = NULL;
static int debug = 0;
{ "CPU_I586_FLAGS",
"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",
"Cpu387" },
{ "CPU_687_FLAGS",
"CPU_387_FLAGS|Cpu687" },
+ { "CPU_CMOV_FLAGS",
+ "CpuCMOV" },
+ { "CPU_FXSR_FLAGS",
+ "CpuFXSR" },
{ "CPU_CLFLUSH_FLAGS",
"CpuClflush" },
{ "CPU_NOP_FLAGS",
{ "CPU_AVX2_FLAGS",
"CPU_AVX_FLAGS|CpuAVX2" },
{ "CPU_AVX512F_FLAGS",
- "CPU_AVX2_FLAGS|CpuVREX|CpuAVX512F" },
+ "CPU_AVX2_FLAGS|CpuAVX512F" },
{ "CPU_AVX512CD_FLAGS",
"CPU_AVX512F_FLAGS|CpuAVX512CD" },
{ "CPU_AVX512ER_FLAGS",
"CPU_AVX512F_FLAGS|CpuAVX512_VNNI" },
{ "CPU_AVX512_BITALG_FLAGS",
"CPU_AVX512F_FLAGS|CpuAVX512_BITALG" },
+ { "CPU_AVX512_BF16_FLAGS",
+ "CPU_AVX512F_FLAGS|CpuAVX512_BF16" },
{ "CPU_L1OM_FLAGS",
"unknown" },
{ "CPU_K1OM_FLAGS",
"CpuMOVDIRI" },
{ "CPU_MOVDIR64B_FLAGS",
"CpuMOVDIR64B" },
+ { "CPU_ENQCMD_FLAGS",
+ "CpuENQCMD" },
+ { "CPU_AVX512_VP2INTERSECT_FLAGS",
+ "CpuAVX512_VP2INTERSECT" },
{ "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_AVX_FLAGS",
"CPU_ANY_AVX2_FLAGS|CpuF16C|CpuFMA|CpuFMA4|CpuXOP|CpuAVX" },
{ "CPU_ANY_AVX2_FLAGS",
- "CpuAVX2" },
+ "CPU_ANY_AVX512F_FLAGS|CpuAVX2" },
{ "CPU_ANY_AVX512F_FLAGS",
- "CpuVREX|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|CpuAVX512_BF16|CpuAVX512_VP2INTERSECT" },
{ "CPU_ANY_AVX512CD_FLAGS",
"CpuAVX512CD" },
{ "CPU_ANY_AVX512ER_FLAGS",
"CpuAVX512_VNNI" },
{ "CPU_ANY_AVX512_BITALG_FLAGS",
"CpuAVX512_BITALG" },
+ { "CPU_ANY_AVX512_BF16_FLAGS",
+ "CpuAVX512_BF16" },
{ "CPU_ANY_MOVDIRI_FLAGS",
"CpuMOVDIRI" },
{ "CPU_ANY_MOVDIR64B_FLAGS",
"CpuMOVDIR64B" },
+ { "CPU_ANY_ENQCMD_FLAGS",
+ "CpuENQCMD" },
+ { "CPU_ANY_AVX512_VP2INTERSECT_FLAGS",
+ "CpuAVX512_VP2INTERSECT" },
};
static const initializer operand_type_shorthands[] =
{ "OPERAND_TYPE_TEST",
"Test" },
{ "OPERAND_TYPE_DEBUG",
- "FloatReg" },
+ "Debug" },
{ "OPERAND_TYPE_FLOATREG",
"FloatReg" },
{ "OPERAND_TYPE_FLOATACC",
"FloatAcc" },
- { "OPERAND_TYPE_SREG2",
- "SReg2" },
- { "OPERAND_TYPE_SREG3",
- "SReg3" },
- { "OPERAND_TYPE_ACC",
- "Acc" },
+ { "OPERAND_TYPE_SREG",
+ "SReg" },
{ "OPERAND_TYPE_JUMPABSOLUTE",
"JumpAbsolute" },
{ "OPERAND_TYPE_REGMMX",
"RegMask" },
{ "OPERAND_TYPE_ESSEG",
"EsSeg" },
+ { "OPERAND_TYPE_ACC8",
+ "Acc|Byte" },
+ { "OPERAND_TYPE_ACC16",
+ "Acc|Word" },
{ "OPERAND_TYPE_ACC32",
- "Reg32|Acc|Dword" },
+ "Acc|Dword" },
{ "OPERAND_TYPE_ACC64",
- "Reg64|Acc|Qword" },
+ "Acc|Qword" },
{ "OPERAND_TYPE_DISP16_32",
"Disp16|Disp32" },
{ "OPERAND_TYPE_ANYDISP",
"Imm32|Imm32S|Imm64|Disp32" },
{ "OPERAND_TYPE_IMM32_32S_64_DISP32_64",
"Imm32|Imm32S|Imm64|Disp32|Disp64" },
- { "OPERAND_TYPE_VEC_IMM4",
- "Vec_Imm4" },
{ "OPERAND_TYPE_REGBND",
"RegBND" },
};
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 (CpuAVX512_VBMI2),
BITFIELD (CpuAVX512_VNNI),
BITFIELD (CpuAVX512_BITALG),
+ BITFIELD (CpuAVX512_BF16),
+ BITFIELD (CpuAVX512_VP2INTERSECT),
BITFIELD (CpuMWAITX),
BITFIELD (CpuCLZERO),
BITFIELD (CpuOSPKE),
BITFIELD (CpuCLDEMOTE),
BITFIELD (CpuMOVDIRI),
BITFIELD (CpuMOVDIR64B),
+ BITFIELD (CpuENQCMD),
#ifdef CpuUnused
BITFIELD (CpuUnused),
#endif
BITFIELD (JumpInterSegment),
BITFIELD (FloatMF),
BITFIELD (FloatR),
- BITFIELD (Size16),
- BITFIELD (Size32),
- BITFIELD (Size64),
+ BITFIELD (Size),
BITFIELD (CheckRegSize),
BITFIELD (IgnoreSize),
BITFIELD (DefaultSize),
BITFIELD (No_ldSuf),
BITFIELD (FWait),
BITFIELD (IsString),
+ BITFIELD (RegMem),
BITFIELD (BNDPrefixOk),
BITFIELD (NoTrackPrefixOk),
BITFIELD (IsLockable),
BITFIELD (Control),
BITFIELD (Debug),
BITFIELD (Test),
- BITFIELD (SReg2),
- BITFIELD (SReg3),
+ BITFIELD (SReg),
BITFIELD (Acc),
BITFIELD (JumpAbsolute),
BITFIELD (EsSeg),
- BITFIELD (RegMem),
- BITFIELD (Mem),
BITFIELD (Byte),
BITFIELD (Word),
BITFIELD (Dword),
BITFIELD (Zmmword),
BITFIELD (Unspecified),
BITFIELD (Anysize),
- BITFIELD (Vec_Imm4),
BITFIELD (RegBND),
#ifdef OTUnused
BITFIELD (OTUnused),
process_copyright (FILE *fp)
{
fprintf (fp, "/* This file is automatically generated by i386-gen. Do not edit! */\n\
-/* Copyright (C) 2007-2018 Free Software Foundation, Inc.\n\
+/* Copyright (C) 2007-2019 Free Software Foundation, Inc.\n\
\n\
This file is part of the GNU opcodes library.\n\
\n\
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, " { ");
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);
/* Check the unused bitfield in i386_cpu_flags. */
#ifdef CpuUnused
+ static_assert (ARRAY_SIZE (cpu_flags) == CpuMax + 2);
+
if ((cpumax - 1) != CpuMax)
fail (_("CpuMax != %d!\n"), cpumax);
#else
+ static_assert (ARRAY_SIZE (cpu_flags) == CpuMax + 1);
+
if (cpumax != CpuMax)
fail (_("CpuMax != %d!\n"), cpumax);
fail (_("%d unused bits in i386_cpu_flags.\n"), c);
#endif
+ static_assert (ARRAY_SIZE (opcode_modifiers) == Opcode_Modifier_Num);
+
/* Check the unused bitfield in i386_operand_type. */
-#ifndef OTUnused
+#ifdef OTUnused
+ static_assert (ARRAY_SIZE (operand_types) == OTNum + 1);
+#else
+ static_assert (ARRAY_SIZE (operand_types) == OTNum);
+
c = OTNumOfBits - OTMax - 1;
if (c)
fail (_("%d unused bits in i386_operand_type.\n"), c);