From 9df6f676c2c7280dc0c419c43927a07c6359814d Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Mon, 29 Mar 2021 12:03:31 +0200 Subject: x86: shrink some struct insn_template fields Now that all base opcodes are only at most 2 bytes in size, shrink its template field to just as much. By also shrinking extension_opcode and operands to just what they really need, we can free up an entire 32-bit slot (plus 4 left bits past the bitfields themselves). At present this alters sizeof(struct insn_template) only for 32-bit builds. In 64-bit builds it instead leaves a padding hole that will allow to buffer future growth of other fields (opcode_modifier, cpu_flags, operand_types[]). --- opcodes/ChangeLog | 6 ++++++ opcodes/i386-opc.h | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 82a1c5c..ff0ecf3 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,5 +1,11 @@ 2021-03-29 Jan Beulich + * i386-opc.h (struct insn_template): Shrink base_opcode to 16 + bits. Shrink extension_opcode to 9 bits. Make it signed. Change + value of None. Shrink operands to 3 bits. + +2021-03-29 Jan Beulich + * i386-gen.c (process_i386_opcode_modifier): New parameter "space". (output_i386_opcode): New local variable "space". Adjust diff --git a/opcodes/i386-opc.h b/opcodes/i386-opc.h index 9ed0793..115895c 100644 --- a/opcodes/i386-opc.h +++ b/opcodes/i386-opc.h @@ -917,7 +917,7 @@ typedef struct insn_template /* base_opcode is the fundamental opcode byte without optional prefix(es). */ - unsigned int base_opcode; + unsigned int base_opcode:16; #define Opcode_D 0x2 /* Direction bit: set if Reg --> Regmem; unset if Regmem --> Reg. */ @@ -934,8 +934,8 @@ typedef struct insn_template AMD 3DNow! instructions. If this template has no extension opcode (the usual case) use None Instructions */ - unsigned short extension_opcode; -#define None 0xffff /* If no extension_opcode is possible. */ + signed int extension_opcode:9; +#define None (-1) /* If no extension_opcode is possible. */ /* Pseudo prefixes. */ #define Prefix_Disp8 0 /* {disp8} */ @@ -950,7 +950,7 @@ typedef struct insn_template #define Prefix_NoOptimize 9 /* {nooptimize} */ /* how many operands */ - unsigned char operands; + unsigned int operands:3; /* the bits in opcode_modifier are used to generate the final opcode from the base_opcode. These bits also are used to detect alternate forms of -- cgit v1.1