public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] RISC-V: Add 'Zacas' extension instructions
@ 2023-07-24  7:49 Jiawei
  2023-07-24  8:44 ` Jan Beulich
  0 siblings, 1 reply; 4+ messages in thread
From: Jiawei @ 2023-07-24  7:49 UTC (permalink / raw)
  To: binutils
  Cc: nelson, kito.cheng, palmer, jbeulich, christoph.muellner,
	wuwei2016, shihua, shiyulong, chenyixuan, Jiawei

This patch supports RISC-V Atomic compare-and-swap(CAS) extension
instructions(Zacas)[1]. It contains word/doubleword/quadword CAS 
instructions amocas.w/d/q.And optionally provides release consistency
semantics, using the 'aq' and 'rl' bits, to help implement
multiprocessor synchronization.


[1] https://github.com/riscv/riscv-zacas

bfd/ChangeLog:

        * elfxx-riscv.c (riscv_multi_subset_supports): New depends.
        (riscv_multi_subset_supports_ext): New extension.

gas/ChangeLog:

        * testsuite/gas/riscv/zacas.d: New test.
        * testsuite/gas/riscv/zacas.s: New test.

include/ChangeLog:

        * opcode/riscv-opc.h (MATCH_AMOCAS_W): New match opcode.
        (MASK_AMOCAS_W): New mask opcode.
        (MATCH_AMOCAS_D): New match opcode.
        (MASK_AMOCAS_D): New mask opcode.
        (MATCH_AMOCAS_Q): New match opcode.
        (MASK_AMOCAS_Q): New mask opcode.
        * opcode/riscv.h (enum riscv_insn_class): New extension class.

opcodes/ChangeLog:

        * riscv-opc.c: New instructions.

---
 bfd/elfxx-riscv.c               |  6 ++++++
 gas/testsuite/gas/riscv/zacas.d | 20 ++++++++++++++++++++
 gas/testsuite/gas/riscv/zacas.s | 13 +++++++++++++
 include/opcode/riscv-opc.h      |  7 +++++++
 include/opcode/riscv.h          |  1 +
 opcodes/riscv-opc.c             | 14 ++++++++++++++
 6 files changed, 61 insertions(+)
 create mode 100644 gas/testsuite/gas/riscv/zacas.d
 create mode 100644 gas/testsuite/gas/riscv/zacas.s

diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
index ee96608358e..46b91087fc6 100644
--- a/bfd/elfxx-riscv.c
+++ b/bfd/elfxx-riscv.c
@@ -1171,6 +1171,7 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] =
   {"zvksg", "zvkg",	check_implicit_always},
   {"zvksc", "zvks",	check_implicit_always},
   {"zvksc", "zvbc",	check_implicit_always},
+  {"zacas", "a",	check_implicit_always},
   {"zcf", "zca",	check_implicit_always},
   {"zcd", "zca",	check_implicit_always},
   {"zcb", "zca",	check_implicit_always},
@@ -1248,6 +1249,7 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] =
   {"zifencei",		ISA_SPEC_CLASS_20190608,	2, 0,  0 },
   {"zihintpause",	ISA_SPEC_CLASS_DRAFT,		2, 0,  0 },
   {"zmmul",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
+  {"zacas",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
   {"zawrs",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
   {"zfa",		ISA_SPEC_CLASS_DRAFT,		0, 1,  0 },
   {"zfh",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
@@ -2382,6 +2384,8 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps,
       return riscv_subset_supports (rps, "zmmul");
     case INSN_CLASS_A:
       return riscv_subset_supports (rps, "a");
+    case INSN_CLASS_ZACAS:
+      return riscv_subset_supports (rps, "zacas");
     case INSN_CLASS_ZAWRS:
       return riscv_subset_supports (rps, "zawrs");
     case INSN_CLASS_F:
@@ -2575,6 +2579,8 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
       return _ ("m' or `zmmul");
     case INSN_CLASS_A:
       return "a";
+    case INSN_CLASS_ZACAS:
+      return "zacas";
     case INSN_CLASS_ZAWRS:
       return "zawrs";
     case INSN_CLASS_F:
diff --git a/gas/testsuite/gas/riscv/zacas.d b/gas/testsuite/gas/riscv/zacas.d
new file mode 100644
index 00000000000..2f65a9bcbe4
--- /dev/null
+++ b/gas/testsuite/gas/riscv/zacas.d
@@ -0,0 +1,20 @@
+#as: -march=rv64i_zacas
+#objdump: -d
+
+.*:[ 	]+file format .*
+
+Disassembly of section .text:
+
+0+000 <target>:
+[ 	]+[0-9a-f]+:[ 	]+28e5262f[ 	]+amocas.w[ 	]+a2,a4,\(a0\)
+[ 	]+[0-9a-f]+:[ 	]+2ce5262f[ 	]+amocas.w.aq[ 	]+a2,a4,\(a0\)
+[ 	]+[0-9a-f]+:[ 	]+2ae5262f[ 	]+amocas.w.rl[ 	]+a2,a4,\(a0\)
+[ 	]+[0-9a-f]+:[ 	]+2ee5262f[ 	]+amocas.w.aqrl[ 	]+a2,a4,\(a0\)
+[ 	]+[0-9a-f]+:[ 	]+28e5372f[ 	]+amocas.d[ 	]+a4,a4,\(a0\)
+[ 	]+[0-9a-f]+:[ 	]+2ce5372f[ 	]+amocas.d.aq[ 	]+a4,a4,\(a0\)
+[ 	]+[0-9a-f]+:[ 	]+2ae5372f[ 	]+amocas.d.rl[ 	]+a4,a4,\(a0\)
+[ 	]+[0-9a-f]+:[ 	]+2ee5372f[ 	]+amocas.d.aqrl[ 	]+a4,a4,\(a0\)
+[ 	]+[0-9a-f]+:[ 	]+28e5482f[ 	]+amocas.q[ 	]+a6,a4,\(a0\)
+[ 	]+[0-9a-f]+:[ 	]+2ce5482f[ 	]+amocas.q.aq[ 	]+a6,a4,\(a0\)
+[ 	]+[0-9a-f]+:[ 	]+2ae5482f[ 	]+amocas.q.rl[ 	]+a6,a4,\(a0\)
+[ 	]+[0-9a-f]+:[ 	]+2ee5482f[ 	]+amocas.q.aqrl[ 	]+a6,a4,\(a0\)
diff --git a/gas/testsuite/gas/riscv/zacas.s b/gas/testsuite/gas/riscv/zacas.s
new file mode 100644
index 00000000000..441284455a2
--- /dev/null
+++ b/gas/testsuite/gas/riscv/zacas.s
@@ -0,0 +1,13 @@
+target:
+	amocas.w a2, a4, (a0)
+	amocas.w.aq a2, a4, (a0)
+	amocas.w.rl a2, a4, (a0)
+	amocas.w.aqrl a2, a4, (a0)
+	amocas.d a4, a4, (a0)
+	amocas.d.aq a4, a4, (a0)
+	amocas.d.rl a4, a4, (a0)
+	amocas.d.aqrl a4, a4, (a0)
+	amocas.q a6, a4, (a0)
+	amocas.q.aq a6, a4, (a0)
+	amocas.q.rl a6, a4, (a0)
+	amocas.q.aqrl a6, a4, (a0)
diff --git a/include/opcode/riscv-opc.h b/include/opcode/riscv-opc.h
index 53f5f200508..750e31a337d 100644
--- a/include/opcode/riscv-opc.h
+++ b/include/opcode/riscv-opc.h
@@ -2298,6 +2298,13 @@
 #define MASK_CZERO_EQZ 0xfe00707f
 #define MATCH_CZERO_NEZ 0xe007033
 #define MASK_CZERO_NEZ 0xfe00707f
