eeric/rv_core/instruction/executor/v/
vsra.rs

1use crate::rv_core::instruction::executor::prelude::*;
2
3use super::utils::shamt::shamt;
4
5pub fn vv(Opivv { vd, vs1, vs2, vm }: Opivv, v: &mut VectorContext<'_>) {
6    let vreg = izip!(v.get(vs2).iter_eew(), v.get(vs1).iter_eew())
7        .masked_map(v.default_mask(vm), v.get(vd).iter_eew(), |(vs2, vs1)| {
8            (vs2 as i64 >> shamt(vs1, v.vec_engine.sew)) as u64
9        })
10        .collect_with_eew(v.vec_engine.sew);
11
12    v.apply(vd, vreg);
13}
14
15pub fn vx(Opivx { vd, rs1, vs2, vm }: Opivx, v: &mut VectorContext<'_>, x: &IntegerRegisters) {
16    let vreg = v
17        .get(vs2)
18        .iter_eew()
19        .masked_map(v.default_mask(vm), v.get(vd).iter_eew(), |vs2| {
20            (vs2 as i64 >> shamt(x[rs1], v.vec_engine.sew)) as u64
21        })
22        .collect_with_eew(v.vec_engine.sew);
23
24    v.apply(vd, vreg);
25}
26
27pub fn vi(Opivi { vd, imm5, vs2, vm }: Opivi, v: &mut VectorContext<'_>) {
28    let vreg = v
29        .get(vs2)
30        .iter_eew()
31        .masked_map(v.default_mask(vm), v.get(vd).iter_eew(), |vs2| {
32            (vs2 as i64 >> shamt(imm5 as u64, v.vec_engine.sew)) as u64
33        })
34        .collect_with_eew(v.vec_engine.sew);
35
36    v.apply(vd, vreg);
37}