From: yulong <shiyul...@iscas.ac.cn> This patch add the mininal support for zabha extension. The doc url as follow: https://github.com/riscv/riscv-zabha/blob/v1.0-rc1/zabha.adoc There are have no amocas.[b|h] instructions, because the zacas extension is not merged.
gcc/ChangeLog: * common/config/riscv/riscv-common.cc: Add zabha extension name. * config/riscv/riscv.md (amo_addqi3): New mode. (amo_addhi3): Ditto. (amo_minqi3): Ditto. (amo_minuqi3): Ditto. (amo_minhi3): Ditto. (amo_minuhi3): Ditto. (amo_maxqi3): Ditto. (amo_maxuqi3): Ditto. (amo_maxhi3): Ditto. (amo_maxuhi3): Ditto. (amo_andqi3): Ditto. (amo_andhi3): Ditto. (amo_orqi3): Ditto. (amo_orhi3): Ditto. (amo_xorqi3): Ditto. (amo_xorhi3): Ditto. (amo_swapqi3): Ditto. (amo_swaphi3): Ditto. * config/riscv/riscv.opt: Add zabha extension. --- gcc/common/config/riscv/riscv-common.cc | 2 + gcc/config/riscv/riscv.md | 167 ++++++++++++++++++++++++ gcc/config/riscv/riscv.opt | 2 + 3 files changed, 171 insertions(+) diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc index 631ce8309a0..9c3be0d7651 100644 --- a/gcc/common/config/riscv/riscv-common.cc +++ b/gcc/common/config/riscv/riscv-common.cc @@ -250,6 +250,7 @@ static const struct riscv_ext_version riscv_ext_version_table[] = {"za64rs", ISA_SPEC_CLASS_NONE, 1, 0}, {"za128rs", ISA_SPEC_CLASS_NONE, 1, 0}, {"zawrs", ISA_SPEC_CLASS_NONE, 1, 0}, + {"zabha", ISA_SPEC_CLASS_NONE, 1, 0}, {"zba", ISA_SPEC_CLASS_NONE, 1, 0}, {"zbb", ISA_SPEC_CLASS_NONE, 1, 0}, @@ -1504,6 +1505,7 @@ static const riscv_ext_flag_table_t riscv_ext_flag_table[] = {"za64rs", &gcc_options::x_riscv_za_subext, MASK_ZA64RS}, {"za128rs", &gcc_options::x_riscv_za_subext, MASK_ZA128RS}, {"zawrs", &gcc_options::x_riscv_za_subext, MASK_ZAWRS}, + {"zabha", &gcc_options::x_riscv_za_subext, MASK_ZABHA}, {"zba", &gcc_options::x_riscv_zb_subext, MASK_ZBA}, {"zbb", &gcc_options::x_riscv_zb_subext, MASK_ZBB}, diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md index 39b29795cd6..058b63ac7f0 100644 --- a/gcc/config/riscv/riscv.md +++ b/gcc/config/riscv/riscv.md @@ -134,6 +134,9 @@ ;; XTheadInt unspec UNSPECV_XTHEADINT_PUSH UNSPECV_XTHEADINT_POP + + ;; Zabha instructions. + UNSPEC_AMO_SWAP ]) (define_constants @@ -849,6 +852,24 @@ [(set_attr "type" "arith") (set_attr "mode" "SI")]) +(define_insn "amo_addqi3" + [(set (match_operand:QI 0 "register_operand" "=r,r") + (plus:QI (match_operand:QI 1 "register_operand" " r,r") + (match_operand:QI 2 "arith_operand" " r,r")))] + "TARGET_ZABHA" + "amoadd.b\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "QI")]) + +(define_insn "amo_addhi3" + [(set (match_operand:HI 0 "register_operand" "=r,r") + (plus:HI (match_operand:HI 1 "register_operand" " r,r") + (match_operand:HI 2 "arith_operand" " r,r")))] + "TARGET_ZABHA" + "amoadd.h\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "HI")]) + ;; ;; .................... ;; @@ -1645,6 +1666,78 @@ [(set_attr "type" "fmove") (set_attr "mode" "<UNITMODE>")]) +(define_insn "amo_minqi3" + [(set (match_operand:QI 0 "register_operand" "=r") + (smin:QI (match_operand:QI 1 "register_operand" " r") + (match_operand:QI 2 "register_operand" " r")))] + "TARGET_ZABHA" + "amomin.b\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "QI")]) + +(define_insn "amo_minuqi3" + [(set (match_operand:QI 0 "register_operand" "=r") + (umin:QI (match_operand:QI 1 "register_operand" " r") + (match_operand:QI 2 "register_operand" " r")))] + "TARGET_ZABHA" + "amominu.b\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "QI")]) + +(define_insn "amo_minhi3" + [(set (match_operand:HI 0 "register_operand" "=r") + (smin:HI (match_operand:HI 1 "register_operand" " r") + (match_operand:HI 2 "register_operand" " r")))] + "TARGET_ZABHA" + "amomin.h\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "HI")]) + +(define_insn "amo_minuhi3" + [(set (match_operand:HI 0 "register_operand" "=r") + (umin:HI (match_operand:HI 1 "register_operand" " r") + (match_operand:HI 2 "register_operand" " r")))] + "TARGET_ZABHA" + "amominu.h\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "HI")]) + +(define_insn "amo_maxqi3" + [(set (match_operand:QI 0 "register_operand" "=r") + (smax:QI (match_operand:QI 1 "register_operand" " r") + (match_operand:QI 2 "register_operand" " r")))] + "TARGET_ZABHA" + "amomax.b\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "QI")]) + +(define_insn "amo_maxuqi3" + [(set (match_operand:QI 0 "register_operand" "=r") + (umax:QI (match_operand:QI 1 "register_operand" " r") + (match_operand:QI 2 "register_operand" " r")))] + "TARGET_ZABHA" + "amomaxu.b\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "QI")]) + +(define_insn "amo_maxhi3" + [(set (match_operand:HI 0 "register_operand" "=r") + (smax:HI (match_operand:HI 1 "register_operand" " r") + (match_operand:HI 2 "register_operand" " r")))] + "TARGET_ZABHA" + "amomax.h\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "HI")]) + +(define_insn "amo_maxuhi3" + [(set (match_operand:HI 0 "register_operand" "=r") + (umax:HI (match_operand:HI 1 "register_operand" " r") + (match_operand:HI 2 "register_operand" " r")))] + "TARGET_ZABHA" + "amomaxu.h\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "HI")]) + ;; ;; .................... ;; @@ -1690,6 +1783,24 @@ [(set_attr "type" "logical") (set_attr "mode" "<MODE>")]) +(define_insn "amo_andqi3" + [(set (match_operand:QI 0 "register_operand" "=r,r") + (and:QI (match_operand:QI 1 "register_operand" "r,r") + (match_operand:QI 2 "arith_operand" " r,r")))] + "TARGET_ZABHA" + "amoand.b\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "QI")]) + +(define_insn "amo_andhi3" + [(set (match_operand:HI 0 "register_operand" "=r,r") + (and:HI (match_operand:HI 1 "register_operand" "r,r") + (match_operand:HI 2 "arith_operand" " r,r")))] + "TARGET_ZABHA" + "amoand.h\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "HI")]) + (define_insn "<optab><mode>3" [(set (match_operand:X 0 "register_operand" "=r,r") (any_or:X (match_operand:X 1 "register_operand" "%r,r") @@ -1724,6 +1835,42 @@ [(set_attr "type" "logical") (set_attr "mode" "SI")]) +(define_insn "amo_orqi3" + [(set (match_operand:QI 0 "register_operand" "=r,r") + (ior:QI (match_operand:QI 1 "register_operand" " r,r") + (match_operand:QI 2 "arith_operand" " r,r")))] + "TARGET_ZABHA" + "amoor.b\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "QI")]) + +(define_insn "amo_orhi3" + [(set (match_operand:HI 0 "register_operand" "=r,r") + (ior:HI (match_operand:HI 1 "register_operand" " r,r") + (match_operand:HI 2 "arith_operand" " r,r")))] + "TARGET_ZABHA" + "amoor.h\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "HI")]) + +(define_insn "amo_xorqi3" + [(set (match_operand:QI 0 "register_operand" "=r,r") + (xor:QI (match_operand:QI 1 "register_operand" " r,r") + (match_operand:QI 2 "arith_operand" " r,r")))] + "TARGET_ZABHA" + "amoxor.b\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "QI")]) + +(define_insn "amo_xorhi3" + [(set (match_operand:HI 0 "register_operand" "=r,r") + (xor:HI (match_operand:HI 1 "register_operand" " r,r") + (match_operand:HI 2 "arith_operand" " r,r")))] + "TARGET_ZABHA" + "amoxor.h\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "HI")]) + ;; ;; .................... ;; @@ -3841,6 +3988,26 @@ [(set_attr "type" "load") (set (attr "length") (const_int 8))]) +(define_insn "amo_swapqi3" + [(set (match_operand:QI 0 "register_operand" "=r") + (unspec:QI [(match_operand:QI 1 "register_operand" "r") + (match_operand:QI 2 "register_operand" "r")] + UNSPEC_AMO_SWAP))] + "TARGET_ZABHA" + "amoswap.b\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "QI")]) + +(define_insn "amo_swaphi3" + [(set (match_operand:HI 0 "register_operand" "=r") + (unspec:HI [(match_operand:HI 1 "register_operand" "r") + (match_operand:HI 2 "register_operand" "r")] + UNSPEC_AMO_SWAP))] + "TARGET_ZABHA" + "amoswap.h\t%0,%1,%2" + [(set_attr "type" "atomic") + (set_attr "mode" "HI")]) + (include "bitmanip.md") (include "crypto.md") (include "sync.md") diff --git a/gcc/config/riscv/riscv.opt b/gcc/config/riscv/riscv.opt index f6ff70b2b30..1136a5301ea 100644 --- a/gcc/config/riscv/riscv.opt +++ b/gcc/config/riscv/riscv.opt @@ -244,6 +244,8 @@ Mask(ZA64RS) Var(riscv_za_subext) Mask(ZA128RS) Var(riscv_za_subext) +Mask(ZABHA) Var(riscv_za_subext) + TargetVariable int riscv_zb_subext -- 2.34.1