+/* Zacas intructions.  */
+#define MATCH_AMOCAS_W 0x2800202f
+#define MASK_AMOCAS_W 0xf800707f
+#define MATCH_AMOCAS_D 0x2800302f
+#define MASK_AMOCAS_D 0xf800707f
+#define MATCH_AMOCAS_Q 0x2800402f
+#define MASK_AMOCAS_Q 0xf800707f
 /* Zawrs intructions.  */
 #define MATCH_WRS_NTO 0x00d00073
 #define MASK_WRS_NTO 0xffffffff
diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h
index 808f3657303..e06f9819d6e 100644
--- a/include/opcode/riscv.h
+++ b/include/opcode/riscv.h
@@ -394,6 +394,7 @@ enum riscv_insn_class
   INSN_CLASS_ZIFENCEI,
   INSN_CLASS_ZIHINTPAUSE,
   INSN_CLASS_ZMMUL,
+  INSN_CLASS_ZACAS,
   INSN_CLASS_ZAWRS,
   INSN_CLASS_F_INX,
   INSN_CLASS_D_INX,
diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
index 6a854736fec..ef57850d4e6 100644
--- a/opcodes/riscv-opc.c
+++ b/opcodes/riscv-opc.c
@@ -633,6 +633,20 @@ const struct riscv_opcode riscv_opcodes[] =
 {"amomin.d.aqrl",  64, INSN_CLASS_A, "d,t,0(s)", MATCH_AMOMIN_D|MASK_AQRL, MASK_AMOMIN_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
 {"amominu.d.aqrl", 64, INSN_CLASS_A, "d,t,0(s)", MATCH_AMOMINU_D|MASK_AQRL, MASK_AMOMINU_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
 
+/* Atomic compare-and-swap instruction subset.  */
+{"amocas.w",        0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
+{"amocas.w.aq",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W|MASK_AQ, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
+{"amocas.w.rl",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W|MASK_RL, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
+{"amocas.w.aqrl",   0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W|MASK_AQRL, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
+{"amocas.d",        0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
+{"amocas.d.aq",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D|MASK_AQ, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
+{"amocas.d.rl",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D|MASK_RL, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
+{"amocas.d.aqrl",   0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D|MASK_AQRL, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
+{"amocas.q",       64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
+{"amocas.q.aq",    64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q|MASK_AQ, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
+{"amocas.q.rl",    64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q|MASK_RL, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
+{"amocas.q.aqrl",  64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q|MASK_AQRL, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
+
 /* Multiply/Divide instruction subset.  */
 {"mul",        0, INSN_CLASS_ZCB_AND_ZMMUL, "Cs,Cw,Ct",  MATCH_C_MUL, MASK_C_MUL, match_opcode, INSN_ALIAS },
 {"mul",        0, INSN_CLASS_ZMMUL, "d,s,t",     MATCH_MUL, MASK_MUL, match_opcode, 0 },
-- 
2.25.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] RISC-V: Add 'Zacas' extension instructions
  2023-07-24  7:49 [PATCH] RISC-V: Add 'Zacas' extension instructions Jiawei
@ 2023-07-24  8:44 ` Jan Beulich
  2023-07-24  9:08   ` jiawei
  2023-07-24 13:55   ` jiawei
  0 siblings, 2 replies; 4+ messages in thread
From: Jan Beulich @ 2023-07-24  8:44 UTC (permalink / raw)
  To: Jiawei
  Cc: nelson, kito.cheng, palmer, christoph.muellner, wuwei2016,
	shihua, shiyulong, chenyixuan, binutils

On 24.07.2023 09:49, Jiawei wrote:
> This patch supports RISC-V Atomic compare-and-swap(CAS) extension
> instructions(Zacas)[1]. It contains word/doubleword/quadword CAS 
> instructions amocas.w/d/q.And optionally provides release consistency
> semantics, using the 'aq' and 'rl' bits, to help implement
> multiprocessor synchronization.
> 
> 
> [1] https://github.com/riscv/riscv-zacas

There was an earlier RFC submission (v1 and v2) by Gianluca Guida [2], [3].
In how far is this (a) based on his work and (b) taking into consideration
previously given review comments?

Jan

[2] https://sourceware.org/pipermail/binutils/2023-May/127404.html
[3] https://sourceware.org/pipermail/binutils/2023-May/127700.html

> bfd/ChangeLog:
> 
>         * elfxx-riscv.c (riscv_multi_subset_supports): New depends.
>         (riscv_multi_subset_supports_ext): New extension.
> 
> gas/ChangeLog:
> 
>         * testsuite/gas/riscv/zacas.d: New test.
>         * testsuite/gas/riscv/zacas.s: New test.
> 
> include/ChangeLog:
> 
>         * opcode/riscv-opc.h (MATCH_AMOCAS_W): New match opcode.
>         (MASK_AMOCAS_W): New mask opcode.
>         (MATCH_AMOCAS_D): New match opcode.
>         (MASK_AMOCAS_D): New mask opcode.
>         (MATCH_AMOCAS_Q): New match opcode.
>         (MASK_AMOCAS_Q): New mask opcode.
>         * opcode/riscv.h (enum riscv_insn_class): New extension class.
> 
> opcodes/ChangeLog:
> 
>         * riscv-opc.c: New instructions.
> 
> ---
>  bfd/elfxx-riscv.c               |  6 ++++++
>  gas/testsuite/gas/riscv/zacas.d | 20 ++++++++++++++++++++
>  gas/testsuite/gas/riscv/zacas.s | 13 +++++++++++++
>  include/opcode/riscv-opc.h      |  7 +++++++
>  include/opcode/riscv.h          |  1 +
>  opcodes/riscv-opc.c             | 14 ++++++++++++++
>  6 files changed, 61 insertions(+)
>  create mode 100644 gas/testsuite/gas/riscv/zacas.d
>  create mode 100644 gas/testsuite/gas/riscv/zacas.s
> 
> diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
> index ee96608358e..46b91087fc6 100644
> --- a/bfd/elfxx-riscv.c
> +++ b/bfd/elfxx-riscv.c
> @@ -1171,6 +1171,7 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] =
>    {"zvksg", "zvkg",	check_implicit_always},
>    {"zvksc", "zvks",	check_implicit_always},
>    {"zvksc", "zvbc",	check_implicit_always},
> +  {"zacas", "a",	check_implicit_always},
>    {"zcf", "zca",	check_implicit_always},
>    {"zcd", "zca",	check_implicit_always},
>    {"zcb", "zca",	check_implicit_always},
> @@ -1248,6 +1249,7 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] =
>    {"zifencei",		ISA_SPEC_CLASS_20190608,	2, 0,  0 },
>    {"zihintpause",	ISA_SPEC_CLASS_DRAFT,		2, 0,  0 },
>    {"zmmul",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
> +  {"zacas",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
>    {"zawrs",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
>    {"zfa",		ISA_SPEC_CLASS_DRAFT,		0, 1,  0 },
>    {"zfh",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
> @@ -2382,6 +2384,8 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps,
>        return riscv_subset_supports (rps, "zmmul");
>      case INSN_CLASS_A:
>        return riscv_subset_supports (rps, "a");
> +    case INSN_CLASS_ZACAS:
> +      return riscv_subset_supports (rps, "zacas");
>      case INSN_CLASS_ZAWRS:
>        return riscv_subset_supports (rps, "zawrs");
>      case INSN_CLASS_F:
> @@ -2575,6 +2579,8 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
>        return _ ("m' or `zmmul");
>      case INSN_CLASS_A:
>        return "a";
> +    case INSN_CLASS_ZACAS:
> +      return "zacas";
>      case INSN_CLASS_ZAWRS:
>        return "zawrs";
>      case INSN_CLASS_F:
> diff --git a/gas/testsuite/gas/riscv/zacas.d b/gas/testsuite/gas/riscv/zacas.d
> new file mode 100644
> index 00000000000..2f65a9bcbe4
> --- /dev/null
> +++ b/gas/testsuite/gas/riscv/zacas.d
> @@ -0,0 +1,20 @@
> +#as: -march=rv64i_zacas
> +#objdump: -d
> +
> +.*:[ 	]+file format .*
> +
> +Disassembly of section .text:
> +
> +0+000 <target>:
> +[ 	]+[0-9a-f]+:[ 	]+28e5262f[ 	]+amocas.w[ 	]+a2,a4,\(a0\)
> +[ 	]+[0-9a-f]+:[ 	]+2ce5262f[ 	]+amocas.w.aq[ 	]+a2,a4,\(a0\)
> +[ 	]+[0-9a-f]+:[ 	]+2ae5262f[ 	]+amocas.w.rl[ 	]+a2,a4,\(a0\)
> +[ 	]+[0-9a-f]+:[ 	]+2ee5262f[ 	]+amocas.w.aqrl[ 	]+a2,a4,\(a0\)
> +[ 	]+[0-9a-f]+:[ 	]+28e5372f[ 	]+amocas.d[ 	]+a4,a4,\(a0\)
> +[ 	]+[0-9a-f]+:[ 	]+2ce5372f[ 	]+amocas.d.aq[ 	]+a4,a4,\(a0\)
> +[ 	]+[0-9a-f]+:[ 	]+2ae5372f[ 	]+amocas.d.rl[ 	]+a4,a4,\(a0\)
> +[ 	]+[0-9a-f]+:[ 	]+2ee5372f[ 	]+amocas.d.aqrl[ 	]+a4,a4,\(a0\)
> +[ 	]+[0-9a-f]+:[ 	]+28e5482f[ 	]+amocas.q[ 	]+a6,a4,\(a0\)
> +[ 	]+[0-9a-f]+:[ 	]+2ce5482f[ 	]+amocas.q.aq[ 	]+a6,a4,\(a0\)
> +[ 	]+[0-9a-f]+:[ 	]+2ae5482f[ 	]+amocas.q.rl[ 	]+a6,a4,\(a0\)
> +[ 	]+[0-9a-f]+:[ 	]+2ee5482f[ 	]+amocas.q.aqrl[ 	]+a6,a4,\(a0\)
> diff --git a/gas/testsuite/gas/riscv/zacas.s b/gas/testsuite/gas/riscv/zacas.s
> new file mode 100644
> index 00000000000..441284455a2
> --- /dev/null
> +++ b/gas/testsuite/gas/riscv/zacas.s
> @@ -0,0 +1,13 @@
> +target:
> +	amocas.w a2, a4, (a0)
> +	amocas.w.aq a2, a4, (a0)
> +	amocas.w.rl a2, a4, (a0)
> +	amocas.w.aqrl a2, a4, (a0)
> +	amocas.d a4, a4, (a0)
> +	amocas.d.aq a4, a4, (a0)
> +	amocas.d.rl a4, a4, (a0)
> +	amocas.d.aqrl a4, a4, (a0)
> +	amocas.q a6, a4, (a0)
> +	amocas.q.aq a6, a4, (a0)
> +	amocas.q.rl a6, a4, (a0)
> +	amocas.q.aqrl a6, a4, (a0)
> diff --git a/include/opcode/riscv-opc.h b/include/opcode/riscv-opc.h
> index 53f5f200508..750e31a337d 100644
> --- a/include/opcode/riscv-opc.h
> +++ b/include/opcode/riscv-opc.h
> @@ -2298,6 +2298,13 @@
>  #define MASK_CZERO_EQZ 0xfe00707f
>  #define MATCH_CZERO_NEZ 0xe007033
>  #define MASK_CZERO_NEZ 0xfe00707f
> +/* Zacas intructions.  */
> +#define MATCH_AMOCAS_W 0x2800202f
> +#define MASK_AMOCAS_W 0xf800707f
> +#define MATCH_AMOCAS_D 0x2800302f
> +#define MASK_AMOCAS_D 0xf800707f
> +#define MATCH_AMOCAS_Q 0x2800402f
> +#define MASK_AMOCAS_Q 0xf800707f
>  /* Zawrs intructions.  */
>  #define MATCH_WRS_NTO 0x00d00073
>  #define MASK_WRS_NTO 0xffffffff
> diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h
> index 808f3657303..e06f9819d6e 100644
> --- a/include/opcode/riscv.h
> +++ b/include/opcode/riscv.h
> @@ -394,6 +394,7 @@ enum riscv_insn_class
>    INSN_CLASS_ZIFENCEI,
>    INSN_CLASS_ZIHINTPAUSE,
>    INSN_CLASS_ZMMUL,
> +  INSN_CLASS_ZACAS,
>    INSN_CLASS_ZAWRS,
>    INSN_CLASS_F_INX,
>    INSN_CLASS_D_INX,
> diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
> index 6a854736fec..ef57850d4e6 100644
> --- a/opcodes/riscv-opc.c
> +++ b/opcodes/riscv-opc.c
> @@ -633,6 +633,20 @@ const struct riscv_opcode riscv_opcodes[] =
>  {"amomin.d.aqrl",  64, INSN_CLASS_A, "d,t,0(s)", MATCH_AMOMIN_D|MASK_AQRL, MASK_AMOMIN_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
>  {"amominu.d.aqrl", 64, INSN_CLASS_A, "d,t,0(s)", MATCH_AMOMINU_D|MASK_AQRL, MASK_AMOMINU_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
>  
> +/* Atomic compare-and-swap instruction subset.  */
> +{"amocas.w",        0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
> +{"amocas.w.aq",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W|MASK_AQ, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
> +{"amocas.w.rl",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W|MASK_RL, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
> +{"amocas.w.aqrl",   0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W|MASK_AQRL, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
> +{"amocas.d",        0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
> +{"amocas.d.aq",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D|MASK_AQ, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
> +{"amocas.d.rl",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D|MASK_RL, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
> +{"amocas.d.aqrl",   0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D|MASK_AQRL, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
> +{"amocas.q",       64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
> +{"amocas.q.aq",    64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q|MASK_AQ, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
> +{"amocas.q.rl",    64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q|MASK_RL, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
> +{"amocas.q.aqrl",  64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q|MASK_AQRL, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
> +
>  /* Multiply/Divide instruction subset.  */
>  {"mul",        0, INSN_CLASS_ZCB_AND_ZMMUL, "Cs,Cw,Ct",  MATCH_C_MUL, MASK_C_MUL, match_opcode, INSN_ALIAS },
>  {"mul",        0, INSN_CLASS_ZMMUL, "d,s,t",     MATCH_MUL, MASK_MUL, match_opcode, 0 },


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Re: [PATCH] RISC-V: Add 'Zacas' extension instructions
  2023-07-24  8:44 ` Jan Beulich
@ 2023-07-24  9:08   ` jiawei
  2023-07-24 13:55   ` jiawei
  1 sibling, 0 replies; 4+ messages in thread
From: jiawei @ 2023-07-24  9:08 UTC (permalink / raw)
  To: Jan Beulich
  Cc: nelson, kito.cheng, palmer, christoph.muellner, wuwei2016,
	shihua, shiyulong, chenyixuan, binutils

&gt; -----原始邮件-----
&gt; 发件人: "Jan Beulich" <jbeulich@suse.com>
&gt; 发送时间: 2023-07-24 16:44:03 (星期一)
&gt; 收件人: Jiawei <jiawei@iscas.ac.cn>
&gt; 抄送: nelson@rivosinc.com, kito.cheng@sifive.com, palmer@dabbelt.com, christoph.muellner@vrull.eu, wuwei2016@iscas.ac.cn, shihua@iscas.ac.cn, shiyulong@iscas.ac.cn, chenyixuan@iscas.ac.cn, binutils@sourceware.org
&gt; 主题: Re: [PATCH] RISC-V: Add 'Zacas' extension instructions
&gt; 
&gt; On 24.07.2023 09:49, Jiawei wrote:
&gt; &gt; This patch supports RISC-V Atomic compare-and-swap(CAS) extension
&gt; &gt; instructions(Zacas)[1]. It contains word/doubleword/quadword CAS 
&gt; &gt; instructions amocas.w/d/q.And optionally provides release consistency
&gt; &gt; semantics, using the 'aq' and 'rl' bits, to help implement
&gt; &gt; multiprocessor synchronization.
&gt; &gt; 
&gt; &gt; 
&gt; &gt; [1] https://github.com/riscv/riscv-zacas
&gt; 
&gt; There was an earlier RFC submission (v1 and v2) by Gianluca Guida [2], [3].
&gt; In how far is this (a) based on his work and (b) taking into consideration
&gt; previously given review comments?
&gt; 
&gt; Jan
&gt; 
&gt; [2] https://sourceware.org/pipermail/binutils/2023-May/127404.html
&gt; [3] https://sourceware.org/pipermail/binutils/2023-May/127700.html

Thanks for your mention, I will review it.

BR,
Jiawei

&gt; 
&gt; &gt; bfd/ChangeLog:
&gt; &gt; 
&gt; &gt;         * elfxx-riscv.c (riscv_multi_subset_supports): New depends.
&gt; &gt;         (riscv_multi_subset_supports_ext): New extension.
&gt; &gt; 
&gt; &gt; gas/ChangeLog:
&gt; &gt; 
&gt; &gt;         * testsuite/gas/riscv/zacas.d: New test.
&gt; &gt;         * testsuite/gas/riscv/zacas.s: New test.
&gt; &gt; 
&gt; &gt; include/ChangeLog:
&gt; &gt; 
&gt; &gt;         * opcode/riscv-opc.h (MATCH_AMOCAS_W): New match opcode.
&gt; &gt;         (MASK_AMOCAS_W): New mask opcode.
&gt; &gt;         (MATCH_AMOCAS_D): New match opcode.
&gt; &gt;         (MASK_AMOCAS_D): New mask opcode.
&gt; &gt;         (MATCH_AMOCAS_Q): New match opcode.
&gt; &gt;         (MASK_AMOCAS_Q): New mask opcode.
&gt; &gt;         * opcode/riscv.h (enum riscv_insn_class): New extension class.
&gt; &gt; 
&gt; &gt; opcodes/ChangeLog:
&gt; &gt; 
&gt; &gt;         * riscv-opc.c: New instructions.
&gt; &gt; 
&gt; &gt; ---
&gt; &gt;  bfd/elfxx-riscv.c               |  6 ++++++
&gt; &gt;  gas/testsuite/gas/riscv/zacas.d | 20 ++++++++++++++++++++
&gt; &gt;  gas/testsuite/gas/riscv/zacas.s | 13 +++++++++++++
&gt; &gt;  include/opcode/riscv-opc.h      |  7 +++++++
&gt; &gt;  include/opcode/riscv.h          |  1 +
&gt; &gt;  opcodes/riscv-opc.c             | 14 ++++++++++++++
&gt; &gt;  6 files changed, 61 insertions(+)
&gt; &gt;  create mode 100644 gas/testsuite/gas/riscv/zacas.d
&gt; &gt;  create mode 100644 gas/testsuite/gas/riscv/zacas.s
&gt; &gt; 
&gt; &gt; diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
&gt; &gt; index ee96608358e..46b91087fc6 100644
&gt; &gt; --- a/bfd/elfxx-riscv.c
&gt; &gt; +++ b/bfd/elfxx-riscv.c
&gt; &gt; @@ -1171,6 +1171,7 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] =
&gt; &gt;    {"zvksg", "zvkg",	check_implicit_always},
&gt; &gt;    {"zvksc", "zvks",	check_implicit_always},
&gt; &gt;    {"zvksc", "zvbc",	check_implicit_always},
&gt; &gt; +  {"zacas", "a",	check_implicit_always},
&gt; &gt;    {"zcf", "zca",	check_implicit_always},
&gt; &gt;    {"zcd", "zca",	check_implicit_always},
&gt; &gt;    {"zcb", "zca",	check_implicit_always},
&gt; &gt; @@ -1248,6 +1249,7 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] =
&gt; &gt;    {"zifencei",		ISA_SPEC_CLASS_20190608,	2, 0,  0 },
&gt; &gt;    {"zihintpause",	ISA_SPEC_CLASS_DRAFT,		2, 0,  0 },
&gt; &gt;    {"zmmul",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
&gt; &gt; +  {"zacas",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
&gt; &gt;    {"zawrs",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
&gt; &gt;    {"zfa",		ISA_SPEC_CLASS_DRAFT,		0, 1,  0 },
&gt; &gt;    {"zfh",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
&gt; &gt; @@ -2382,6 +2384,8 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps,
&gt; &gt;        return riscv_subset_supports (rps, "zmmul");
&gt; &gt;      case INSN_CLASS_A:
&gt; &gt;        return riscv_subset_supports (rps, "a");
&gt; &gt; +    case INSN_CLASS_ZACAS:
&gt; &gt; +      return riscv_subset_supports (rps, "zacas");
&gt; &gt;      case INSN_CLASS_ZAWRS:
&gt; &gt;        return riscv_subset_supports (rps, "zawrs");
&gt; &gt;      case INSN_CLASS_F:
&gt; &gt; @@ -2575,6 +2579,8 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
&gt; &gt;        return _ ("m' or `zmmul");
&gt; &gt;      case INSN_CLASS_A:
&gt; &gt;        return "a";
&gt; &gt; +    case INSN_CLASS_ZACAS:
&gt; &gt; +      return "zacas";
&gt; &gt;      case INSN_CLASS_ZAWRS:
&gt; &gt;        return "zawrs";
&gt; &gt;      case INSN_CLASS_F:
&gt; &gt; diff --git a/gas/testsuite/gas/riscv/zacas.d b/gas/testsuite/gas/riscv/zacas.d
&gt; &gt; new file mode 100644
&gt; &gt; index 00000000000..2f65a9bcbe4
&gt; &gt; --- /dev/null
&gt; &gt; +++ b/gas/testsuite/gas/riscv/zacas.d
&gt; &gt; @@ -0,0 +1,20 @@
&gt; &gt; +#as: -march=rv64i_zacas
&gt; &gt; +#objdump: -d
&gt; &gt; +
&gt; &gt; +.*:[ 	]+file format .*
&gt; &gt; +
&gt; &gt; +Disassembly of section .text:
&gt; &gt; +
&gt; &gt; +0+000 <target>:
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+28e5262f[ 	]+amocas.w[ 	]+a2,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ce5262f[ 	]+amocas.w.aq[ 	]+a2,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ae5262f[ 	]+amocas.w.rl[ 	]+a2,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ee5262f[ 	]+amocas.w.aqrl[ 	]+a2,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+28e5372f[ 	]+amocas.d[ 	]+a4,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ce5372f[ 	]+amocas.d.aq[ 	]+a4,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ae5372f[ 	]+amocas.d.rl[ 	]+a4,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ee5372f[ 	]+amocas.d.aqrl[ 	]+a4,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+28e5482f[ 	]+amocas.q[ 	]+a6,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ce5482f[ 	]+amocas.q.aq[ 	]+a6,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ae5482f[ 	]+amocas.q.rl[ 	]+a6,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ee5482f[ 	]+amocas.q.aqrl[ 	]+a6,a4,\(a0\)
&gt; &gt; diff --git a/gas/testsuite/gas/riscv/zacas.s b/gas/testsuite/gas/riscv/zacas.s
&gt; &gt; new file mode 100644
&gt; &gt; index 00000000000..441284455a2
&gt; &gt; --- /dev/null
&gt; &gt; +++ b/gas/testsuite/gas/riscv/zacas.s
&gt; &gt; @@ -0,0 +1,13 @@
&gt; &gt; +target:
&gt; &gt; +	amocas.w a2, a4, (a0)
&gt; &gt; +	amocas.w.aq a2, a4, (a0)
&gt; &gt; +	amocas.w.rl a2, a4, (a0)
&gt; &gt; +	amocas.w.aqrl a2, a4, (a0)
&gt; &gt; +	amocas.d a4, a4, (a0)
&gt; &gt; +	amocas.d.aq a4, a4, (a0)
&gt; &gt; +	amocas.d.rl a4, a4, (a0)
&gt; &gt; +	amocas.d.aqrl a4, a4, (a0)
&gt; &gt; +	amocas.q a6, a4, (a0)
&gt; &gt; +	amocas.q.aq a6, a4, (a0)
&gt; &gt; +	amocas.q.rl a6, a4, (a0)
&gt; &gt; +	amocas.q.aqrl a6, a4, (a0)
&gt; &gt; diff --git a/include/opcode/riscv-opc.h b/include/opcode/riscv-opc.h
&gt; &gt; index 53f5f200508..750e31a337d 100644
&gt; &gt; --- a/include/opcode/riscv-opc.h
&gt; &gt; +++ b/include/opcode/riscv-opc.h
&gt; &gt; @@ -2298,6 +2298,13 @@
&gt; &gt;  #define MASK_CZERO_EQZ 0xfe00707f
&gt; &gt;  #define MATCH_CZERO_NEZ 0xe007033
&gt; &gt;  #define MASK_CZERO_NEZ 0xfe00707f
&gt; &gt; +/* Zacas intructions.  */
&gt; &gt; +#define MATCH_AMOCAS_W 0x2800202f
&gt; &gt; +#define MASK_AMOCAS_W 0xf800707f
&gt; &gt; +#define MATCH_AMOCAS_D 0x2800302f
&gt; &gt; +#define MASK_AMOCAS_D 0xf800707f
&gt; &gt; +#define MATCH_AMOCAS_Q 0x2800402f
&gt; &gt; +#define MASK_AMOCAS_Q 0xf800707f
&gt; &gt;  /* Zawrs intructions.  */
&gt; &gt;  #define MATCH_WRS_NTO 0x00d00073
&gt; &gt;  #define MASK_WRS_NTO 0xffffffff
&gt; &gt; diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h
&gt; &gt; index 808f3657303..e06f9819d6e 100644
&gt; &gt; --- a/include/opcode/riscv.h
&gt; &gt; +++ b/include/opcode/riscv.h
&gt; &gt; @@ -394,6 +394,7 @@ enum riscv_insn_class
&gt; &gt;    INSN_CLASS_ZIFENCEI,
&gt; &gt;    INSN_CLASS_ZIHINTPAUSE,
&gt; &gt;    INSN_CLASS_ZMMUL,
&gt; &gt; +  INSN_CLASS_ZACAS,
&gt; &gt;    INSN_CLASS_ZAWRS,
&gt; &gt;    INSN_CLASS_F_INX,
&gt; &gt;    INSN_CLASS_D_INX,
&gt; &gt; diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
&gt; &gt; index 6a854736fec..ef57850d4e6 100644
&gt; &gt; --- a/opcodes/riscv-opc.c
&gt; &gt; +++ b/opcodes/riscv-opc.c
&gt; &gt; @@ -633,6 +633,20 @@ const struct riscv_opcode riscv_opcodes[] =
&gt; &gt;  {"amomin.d.aqrl",  64, INSN_CLASS_A, "d,t,0(s)", MATCH_AMOMIN_D|MASK_AQRL, MASK_AMOMIN_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
&gt; &gt;  {"amominu.d.aqrl", 64, INSN_CLASS_A, "d,t,0(s)", MATCH_AMOMINU_D|MASK_AQRL, MASK_AMOMINU_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
&gt; &gt;  
&gt; &gt; +/* Atomic compare-and-swap instruction subset.  */
&gt; &gt; +{"amocas.w",        0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
&gt; &gt; +{"amocas.w.aq",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W|MASK_AQ, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
&gt; &gt; +{"amocas.w.rl",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W|MASK_RL, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
&gt; &gt; +{"amocas.w.aqrl",   0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W|MASK_AQRL, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
&gt; &gt; +{"amocas.d",        0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
&gt; &gt; +{"amocas.d.aq",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D|MASK_AQ, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
&gt; &gt; +{"amocas.d.rl",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D|MASK_RL, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
&gt; &gt; +{"amocas.d.aqrl",   0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D|MASK_AQRL, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
&gt; &gt; +{"amocas.q",       64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
&gt; &gt; +{"amocas.q.aq",    64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q|MASK_AQ, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
&gt; &gt; +{"amocas.q.rl",    64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q|MASK_RL, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
&gt; &gt; +{"amocas.q.aqrl",  64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q|MASK_AQRL, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
&gt; &gt; +
&gt; &gt;  /* Multiply/Divide instruction subset.  */
&gt; &gt;  {"mul",        0, INSN_CLASS_ZCB_AND_ZMMUL, "Cs,Cw,Ct",  MATCH_C_MUL, MASK_C_MUL, match_opcode, INSN_ALIAS },
&gt; &gt;  {"mul",        0, INSN_CLASS_ZMMUL, "d,s,t",     MATCH_MUL, MASK_MUL, match_opcode, 0 },
</target></jiawei@iscas.ac.cn></jbeulich@suse.com>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Re: [PATCH] RISC-V: Add 'Zacas' extension instructions
  2023-07-24  8:44 ` Jan Beulich
  2023-07-24  9:08   ` jiawei
@ 2023-07-24 13:55   ` jiawei
  1 sibling, 0 replies; 4+ messages in thread
From: jiawei @ 2023-07-24 13:55 UTC (permalink / raw)
  To: Jan Beulich
  Cc: nelson, kito.cheng, palmer, christoph.muellner, wuwei2016,
	shihua, shiyulong, chenyixuan, binutils

Sorry, I didn't check the previous mailing list carefully.
Please ignore this patch and stay tuned to Gianluca Guida's work.
Thank you for your correction again.

BR,
Jiawei

&gt; -----原始邮件-----
&gt; 发件人: "Jan Beulich" <jbeulich@suse.com>
&gt; 发送时间: 2023-07-24 16:44:03 (星期一)
&gt; 收件人: Jiawei <jiawei@iscas.ac.cn>
&gt; 抄送: nelson@rivosinc.com, kito.cheng@sifive.com, palmer@dabbelt.com, christoph.muellner@vrull.eu, wuwei2016@iscas.ac.cn, shihua@iscas.ac.cn, shiyulong@iscas.ac.cn, chenyixuan@iscas.ac.cn, binutils@sourceware.org
&gt; 主题: Re: [PATCH] RISC-V: Add 'Zacas' extension instructions
&gt; 
&gt; On 24.07.2023 09:49, Jiawei wrote:
&gt; &gt; This patch supports RISC-V Atomic compare-and-swap(CAS) extension
&gt; &gt; instructions(Zacas)[1]. It contains word/doubleword/quadword CAS 
&gt; &gt; instructions amocas.w/d/q.And optionally provides release consistency
&gt; &gt; semantics, using the 'aq' and 'rl' bits, to help implement
&gt; &gt; multiprocessor synchronization.
&gt; &gt; 
&gt; &gt; 
&gt; &gt; [1] https://github.com/riscv/riscv-zacas
&gt; 
&gt; There was an earlier RFC submission (v1 and v2) by Gianluca Guida [2], [3].
&gt; In how far is this (a) based on his work and (b) taking into consideration
&gt; previously given review comments?
&gt; 
&gt; Jan
&gt; 
&gt; [2] https://sourceware.org/pipermail/binutils/2023-May/127404.html
&gt; [3] https://sourceware.org/pipermail/binutils/2023-May/127700.html
&gt; 
&gt; &gt; bfd/ChangeLog:
&gt; &gt; 
&gt; &gt;         * elfxx-riscv.c (riscv_multi_subset_supports): New depends.
&gt; &gt;         (riscv_multi_subset_supports_ext): New extension.
&gt; &gt; 
&gt; &gt; gas/ChangeLog:
&gt; &gt; 
&gt; &gt;         * testsuite/gas/riscv/zacas.d: New test.
&gt; &gt;         * testsuite/gas/riscv/zacas.s: New test.
&gt; &gt; 
&gt; &gt; include/ChangeLog:
&gt; &gt; 
&gt; &gt;         * opcode/riscv-opc.h (MATCH_AMOCAS_W): New match opcode.
&gt; &gt;         (MASK_AMOCAS_W): New mask opcode.
&gt; &gt;         (MATCH_AMOCAS_D): New match opcode.
&gt; &gt;         (MASK_AMOCAS_D): New mask opcode.
&gt; &gt;         (MATCH_AMOCAS_Q): New match opcode.
&gt; &gt;         (MASK_AMOCAS_Q): New mask opcode.
&gt; &gt;         * opcode/riscv.h (enum riscv_insn_class): New extension class.
&gt; &gt; 
&gt; &gt; opcodes/ChangeLog:
&gt; &gt; 
&gt; &gt;         * riscv-opc.c: New instructions.
&gt; &gt; 
&gt; &gt; ---
&gt; &gt;  bfd/elfxx-riscv.c               |  6 ++++++
&gt; &gt;  gas/testsuite/gas/riscv/zacas.d | 20 ++++++++++++++++++++
&gt; &gt;  gas/testsuite/gas/riscv/zacas.s | 13 +++++++++++++
&gt; &gt;  include/opcode/riscv-opc.h      |  7 +++++++
&gt; &gt;  include/opcode/riscv.h          |  1 +
&gt; &gt;  opcodes/riscv-opc.c             | 14 ++++++++++++++
&gt; &gt;  6 files changed, 61 insertions(+)
&gt; &gt;  create mode 100644 gas/testsuite/gas/riscv/zacas.d
&gt; &gt;  create mode 100644 gas/testsuite/gas/riscv/zacas.s
&gt; &gt; 
&gt; &gt; diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
&gt; &gt; index ee96608358e..46b91087fc6 100644
&gt; &gt; --- a/bfd/elfxx-riscv.c
&gt; &gt; +++ b/bfd/elfxx-riscv.c
&gt; &gt; @@ -1171,6 +1171,7 @@ static struct riscv_implicit_subset riscv_implicit_subsets[] =
&gt; &gt;    {"zvksg", "zvkg",	check_implicit_always},
&gt; &gt;    {"zvksc", "zvks",	check_implicit_always},
&gt; &gt;    {"zvksc", "zvbc",	check_implicit_always},
&gt; &gt; +  {"zacas", "a",	check_implicit_always},
&gt; &gt;    {"zcf", "zca",	check_implicit_always},
&gt; &gt;    {"zcd", "zca",	check_implicit_always},
&gt; &gt;    {"zcb", "zca",	check_implicit_always},
&gt; &gt; @@ -1248,6 +1249,7 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] =
&gt; &gt;    {"zifencei",		ISA_SPEC_CLASS_20190608,	2, 0,  0 },
&gt; &gt;    {"zihintpause",	ISA_SPEC_CLASS_DRAFT,		2, 0,  0 },
&gt; &gt;    {"zmmul",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
&gt; &gt; +  {"zacas",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
&gt; &gt;    {"zawrs",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
&gt; &gt;    {"zfa",		ISA_SPEC_CLASS_DRAFT,		0, 1,  0 },
&gt; &gt;    {"zfh",		ISA_SPEC_CLASS_DRAFT,		1, 0,  0 },
&gt; &gt; @@ -2382,6 +2384,8 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps,
&gt; &gt;        return riscv_subset_supports (rps, "zmmul");
&gt; &gt;      case INSN_CLASS_A:
&gt; &gt;        return riscv_subset_supports (rps, "a");
&gt; &gt; +    case INSN_CLASS_ZACAS:
&gt; &gt; +      return riscv_subset_supports (rps, "zacas");
&gt; &gt;      case INSN_CLASS_ZAWRS:
&gt; &gt;        return riscv_subset_supports (rps, "zawrs");
&gt; &gt;      case INSN_CLASS_F:
&gt; &gt; @@ -2575,6 +2579,8 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
&gt; &gt;        return _ ("m' or `zmmul");
&gt; &gt;      case INSN_CLASS_A:
&gt; &gt;        return "a";
&gt; &gt; +    case INSN_CLASS_ZACAS:
&gt; &gt; +      return "zacas";
&gt; &gt;      case INSN_CLASS_ZAWRS:
&gt; &gt;        return "zawrs";
&gt; &gt;      case INSN_CLASS_F:
&gt; &gt; diff --git a/gas/testsuite/gas/riscv/zacas.d b/gas/testsuite/gas/riscv/zacas.d
&gt; &gt; new file mode 100644
&gt; &gt; index 00000000000..2f65a9bcbe4
&gt; &gt; --- /dev/null
&gt; &gt; +++ b/gas/testsuite/gas/riscv/zacas.d
&gt; &gt; @@ -0,0 +1,20 @@
&gt; &gt; +#as: -march=rv64i_zacas
&gt; &gt; +#objdump: -d
&gt; &gt; +
&gt; &gt; +.*:[ 	]+file format .*
&gt; &gt; +
&gt; &gt; +Disassembly of section .text:
&gt; &gt; +
&gt; &gt; +0+000 <target>:
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+28e5262f[ 	]+amocas.w[ 	]+a2,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ce5262f[ 	]+amocas.w.aq[ 	]+a2,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ae5262f[ 	]+amocas.w.rl[ 	]+a2,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ee5262f[ 	]+amocas.w.aqrl[ 	]+a2,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+28e5372f[ 	]+amocas.d[ 	]+a4,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ce5372f[ 	]+amocas.d.aq[ 	]+a4,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ae5372f[ 	]+amocas.d.rl[ 	]+a4,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ee5372f[ 	]+amocas.d.aqrl[ 	]+a4,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+28e5482f[ 	]+amocas.q[ 	]+a6,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ce5482f[ 	]+amocas.q.aq[ 	]+a6,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ae5482f[ 	]+amocas.q.rl[ 	]+a6,a4,\(a0\)
&gt; &gt; +[ 	]+[0-9a-f]+:[ 	]+2ee5482f[ 	]+amocas.q.aqrl[ 	]+a6,a4,\(a0\)
&gt; &gt; diff --git a/gas/testsuite/gas/riscv/zacas.s b/gas/testsuite/gas/riscv/zacas.s
&gt; &gt; new file mode 100644
&gt; &gt; index 00000000000..441284455a2
&gt; &gt; --- /dev/null
&gt; &gt; +++ b/gas/testsuite/gas/riscv/zacas.s
&gt; &gt; @@ -0,0 +1,13 @@
&gt; &gt; +target:
&gt; &gt; +	amocas.w a2, a4, (a0)
&gt; &gt; +	amocas.w.aq a2, a4, (a0)
&gt; &gt; +	amocas.w.rl a2, a4, (a0)
&gt; &gt; +	amocas.w.aqrl a2, a4, (a0)
&gt; &gt; +	amocas.d a4, a4, (a0)
&gt; &gt; +	amocas.d.aq a4, a4, (a0)
&gt; &gt; +	amocas.d.rl a4, a4, (a0)
&gt; &gt; +	amocas.d.aqrl a4, a4, (a0)
&gt; &gt; +	amocas.q a6, a4, (a0)
&gt; &gt; +	amocas.q.aq a6, a4, (a0)
&gt; &gt; +	amocas.q.rl a6, a4, (a0)
&gt; &gt; +	amocas.q.aqrl a6, a4, (a0)
&gt; &gt; diff --git a/include/opcode/riscv-opc.h b/include/opcode/riscv-opc.h
&gt; &gt; index 53f5f200508..750e31a337d 100644
&gt; &gt; --- a/include/opcode/riscv-opc.h
&gt; &gt; +++ b/include/opcode/riscv-opc.h
&gt; &gt; @@ -2298,6 +2298,13 @@
&gt; &gt;  #define MASK_CZERO_EQZ 0xfe00707f
&gt; &gt;  #define MATCH_CZERO_NEZ 0xe007033
&gt; &gt;  #define MASK_CZERO_NEZ 0xfe00707f
&gt; &gt; +/* Zacas intructions.  */
&gt; &gt; +#define MATCH_AMOCAS_W 0x2800202f
&gt; &gt; +#define MASK_AMOCAS_W 0xf800707f
&gt; &gt; +#define MATCH_AMOCAS_D 0x2800302f
&gt; &gt; +#define MASK_AMOCAS_D 0xf800707f
&gt; &gt; +#define MATCH_AMOCAS_Q 0x2800402f
&gt; &gt; +#define MASK_AMOCAS_Q 0xf800707f
&gt; &gt;  /* Zawrs intructions.  */
&gt; &gt;  #define MATCH_WRS_NTO 0x00d00073
&gt; &gt;  #define MASK_WRS_NTO 0xffffffff
&gt; &gt; diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h
&gt; &gt; index 808f3657303..e06f9819d6e 100644
&gt; &gt; --- a/include/opcode/riscv.h
&gt; &gt; +++ b/include/opcode/riscv.h
&gt; &gt; @@ -394,6 +394,7 @@ enum riscv_insn_class
&gt; &gt;    INSN_CLASS_ZIFENCEI,
&gt; &gt;    INSN_CLASS_ZIHINTPAUSE,
&gt; &gt;    INSN_CLASS_ZMMUL,
&gt; &gt; +  INSN_CLASS_ZACAS,
&gt; &gt;    INSN_CLASS_ZAWRS,
&gt; &gt;    INSN_CLASS_F_INX,
&gt; &gt;    INSN_CLASS_D_INX,
&gt; &gt; diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
&gt; &gt; index 6a854736fec..ef57850d4e6 100644
&gt; &gt; --- a/opcodes/riscv-opc.c
&gt; &gt; +++ b/opcodes/riscv-opc.c
&gt; &gt; @@ -633,6 +633,20 @@ const struct riscv_opcode riscv_opcodes[] =
&gt; &gt;  {"amomin.d.aqrl",  64, INSN_CLASS_A, "d,t,0(s)", MATCH_AMOMIN_D|MASK_AQRL, MASK_AMOMIN_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
&gt; &gt;  {"amominu.d.aqrl", 64, INSN_CLASS_A, "d,t,0(s)", MATCH_AMOMINU_D|MASK_AQRL, MASK_AMOMINU_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
&gt; &gt;  
&gt; &gt; +/* Atomic compare-and-swap instruction subset.  */
&gt; &gt; +{"amocas.w",        0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
&gt; &gt; +{"amocas.w.aq",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W|MASK_AQ, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
&gt; &gt; +{"amocas.w.rl",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W|MASK_RL, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
&gt; &gt; +{"amocas.w.aqrl",   0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_W|MASK_AQRL, MASK_AMOCAS_W|MASK_AQRL, match_opcode, INSN_DREF|INSN_4_BYTE },
&gt; &gt; +{"amocas.d",        0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
&gt; &gt; +{"amocas.d.aq",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D|MASK_AQ, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
&gt; &gt; +{"amocas.d.rl",     0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D|MASK_RL, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
&gt; &gt; +{"amocas.d.aqrl",   0, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_D|MASK_AQRL, MASK_AMOCAS_D|MASK_AQRL, match_opcode, INSN_DREF|INSN_8_BYTE },
&gt; &gt; +{"amocas.q",       64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
&gt; &gt; +{"amocas.q.aq",    64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q|MASK_AQ, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
&gt; &gt; +{"amocas.q.rl",    64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q|MASK_RL, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
&gt; &gt; +{"amocas.q.aqrl",  64, INSN_CLASS_ZACAS, "d,t,0(s)",   MATCH_AMOCAS_Q|MASK_AQRL, MASK_AMOCAS_Q|MASK_AQRL, match_opcode, INSN_DREF|INSN_16_BYTE },
&gt; &gt; +
&gt; &gt;  /* Multiply/Divide instruction subset.  */
&gt; &gt;  {"mul",        0, INSN_CLASS_ZCB_AND_ZMMUL, "Cs,Cw,Ct",  MATCH_C_MUL, MASK_C_MUL, match_opcode, INSN_ALIAS },
&gt; &gt;  {"mul",        0, INSN_CLASS_ZMMUL, "d,s,t",     MATCH_MUL, MASK_MUL, match_opcode, 0 },
</target></jiawei@iscas.ac.cn></jbeulich@suse.com>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-07-24 13:56 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-24  7:49 [PATCH] RISC-V: Add 'Zacas' extension instructions Jiawei
2023-07-24  8:44 ` Jan Beulich
2023-07-24  9:08   ` jiawei
2023-07-24 13:55   ` jiawei

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).