From: Dmitry Selyutin <ghostmansd@gmail.com>
To: binutils@sourceware.org
Cc: Alan Modra <amodra@gmail.com>,
Luke Kenneth Casson Leighton <luke.leighton@gmail.com>,
Dmitry Selyutin <ghostmansd@gmail.com>
Subject: [PATCH] ppc/svp64: support svshape2 instruction
Date: Thu, 8 Sep 2022 21:25:30 +0300 [thread overview]
Message-ID: <20220908182530.118842-1-ghostmansd@gmail.com> (raw)
https://libre-soc.org/openpower/sv/
https://libre-soc.org/openpower/sv/remap/#svshape
https://libre-soc.org/openpower/sv/remap/#svshape2
https://libre-soc.org/openpower/isa/simplev/
---
gas/testsuite/gas/ppc/svshape.s | 6 +++
opcodes/ppc-opc.c | 75 ++++++++++++++++++++++++++++++++-
2 files changed, 80 insertions(+), 1 deletion(-)
diff --git a/gas/testsuite/gas/ppc/svshape.s b/gas/testsuite/gas/ppc/svshape.s
index c83373ba372..39d4579a200 100644
--- a/gas/testsuite/gas/ppc/svshape.s
+++ b/gas/testsuite/gas/ppc/svshape.s
@@ -3,3 +3,9 @@ svshape 1,32,1,0,0
svshape 1,1,32,0,0
svshape 1,1,1,15,0
svshape 1,1,1,0,1
+svshape2 15,0,0,1,0,0
+svshape2 0,1,0,1,0,0
+svshape2 0,0,31,1,0,0
+svshape2 0,0,0,32,0,0
+svshape2 0,0,0,1,1,0
+svshape2 0,0,0,1,0,1
diff --git a/opcodes/ppc-opc.c b/opcodes/ppc-opc.c
index 934b1bf4e85..fb7fb79cba4 100644
--- a/opcodes/ppc-opc.c
+++ b/opcodes/ppc-opc.c
@@ -2719,6 +2719,67 @@ extract_thds (uint64_t insn,
return value;
}
+
+static uint64_t
+insert_SVrm (uint64_t insn,
+ int64_t value,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ const char **errmsg)
+{
+ /*
+ * 0b1000 and 0b1001 values are reserved for svshape2.
+ * svshape is SVM-form; svshape2 is SVM2-form.
+ *
+ * svshape XO:
+ * 0000-011001
+ * 0001-011001
+ * 0010-011001
+ * 0011-011001
+ * 0100-011001
+ * 0101-011001
+ * 0110-011001
+ * 0111-011001
+ * 1010-011001
+ * 1011-011001
+ * 1100-011001
+ * 1101-011001
+ * 1110-011001
+ * 1111-011001
+ *
+ * svshape2 XO:
+ * 100--011001
+ *
+ * # 1.6.35 SVM-FORM
+ * |0 |6 |11 |16 |21 |25 |26 |31 |
+ * | PO | SVxd | SVyd | SVzd | SVrm |vf | XO |
+ *
+ * # 1.6.35.1 SVM2-FORM
+ * |0 |6 |10|11 |16 |21 |24|25 |26 |31 |
+ * | PO | offs |yx| rmm | SVd |XO |mm|sk | XO |
+ */
+ if ((value == 8) || (value == 9))
+ *errmsg = _("invalid SVrm value");
+
+ return insn | ((value & 0xf) << 7);
+}
+
+static int64_t
+extract_SVrm (uint64_t insn,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ int *invalid)
+{
+ int64_t value = (insn >> 21) & 0x1f;
+
+ /*
+ * We should never meet the condition below in practice.
+ * svshape2 opcode and mask should always be matched first.
+ */
+ if ((value == 8) || (value == 9))
+ *invalid = 1;
+
+ return value;
+}
+
\f
/* The operands table.
@@ -3110,6 +3171,7 @@ const struct powerpc_operand powerpc_operands[] =
/* The L field in a D or X form instruction. */
#define L IMM20 + 1
+#define yx10 L
{ 0x1, 21, NULL, NULL, 0 },
/* The optional L field in tlbie and tlbiel instructions. */
@@ -3864,13 +3926,16 @@ const struct powerpc_operand powerpc_operands[] =
{ 0x1f, 11, NULL, NULL, PPC_OPERAND_NONZERO },
#define SVrm SVzd + 1
- { 0xf, 7, NULL, NULL, 0 },
+ { 0xf, 7, insert_SVrm, extract_SVrm, 0 },
#define mi1 SVrm + 1
{ 0x3, 17, NULL, NULL, 0 },
#define mi2 mi1 + 1
{ 0x3, 15, NULL, NULL, 0 },
+
+#define SVo mi2 + 1
+ { 0xf, 22, NULL, NULL, 0 },
};
const unsigned int num_powerpc_operands = (sizeof (powerpc_operands)
@@ -4759,6 +4824,13 @@ const unsigned int num_powerpc_operands = (sizeof (powerpc_operands)
| (((uint64_t)(xop)) & 0x3f))
#define SVM_MASK SVM (0x3f, 0x3f)
+/* An SVM2 form instruction. */
+#define SVM2(op, xop) \
+ (OP (op) \
+ | (((((uint64_t)(xop)) >> 6) & 0x7) << 8) \
+ | (((uint64_t)(xop)) & 0x3f))
+#define SVM2_MASK SVM2 (0x3f, 0x1ff)
+
/* An SVRM form instruction. */
#define SVRM(op, xop) \
(OP (op) \
@@ -6843,6 +6915,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"svstep", SVL(22,19,0), SVL_MASK, SVP64, PPCVLE, {RT, SVi, vf}},
{"svstep.", SVL(22,19,1), SVL_MASK, SVP64, PPCVLE, {RT, SVi, vf}},
+{"svshape2", SVM2(22,281), SVM2_MASK, SVP64, PPCVLE, {SVo, yx10, rmm, SVd, sk, mm}},
{"svshape", SVM(22,25), SVM_MASK, SVP64, PPCVLE, {SVxd, SVyd, SVzd, SVrm, vf}},
{"setvl", SVL(22,27,0), SVL_MASK, SVP64, PPCVLE, {RT, RA, SVi, vf, vs, ms}},
--
2.37.2
next reply other threads:[~2022-09-08 18:26 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-08 18:25 Dmitry Selyutin [this message]
2022-09-08 18:34 ` Dmitry Selyutin
2022-09-08 19:03 ` lkcl
2022-09-09 9:22 ` Dmitry Selyutin
2022-09-12 6:24 ` Jan Beulich
2022-09-12 8:43 ` Dmitry Selyutin
2022-09-12 10:30 ` lkcl
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220908182530.118842-1-ghostmansd@gmail.com \
--to=ghostmansd@gmail.com \
--cc=amodra@gmail.com \
--cc=binutils@sourceware.org \
--cc=luke.leighton@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).