145 lines
5.2 KiB
Diff
145 lines
5.2 KiB
Diff
diff -rup binutils.orig/gas/testsuite/gas/ppc/power4_32.d binutils-2.35/gas/testsuite/gas/ppc/power4_32.d
|
||
--- binutils.orig/gas/testsuite/gas/ppc/power4_32.d 2022-01-25 13:39:48.063563099 +0000
|
||
+++ binutils-2.35/gas/testsuite/gas/ppc/power4_32.d 2022-01-25 13:48:30.857981751 +0000
|
||
@@ -41,7 +41,7 @@ Disassembly of section \.text:
|
||
7c: (7c 01 17 ec|ec 17 01 7c) dcbz r1,r2
|
||
80: (7c 23 27 ec|ec 27 23 7c) dcbzl r3,r4
|
||
84: (7c 05 37 ec|ec 37 05 7c) dcbz r5,r6
|
||
- 88: (7c 05 32 2c|2c 32 05 7c) dcbt r5,r6
|
||
- 8c: (7c 05 32 2c|2c 32 05 7c) dcbt r5,r6
|
||
- 90: (7d 05 32 2c|2c 32 05 7d) dcbt r5,r6,8
|
||
+ 88: (7c 05 32 2c|2c 32 05 7c) dcbtct r5,r6
|
||
+ 8c: (7c 05 32 2c|2c 32 05 7c) dcbtct r5,r6
|
||
+ 90: (7d 05 32 2c|2c 32 05 7d) dcbtds r5,r6
|
||
#pass
|
||
diff -rup binutils.orig/opcodes/ppc-opc.c binutils-2.35/opcodes/ppc-opc.c
|
||
--- binutils.orig/opcodes/ppc-opc.c 2022-01-25 13:39:47.650565929 +0000
|
||
+++ binutils-2.35/opcodes/ppc-opc.c 2022-01-25 13:47:09.056542122 +0000
|
||
@@ -2205,6 +2205,74 @@ extract_sxl (uint64_t insn,
|
||
return 1;
|
||
return (insn >> 11) & 0x1;
|
||
}
|
||
+
|
||
+/* The list of embedded processors that use the embedded operand ordering
|
||
+ for the 3 operand dcbt and dcbtst instructions. */
|
||
+#define DCBT_EO (PPC_OPCODE_E500 | PPC_OPCODE_E500MC | PPC_OPCODE_476 \
|
||
+ | PPC_OPCODE_A2)
|
||
+
|
||
+/* ISA 2.03 and later specify extended mnemonics dcbtct, dcbtds, and
|
||
+ dcbtstct, dcbtstds with a note saying these should be used in new
|
||
+ programs rather than the base mnemonics "so that it can be coded
|
||
+ with TH as the last operand for all categories". For that reason
|
||
+ the extended mnemonics are enabled in the assembler for the
|
||
+ embedded processors, but not for the disassembler so as to display
|
||
+ the embedded dcbt or dcbtst expected form with TH first for
|
||
+ embedded programmers. */
|
||
+
|
||
+static uint64_t
|
||
+insert_thct (uint64_t insn,
|
||
+ int64_t value,
|
||
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
|
||
+ const char **errmsg)
|
||
+{
|
||
+ if ((uint64_t) value > 7)
|
||
+ *errmsg = _("invalid TH value");
|
||
+ return insn | ((value & 7) << 21);
|
||
+}
|
||
+
|
||
+static int64_t
|
||
+extract_thct (uint64_t insn,
|
||
+ ppc_cpu_t dialect,
|
||
+ int *invalid)
|
||
+{
|
||
+ /* Missing optional operands have a value of 0. */
|
||
+ if (*invalid < 0)
|
||
+ return 0;
|
||
+
|
||
+ int64_t value = (insn >> 21) & 0x1f;
|
||
+ if (value > 7 || (dialect & DCBT_EO) != 0)
|
||
+ *invalid = 1;
|
||
+
|
||
+ return value;
|
||
+}
|
||
+
|
||
+static uint64_t
|
||
+insert_thds (uint64_t insn,
|
||
+ int64_t value,
|
||
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
|
||
+ const char **errmsg)
|
||
+{
|
||
+ if (value < 8 || value > 15)
|
||
+ *errmsg = _("invalid TH value");
|
||
+ return insn | ((value & 0x1f) << 21);
|
||
+}
|
||
+
|
||
+static int64_t
|
||
+extract_thds (uint64_t insn,
|
||
+ ppc_cpu_t dialect,
|
||
+ int *invalid)
|
||
+{
|
||
+ /* Missing optional operands have a value of 8. */
|
||
+ if (*invalid < 0)
|
||
+ return 8;
|
||
+
|
||
+ int64_t value = (insn >> 21) & 0x1f;
|
||
+ if (value < 8 || value > 15 || (dialect & DCBT_EO) != 0)
|
||
+ *invalid = 1;
|
||
+
|
||
+ return value;
|
||
+}
|
||
|
||
/* The operands table.
|
||
|
||
@@ -2402,10 +2470,18 @@ const struct powerpc_operand powerpc_ope
|
||
#define MO CT
|
||
{ 0x1f, 21, NULL, NULL, PPC_OPERAND_OPTIONAL },
|
||
|
||
+ /* The TH field in dcbtct. */
|
||
+#define THCT CT + 1
|
||
+ { 0x1f, 21, insert_thct, extract_thct, PPC_OPERAND_OPTIONAL },
|
||
+
|
||
+ /* The TH field in dcbtds. */
|
||
+#define THDS THCT + 1
|
||
+ { 0x1f, 21, insert_thds, extract_thds, PPC_OPERAND_OPTIONAL },
|
||
+
|
||
/* The D field in a D form instruction. This is a displacement off
|
||
a register, and implies that the next operand is a register in
|
||
parentheses. */
|
||
-#define D CT + 1
|
||
+#define D THDS + 1
|
||
{ 0xffff, 0, NULL, NULL, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED },
|
||
|
||
/* The D8 field in a D form instruction. This is a displacement off
|
||
@@ -4211,12 +4287,6 @@ const unsigned int num_powerpc_operands
|
||
#define PPCHTM PPC_OPCODE_POWER8
|
||
#define E200Z4 PPC_OPCODE_E200Z4
|
||
#define PPCLSP PPC_OPCODE_LSP
|
||
-/* The list of embedded processors that use the embedded operand ordering
|
||
- for the 3 operand dcbt and dcbtst instructions. */
|
||
-#define DCBT_EO (PPC_OPCODE_E500 | PPC_OPCODE_E500MC | PPC_OPCODE_476 \
|
||
- | PPC_OPCODE_A2)
|
||
-
|
||
-
|
||
|
||
/* The opcode table.
|
||
|
||
@@ -6592,6 +6662,8 @@ const struct powerpc_opcode powerpc_opco
|
||
{"mtvsrwz", X(31,243), XX1RB_MASK, PPCVSX2, 0, {XT6, RA}},
|
||
|
||
{"dcbtstt", XRT(31,246,0x10), XRT_MASK, POWER7, 0, {RA0, RB}},
|
||
+{"dcbtstct", X(31,246), X_MASK, POWER4, 0, {RA0, RB, THCT}},
|
||
+{"dcbtstds", X(31,246), X_MASK, POWER4, 0, {RA0, RB, THDS}},
|
||
{"dcbtst", X(31,246), X_MASK, POWER4, DCBT_EO, {RA0, RB, CT}},
|
||
{"dcbtst", X(31,246), X_MASK, DCBT_EO, 0, {CT, RA0, RB}},
|
||
{"dcbtst", X(31,246), X_MASK, PPC, POWER4|DCBT_EO, {RA0, RB}},
|
||
@@ -6643,6 +6715,9 @@ const struct powerpc_opcode powerpc_opco
|
||
{"lscbx.", XRC(31,277,1), X_MASK, M601, 0, {RT, RA, RB}},
|
||
|
||
{"dcbtt", XRT(31,278,0x10), XRT_MASK, POWER7, 0, {RA0, RB}},
|
||
+{"dcbna", XRT(31,278,0x11), XRT_MASK, POWER10, 0, {RA0, RB}},
|
||
+{"dcbtct", X(31,278), X_MASK, POWER4, 0, {RA0, RB, THCT}},
|
||
+{"dcbtds", X(31,278), X_MASK, POWER4, 0, {RA0, RB, THDS}},
|
||
{"dcbt", X(31,278), X_MASK, POWER4, DCBT_EO, {RA0, RB, CT}},
|
||
{"dcbt", X(31,278), X_MASK, DCBT_EO, 0, {CT, RA0, RB}},
|
||
{"dcbt", X(31,278), X_MASK, PPC, POWER4|DCBT_EO, {RA0, RB}},
|