ppc: extend opindex to 16 bits

With the upcoming SVP64 extension[0] to PowerPC architecture, it became
evident that PowerPC operand indices no longer fit 8 bits. This patch
switches the underlying type to uint16_t, also introducing a special
typedef so that any future extension goes even smoother.

[0] https://libre-soc.org

include/
	* opcode/ppc.h (ppc_opindex_t): New typedef.
	(struct powerpc_opcode): Use it.
	(PPC_OPINDEX_MAX): Define.
gas/
	* write.h (struct fix): Increase size of fx_pcrel_adjust.
	Reorganise.
	* config/tc-ppc.c (insn_validate): Use ppc_opindex_t for operands.
	(md_assemble): Likewise.
	(md_apply_fix): Likewise.  Mask fx_pcrel_adjust with PPC_OPINDEX_MAX.
	(ppc_setup_opcodes): Adjust opcode index assertion.
opcodes/
	* ppc-dis.c (skip_optional_operands): Use ppc_opindex_t for
	operand pointer.
	(lookup_powerpc, lookup_prefix, lookup_vle, lookup_spe2): Likewise.
	(print_insn_powerpc): Likewise.
This commit is contained in:
Dmitry Selyutin
2022-05-12 10:32:11 +03:00
committed by Alan Modra
parent f59e7b1289
commit 8e5eb8e1b0
4 changed files with 30 additions and 20 deletions

View File

@@ -29,6 +29,12 @@ extern "C" {
#endif
typedef uint64_t ppc_cpu_t;
typedef uint16_t ppc_opindex_t;
/* Smaller of ppc_opindex_t and fx_pcrel_adjust maximum. Note that
values extracted from fx_pcrel_adjust are masked with this constant,
effectively making the field unsigned. */
#define PPC_OPINDEX_MAX 0xffff
/* The opcode table is an array of struct powerpc_opcode. */
@@ -60,7 +66,7 @@ struct powerpc_opcode
/* An array of operand codes. Each code is an index into the
operand table. They appear in the order which the operands must
appear in assembly code, and are terminated by a zero. */
unsigned char operands[8];
ppc_opindex_t operands[8];
};
/* The table itself is sorted by major opcode number, and is otherwise