mbox series

[v8,00/78] support vector extension v1.0

Message ID 20211015074627.3957162-1-frank.chang@sifive.com (mailing list archive)
Headers show
Series support vector extension v1.0 | expand

Message

Frank Chang Oct. 15, 2021, 7:45 a.m. UTC
From: Frank Chang <frank.chang@sifive.com>

This patchset implements the vector extension v1.0 for RISC-V on QEMU.

RVV v1.0 spec is now fronzen for public review:
https://github.com/riscv/riscv-v-spec/releases/tag/v1.0

The port is available here:
https://github.com/sifive/qemu/tree/rvv-1.0-upstream-v8

RVV v1.0 can be enabled with -cpu option: v=true and specify vext_spec
option to v1.0 (i.e. vext_spec=v1.0)

Note: This patchset depends on other patchsets listed in Based-on
      section below so it is not able to be built unless those patchsets
      are applied.

Changelog:

v8
  * Use {get,dest}_gpr APIs.
  * remove vector AMO instructions.
  * rename vpopc.m to vcpop.m.
  * rename vle1.v and vse1.v to vlm.v and vsm.v.
  * rename vmandnot.mm and vmornot.mm to vmandn.mm and vmorn.mm.

v7
  * remove hardcoded GDB vector registers list.
  * add vsetivli instruction.
  * add vle1.v and vse1.v instructions.

v6
  * add vector floating-point reciprocal estimate instruction.
  * add vector floating-point reciprocal square-root estimate instruction.
  * update check rules for segment register groups, each segment register
    group has to follow overlap rules.
  * update viota.m instruction check rules.

