Browse Source

Dramatically simplify whole-register loads/stores

This makes the vstart/VS handling identical to regular vector loads/stores
pull/2207/head
Andrew Waterman 5 months ago
parent
commit
e8e3a747d5
Failed to extract signature
  1. 47
      riscv/v_ext_macros.h

47
riscv/v_ext_macros.h

@ -1350,26 +1350,10 @@ VI_VX_ULOOP({ \
require_align(vd, len); \
const reg_t elt_per_reg = P.VU.vlenb / sizeof(elt_width ## _t); \
const reg_t size = len * elt_per_reg; \
if (P.VU.vstart->read() < size) { \
reg_t i = P.VU.vstart->read() / elt_per_reg; \
reg_t off = P.VU.vstart->read() % elt_per_reg; \
if (off) { \
for (reg_t pos = off; pos < elt_per_reg; ++pos) { \
auto val = MMU.load<elt_width##_t>(baseAddr + \
P.VU.vstart->read() * sizeof(elt_width ## _t)); \
P.VU.elt<elt_width ## _t>(vd + i, pos, true) = val; \
P.VU.vstart->write(P.VU.vstart->read() + 1); \
} \
++i; \
} \
for (; i < len; ++i) { \
for (reg_t pos = 0; pos < elt_per_reg; ++pos) { \
auto val = MMU.load<elt_width##_t>(baseAddr + \
P.VU.vstart->read() * sizeof(elt_width ## _t)); \
P.VU.elt<elt_width ## _t>(vd + i, pos, true) = val; \
P.VU.vstart->write(P.VU.vstart->read() + 1); \
} \
} \
for (reg_t i = P.VU.vstart->read(); i < size; i++) { \
P.VU.vstart->write(i); \
auto val = MMU.load<elt_width##_t>(baseAddr + i * sizeof(elt_width ## _t)); \
P.VU.elt<elt_width ## _t>(vd, i, true) = val; \
} \
P.VU.vstart->write(0);
@ -1380,25 +1364,10 @@ VI_VX_ULOOP({ \
const reg_t len = insn.v_nf() + 1; \
require_align(vs3, len); \
const reg_t size = len * P.VU.vlenb; \
\
if (P.VU.vstart->read() < size) { \
reg_t i = P.VU.vstart->read() / P.VU.vlenb; \
reg_t off = P.VU.vstart->read() % P.VU.vlenb; \
if (off) { \
for (reg_t pos = off; pos < P.VU.vlenb; ++pos) { \
auto val = P.VU.elt<uint8_t>(vs3 + i, pos); \
MMU.store<uint8_t>(baseAddr + P.VU.vstart->read(), val); \
P.VU.vstart->write(P.VU.vstart->read() + 1); \
} \
i++; \
} \
for (; i < len; ++i) { \
for (reg_t pos = 0; pos < P.VU.vlenb; ++pos) { \
auto val = P.VU.elt<uint8_t>(vs3 + i, pos); \
MMU.store<uint8_t>(baseAddr + P.VU.vstart->read(), val); \
P.VU.vstart->write(P.VU.vstart->read() + 1); \
} \
} \
for (reg_t i = P.VU.vstart->read(); i < size; i++) { \
P.VU.vstart->write(i); \
auto val = P.VU.elt<uint8_t>(vs3, i); \
MMU.store<uint8_t>(baseAddr + i, val); \
} \
P.VU.vstart->write(0);

Loading…
Cancel
Save