Browse Source

Merge pull request #2050 from riscv-software-src/vfp-refactor

Factor out common vector FP prologue
pull/2051/head
Andrew Waterman 9 months ago
committed by GitHub
parent
commit
5da583ee34
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 7
      riscv/decode_macros.h
  2. 2
      riscv/insns/vfbdot_vv.h
  3. 8
      riscv/insns/vfmv_f_s.h
  4. 9
      riscv/insns/vfmv_s_f.h
  5. 2
      riscv/insns/vfwbdot_vv.h
  6. 32
      riscv/v_ext_macros.h

7
riscv/decode_macros.h

@ -146,10 +146,9 @@ do { \
#define SHAMT (insn.i_imm() & 0x3F) #define SHAMT (insn.i_imm() & 0x3F)
#define BRANCH_TARGET (pc + insn.sb_imm()) #define BRANCH_TARGET (pc + insn.sb_imm())
#define JUMP_TARGET (pc + insn.uj_imm()) #define JUMP_TARGET (pc + insn.uj_imm())
#define RM ({ int rm = insn.rm(); \ #define validate_rm(rm) ({ require(rm < 5); rm; })
if (rm == 7) rm = STATE.frm->read(); \ #define VFP_RM validate_rm(STATE.frm->read())
if (rm > 4) throw trap_illegal_instruction(insn.bits()); \ #define RM (insn.rm() == 7 ? VFP_RM : validate_rm(insn.rm()))
rm; })
static inline bool is_aligned(const unsigned val, const unsigned pos) static inline bool is_aligned(const unsigned val, const unsigned pos)
{ {

2
riscv/insns/vfbdot_vv.h

@ -1,5 +1,5 @@
VI_VFP_BASE;
ZVBDOT_INIT(1); ZVBDOT_INIT(1);
require_fp;
switch (P.VU.vsew) { switch (P.VU.vsew) {
case 32: { case 32: {

8
riscv/insns/vfmv_f_s.h

@ -1,12 +1,6 @@
// vfmv_f_s: rd = vs2[0] (rs1=0) // vfmv_f_s: rd = vs2[0] (rs1=0)
require_vector(true); VI_VFP_COMMON;
require_fp;
require((P.VU.vsew == e16 && p->extension_enabled(EXT_ZVFH)) ||
(P.VU.vsew == e32 && p->extension_enabled('F')) ||
(P.VU.vsew == e64 && p->extension_enabled('D')));
require(STATE.frm->read() < 0x5);
reg_t rs2_num = insn.rs2();
uint64_t vs2_0 = 0; uint64_t vs2_0 = 0;
const reg_t sew = P.VU.vsew; const reg_t sew = P.VU.vsew;
switch (sew) { switch (sew) {

9
riscv/insns/vfmv_s_f.h

@ -1,12 +1,5 @@
// vfmv_s_f: vd[0] = rs1 (vs2=0) // vfmv_s_f: vd[0] = rs1 (vs2=0)
require_vector(true); VI_VFP_COMMON;
require_fp;
require((P.VU.vsew == e16 && p->extension_enabled(EXT_ZVFH)) ||
(P.VU.vsew == e32 && p->extension_enabled('F')) ||
(P.VU.vsew == e64 && p->extension_enabled('D')));
require(STATE.frm->read() < 0x5);
reg_t vl = P.VU.vl->read();
if (vl > 0 && P.VU.vstart->read() < vl) { if (vl > 0 && P.VU.vstart->read() < vl) {
reg_t rd_num = insn.rd(); reg_t rd_num = insn.rd();

2
riscv/insns/vfwbdot_vv.h

@ -1,5 +1,5 @@
VI_VFP_BASE;
ZVBDOT_INIT(2); ZVBDOT_INIT(2);
require_fp;
switch (P.VU.vsew) { switch (P.VU.vsew) {
case 16: { case 16: {

32
riscv/v_ext_macros.h

@ -1426,29 +1426,24 @@ VI_VX_ULOOP({ \
// //
// vector: vfp helper // vector: vfp helper
// //
#define VI_VFP_COMMON \ #define VI_VFP_BASE \
require_fp; \ require_fp; \
require((P.VU.vsew == e16 && p->extension_enabled(EXT_ZVFH)) || \
(P.VU.vsew == e32 && p->get_isa().get_zvf()) || \
(P.VU.vsew == e64 && p->get_isa().get_zvd())); \
require_vector(true); \ require_vector(true); \
require(STATE.frm->read() < 0x5); \
reg_t UNUSED vl = P.VU.vl->read(); \ reg_t UNUSED vl = P.VU.vl->read(); \
reg_t UNUSED rd_num = insn.rd(); \ reg_t UNUSED rd_num = insn.rd(); \
reg_t UNUSED rs1_num = insn.rs1(); \ reg_t UNUSED rs1_num = insn.rs1(); \
reg_t UNUSED rs2_num = insn.rs2(); \ reg_t UNUSED rs2_num = insn.rs2(); \
softfloat_roundingMode = STATE.frm->read(); softfloat_roundingMode = VFP_RM
#define VI_VFP_COMMON \
VI_VFP_BASE; \
require((P.VU.vsew == e16 && p->extension_enabled(EXT_ZVFH)) || \
(P.VU.vsew == e32 && p->get_isa().get_zvf()) || \
(P.VU.vsew == e64 && p->get_isa().get_zvd())); \
#define VI_VFP_BF16_COMMON \ #define VI_VFP_BF16_COMMON \
require_fp; \ VI_VFP_BASE; \
require((P.VU.vsew == e16 && p->extension_enabled(EXT_ZVFBFWMA))); \ require((P.VU.vsew == e16 && p->extension_enabled(EXT_ZVFBFWMA))); \
require_vector(true); \
require(STATE.frm->read() < 0x5); \
reg_t UNUSED vl = P.VU.vl->read(); \
reg_t UNUSED rd_num = insn.rd(); \
reg_t UNUSED rs1_num = insn.rs1(); \
reg_t UNUSED rs2_num = insn.rs2(); \
softfloat_roundingMode = STATE.frm->read();
#define VI_VFP_LOOP_BASE \ #define VI_VFP_LOOP_BASE \
VI_VFP_COMMON \ VI_VFP_COMMON \
@ -1901,14 +1896,7 @@ VI_VX_ULOOP({ \
VI_VFP_LOOP_END VI_VFP_LOOP_END
#define VI_VFP_LOOP_SCALE_BASE \ #define VI_VFP_LOOP_SCALE_BASE \
require_fp; \ VI_VFP_COMMON \
require_vector(true); \
require(STATE.frm->read() < 0x5); \
reg_t vl = P.VU.vl->read(); \
reg_t rd_num = insn.rd(); \
reg_t UNUSED rs1_num = insn.rs1(); \
reg_t rs2_num = insn.rs2(); \
softfloat_roundingMode = STATE.frm->read(); \
for (reg_t i = P.VU.vstart->read(); i < vl; ++i) { \ for (reg_t i = P.VU.vstart->read(); i < vl; ++i) { \
VI_LOOP_ELEMENT_SKIP(); VI_LOOP_ELEMENT_SKIP();

Loading…
Cancel
Save