eeric_core/rv_core/instruction/executor/v/
vslidedown.rs

1use crate::rv_core::instruction::executor::prelude::*;
2
3pub fn vx(Opivx { vd, rs1, vs2, vm }: Opivx, v: &mut VectorContext<'_>, x: &IntegerRegisters) {
4    let offset = x[rs1] as usize;
5
6    let vs2_snapshot = v.get(vs2).iter_eew().collect_vec();
7
8    let vreg = v
9        .get(vd)
10        .iter_eew()
11        .enumerate()
12        .masked_map(v.default_mask(vm), v.get(vd).iter_eew(), |(index, _)| {
13            vs2_snapshot.get(index + offset).copied().unwrap_or(0)
14        })
15        .collect_with_eew(v.vec_engine.sew);
16
17    v.apply(vd, vreg);
18}
19
20pub fn vi(Opivi { vd, imm5, vs2, vm }: Opivi, v: &mut VectorContext<'_>) {
21    let offset = imm5 as usize;
22
23    let vs2_snapshot = v.get(vs2).iter_eew().collect_vec();
24
25    let vreg = v
26        .get(vd)
27        .iter_eew()
28        .enumerate()
29        .masked_map(v.default_mask(vm), v.get(vd).iter_eew(), |(index, _)| {
30            vs2_snapshot.get(index + offset).copied().unwrap_or(0)
31        })
32        .collect_with_eew(v.vec_engine.sew);
33
34    v.apply(vd, vreg);
35}