Browse Source

Merge pull request #2253 from 5265325/feat/zvzip

Add Zvzip extension.
master
Andrew Waterman 8 hours ago
committed by GitHub
parent
commit
509bec19b0
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      README.md
  2. 8
      disasm/disasm.cc
  3. 2
      disasm/isa_parser.cc
  4. 7
      riscv/insns/vpaire_vv.h
  5. 7
      riscv/insns/vpairo_vv.h
  6. 7
      riscv/insns/vunzipe_v.h
  7. 7
      riscv/insns/vunzipo_v.h
  8. 7
      riscv/insns/vzip_vv.h
  9. 1
      riscv/isa_parser.h
  10. 8
      riscv/riscv.mk.in
  11. 110
      riscv/zvzip_ext_macros.h

1
README.md

@ -77,6 +77,7 @@ Spike supports the following RISC-V ISA features:
- Zvkt extension, v1.0
- Zvkn, Zvknc, Zvkng extension, v1.0
- Zvks, Zvksc, Zvksg extension, v1.0
- Zvzip extension, v0.1
- Zicond extension, v1.0
- Zilsd extension, v1.0
- Zclsd extension, v1.0

8
disasm/disasm.cc

@ -2183,6 +2183,14 @@ void disassembler_t::add_instructions(const isa_parser_t* isa, bool strict)
DEFINE_VECTOR_MULTIPLYADD_VV(vwabdau_vv);
}
if (ext_enabled(EXT_ZVZIP)) {
DEFINE_VECTOR_VV(vzip_vv);
DEFINE_VECTOR_V(vunzipe_v);
DEFINE_VECTOR_V(vunzipo_v);
DEFINE_VECTOR_VV(vpaire_vv);
DEFINE_VECTOR_VV(vpairo_vv);
}
if (ext_enabled(EXT_ZVBB)) {
#define DEFINE_VECTOR_VIU_ZIMM6(code) \
add_vector_viu_z6_insn(this, #code, match_##code, mask_##code)

2
disasm/isa_parser.cc

@ -321,6 +321,8 @@ void isa_parser_t::add_extension(const std::string& ext_str, const char* str)
} else if (ext_str == "zvfwldot16bf") {
extension_table[EXT_ZVFWLDOT16BF] = true;
} else if (ext_str == "zvkt") {
} else if (ext_str == "zvzip") {
extension_table[EXT_ZVZIP] = true;
} else if (ext_str == "sstc") {
extension_table[EXT_SSTC] = true;
} else if (ext_str == "smcsrind") {

7
riscv/insns/vpaire_vv.h

@ -0,0 +1,7 @@
// vunzipe.vv vd, vs1, vs2, vm
#include "zvzip_ext_macros.h"
require_zvzip;
VI_VPAIR_VV_LOOP(i - 1, i)

7
riscv/insns/vpairo_vv.h

@ -0,0 +1,7 @@
// vunzipo.vv vd, vs1, vs2, vm
#include "zvzip_ext_macros.h"
require_zvzip;
VI_VPAIR_VV_LOOP(i, i + 1)

7
riscv/insns/vunzipe_v.h

@ -0,0 +1,7 @@
// vunzipe.v vd, vs2, vm
#include "zvzip_ext_macros.h"
require_zvzip;
VI_VUNZIP_V_LOOP(i << 1)

7
riscv/insns/vunzipo_v.h

@ -0,0 +1,7 @@
// vunzipo.v vd, vs2, vm
#include "zvzip_ext_macros.h"
require_zvzip;
VI_VUNZIP_V_LOOP((i << 1) + 1)

7
riscv/insns/vzip_vv.h

@ -0,0 +1,7 @@
// vzip.vv vd, vs1, vs2, vm
#include "zvzip_ext_macros.h"
require_zvzip;
VI_VZIP_VV_LOOP(i >> 1, i >> 1)

1
riscv/isa_parser.h

@ -88,6 +88,7 @@ typedef enum {
EXT_ZVQLDOT16I,
EXT_ZVFQLDOT8F,
EXT_ZVFWLDOT16BF,
EXT_ZVZIP,
EXT_SSTC,
EXT_ZAAMO,
EXT_ZALRSC,

8
riscv/riscv.mk.in

@ -1143,6 +1143,13 @@ riscv_insn_ext_zvabd = \
vwabda_vv \
vwabdau_vv \
riscv_insn_ext_zvzip = \
vzip_vv \
vunzipe_v \
vunzipo_v \
vpaire_vv \
vpairo_vv \
riscv_insn_list = \
$(riscv_insn_ext_i) \
$(riscv_insn_ext_c) \
@ -1174,6 +1181,7 @@ riscv_insn_list = \
$(riscv_insn_ext_zvbdot) \
$(riscv_insn_ext_zvldot) \
$(riscv_insn_ext_zvabd) \
$(riscv_insn_ext_zvzip) \
$(riscv_insn_priv) \
$(riscv_insn_smrnmi) \
$(riscv_insn_svinval) \

110
riscv/zvzip_ext_macros.h

@ -0,0 +1,110 @@
#ifndef RISCV_ZVZIP_MACROS_H_
#define RISCV_ZVZIP_MACROS_H_
#define require_zvzip \
do { \
require_vector(true); \
require_extension(EXT_ZVZIP); \
} while (0)
#define ZVZIP_EXTRACT_V(x, VS2_IDX) \
type_sew_t<x>::type UNUSED &vd = P.VU.elt<type_sew_t<x>::type>(rd_num, i, true); \
vd = P.VU.elt<type_sew_t<x>::type>(rs2_num, VS2_IDX);
#define ZVZIP_EXTRACT_VV(x, VS1_IDX, VS2_IDX) \
type_sew_t<x>::type UNUSED &vd = P.VU.elt<type_sew_t<x>::type>(rd_num, i, true); \
vd = (i & 1) \
? ((VS1_IDX) >= P.VU.vlmax ? 0 : P.VU.elt<type_sew_t<x>::type>(rs1_num, VS1_IDX)) \
: ((VS2_IDX) >= P.VU.vlmax ? 0 : P.VU.elt<type_sew_t<x>::type>(rs2_num, VS2_IDX));
#define VI_VZIP_VV_CHECK \
require_vector(true); \
require(P.VU.vflmul <= 4); \
require_align(insn.rd(), P.VU.vflmul * 2); \
require_align(insn.rs2(), P.VU.vflmul); \
require_align(insn.rs1(), P.VU.vflmul); \
require_vm; \
if (P.VU.vflmul < 1) { \
require_noover(insn.rd(), P.VU.vflmul * 2, insn.rs2(), P.VU.vflmul); \
require_noover(insn.rd(), P.VU.vflmul * 2, insn.rs1(), P.VU.vflmul); \
} else { \
require_noover_widen(insn.rd(), P.VU.vflmul * 2, insn.rs2(), P.VU.vflmul); \
require_noover_widen(insn.rd(), P.VU.vflmul * 2, insn.rs1(), P.VU.vflmul); \
}
#define VI_VZIP_VV_LOOP_BASE \
require(P.VU.vsew >= e8 && P.VU.vsew <= e64); \
reg_t vl = P.VU.vl->read() * 2; \
reg_t UNUSED sew = P.VU.vsew; \
reg_t UNUSED rd_num = insn.rd(); \
reg_t UNUSED rs1_num = insn.rs1(); \
reg_t rs2_num = insn.rs2(); \
for (reg_t i = P.VU.vstart->read(); i < vl; ++i) { \
VI_LOOP_ELEMENT_SKIP();
#define VI_VZIP_VV_LOOP_END \
} \
P.VU.vstart->write(0);
#define VI_VZIP_VV_LOOP(VS1_IDX, VS2_IDX) \
VI_VZIP_VV_CHECK \
VI_VZIP_VV_LOOP_BASE \
if (sew == e8) { \
ZVZIP_EXTRACT_VV(e8, VS1_IDX, VS2_IDX); \
} else if (sew == e16) { \
ZVZIP_EXTRACT_VV(e16, VS1_IDX, VS2_IDX); \
} else if (sew == e32) { \
ZVZIP_EXTRACT_VV(e32, VS1_IDX, VS2_IDX); \
} else if (sew == e64) { \
ZVZIP_EXTRACT_VV(e64, VS1_IDX, VS2_IDX); \
} \
VI_VZIP_VV_LOOP_END
#define VI_VUNZIP_V_CHECK \
require_vector(true); \
require(P.VU.vflmul <= 4); \
require_align(insn.rs2(), P.VU.vflmul * 2); \
require_align(insn.rd(), P.VU.vflmul); \
require_vm; \
if (insn.rd() != insn.rs2()) { \
require_noover(insn.rd(), P.VU.vflmul, insn.rs2(), P.VU.vflmul * 2); \
}
#define VI_VUNZIP_V_LOOP(VS2_IDX) \
VI_VUNZIP_V_CHECK \
VI_LOOP_BASE \
if (sew == e8) { \
ZVZIP_EXTRACT_V(e8, VS2_IDX); \
} else if (sew == e16) { \
ZVZIP_EXTRACT_V(e16, VS2_IDX); \
} else if (sew == e32) { \
ZVZIP_EXTRACT_V(e32, VS2_IDX); \
} else if (sew == e64) { \
ZVZIP_EXTRACT_V(e64, VS2_IDX); \
} \
VI_LOOP_END
#define VI_VPAIR_VV_CHECK \
require_vector(true); \
require_align(insn.rd(), P.VU.vflmul); \
require_align(insn.rs2(), P.VU.vflmul); \
require_align(insn.rs1(), P.VU.vflmul); \
require_vm; \
require_noover(insn.rd(), P.VU.vflmul, insn.rs2(), P.VU.vflmul); \
require_noover(insn.rd(), P.VU.vflmul, insn.rs1(), P.VU.vflmul);
#define VI_VPAIR_VV_LOOP(VS1_IDX, VS2_IDX) \
VI_VPAIR_VV_CHECK \
VI_LOOP_BASE \
if (sew == e8) { \
ZVZIP_EXTRACT_VV(e8, VS1_IDX, VS2_IDX); \
} else if (sew == e16) { \
ZVZIP_EXTRACT_VV(e16, VS1_IDX, VS2_IDX); \
} else if (sew == e32) { \
ZVZIP_EXTRACT_VV(e32, VS1_IDX, VS2_IDX); \
} else if (sew == e64) { \
ZVZIP_EXTRACT_VV(e64, VS1_IDX, VS2_IDX); \
} \
VI_LOOP_END
#endif
Loading…
Cancel
Save