diff options
author | Jan Beulich <jbeulich@suse.com> | 2019-11-08 09:03:23 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2019-11-08 09:03:23 +0100 |
commit | bab6aec1255ba2ec8de3ae0363958e2ff26ce25d (patch) | |
tree | efe48ee35c00c178caec897d69237980ef1f83cf /opcodes/i386-gen.c | |
parent | 831bd6aa3b2d5e36c94b89756f58bb99f35026ca (diff) | |
download | gdb-bab6aec1255ba2ec8de3ae0363958e2ff26ce25d.zip gdb-bab6aec1255ba2ec8de3ae0363958e2ff26ce25d.tar.gz gdb-bab6aec1255ba2ec8de3ae0363958e2ff26ce25d.tar.bz2 |
x86: introduce operand type "class"
Many operand types, in particular the various kinds of registers, can't
be combined with one another (neither in templates nor in register
entries), and hence it is not a good use of resources (memory as well as
execution time) to represent them as individual bits of a bit field.
Diffstat (limited to 'opcodes/i386-gen.c')
-rw-r--r-- | opcodes/i386-gen.c | 55 |
1 files changed, 42 insertions, 13 deletions
diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c index d33e665..a15be80 100644 --- a/opcodes/i386-gen.c +++ b/opcodes/i386-gen.c @@ -388,13 +388,13 @@ static initializer operand_type_init[] = { "OPERAND_TYPE_NONE", "0" }, { "OPERAND_TYPE_REG8", - "Reg|Byte" }, + "Class=Reg|Byte" }, { "OPERAND_TYPE_REG16", - "Reg|Word" }, + "Class=Reg|Word" }, { "OPERAND_TYPE_REG32", - "Reg|Dword" }, + "Class=Reg|Dword" }, { "OPERAND_TYPE_REG64", - "Reg|Qword" }, + "Class=Reg|Qword" }, { "OPERAND_TYPE_IMM1", "Imm1" }, { "OPERAND_TYPE_IMM8", @@ -432,7 +432,7 @@ static initializer operand_type_init[] = { "OPERAND_TYPE_DEBUG", "Debug" }, { "OPERAND_TYPE_FLOATREG", - "Reg|Tbyte" }, + "Class=Reg|Tbyte" }, { "OPERAND_TYPE_FLOATACC", "Acc|Tbyte" }, { "OPERAND_TYPE_SREG", @@ -479,6 +479,8 @@ static initializer operand_type_init[] = "Imm32|Imm32S|Imm64|Disp32" }, { "OPERAND_TYPE_IMM32_32S_64_DISP32_64", "Imm32|Imm32S|Imm64|Disp32|Disp64" }, + { "OPERAND_TYPE_ANYIMM", + "Imm1|Imm8|Imm8S|Imm16|Imm32|Imm32S|Imm64" }, { "OPERAND_TYPE_REGBND", "RegBND" }, }; @@ -674,9 +676,19 @@ static bitfield opcode_modifiers[] = BITFIELD (Intel64), }; +#define CLASS(n) #n, n + +static const struct { + const char *name; + enum operand_class value; +} operand_classes[] = { + CLASS (Reg), +}; + +#undef CLASS + static bitfield operand_types[] = { - BITFIELD (Reg), BITFIELD (RegMMX), BITFIELD (RegSIMD), BITFIELD (RegMask), @@ -1134,20 +1146,21 @@ enum stage { }; static void -output_operand_type (FILE *table, bitfield *types, unsigned int size, +output_operand_type (FILE *table, enum operand_class class, + const bitfield *types, unsigned int size, enum stage stage, const char *indent) { unsigned int i; - fprintf (table, "{ { "); + fprintf (table, "{ { %d, ", class); for (i = 0; i < size - 1; i++) { - if (((i + 1) % 20) != 0) + if (((i + 2) % 20) != 0) fprintf (table, "%d, ", types[i].value); else fprintf (table, "%d,", types[i].value); - if (((i + 1) % 20) == 0) + if (((i + 2) % 20) == 0) { /* We need \\ for macro. */ if (stage == stage_macros) @@ -1165,6 +1178,7 @@ process_i386_operand_type (FILE *table, char *op, enum stage stage, const char *indent, int lineno) { char *str, *next, *last; + enum operand_class class = ClassNone; bitfield types [ARRAY_SIZE (operand_types)]; /* Copy the default operand type. */ @@ -1180,6 +1194,21 @@ process_i386_operand_type (FILE *table, char *op, enum stage stage, str = next_field (next, '|', &next, last); if (str) { + unsigned int i; + + if (!strncmp(str, "Class=", 6)) + { + for (i = 0; i < ARRAY_SIZE(operand_classes); ++i) + if (!strcmp(str + 6, operand_classes[i].name)) + { + class = operand_classes[i].value; + str = NULL; + break; + } + } + } + if (str) + { set_bitfield (str, types, 1, ARRAY_SIZE (types), lineno); if (strcasecmp(str, "BaseIndex") == 0) baseindex = 1; @@ -1197,7 +1226,7 @@ process_i386_operand_type (FILE *table, char *op, enum stage stage, set_bitfield("Disp32S", types, 1, ARRAY_SIZE (types), lineno); } } - output_operand_type (table, types, ARRAY_SIZE (types), stage, + output_operand_type (table, class, types, ARRAY_SIZE (types), stage, indent); } @@ -1688,9 +1717,9 @@ main (int argc, char **argv) /* Check the unused bitfield in i386_operand_type. */ #ifdef OTUnused - static_assert (ARRAY_SIZE (operand_types) == OTNum + 1); + static_assert (ARRAY_SIZE (operand_types) + CLASS_WIDTH == OTNum + 1); #else - static_assert (ARRAY_SIZE (operand_types) == OTNum); + static_assert (ARRAY_SIZE (operand_types) + CLASS_WIDTH == OTNum); c = OTNumOfBits - OTMax - 1; if (c) |