diff options
-rw-r--r-- | gas/ChangeLog | 8 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/dcbt.d | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/power4_32.d | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/ppc.exp | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/pr27676.d | 79 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/pr27676.s | 71 | ||||
-rw-r--r-- | opcodes/ChangeLog | 8 | ||||
-rw-r--r-- | opcodes/ppc-opc.c | 89 |
8 files changed, 253 insertions, 11 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 8a7549d..ba23cc2 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2021-04-08 Alan Modra <amodra@gmail.com> + + * testsuite/gas/ppc/pr27676.d, + * testsuite/gas/ppc/pr27676.s: New test. + * testsuite/gas/ppc/ppc.exp: Run it. + * testsuite/gas/ppc/dcbt.d: Update. + * testsuite/gas/ppc/power4_32.d: Update. + 2021-04-07 Alan Modra <amodra@gmail.com> PR 27217 diff --git a/gas/testsuite/gas/ppc/dcbt.d b/gas/testsuite/gas/ppc/dcbt.d index 49311e8..0a213fd 100644 --- a/gas/testsuite/gas/ppc/dcbt.d +++ b/gas/testsuite/gas/ppc/dcbt.d @@ -6,4 +6,4 @@ Disassembly of section \.text: .*: - 0: (7d 40 5a 2c|2c 5a 40 7d) dcbt 0,r11,10 + 0: (7d 40 5a 2c|2c 5a 40 7d) dcbtds 0,r11,10 diff --git a/gas/testsuite/gas/ppc/power4_32.d b/gas/testsuite/gas/ppc/power4_32.d index 39c80dd..8396d7d 100644 --- a/gas/testsuite/gas/ppc/power4_32.d +++ b/gas/testsuite/gas/ppc/power4_32.d @@ -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 --git a/gas/testsuite/gas/ppc/ppc.exp b/gas/testsuite/gas/ppc/ppc.exp index 6f61ad0..560d927 100644 --- a/gas/testsuite/gas/ppc/ppc.exp +++ b/gas/testsuite/gas/ppc/ppc.exp @@ -150,3 +150,4 @@ run_dump_test "rop" run_dump_test "rop-checks" run_dump_test "dcbt" +run_dump_test "pr27676" diff --git a/gas/testsuite/gas/ppc/pr27676.d b/gas/testsuite/gas/ppc/pr27676.d new file mode 100644 index 0000000..55e1639 --- /dev/null +++ b/gas/testsuite/gas/ppc/pr27676.d @@ -0,0 +1,79 @@ +#as: -mpower10 +#objdump: -dr -Mpower10 + +.*: file format .* + +Disassembly of section \.text: + +0+ <\.text>: + 0: (7c 03 22 2c|2c 22 03 7c) dcbtct r3,r4 + 4: (7c 23 22 2c|2c 22 23 7c) dcbtct r3,r4,1 + 8: (7c 43 22 2c|2c 22 43 7c) dcbtct r3,r4,2 + c: (7c 63 22 2c|2c 22 63 7c) dcbtct r3,r4,3 + 10: (7c 83 22 2c|2c 22 83 7c) dcbtct r3,r4,4 + 14: (7c a3 22 2c|2c 22 a3 7c) dcbtct r3,r4,5 + 18: (7c c3 22 2c|2c 22 c3 7c) dcbtct r3,r4,6 + 1c: (7c e3 22 2c|2c 22 e3 7c) dcbtct r3,r4,7 + 20: (7d 03 22 2c|2c 22 03 7d) dcbtds r3,r4 + 24: (7d 23 22 2c|2c 22 23 7d) dcbtds r3,r4,9 + 28: (7d 43 22 2c|2c 22 43 7d) dcbtds r3,r4,10 + 2c: (7d 63 22 2c|2c 22 63 7d) dcbtds r3,r4,11 + 30: (7d 83 22 2c|2c 22 83 7d) dcbtds r3,r4,12 + 34: (7d a3 22 2c|2c 22 a3 7d) dcbtds r3,r4,13 + 38: (7d c3 22 2c|2c 22 c3 7d) dcbtds r3,r4,14 + 3c: (7d e3 22 2c|2c 22 e3 7d) dcbtds r3,r4,15 + 40: (7e 03 22 2c|2c 22 03 7e) dcbtt r3,r4 + 44: (7e 23 22 2c|2c 22 23 7e) dcbna r3,r4 + 48: (7e 43 22 2c|2c 22 43 7e) dcbt r3,r4,18 + 4c: (7e 63 22 2c|2c 22 63 7e) dcbt r3,r4,19 + 50: (7e 83 22 2c|2c 22 83 7e) dcbt r3,r4,20 + 54: (7e a3 22 2c|2c 22 a3 7e) dcbt r3,r4,21 + 58: (7e c3 22 2c|2c 22 c3 7e) dcbt r3,r4,22 + 5c: (7e e3 22 2c|2c 22 e3 7e) dcbt r3,r4,23 + 60: (7f 03 22 2c|2c 22 03 7f) dcbt r3,r4,24 + 64: (7f 23 22 2c|2c 22 23 7f) dcbt r3,r4,25 + 68: (7f 43 22 2c|2c 22 43 7f) dcbt r3,r4,26 + 6c: (7f 63 22 2c|2c 22 63 7f) dcbt r3,r4,27 + 70: (7f 83 22 2c|2c 22 83 7f) dcbt r3,r4,28 + 74: (7f a3 22 2c|2c 22 a3 7f) dcbt r3,r4,29 + 78: (7f c3 22 2c|2c 22 c3 7f) dcbt r3,r4,30 + 7c: (7f e3 22 2c|2c 22 e3 7f) dcbt r3,r4,31 + 80: (7c 05 32 2c|2c 32 05 7c) dcbtct r5,r6 + 84: (7d 05 32 2c|2c 32 05 7d) dcbtds r5,r6 + 88: (7e 05 32 2c|2c 32 05 7e) dcbtt r5,r6 + 8c: (7e 25 32 2c|2c 32 25 7e) dcbna r5,r6 + 90: (7c 03 21 ec|ec 21 03 7c) dcbtstct r3,r4 + 94: (7c 23 21 ec|ec 21 23 7c) dcbtstct r3,r4,1 + 98: (7c 43 21 ec|ec 21 43 7c) dcbtstct r3,r4,2 + 9c: (7c 63 21 ec|ec 21 63 7c) dcbtstct r3,r4,3 + a0: (7c 83 21 ec|ec 21 83 7c) dcbtstct r3,r4,4 + a4: (7c a3 21 ec|ec 21 a3 7c) dcbtstct r3,r4,5 + a8: (7c c3 21 ec|ec 21 c3 7c) dcbtstct r3,r4,6 + ac: (7c e3 21 ec|ec 21 e3 7c) dcbtstct r3,r4,7 + b0: (7d 03 21 ec|ec 21 03 7d) dcbtstds r3,r4 + b4: (7d 23 21 ec|ec 21 23 7d) dcbtstds r3,r4,9 + b8: (7d 43 21 ec|ec 21 43 7d) dcbtstds r3,r4,10 + bc: (7d 63 21 ec|ec 21 63 7d) dcbtstds r3,r4,11 + c0: (7d 83 21 ec|ec 21 83 7d) dcbtstds r3,r4,12 + c4: (7d a3 21 ec|ec 21 a3 7d) dcbtstds r3,r4,13 + c8: (7d c3 21 ec|ec 21 c3 7d) dcbtstds r3,r4,14 + cc: (7d e3 21 ec|ec 21 e3 7d) dcbtstds r3,r4,15 + d0: (7e 03 21 ec|ec 21 03 7e) dcbtstt r3,r4 + d4: (7e 23 21 ec|ec 21 23 7e) dcbtst r3,r4,17 + d8: (7e 43 21 ec|ec 21 43 7e) dcbtst r3,r4,18 + dc: (7e 63 21 ec|ec 21 63 7e) dcbtst r3,r4,19 + e0: (7e 83 21 ec|ec 21 83 7e) dcbtst r3,r4,20 + e4: (7e a3 21 ec|ec 21 a3 7e) dcbtst r3,r4,21 + e8: (7e c3 21 ec|ec 21 c3 7e) dcbtst r3,r4,22 + ec: (7e e3 21 ec|ec 21 e3 7e) dcbtst r3,r4,23 + f0: (7f 03 21 ec|ec 21 03 7f) dcbtst r3,r4,24 + f4: (7f 23 21 ec|ec 21 23 7f) dcbtst r3,r4,25 + f8: (7f 43 21 ec|ec 21 43 7f) dcbtst r3,r4,26 + fc: (7f 63 21 ec|ec 21 63 7f) dcbtst r3,r4,27 + 100: (7f 83 21 ec|ec 21 83 7f) dcbtst r3,r4,28 + 104: (7f a3 21 ec|ec 21 a3 7f) dcbtst r3,r4,29 + 108: (7f c3 21 ec|ec 21 c3 7f) dcbtst r3,r4,30 + 10c: (7f e3 21 ec|ec 21 e3 7f) dcbtst r3,r4,31 + 110: (7c 05 31 ec|ec 31 05 7c) dcbtstct r5,r6 + 114: (7d 05 31 ec|ec 31 05 7d) dcbtstds r5,r6 + 118: (7e 05 31 ec|ec 31 05 7e) dcbtstt r5,r6 diff --git a/gas/testsuite/gas/ppc/pr27676.s b/gas/testsuite/gas/ppc/pr27676.s new file mode 100644 index 0000000..3186e49 --- /dev/null +++ b/gas/testsuite/gas/ppc/pr27676.s @@ -0,0 +1,71 @@ + dcbt 3,4,0 + dcbt 3,4,1 + dcbt 3,4,2 + dcbt 3,4,3 + dcbt 3,4,4 + dcbt 3,4,5 + dcbt 3,4,6 + dcbt 3,4,7 + dcbt 3,4,8 + dcbt 3,4,9 + dcbt 3,4,10 + dcbt 3,4,11 + dcbt 3,4,12 + dcbt 3,4,13 + dcbt 3,4,14 + dcbt 3,4,15 + dcbt 3,4,16 + dcbt 3,4,17 + dcbt 3,4,18 + dcbt 3,4,19 + dcbt 3,4,20 + dcbt 3,4,21 + dcbt 3,4,22 + dcbt 3,4,23 + dcbt 3,4,24 + dcbt 3,4,25 + dcbt 3,4,26 + dcbt 3,4,27 + dcbt 3,4,28 + dcbt 3,4,29 + dcbt 3,4,30 + dcbt 3,4,31 + dcbtct 5,6 + dcbtds 5,6 + dcbtt 5,6 + dcbna 5,6 + dcbtst 3,4,0 + dcbtst 3,4,1 + dcbtst 3,4,2 + dcbtst 3,4,3 + dcbtst 3,4,4 + dcbtst 3,4,5 + dcbtst 3,4,6 + dcbtst 3,4,7 + dcbtst 3,4,8 + dcbtst 3,4,9 + dcbtst 3,4,10 + dcbtst 3,4,11 + dcbtst 3,4,12 + dcbtst 3,4,13 + dcbtst 3,4,14 + dcbtst 3,4,15 + dcbtst 3,4,16 + dcbtst 3,4,17 + dcbtst 3,4,18 + dcbtst 3,4,19 + dcbtst 3,4,20 + dcbtst 3,4,21 + dcbtst 3,4,22 + dcbtst 3,4,23 + dcbtst 3,4,24 + dcbtst 3,4,25 + dcbtst 3,4,26 + dcbtst 3,4,27 + dcbtst 3,4,28 + dcbtst 3,4,29 + dcbtst 3,4,30 + dcbtst 3,4,31 + dcbtstct 5,6 + dcbtstds 5,6 + dcbtstt 5,6 diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 7a380dc..6ed8178 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,11 @@ +2021-04-08 Alan Modra <amodra@gmail.com> + + PR 27676 + * ppc-opc.c (DCBT_EO): Move earlier. + (insert_thct, extract_thct, insert_thds, extract_thds): New functions. + (powerpc_operands): Add THCT and THDS entries. + (powerpc_opcodes): Add dcbtstct, dcbtstds, dcbna, dcbtct, dcbtds. + 2021-04-06 Alan Modra <amodra@gmail.com> * dis-buf.c (generic_symbol_at_address): Return symbol* NULL. diff --git a/opcodes/ppc-opc.c b/opcodes/ppc-opc.c index 97982ab..025a2ba 100644 --- a/opcodes/ppc-opc.c +++ b/opcodes/ppc-opc.c @@ -2233,6 +2233,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. @@ -2430,10 +2498,18 @@ const struct powerpc_operand powerpc_operands[] = #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 @@ -4248,12 +4324,6 @@ const unsigned int num_powerpc_operands = (sizeof (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. @@ -6632,6 +6702,8 @@ const struct powerpc_opcode powerpc_opcodes[] = { {"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}}, @@ -6683,6 +6755,9 @@ const struct powerpc_opcode powerpc_opcodes[] = { {"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}}, |