v5
  * refactor RVV v1.0 check functions.
    (Thanks to Richard Henderson's bitwise tricks.)
  * relax RV_VLEN_MAX to 1024-bits.
  * implement vstart CSR's behaviors.
  * trigger illegal instruction exception if frm is not valid for
    vector floating-point instructions.
  * rebase on riscv-to-apply.next.

v4
  * remove explicit float flmul variable in DisasContext.
  * replace floating-point calculations with shift operations to
    improve performance.
  * relax RV_VLEN_MAX to 512-bits.

v3
  * apply nan-box helpers from Richard Henderson.
  * remove fp16 api changes as they are sent independently in another
    pathcset by Chih-Min Chao.
  * remove all tail elements clear functions as tail elements can
    retain unchanged for either VTA set to undisturbed or agnostic.
  * add fp16 nan-box check generator function.
  * add floating-point rounding mode enum.
  * replace flmul arithmetic with shifts to avoid floating-point
    conversions.
  * add Zvqmac extension.
  * replace gdbstub vector register xml files with dynamic generator.
  * bumped to RVV v1.0.
  * RVV v1.0 related changes:
    * add vl<nf>re<eew>.v and vs<nf>r.v vector whole register
      load/store instructions
    * add vrgatherei16 instruction.
    * rearranged bits in vtype to make vlmul bits into a contiguous
      field.

v2
  * drop v0.7.1 support.
  * replace invisible return check macros with functions.
  * move mark_vs_dirty() to translators.
  * add SSTATUS_VS flag for s-mode.
  * nan-box scalar fp register for floating-point operations.
  * add gdbstub files for vector registers to allow system-mode
    debugging with GDB.

Based-on: <20211015065500.3850513-1-frank.chang@sifive.com>
Based-on: <20211015070307.3860984-1-frank.chang@sifive.com>

Frank Chang (73):
  target/riscv: fix TB_FLAGS bits overlapping bug for rvv/rvh
  target/riscv: drop vector 0.7.1 and add 1.0 support
  target/riscv: Use FIELD_EX32() to extract wd field
  target/riscv: rvv-1.0: introduce writable misa.v field
  target/riscv: rvv-1.0: add translation-time vector context status
  target/riscv: rvv-1.0: remove rvv related codes from fcsr registers
  target/riscv: rvv-1.0: check MSTATUS_VS when accessing vector csr
    registers
  target/riscv: rvv-1.0: remove MLEN calculations
  target/riscv: rvv-1.0: add fractional LMUL
  target/riscv: rvv-1.0: add VMA and VTA
  target/riscv: rvv-1.0: update check functions
  target/riscv: introduce more imm value modes in translator functions
  target/riscv: rvv:1.0: add translation-time nan-box helper function
  target/riscv: rvv-1.0: remove amo operations instructions
  target/riscv: rvv-1.0: configure instructions
  target/riscv: rvv-1.0: stride load and store instructions
  target/riscv: rvv-1.0: index load and store instructions
  target/riscv: rvv-1.0: fix address index overflow bug of indexed
    load/store insns
  target/riscv: rvv-1.0: fault-only-first unit stride load
  target/riscv: rvv-1.0: load/store whole register instructions
  target/riscv: rvv-1.0: update vext_max_elems() for load/store insns
  target/riscv: rvv-1.0: take fractional LMUL into vector max elements
    calculation
  target/riscv: rvv-1.0: floating-point square-root instruction
  target/riscv: rvv-1.0: floating-point classify instructions
  target/riscv: rvv-1.0: count population in mask instruction
  target/riscv: rvv-1.0: find-first-set mask bit instruction
  target/riscv: rvv-1.0: set-X-first mask bit instructions
  target/riscv: rvv-1.0: iota instruction
  target/riscv: rvv-1.0: element index instruction
  target/riscv: rvv-1.0: allow load element with sign-extended
  target/riscv: rvv-1.0: register gather instructions
  target/riscv: rvv-1.0: integer scalar move instructions
  target/riscv: rvv-1.0: floating-point move instruction
  target/riscv: rvv-1.0: floating-point scalar move instructions
  target/riscv: rvv-1.0: whole register move instructions
  target/riscv: rvv-1.0: integer extension instructions
  target/riscv: rvv-1.0: single-width averaging add and subtract
    instructions
  target/riscv: rvv-1.0: single-width bit shift instructions
  target/riscv: rvv-1.0: integer add-with-carry/subtract-with-borrow
  target/riscv: rvv-1.0: narrowing integer right shift instructions
  target/riscv: rvv-1.0: widening integer multiply-add instructions
  target/riscv: rvv-1.0: single-width saturating add and subtract
    instructions
  target/riscv: rvv-1.0: integer comparison instructions
  target/riscv: rvv-1.0: floating-point compare instructions
  target/riscv: rvv-1.0: mask-register logical instructions
  target/riscv: rvv-1.0: slide instructions
  target/riscv: rvv-1.0: floating-point slide instructions
  target/riscv: rvv-1.0: narrowing fixed-point clip instructions
  target/riscv: rvv-1.0: single-width floating-point reduction
  target/riscv: rvv-1.0: widening floating-point reduction instructions
  target/riscv: rvv-1.0: single-width scaling shift instructions
  target/riscv: rvv-1.0: remove widening saturating scaled multiply-add
  target/riscv: rvv-1.0: remove vmford.vv and vmford.vf
  target/riscv: rvv-1.0: remove integer extract instruction
  target/riscv: rvv-1.0: floating-point min/max instructions
  target/riscv: introduce floating-point rounding mode enum
  target/riscv: rvv-1.0: floating-point/integer type-convert
    instructions
  target/riscv: rvv-1.0: widening floating-point/integer type-convert
  target/riscv: add "set round to odd" rounding mode helper function
  target/riscv: rvv-1.0: narrowing floating-point/integer type-convert
  target/riscv: rvv-1.0: relax RV_VLEN_MAX to 1024-bits
  target/riscv: rvv-1.0: implement vstart CSR
  target/riscv: rvv-1.0: trigger illegal instruction exception if frm is
    not valid
  target/riscv: rvv-1.0: set mstatus.SD bit when writing vector CSRs
  target/riscv: rvv-1.0: floating-point reciprocal square-root estimate
    instruction
  target/riscv: rvv-1.0: floating-point reciprocal estimate instruction
  target/riscv: set mstatus.SD bit when writing fp CSRs
  target/riscv: rvv-1.0: rename r2_zimm to r2_zimm11
  target/riscv: rvv-1.0: add vsetivli instruction
  target/riscv: rvv-1.0: add evl parameter to vext_ldst_us()
  target/riscv: rvv-1.0: add vector unit-stride mask load/store insns
  target/riscv: rvv-1.0: rename vmandnot.mm and vmornot.mm to vmandn.mm
    and vmorn.mm
  target/riscv: rvv-1.0: update opivv_vadc_check() comment

Greentime Hu (1):
  target/riscv: rvv-1.0: add vlenb register

Hsiangkai Wang (1):
  target/riscv: gdb: support vector registers for rv64 & rv32

LIU Zhiwei (3):
  target/riscv: rvv-1.0: add mstatus VS field
  target/riscv: rvv-1.0: add sstatus VS field
  target/riscv: rvv-1.0: add vcsr register

 target/riscv/cpu.c                      |   12 +-
 target/riscv/cpu.h                      |   85 +-
 target/riscv/cpu_bits.h                 |   10 +
 target/riscv/cpu_helper.c               |   15 +-
 target/riscv/csr.c                      |   92 +-
 target/riscv/fpu_helper.c               |   17 +-
 target/riscv/gdbstub.c                  |  184 ++
 target/riscv/helper.h                   |  435 ++-
 target/riscv/insn32.decode              |  294 +-
 target/riscv/insn_trans/trans_rvv.c.inc | 2423 +++++++++------
 target/riscv/internals.h                |   24 +-
 target/riscv/translate.c                |   74 +-
 target/riscv/vector_helper.c            | 3601 ++++++++++++-----------
 13 files changed, 4176 insertions(+), 3090 deletions(-)

--
2.25.1

Comments

Frank Chang Oct. 15, 2021, 9:02 a.m. UTC | #1
<frank.chang@sifive.com> 於 2021年10月15日 週五 下午3:48寫道:

> From: Frank Chang <frank.chang@sifive.com>
>
> This patchset implements the vector extension v1.0 for RISC-V on QEMU.
>
> RVV v1.0 spec is now fronzen for public review:
> https://github.com/riscv/riscv-v-spec/releases/tag/v1.0
>
> The port is available here:
> https://github.com/sifive/qemu/tree/rvv-1.0-upstream-v8
>
> RVV v1.0 can be enabled with -cpu option: v=true and specify vext_spec
> option to v1.0 (i.e. vext_spec=v1.0)
>
> Note: This patchset depends on other patchsets listed in Based-on
>       section below so it is not able to be built unless those patchsets
>       are applied.
>
> Changelog:
>
> v8
>   * Use {get,dest}_gpr APIs.
>   * remove vector AMO instructions.
>   * rename vpopc.m to vcpop.m.
>   * rename vle1.v and vse1.v to vlm.v and vsm.v.
>   * rename vmandnot.mm and vmornot.mm to vmandn.mm and vmorn.mm.
>
> v7
>   * remove hardcoded GDB vector registers list.
>   * add vsetivli instruction.
>   * add vle1.v and vse1.v instructions.
>
> v6
>   * add vector floating-point reciprocal estimate instruction.
>   * add vector floating-point reciprocal square-root estimate instruction.
>   * update check rules for segment register groups, each segment register
>     group has to follow overlap rules.
>   * update viota.m instruction check rules.
>
> v5
>   * refactor RVV v1.0 check functions.
>     (Thanks to Richard Henderson's bitwise tricks.)
>   * relax RV_VLEN_MAX to 1024-bits.
>   * implement vstart CSR's behaviors.
>   * trigger illegal instruction exception if frm is not valid for
>     vector floating-point instructions.
>   * rebase on riscv-to-apply.next.
>
> v4
>   * remove explicit float flmul variable in DisasContext.
>   * replace floating-point calculations with shift operations to
>     improve performance.
>   * relax RV_VLEN_MAX to 512-bits.
>
> v3
>   * apply nan-box helpers from Richard Henderson.
>   * remove fp16 api changes as they are sent independently in another
>     pathcset by Chih-Min Chao.
>   * remove all tail elements clear functions as tail elements can
>     retain unchanged for either VTA set to undisturbed or agnostic.
>   * add fp16 nan-box check generator function.
>   * add floating-point rounding mode enum.
>   * replace flmul arithmetic with shifts to avoid floating-point
>     conversions.
>   * add Zvqmac extension.
>   * replace gdbstub vector register xml files with dynamic generator.
>   * bumped to RVV v1.0.
>   * RVV v1.0 related changes:
>     * add vl<nf>re<eew>.v and vs<nf>r.v vector whole register
>       load/store instructions
>     * add vrgatherei16 instruction.
>     * rearranged bits in vtype to make vlmul bits into a contiguous
>       field.
>
> v2
>   * drop v0.7.1 support.
>   * replace invisible return check macros with functions.
>   * move mark_vs_dirty() to translators.
>   * add SSTATUS_VS flag for s-mode.
>   * nan-box scalar fp register for floating-point operations.
>   * add gdbstub files for vector registers to allow system-mode
>     debugging with GDB.
>
> Based-on: <20211015065500.3850513-1-frank.chang@sifive.com>
> Based-on: <20211015070307.3860984-1-frank.chang@sifive.com>
>
> Frank Chang (73):
>   target/riscv: fix TB_FLAGS bits overlapping bug for rvv/rvh
>   target/riscv: drop vector 0.7.1 and add 1.0 support
>   target/riscv: Use FIELD_EX32() to extract wd field
>   target/riscv: rvv-1.0: introduce writable misa.v field
>   target/riscv: rvv-1.0: add translation-time vector context status
>   target/riscv: rvv-1.0: remove rvv related codes from fcsr registers
>   target/riscv: rvv-1.0: check MSTATUS_VS when accessing vector csr
>     registers
>   target/riscv: rvv-1.0: remove MLEN calculations
>   target/riscv: rvv-1.0: add fractional LMUL
>   target/riscv: rvv-1.0: add VMA and VTA
>   target/riscv: rvv-1.0: update check functions
>   target/riscv: introduce more imm value modes in translator functions
>   target/riscv: rvv:1.0: add translation-time nan-box helper function
>   target/riscv: rvv-1.0: remove amo operations instructions
>   target/riscv: rvv-1.0: configure instructions
>   target/riscv: rvv-1.0: stride load and store instructions
>   target/riscv: rvv-1.0: index load and store instructions
>   target/riscv: rvv-1.0: fix address index overflow bug of indexed
>     load/store insns
>   target/riscv: rvv-1.0: fault-only-first unit stride load
>   target/riscv: rvv-1.0: load/store whole register instructions
>   target/riscv: rvv-1.0: update vext_max_elems() for load/store insns
>   target/riscv: rvv-1.0: take fractional LMUL into vector max elements
>     calculation
>   target/riscv: rvv-1.0: floating-point square-root instruction
>   target/riscv: rvv-1.0: floating-point classify instructions
>   target/riscv: rvv-1.0: count population in mask instruction
>   target/riscv: rvv-1.0: find-first-set mask bit instruction
>   target/riscv: rvv-1.0: set-X-first mask bit instructions
>   target/riscv: rvv-1.0: iota instruction
>   target/riscv: rvv-1.0: element index instruction
>   target/riscv: rvv-1.0: allow load element with sign-extended
>   target/riscv: rvv-1.0: register gather instructions
>   target/riscv: rvv-1.0: integer scalar move instructions
>   target/riscv: rvv-1.0: floating-point move instruction
>   target/riscv: rvv-1.0: floating-point scalar move instructions
>   target/riscv: rvv-1.0: whole register move instructions
>   target/riscv: rvv-1.0: integer extension instructions
>   target/riscv: rvv-1.0: single-width averaging add and subtract
>     instructions
>   target/riscv: rvv-1.0: single-width bit shift instructions
>   target/riscv: rvv-1.0: integer add-with-carry/subtract-with-borrow
>   target/riscv: rvv-1.0: narrowing integer right shift instructions
>   target/riscv: rvv-1.0: widening integer multiply-add instructions
>   target/riscv: rvv-1.0: single-width saturating add and subtract
>     instructions
>   target/riscv: rvv-1.0: integer comparison instructions
>   target/riscv: rvv-1.0: floating-point compare instructions
>   target/riscv: rvv-1.0: mask-register logical instructions
>   target/riscv: rvv-1.0: slide instructions
>   target/riscv: rvv-1.0: floating-point slide instructions
>   target/riscv: rvv-1.0: narrowing fixed-point clip instructions
>   target/riscv: rvv-1.0: single-width floating-point reduction
>   target/riscv: rvv-1.0: widening floating-point reduction instructions
>   target/riscv: rvv-1.0: single-width scaling shift instructions
>   target/riscv: rvv-1.0: remove widening saturating scaled multiply-add
>   target/riscv: rvv-1.0: remove vmford.vv and vmford.vf
>   target/riscv: rvv-1.0: remove integer extract instruction
>   target/riscv: rvv-1.0: floating-point min/max instructions
>   target/riscv: introduce floating-point rounding mode enum
>   target/riscv: rvv-1.0: floating-point/integer type-convert
>     instructions
>   target/riscv: rvv-1.0: widening floating-point/integer type-convert
>   target/riscv: add "set round to odd" rounding mode helper function
>   target/riscv: rvv-1.0: narrowing floating-point/integer type-convert
>   target/riscv: rvv-1.0: relax RV_VLEN_MAX to 1024-bits
>   target/riscv: rvv-1.0: implement vstart CSR
>   target/riscv: rvv-1.0: trigger illegal instruction exception if frm is
>     not valid
>   target/riscv: rvv-1.0: set mstatus.SD bit when writing vector CSRs
>   target/riscv: rvv-1.0: floating-point reciprocal square-root estimate
>     instruction
>   target/riscv: rvv-1.0: floating-point reciprocal estimate instruction
>   target/riscv: set mstatus.SD bit when writing fp CSRs
>   target/riscv: rvv-1.0: rename r2_zimm to r2_zimm11
>   target/riscv: rvv-1.0: add vsetivli instruction
>   target/riscv: rvv-1.0: add evl parameter to vext_ldst_us()
>   target/riscv: rvv-1.0: add vector unit-stride mask load/store insns
>   target/riscv: rvv-1.0: rename vmandnot.mm and vmornot.mm to vmandn.mm
>     and vmorn.mm
>   target/riscv: rvv-1.0: update opivv_vadc_check() comment
>
> Greentime Hu (1):
>   target/riscv: rvv-1.0: add vlenb register
>
> Hsiangkai Wang (1):
>   target/riscv: gdb: support vector registers for rv64 & rv32
>
> LIU Zhiwei (3):
>   target/riscv: rvv-1.0: add mstatus VS field
>   target/riscv: rvv-1.0: add sstatus VS field
>   target/riscv: rvv-1.0: add vcsr register
>
>  target/riscv/cpu.c                      |   12 +-
>  target/riscv/cpu.h                      |   85 +-
>  target/riscv/cpu_bits.h                 |   10 +
>  target/riscv/cpu_helper.c               |   15 +-
>  target/riscv/csr.c                      |   92 +-
>  target/riscv/fpu_helper.c               |   17 +-
>  target/riscv/gdbstub.c                  |  184 ++
>  target/riscv/helper.h                   |  435 ++-
>  target/riscv/insn32.decode              |  294 +-
>  target/riscv/insn_trans/trans_rvv.c.inc | 2423 +++++++++------
>  target/riscv/internals.h                |   24 +-
>  target/riscv/translate.c                |   74 +-
>  target/riscv/vector_helper.c            | 3601 ++++++++++++-----------
>  13 files changed, 4176 insertions(+), 3090 deletions(-)
>
> --
> 2.25.1
>
>
>
I notice that there are couple of unexpected patches being incldued in this
series:

* [PATCH 18/76] target/riscv: rvv-1.0: configure instructions
* [PATCH 19/76] target/riscv: rvv-1.0: stride load and store instructions
* [PATCH 20/76] target/riscv: rvv-1.0: index load and store instructions
* [PATCH 21/76] target/riscv: rvv-1.0: fix address index overflow bug of
indexed load/store insns
* [PATCH 22/76] target/riscv: rvv-1.0: fault-only-first unit stride load
* [PATCH 23/76] target/riscv: rvv-1.0: amo operations

It's probably because I had dirty content in my directory which I didn't
aware of :(
Please ignore them.
Or I can resend the patchset if that's more convenient to review.
Sorry for the confusion.

Regards,
Frank Chang
Alistair Francis Oct. 18, 2021, 6 a.m. UTC | #2
On Fri, Oct 15, 2021 at 5:48 PM <frank.chang@sifive.com> wrote:
>
> From: Frank Chang <frank.chang@sifive.com>
>
> This patchset implements the vector extension v1.0 for RISC-V on QEMU.
>
> RVV v1.0 spec is now fronzen for public review:
> https://github.com/riscv/riscv-v-spec/releases/tag/v1.0
>
> The port is available here:
> https://github.com/sifive/qemu/tree/rvv-1.0-upstream-v8
>
> RVV v1.0 can be enabled with -cpu option: v=true and specify vext_spec
> option to v1.0 (i.e. vext_spec=v1.0)

It doesn't seem like this series made it to the general QEMU list. You
might want to check to see what happened there.

Alistair

>
> Note: This patchset depends on other patchsets listed in Based-on
>       section below so it is not able to be built unless those patchsets
>       are applied.
>
> Changelog:
>
> v8
>   * Use {get,dest}_gpr APIs.
>   * remove vector AMO instructions.
>   * rename vpopc.m to vcpop.m.
>   * rename vle1.v and vse1.v to vlm.v and vsm.v.
>   * rename vmandnot.mm and vmornot.mm to vmandn.mm and vmorn.mm.
>
> v7
>   * remove hardcoded GDB vector registers list.
>   * add vsetivli instruction.
>   * add vle1.v and vse1.v instructions.
>
> v6
>   * add vector floating-point reciprocal estimate instruction.
>   * add vector floating-point reciprocal square-root estimate instruction.
>   * update check rules for segment register groups, each segment register
>     group has to follow overlap rules.
>   * update viota.m instruction check rules.
>
> v5
>   * refactor RVV v1.0 check functions.
>     (Thanks to Richard Henderson's bitwise tricks.)
>   * relax RV_VLEN_MAX to 1024-bits.
>   * implement vstart CSR's behaviors.
>   * trigger illegal instruction exception if frm is not valid for
>     vector floating-point instructions.
>   * rebase on riscv-to-apply.next.
>
> v4
>   * remove explicit float flmul variable in DisasContext.
>   * replace floating-point calculations with shift operations to
>     improve performance.
>   * relax RV_VLEN_MAX to 512-bits.
>
> v3
>   * apply nan-box helpers from Richard Henderson.
>   * remove fp16 api changes as they are sent independently in another
>     pathcset by Chih-Min Chao.
>   * remove all tail elements clear functions as tail elements can
>     retain unchanged for either VTA set to undisturbed or agnostic.
>   * add fp16 nan-box check generator function.
>   * add floating-point rounding mode enum.
>   * replace flmul arithmetic with shifts to avoid floating-point
>     conversions.
>   * add Zvqmac extension.
>   * replace gdbstub vector register xml files with dynamic generator.
>   * bumped to RVV v1.0.
>   * RVV v1.0 related changes:
>     * add vl<nf>re<eew>.v and vs<nf>r.v vector whole register
>       load/store instructions
>     * add vrgatherei16 instruction.
>     * rearranged bits in vtype to make vlmul bits into a contiguous
>       field.
>
> v2
>   * drop v0.7.1 support.
>   * replace invisible return check macros with functions.
>   * move mark_vs_dirty() to translators.
>   * add SSTATUS_VS flag for s-mode.
>   * nan-box scalar fp register for floating-point operations.
>   * add gdbstub files for vector registers to allow system-mode
>     debugging with GDB.
>
> Based-on: <20211015065500.3850513-1-frank.chang@sifive.com>
> Based-on: <20211015070307.3860984-1-frank.chang@sifive.com>
>
> Frank Chang (73):
>   target/riscv: fix TB_FLAGS bits overlapping bug for rvv/rvh
>   target/riscv: drop vector 0.7.1 and add 1.0 support
>   target/riscv: Use FIELD_EX32() to extract wd field
>   target/riscv: rvv-1.0: introduce writable misa.v field
>   target/riscv: rvv-1.0: add translation-time vector context status
>   target/riscv: rvv-1.0: remove rvv related codes from fcsr registers
>   target/riscv: rvv-1.0: check MSTATUS_VS when accessing vector csr
>     registers
>   target/riscv: rvv-1.0: remove MLEN calculations
>   target/riscv: rvv-1.0: add fractional LMUL
>   target/riscv: rvv-1.0: add VMA and VTA
>   target/riscv: rvv-1.0: update check functions
>   target/riscv: introduce more imm value modes in translator functions
>   target/riscv: rvv:1.0: add translation-time nan-box helper function
>   target/riscv: rvv-1.0: remove amo operations instructions
>   target/riscv: rvv-1.0: configure instructions
>   target/riscv: rvv-1.0: stride load and store instructions
>   target/riscv: rvv-1.0: index load and store instructions
>   target/riscv: rvv-1.0: fix address index overflow bug of indexed
>     load/store insns
>   target/riscv: rvv-1.0: fault-only-first unit stride load
>   target/riscv: rvv-1.0: load/store whole register instructions
>   target/riscv: rvv-1.0: update vext_max_elems() for load/store insns
>   target/riscv: rvv-1.0: take fractional LMUL into vector max elements
>     calculation
>   target/riscv: rvv-1.0: floating-point square-root instruction
>   target/riscv: rvv-1.0: floating-point classify instructions
>   target/riscv: rvv-1.0: count population in mask instruction
>   target/riscv: rvv-1.0: find-first-set mask bit instruction
>   target/riscv: rvv-1.0: set-X-first mask bit instructions
>   target/riscv: rvv-1.0: iota instruction
>   target/riscv: rvv-1.0: element index instruction
>   target/riscv: rvv-1.0: allow load element with sign-extended
>   target/riscv: rvv-1.0: register gather instructions
>   target/riscv: rvv-1.0: integer scalar move instructions
>   target/riscv: rvv-1.0: floating-point move instruction
>   target/riscv: rvv-1.0: floating-point scalar move instructions
>   target/riscv: rvv-1.0: whole register move instructions
>   target/riscv: rvv-1.0: integer extension instructions
>   target/riscv: rvv-1.0: single-width averaging add and subtract
>     instructions
>   target/riscv: rvv-1.0: single-width bit shift instructions
>   target/riscv: rvv-1.0: integer add-with-carry/subtract-with-borrow
>   target/riscv: rvv-1.0: narrowing integer right shift instructions
>   target/riscv: rvv-1.0: widening integer multiply-add instructions
>   target/riscv: rvv-1.0: single-width saturating add and subtract
>     instructions
>   target/riscv: rvv-1.0: integer comparison instructions
>   target/riscv: rvv-1.0: floating-point compare instructions
>   target/riscv: rvv-1.0: mask-register logical instructions
>   target/riscv: rvv-1.0: slide instructions
>   target/riscv: rvv-1.0: floating-point slide instructions
>   target/riscv: rvv-1.0: narrowing fixed-point clip instructions
>   target/riscv: rvv-1.0: single-width floating-point reduction
>   target/riscv: rvv-1.0: widening floating-point reduction instructions
>   target/riscv: rvv-1.0: single-width scaling shift instructions
>   target/riscv: rvv-1.0: remove widening saturating scaled multiply-add
>   target/riscv: rvv-1.0: remove vmford.vv and vmford.vf
>   target/riscv: rvv-1.0: remove integer extract instruction
>   target/riscv: rvv-1.0: floating-point min/max instructions
>   target/riscv: introduce floating-point rounding mode enum
>   target/riscv: rvv-1.0: floating-point/integer type-convert
>     instructions
>   target/riscv: rvv-1.0: widening floating-point/integer type-convert
>   target/riscv: add "set round to odd" rounding mode helper function
>   target/riscv: rvv-1.0: narrowing floating-point/integer type-convert
>   target/riscv: rvv-1.0: relax RV_VLEN_MAX to 1024-bits
>   target/riscv: rvv-1.0: implement vstart CSR
>   target/riscv: rvv-1.0: trigger illegal instruction exception if frm is
>     not valid
>   target/riscv: rvv-1.0: set mstatus.SD bit when writing vector CSRs
>   target/riscv: rvv-1.0: floating-point reciprocal square-root estimate
>     instruction
>   target/riscv: rvv-1.0: floating-point reciprocal estimate instruction
>   target/riscv: set mstatus.SD bit when writing fp CSRs
>   target/riscv: rvv-1.0: rename r2_zimm to r2_zimm11
>   target/riscv: rvv-1.0: add vsetivli instruction
>   target/riscv: rvv-1.0: add evl parameter to vext_ldst_us()
>   target/riscv: rvv-1.0: add vector unit-stride mask load/store insns
>   target/riscv: rvv-1.0: rename vmandnot.mm and vmornot.mm to vmandn.mm
>     and vmorn.mm
>   target/riscv: rvv-1.0: update opivv_vadc_check() comment
>
> Greentime Hu (1):
>   target/riscv: rvv-1.0: add vlenb register
>
> Hsiangkai Wang (1):
>   target/riscv: gdb: support vector registers for rv64 & rv32
>
> LIU Zhiwei (3):
>   target/riscv: rvv-1.0: add mstatus VS field
>   target/riscv: rvv-1.0: add sstatus VS field
>   target/riscv: rvv-1.0: add vcsr register
>
>  target/riscv/cpu.c                      |   12 +-
>  target/riscv/cpu.h                      |   85 +-
>  target/riscv/cpu_bits.h                 |   10 +
>  target/riscv/cpu_helper.c               |   15 +-
>  target/riscv/csr.c                      |   92 +-
>  target/riscv/fpu_helper.c               |   17 +-
>  target/riscv/gdbstub.c                  |  184 ++
>  target/riscv/helper.h                   |  435 ++-
>  target/riscv/insn32.decode              |  294 +-
>  target/riscv/insn_trans/trans_rvv.c.inc | 2423 +++++++++------
>  target/riscv/internals.h                |   24 +-
>  target/riscv/translate.c                |   74 +-
>  target/riscv/vector_helper.c            | 3601 ++++++++++++-----------
>  13 files changed, 4176 insertions(+), 3090 deletions(-)
>
> --
> 2.25.1
>
>
Frank Chang Oct. 18, 2021, 6:09 a.m. UTC | #3
On Mon, Oct 18, 2021 at 2:00 PM Alistair Francis <alistair23@gmail.com>
wrote:

> On Fri, Oct 15, 2021 at 5:48 PM <frank.chang@sifive.com> wrote:
> >
> > From: Frank Chang <frank.chang@sifive.com>
> >
> > This patchset implements the vector extension v1.0 for RISC-V on QEMU.
> >
> > RVV v1.0 spec is now fronzen for public review:
> > https://github.com/riscv/riscv-v-spec/releases/tag/v1.0
> >
> > The port is available here:
> > https://github.com/sifive/qemu/tree/rvv-1.0-upstream-v8
> >
> > RVV v1.0 can be enabled with -cpu option: v=true and specify vext_spec
> > option to v1.0 (i.e. vext_spec=v1.0)
>
> It doesn't seem like this series made it to the general QEMU list. You
> might want to check to see what happened there.
>
>
Hi Alistair, what does "general QEMU list" mean here?

Regards,
Frank Chang

Alistair
>
> >
> > Note: This patchset depends on other patchsets listed in Based-on
> >       section below so it is not able to be built unless those patchsets
> >       are applied.
> >
> > Changelog:
> >
> > v8
> >   * Use {get,dest}_gpr APIs.
> >   * remove vector AMO instructions.
> >   * rename vpopc.m to vcpop.m.
> >   * rename vle1.v and vse1.v to vlm.v and vsm.v.
> >   * rename vmandnot.mm and vmornot.mm to vmandn.mm and vmorn.mm.
> >
> > v7
> >   * remove hardcoded GDB vector registers list.
> >   * add vsetivli instruction.
> >   * add vle1.v and vse1.v instructions.
> >
> > v6
> >   * add vector floating-point reciprocal estimate instruction.
> >   * add vector floating-point reciprocal square-root estimate
> instruction.
> >   * update check rules for segment register groups, each segment register
> >     group has to follow overlap rules.
> >   * update viota.m instruction check rules.
> >
> > v5
> >   * refactor RVV v1.0 check functions.
> >     (Thanks to Richard Henderson's bitwise tricks.)
> >   * relax RV_VLEN_MAX to 1024-bits.
> >   * implement vstart CSR's behaviors.
> >   * trigger illegal instruction exception if frm is not valid for
> >     vector floating-point instructions.
> >   * rebase on riscv-to-apply.next.
> >
> > v4
> >   * remove explicit float flmul variable in DisasContext.
> >   * replace floating-point calculations with shift operations to
> >     improve performance.
> >   * relax RV_VLEN_MAX to 512-bits.
> >
> > v3
> >   * apply nan-box helpers from Richard Henderson.
> >   * remove fp16 api changes as they are sent independently in another
> >     pathcset by Chih-Min Chao.
> >   * remove all tail elements clear functions as tail elements can
> >     retain unchanged for either VTA set to undisturbed or agnostic.
> >   * add fp16 nan-box check generator function.
> >   * add floating-point rounding mode enum.
> >   * replace flmul arithmetic with shifts to avoid floating-point
> >     conversions.
> >   * add Zvqmac extension.
> >   * replace gdbstub vector register xml files with dynamic generator.
> >   * bumped to RVV v1.0.
> >   * RVV v1.0 related changes:
> >     * add vl<nf>re<eew>.v and vs<nf>r.v vector whole register
> >       load/store instructions
> >     * add vrgatherei16 instruction.
> >     * rearranged bits in vtype to make vlmul bits into a contiguous
> >       field.
> >
> > v2
> >   * drop v0.7.1 support.
> >   * replace invisible return check macros with functions.
> >   * move mark_vs_dirty() to translators.
> >   * add SSTATUS_VS flag for s-mode.
> >   * nan-box scalar fp register for floating-point operations.
> >   * add gdbstub files for vector registers to allow system-mode
> >     debugging with GDB.
> >
> > Based-on: <20211015065500.3850513-1-frank.chang@sifive.com>
> > Based-on: <20211015070307.3860984-1-frank.chang@sifive.com>
> >
> > Frank Chang (73):
> >   target/riscv: fix TB_FLAGS bits overlapping bug for rvv/rvh
> >   target/riscv: drop vector 0.7.1 and add 1.0 support
> >   target/riscv: Use FIELD_EX32() to extract wd field
> >   target/riscv: rvv-1.0: introduce writable misa.v field
> >   target/riscv: rvv-1.0: add translation-time vector context status
> >   target/riscv: rvv-1.0: remove rvv related codes from fcsr registers
> >   target/riscv: rvv-1.0: check MSTATUS_VS when accessing vector csr
> >     registers
> >   target/riscv: rvv-1.0: remove MLEN calculations
> >   target/riscv: rvv-1.0: add fractional LMUL
> >   target/riscv: rvv-1.0: add VMA and VTA
> >   target/riscv: rvv-1.0: update check functions
> >   target/riscv: introduce more imm value modes in translator functions
> >   target/riscv: rvv:1.0: add translation-time nan-box helper function
> >   target/riscv: rvv-1.0: remove amo operations instructions
> >   target/riscv: rvv-1.0: configure instructions
> >   target/riscv: rvv-1.0: stride load and store instructions
> >   target/riscv: rvv-1.0: index load and store instructions
> >   target/riscv: rvv-1.0: fix address index overflow bug of indexed
> >     load/store insns
> >   target/riscv: rvv-1.0: fault-only-first unit stride load
> >   target/riscv: rvv-1.0: load/store whole register instructions
> >   target/riscv: rvv-1.0: update vext_max_elems() for load/store insns
> >   target/riscv: rvv-1.0: take fractional LMUL into vector max elements
> >     calculation
> >   target/riscv: rvv-1.0: floating-point square-root instruction
> >   target/riscv: rvv-1.0: floating-point classify instructions
> >   target/riscv: rvv-1.0: count population in mask instruction
> >   target/riscv: rvv-1.0: find-first-set mask bit instruction
> >   target/riscv: rvv-1.0: set-X-first mask bit instructions
> >   target/riscv: rvv-1.0: iota instruction
> >   target/riscv: rvv-1.0: element index instruction
> >   target/riscv: rvv-1.0: allow load element with sign-extended
> >   target/riscv: rvv-1.0: register gather instructions
> >   target/riscv: rvv-1.0: integer scalar move instructions
> >   target/riscv: rvv-1.0: floating-point move instruction
> >   target/riscv: rvv-1.0: floating-point scalar move instructions
> >   target/riscv: rvv-1.0: whole register move instructions
> >   target/riscv: rvv-1.0: integer extension instructions
> >   target/riscv: rvv-1.0: single-width averaging add and subtract
> >     instructions
> >   target/riscv: rvv-1.0: single-width bit shift instructions
> >   target/riscv: rvv-1.0: integer add-with-carry/subtract-with-borrow
> >   target/riscv: rvv-1.0: narrowing integer right shift instructions
> >   target/riscv: rvv-1.0: widening integer multiply-add instructions
> >   target/riscv: rvv-1.0: single-width saturating add and subtract
> >     instructions
> >   target/riscv: rvv-1.0: integer comparison instructions
> >   target/riscv: rvv-1.0: floating-point compare instructions
> >   target/riscv: rvv-1.0: mask-register logical instructions
> >   target/riscv: rvv-1.0: slide instructions
> >   target/riscv: rvv-1.0: floating-point slide instructions
> >   target/riscv: rvv-1.0: narrowing fixed-point clip instructions
> >   target/riscv: rvv-1.0: single-width floating-point reduction
> >   target/riscv: rvv-1.0: widening floating-point reduction instructions
> >   target/riscv: rvv-1.0: single-width scaling shift instructions
> >   target/riscv: rvv-1.0: remove widening saturating scaled multiply-add
> >   target/riscv: rvv-1.0: remove vmford.vv and vmford.vf
> >   target/riscv: rvv-1.0: remove integer extract instruction
> >   target/riscv: rvv-1.0: floating-point min/max instructions
> >   target/riscv: introduce floating-point rounding mode enum
> >   target/riscv: rvv-1.0: floating-point/integer type-convert
> >     instructions
> >   target/riscv: rvv-1.0: widening floating-point/integer type-convert
> >   target/riscv: add "set round to odd" rounding mode helper function
> >   target/riscv: rvv-1.0: narrowing floating-point/integer type-convert
> >   target/riscv: rvv-1.0: relax RV_VLEN_MAX to 1024-bits
> >   target/riscv: rvv-1.0: implement vstart CSR
> >   target/riscv: rvv-1.0: trigger illegal instruction exception if frm is
> >     not valid
> >   target/riscv: rvv-1.0: set mstatus.SD bit when writing vector CSRs
> >   target/riscv: rvv-1.0: floating-point reciprocal square-root estimate
> >     instruction
> >   target/riscv: rvv-1.0: floating-point reciprocal estimate instruction
> >   target/riscv: set mstatus.SD bit when writing fp CSRs
> >   target/riscv: rvv-1.0: rename r2_zimm to r2_zimm11
> >   target/riscv: rvv-1.0: add vsetivli instruction
> >   target/riscv: rvv-1.0: add evl parameter to vext_ldst_us()
> >   target/riscv: rvv-1.0: add vector unit-stride mask load/store insns
> >   target/riscv: rvv-1.0: rename vmandnot.mm and vmornot.mm to vmandn.mm
> >     and vmorn.mm
> >   target/riscv: rvv-1.0: update opivv_vadc_check() comment
> >
> > Greentime Hu (1):
> >   target/riscv: rvv-1.0: add vlenb register
> >
> > Hsiangkai Wang (1):
> >   target/riscv: gdb: support vector registers for rv64 & rv32
> >
> > LIU Zhiwei (3):
> >   target/riscv: rvv-1.0: add mstatus VS field
> >   target/riscv: rvv-1.0: add sstatus VS field
> >   target/riscv: rvv-1.0: add vcsr register
> >
> >  target/riscv/cpu.c                      |   12 +-
> >  target/riscv/cpu.h                      |   85 +-
> >  target/riscv/cpu_bits.h                 |   10 +
> >  target/riscv/cpu_helper.c               |   15 +-
> >  target/riscv/csr.c                      |   92 +-
> >  target/riscv/fpu_helper.c               |   17 +-
> >  target/riscv/gdbstub.c                  |  184 ++
> >  target/riscv/helper.h                   |  435 ++-
> >  target/riscv/insn32.decode              |  294 +-
> >  target/riscv/insn_trans/trans_rvv.c.inc | 2423 +++++++++------
> >  target/riscv/internals.h                |   24 +-
> >  target/riscv/translate.c                |   74 +-
> >  target/riscv/vector_helper.c            | 3601 ++++++++++++-----------
> >  13 files changed, 4176 insertions(+), 3090 deletions(-)
> >
> > --
> > 2.25.1
> >
> >
>
Alistair Francis Oct. 18, 2021, 6:12 a.m. UTC | #4
On Mon, Oct 18, 2021 at 4:09 PM Frank Chang <frank.chang@sifive.com> wrote:
>
> On Mon, Oct 18, 2021 at 2:00 PM Alistair Francis <alistair23@gmail.com> wrote:
>>
>> On Fri, Oct 15, 2021 at 5:48 PM <frank.chang@sifive.com> wrote:
>> >
>> > From: Frank Chang <frank.chang@sifive.com>
>> >
>> > This patchset implements the vector extension v1.0 for RISC-V on QEMU.
>> >
>> > RVV v1.0 spec is now fronzen for public review:
>> > https://github.com/riscv/riscv-v-spec/releases/tag/v1.0
>> >
>> > The port is available here:
>> > https://github.com/sifive/qemu/tree/rvv-1.0-upstream-v8
>> >
>> > RVV v1.0 can be enabled with -cpu option: v=true and specify vext_spec
>> > option to v1.0 (i.e. vext_spec=v1.0)
>>
>> It doesn't seem like this series made it to the general QEMU list. You
>> might want to check to see what happened there.
>>
>
> Hi Alistair, what does "general QEMU list" mean here?

To the qemu-devel mailing list.

A good way to check is to have a look at something like patchew
(https://patchew.org/QEMU/) and see if the patches are there.

Alistair
Frank Chang Oct. 18, 2021, 6:17 a.m. UTC | #5
On Mon, Oct 18, 2021 at 2:12 PM Alistair Francis <alistair23@gmail.com>
wrote:

> On Mon, Oct 18, 2021 at 4:09 PM Frank Chang <frank.chang@sifive.com>
> wrote:
> >
> > On Mon, Oct 18, 2021 at 2:00 PM Alistair Francis <alistair23@gmail.com>
> wrote:
> >>
> >> On Fri, Oct 15, 2021 at 5:48 PM <frank.chang@sifive.com> wrote:
> >> >
> >> > From: Frank Chang <frank.chang@sifive.com>
> >> >
> >> > This patchset implements the vector extension v1.0 for RISC-V on QEMU.
> >> >
> >> > RVV v1.0 spec is now fronzen for public review:
> >> > https://github.com/riscv/riscv-v-spec/releases/tag/v1.0
> >> >
> >> > The port is available here:
> >> > https://github.com/sifive/qemu/tree/rvv-1.0-upstream-v8
> >> >
> >> > RVV v1.0 can be enabled with -cpu option: v=true and specify vext_spec
> >> > option to v1.0 (i.e. vext_spec=v1.0)
> >>
> >> It doesn't seem like this series made it to the general QEMU list. You
> >> might want to check to see what happened there.
> >>
> >
> > Hi Alistair, what does "general QEMU list" mean here?
>
> To the qemu-devel mailing list.
>
> A good way to check is to have a look at something like patchew
> (https://patchew.org/QEMU/) and see if the patches are there.
>
> Alistair
>

I see...
That's probably because I used git send-email with '--to' option:
  'qemu-devel@nongnu.org,qemu-riscv@nongnu.org'?

Regards,
Frank Chang
LIU Zhiwei Oct. 18, 2021, 9:01 a.m. UTC | #6
Hi Alistair,

There is some products based on the vector v0.7.1, such as D1 SOC from 
Allwinner and  Xuantie CPU  And we have spent a lot of work to support  
vector  on QEMU.



Allwinner


On 2021/10/15 下午3:45, frank.chang@sifive.com wrote:
> From: Frank Chang <frank.chang@sifive.com>
>
> This patchset implements the vector extension v1.0 for RISC-V on QEMU.
>
> RVV v1.0 spec is now fronzen for public review:
> https://github.com/riscv/riscv-v-spec/releases/tag/v1.0
>
> The port is available here:
> https://github.com/sifive/qemu/tree/rvv-1.0-upstream-v8
>
> RVV v1.0 can be enabled with -cpu option: v=true and specify vext_spec
> option to v1.0 (i.e. vext_spec=v1.0)
>
> Note: This patchset depends on other patchsets listed in Based-on
>        section below so it is not able to be built unless those patchsets
>        are applied.
>
> Changelog:
>
> v8
>    * Use {get,dest}_gpr APIs.
>    * remove vector AMO instructions.
>    * rename vpopc.m to vcpop.m.
>    * rename vle1.v and vse1.v to vlm.v and vsm.v.
>    * rename vmandnot.mm and vmornot.mm to vmandn.mm and vmorn.mm.
>
> v7
>    * remove hardcoded GDB vector registers list.
>    * add vsetivli instruction.
>    * add vle1.v and vse1.v instructions.
>
> v6
>    * add vector floating-point reciprocal estimate instruction.
>    * add vector floating-point reciprocal square-root estimate instruction.
>    * update check rules for segment register groups, each segment register
>      group has to follow overlap rules.
>    * update viota.m instruction check rules.
>
> v5
>    * refactor RVV v1.0 check functions.
>      (Thanks to Richard Henderson's bitwise tricks.)
>    * relax RV_VLEN_MAX to 1024-bits.
>    * implement vstart CSR's behaviors.
>    * trigger illegal instruction exception if frm is not valid for
>      vector floating-point instructions.
>    * rebase on riscv-to-apply.next.
>
> v4
>    * remove explicit float flmul variable in DisasContext.
>    * replace floating-point calculations with shift operations to
>      improve performance.
>    * relax RV_VLEN_MAX to 512-bits.
>
> v3
>    * apply nan-box helpers from Richard Henderson.
>    * remove fp16 api changes as they are sent independently in another
>      pathcset by Chih-Min Chao.
>    * remove all tail elements clear functions as tail elements can
>      retain unchanged for either VTA set to undisturbed or agnostic.
>    * add fp16 nan-box check generator function.
>    * add floating-point rounding mode enum.
>    * replace flmul arithmetic with shifts to avoid floating-point
>      conversions.
>    * add Zvqmac extension.
>    * replace gdbstub vector register xml files with dynamic generator.
>    * bumped to RVV v1.0.
>    * RVV v1.0 related changes:
>      * add vl<nf>re<eew>.v and vs<nf>r.v vector whole register
>        load/store instructions
>      * add vrgatherei16 instruction.
>      * rearranged bits in vtype to make vlmul bits into a contiguous
>        field.
>
> v2
>    * drop v0.7.1 support.
>    * replace invisible return check macros with functions.
>    * move mark_vs_dirty() to translators.
>    * add SSTATUS_VS flag for s-mode.
>    * nan-box scalar fp register for floating-point operations.
>    * add gdbstub files for vector registers to allow system-mode
>      debugging with GDB.
>
> Based-on: <20211015065500.3850513-1-frank.chang@sifive.com>
> Based-on: <20211015070307.3860984-1-frank.chang@sifive.com>
>
> Frank Chang (73):
>    target/riscv: fix TB_FLAGS bits overlapping bug for rvv/rvh
>    target/riscv: drop vector 0.7.1 and add 1.0 support
>    target/riscv: Use FIELD_EX32() to extract wd field
>    target/riscv: rvv-1.0: introduce writable misa.v field
>    target/riscv: rvv-1.0: add translation-time vector context status
>    target/riscv: rvv-1.0: remove rvv related codes from fcsr registers
>    target/riscv: rvv-1.0: check MSTATUS_VS when accessing vector csr
>      registers
>    target/riscv: rvv-1.0: remove MLEN calculations
>    target/riscv: rvv-1.0: add fractional LMUL
>    target/riscv: rvv-1.0: add VMA and VTA
>    target/riscv: rvv-1.0: update check functions
>    target/riscv: introduce more imm value modes in translator functions
>    target/riscv: rvv:1.0: add translation-time nan-box helper function
>    target/riscv: rvv-1.0: remove amo operations instructions
>    target/riscv: rvv-1.0: configure instructions
>    target/riscv: rvv-1.0: stride load and store instructions
>    target/riscv: rvv-1.0: index load and store instructions
>    target/riscv: rvv-1.0: fix address index overflow bug of indexed
>      load/store insns
>    target/riscv: rvv-1.0: fault-only-first unit stride load
>    target/riscv: rvv-1.0: load/store whole register instructions
>    target/riscv: rvv-1.0: update vext_max_elems() for load/store insns
>    target/riscv: rvv-1.0: take fractional LMUL into vector max elements
>      calculation
>    target/riscv: rvv-1.0: floating-point square-root instruction
>    target/riscv: rvv-1.0: floating-point classify instructions
>    target/riscv: rvv-1.0: count population in mask instruction
>    target/riscv: rvv-1.0: find-first-set mask bit instruction
>    target/riscv: rvv-1.0: set-X-first mask bit instructions
>    target/riscv: rvv-1.0: iota instruction
>    target/riscv: rvv-1.0: element index instruction
>    target/riscv: rvv-1.0: allow load element with sign-extended
>    target/riscv: rvv-1.0: register gather instructions
>    target/riscv: rvv-1.0: integer scalar move instructions
>    target/riscv: rvv-1.0: floating-point move instruction
>    target/riscv: rvv-1.0: floating-point scalar move instructions
>    target/riscv: rvv-1.0: whole register move instructions
>    target/riscv: rvv-1.0: integer extension instructions
>    target/riscv: rvv-1.0: single-width averaging add and subtract
>      instructions
>    target/riscv: rvv-1.0: single-width bit shift instructions
>    target/riscv: rvv-1.0: integer add-with-carry/subtract-with-borrow
>    target/riscv: rvv-1.0: narrowing integer right shift instructions
>    target/riscv: rvv-1.0: widening integer multiply-add instructions
>    target/riscv: rvv-1.0: single-width saturating add and subtract
>      instructions
>    target/riscv: rvv-1.0: integer comparison instructions
>    target/riscv: rvv-1.0: floating-point compare instructions
>    target/riscv: rvv-1.0: mask-register logical instructions
>    target/riscv: rvv-1.0: slide instructions
>    target/riscv: rvv-1.0: floating-point slide instructions
>    target/riscv: rvv-1.0: narrowing fixed-point clip instructions
>    target/riscv: rvv-1.0: single-width floating-point reduction
>    target/riscv: rvv-1.0: widening floating-point reduction instructions
>    target/riscv: rvv-1.0: single-width scaling shift instructions
>    target/riscv: rvv-1.0: remove widening saturating scaled multiply-add
>    target/riscv: rvv-1.0: remove vmford.vv and vmford.vf
>    target/riscv: rvv-1.0: remove integer extract instruction
>    target/riscv: rvv-1.0: floating-point min/max instructions
>    target/riscv: introduce floating-point rounding mode enum
>    target/riscv: rvv-1.0: floating-point/integer type-convert
>      instructions
>    target/riscv: rvv-1.0: widening floating-point/integer type-convert
>    target/riscv: add "set round to odd" rounding mode helper function
>    target/riscv: rvv-1.0: narrowing floating-point/integer type-convert
>    target/riscv: rvv-1.0: relax RV_VLEN_MAX to 1024-bits
>    target/riscv: rvv-1.0: implement vstart CSR
>    target/riscv: rvv-1.0: trigger illegal instruction exception if frm is
>      not valid
>    target/riscv: rvv-1.0: set mstatus.SD bit when writing vector CSRs
>    target/riscv: rvv-1.0: floating-point reciprocal square-root estimate
>      instruction
>    target/riscv: rvv-1.0: floating-point reciprocal estimate instruction
>    target/riscv: set mstatus.SD bit when writing fp CSRs
>    target/riscv: rvv-1.0: rename r2_zimm to r2_zimm11
>    target/riscv: rvv-1.0: add vsetivli instruction
>    target/riscv: rvv-1.0: add evl parameter to vext_ldst_us()
>    target/riscv: rvv-1.0: add vector unit-stride mask load/store insns
>    target/riscv: rvv-1.0: rename vmandnot.mm and vmornot.mm to vmandn.mm
>      and vmorn.mm
>    target/riscv: rvv-1.0: update opivv_vadc_check() comment
>
> Greentime Hu (1):
>    target/riscv: rvv-1.0: add vlenb register
>
> Hsiangkai Wang (1):
>    target/riscv: gdb: support vector registers for rv64 & rv32
>
> LIU Zhiwei (3):
>    target/riscv: rvv-1.0: add mstatus VS field
>    target/riscv: rvv-1.0: add sstatus VS field
>    target/riscv: rvv-1.0: add vcsr register
>
>   target/riscv/cpu.c                      |   12 +-
>   target/riscv/cpu.h                      |   85 +-
>   target/riscv/cpu_bits.h                 |   10 +
>   target/riscv/cpu_helper.c               |   15 +-
>   target/riscv/csr.c                      |   92 +-
>   target/riscv/fpu_helper.c               |   17 +-
>   target/riscv/gdbstub.c                  |  184 ++
>   target/riscv/helper.h                   |  435 ++-
>   target/riscv/insn32.decode              |  294 +-
>   target/riscv/insn_trans/trans_rvv.c.inc | 2423 +++++++++------
>   target/riscv/internals.h                |   24 +-
>   target/riscv/translate.c                |   74 +-
>   target/riscv/vector_helper.c            | 3601 ++++++++++++-----------
>   13 files changed, 4176 insertions(+), 3090 deletions(-)
>
> --
> 2.25.1
>
>
LIU Zhiwei Oct. 18, 2021, 9:34 a.m. UTC | #7
Hi Alistair,

Sorry for the  send error.  And I have a question about this patch set.

Firstly, I totally support the vector v1.0 upstream.

The concern is how to deal with the v0.7.1 code on QEMU. There are some 
products based on the vector v0.7.1,
such as D1 SOC from Allwinner and  Xuantie CPU  from Alibaba. The Linux 
and GCC upstream for D1 is working in progress,
and eventually these projects will support v0.7.1 in some way, probably 
as "x-thead-v" (the "thead" stands for Alibaba T-Head).

Maybe we can

1. Drop the v0.7.1 support permanently.

2. Drop the v0.7.1  temporarily and add  it  back later.

3. Do some compatible work for v0.7.1 in the v1.0 patch set.

Look forward to your idea. Thanks very much.

Best Regards,
Zhiwei

On 2021/10/18 下午5:01, LIU Zhiwei wrote:
> Hi Alistair,
>
> There is some products based on the vector v0.7.1, such as D1 SOC from 
> Allwinner and  Xuantie CPU  And we have spent a lot of work to 
> support  vector  on QEMU.
>
>
>
> Allwinner
>
>
> On 2021/10/15 下午3:45, frank.chang@sifive.com wrote:
>> From: Frank Chang <frank.chang@sifive.com>
>>
>> This patchset implements the vector extension v1.0 for RISC-V on QEMU.
>>
>> RVV v1.0 spec is now fronzen for public review:
>> https://github.com/riscv/riscv-v-spec/releases/tag/v1.0
>>
>> The port is available here:
>> https://github.com/sifive/qemu/tree/rvv-1.0-upstream-v8
>>
>> RVV v1.0 can be enabled with -cpu option: v=true and specify vext_spec
>> option to v1.0 (i.e. vext_spec=v1.0)
>>
>> Note: This patchset depends on other patchsets listed in Based-on
>>        section below so it is not able to be built unless those 
>> patchsets
>>        are applied.
>>
>> Changelog:
>>
>> v8
>>    * Use {get,dest}_gpr APIs.
>>    * remove vector AMO instructions.
>>    * rename vpopc.m to vcpop.m.
>>    * rename vle1.v and vse1.v to vlm.v and vsm.v.
>>    * rename vmandnot.mm and vmornot.mm to vmandn.mm and vmorn.mm.
>>
>> v7
>>    * remove hardcoded GDB vector registers list.
>>    * add vsetivli instruction.
>>    * add vle1.v and vse1.v instructions.
>>
>> v6
>>    * add vector floating-point reciprocal estimate instruction.
>>    * add vector floating-point reciprocal square-root estimate 
>> instruction.
>>    * update check rules for segment register groups, each segment 
>> register
>>      group has to follow overlap rules.
>>    * update viota.m instruction check rules.
>>
>> v5
>>    * refactor RVV v1.0 check functions.
>>      (Thanks to Richard Henderson's bitwise tricks.)
>>    * relax RV_VLEN_MAX to 1024-bits.
>>    * implement vstart CSR's behaviors.
>>    * trigger illegal instruction exception if frm is not valid for
>>      vector floating-point instructions.
>>    * rebase on riscv-to-apply.next.
>>
>> v4
>>    * remove explicit float flmul variable in DisasContext.
>>    * replace floating-point calculations with shift operations to
>>      improve performance.
>>    * relax RV_VLEN_MAX to 512-bits.
>>
>> v3
>>    * apply nan-box helpers from Richard Henderson.
>>    * remove fp16 api changes as they are sent independently in another
>>      pathcset by Chih-Min Chao.
>>    * remove all tail elements clear functions as tail elements can
>>      retain unchanged for either VTA set to undisturbed or agnostic.
>>    * add fp16 nan-box check generator function.
>>    * add floating-point rounding mode enum.
>>    * replace flmul arithmetic with shifts to avoid floating-point
>>      conversions.
>>    * add Zvqmac extension.
>>    * replace gdbstub vector register xml files with dynamic generator.
>>    * bumped to RVV v1.0.
>>    * RVV v1.0 related changes:
>>      * add vl<nf>re<eew>.v and vs<nf>r.v vector whole register
>>        load/store instructions
>>      * add vrgatherei16 instruction.
>>      * rearranged bits in vtype to make vlmul bits into a contiguous
>>        field.
>>
>> v2
>>    * drop v0.7.1 support.
>>    * replace invisible return check macros with functions.
>>    * move mark_vs_dirty() to translators.
>>    * add SSTATUS_VS flag for s-mode.
>>    * nan-box scalar fp register for floating-point operations.
>>    * add gdbstub files for vector registers to allow system-mode
>>      debugging with GDB.
>>
>> Based-on: <20211015065500.3850513-1-frank.chang@sifive.com>
>> Based-on: <20211015070307.3860984-1-frank.chang@sifive.com>
>>
>> Frank Chang (73):
>>    target/riscv: fix TB_FLAGS bits overlapping bug for rvv/rvh
>>    target/riscv: drop vector 0.7.1 and add 1.0 support
>>    target/riscv: Use FIELD_EX32() to extract wd field
>>    target/riscv: rvv-1.0: introduce writable misa.v field
>>    target/riscv: rvv-1.0: add translation-time vector context status
>>    target/riscv: rvv-1.0: remove rvv related codes from fcsr registers
>>    target/riscv: rvv-1.0: check MSTATUS_VS when accessing vector csr
>>      registers
>>    target/riscv: rvv-1.0: remove MLEN calculations
>>    target/riscv: rvv-1.0: add fractional LMUL
>>    target/riscv: rvv-1.0: add VMA and VTA
>>    target/riscv: rvv-1.0: update check functions
>>    target/riscv: introduce more imm value modes in translator functions
>>    target/riscv: rvv:1.0: add translation-time nan-box helper function
>>    target/riscv: rvv-1.0: remove amo operations instructions
>>    target/riscv: rvv-1.0: configure instructions
>>    target/riscv: rvv-1.0: stride load and store instructions
>>    target/riscv: rvv-1.0: index load and store instructions
>>    target/riscv: rvv-1.0: fix address index overflow bug of indexed
>>      load/store insns
>>    target/riscv: rvv-1.0: fault-only-first unit stride load
>>    target/riscv: rvv-1.0: load/store whole register instructions
>>    target/riscv: rvv-1.0: update vext_max_elems() for load/store insns
>>    target/riscv: rvv-1.0: take fractional LMUL into vector max elements
>>      calculation
>>    target/riscv: rvv-1.0: floating-point square-root instruction
>>    target/riscv: rvv-1.0: floating-point classify instructions
>>    target/riscv: rvv-1.0: count population in mask instruction
>>    target/riscv: rvv-1.0: find-first-set mask bit instruction
>>    target/riscv: rvv-1.0: set-X-first mask bit instructions
>>    target/riscv: rvv-1.0: iota instruction
>>    target/riscv: rvv-1.0: element index instruction
>>    target/riscv: rvv-1.0: allow load element with sign-extended
>>    target/riscv: rvv-1.0: register gather instructions
>>    target/riscv: rvv-1.0: integer scalar move instructions
>>    target/riscv: rvv-1.0: floating-point move instruction
>>    target/riscv: rvv-1.0: floating-point scalar move instructions
>>    target/riscv: rvv-1.0: whole register move instructions
>>    target/riscv: rvv-1.0: integer extension instructions
>>    target/riscv: rvv-1.0: single-width averaging add and subtract
>>      instructions
>>    target/riscv: rvv-1.0: single-width bit shift instructions
>>    target/riscv: rvv-1.0: integer add-with-carry/subtract-with-borrow
>>    target/riscv: rvv-1.0: narrowing integer right shift instructions
>>    target/riscv: rvv-1.0: widening integer multiply-add instructions
>>    target/riscv: rvv-1.0: single-width saturating add and subtract
>>      instructions
>>    target/riscv: rvv-1.0: integer comparison instructions
>>    target/riscv: rvv-1.0: floating-point compare instructions
>>    target/riscv: rvv-1.0: mask-register logical instructions
>>    target/riscv: rvv-1.0: slide instructions
>>    target/riscv: rvv-1.0: floating-point slide instructions
>>    target/riscv: rvv-1.0: narrowing fixed-point clip instructions
>>    target/riscv: rvv-1.0: single-width floating-point reduction
>>    target/riscv: rvv-1.0: widening floating-point reduction instructions
>>    target/riscv: rvv-1.0: single-width scaling shift instructions
>>    target/riscv: rvv-1.0: remove widening saturating scaled multiply-add
>>    target/riscv: rvv-1.0: remove vmford.vv and vmford.vf
>>    target/riscv: rvv-1.0: remove integer extract instruction
>>    target/riscv: rvv-1.0: floating-point min/max instructions
>>    target/riscv: introduce floating-point rounding mode enum
>>    target/riscv: rvv-1.0: floating-point/integer type-convert
>>      instructions
>>    target/riscv: rvv-1.0: widening floating-point/integer type-convert
>>    target/riscv: add "set round to odd" rounding mode helper function
>>    target/riscv: rvv-1.0: narrowing floating-point/integer type-convert
>>    target/riscv: rvv-1.0: relax RV_VLEN_MAX to 1024-bits
>>    target/riscv: rvv-1.0: implement vstart CSR
>>    target/riscv: rvv-1.0: trigger illegal instruction exception if 
>> frm is
>>      not valid
>>    target/riscv: rvv-1.0: set mstatus.SD bit when writing vector CSRs
>>    target/riscv: rvv-1.0: floating-point reciprocal square-root estimate
>>      instruction
>>    target/riscv: rvv-1.0: floating-point reciprocal estimate instruction
>>    target/riscv: set mstatus.SD bit when writing fp CSRs
>>    target/riscv: rvv-1.0: rename r2_zimm to r2_zimm11
>>    target/riscv: rvv-1.0: add vsetivli instruction
>>    target/riscv: rvv-1.0: add evl parameter to vext_ldst_us()
>>    target/riscv: rvv-1.0: add vector unit-stride mask load/store insns
>>    target/riscv: rvv-1.0: rename vmandnot.mm and vmornot.mm to vmandn.mm
>>      and vmorn.mm
>>    target/riscv: rvv-1.0: update opivv_vadc_check() comment
>>
>> Greentime Hu (1):
>>    target/riscv: rvv-1.0: add vlenb register
>>
>> Hsiangkai Wang (1):
>>    target/riscv: gdb: support vector registers for rv64 & rv32
>>
>> LIU Zhiwei (3):
>>    target/riscv: rvv-1.0: add mstatus VS field
>>    target/riscv: rvv-1.0: add sstatus VS field
>>    target/riscv: rvv-1.0: add vcsr register
>>
>>   target/riscv/cpu.c                      |   12 +-
>>   target/riscv/cpu.h                      |   85 +-
>>   target/riscv/cpu_bits.h                 |   10 +
>>   target/riscv/cpu_helper.c               |   15 +-
>>   target/riscv/csr.c                      |   92 +-
>>   target/riscv/fpu_helper.c               |   17 +-
>>   target/riscv/gdbstub.c                  |  184 ++
>>   target/riscv/helper.h                   |  435 ++-
>>   target/riscv/insn32.decode              |  294 +-
>>   target/riscv/insn_trans/trans_rvv.c.inc | 2423 +++++++++------
>>   target/riscv/internals.h                |   24 +-
>>   target/riscv/translate.c                |   74 +-
>>   target/riscv/vector_helper.c            | 3601 ++++++++++++-----------
>>   13 files changed, 4176 insertions(+), 3090 deletions(-)
>>
>> -- 
>> 2.25.1
>>
>>
Alistair Francis Oct. 20, 2021, 5:28 a.m. UTC | #8
On Mon, Oct 18, 2021 at 7:37 PM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>
> Hi Alistair,
>
> Sorry for the  send error.  And I have a question about this patch set.

Hello Zhiwei,

>
> Firstly, I totally support the vector v1.0 upstream.

Great!

>
> The concern is how to deal with the v0.7.1 code on QEMU. There are some
> products based on the vector v0.7.1,
> such as D1 SOC from Allwinner and  Xuantie CPU  from Alibaba. The Linux
> and GCC upstream for D1 is working in progress,
> and eventually these projects will support v0.7.1 in some way, probably
> as "x-thead-v" (the "thead" stands for Alibaba T-Head).

Yep, so QEMU's stance is to only support the latest version of a draft
specification. Once a specification moves from draft to frozen we will
also only support the frozen spec.

I understand that there is hardware with the v0.7.1 of the vector
extension. But in QEMU we don't have the resources for RISC-V to
maintain multiple sets of draft extensions. Especially the vector
extension, which is very different between v0.7.1 and v1.0 (see the 78
patches in this series).

I realise this is disappointing for companies and people who have
invested in v0.7.1 in QEMU, and I hope it doesn't put anyone off
upstream work. Having the v0.7.1 even for a short period of time has
been helpful for the vector extension development and related
software/tools.

>
> Maybe we can
>
> 1. Drop the v0.7.1 support permanently.
>
> 2. Drop the v0.7.1  temporarily and add  it  back later.

If in the future there is broad community support for v0.7.1 and we
can get some more QEMU resources for RISC-V we can re-evaluate v0.7.1
support. But for the time being it will just be dropped.

There are a few QEMU releases with v0.7.1 support, so you can use
those for development. The v0.7.1 has received a few bug fixes in the
upstream code base which will be beneficial for those using it.

Sorry about that

Alistair

>
> 3. Do some compatible work for v0.7.1 in the v1.0 patch set.
>
> Look forward to your idea. Thanks very much.
>
> Best Regards,
> Zhiwei
>
> On 2021/10/18 下午5:01, LIU Zhiwei wrote:
> > Hi Alistair,
> >
> > There is some products based on the vector v0.7.1, such as D1 SOC from
> > Allwinner and  Xuantie CPU  And we have spent a lot of work to
> > support  vector  on QEMU.
> >
> >
> >
> > Allwinner
> >
> >