1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use crate::rv_core::instruction::executor::prelude::*;

pub fn vv(Opivv { vd, vs1, vs2, vm }: Opivv, v: &mut VectorContext<'_>) {
    let vreg = izip!(v.get(vs2).iter_eew(), v.get(vs1).iter_eew())
        .masked_map(
            v.default_mask(vm),
            v.get(vd).iter_eew(),
            |(vs2, vs1)| match v.vec_engine.sew {
                BaseSew::E8 => (vs2 as i8).saturating_add(vs1 as i8) as u64,
                BaseSew::E16 => (vs2 as i16).saturating_add(vs1 as i16) as u64,
                BaseSew::E32 => (vs2 as i32).saturating_add(vs1 as i32) as u64,
                BaseSew::E64 => (vs2 as i64).saturating_add(vs1 as i64) as u64,
            },
        )
        .collect_with_eew(v.vec_engine.sew);

    v.apply(vd, vreg);
}

pub fn vx(Opivx { vd, rs1, vs2, vm }: Opivx, v: &mut VectorContext<'_>, x: &IntegerRegisters) {
    let vreg = v
        .get(vs2)
        .iter_eew()
        .masked_map(v.default_mask(vm), v.get(vd).iter_eew(), |vs2| {
            match v.vec_engine.sew {
                BaseSew::E8 => (vs2 as i8).saturating_add(x[rs1] as i8) as u64,
                BaseSew::E16 => (vs2 as i16).saturating_add(x[rs1] as i16) as u64,
                BaseSew::E32 => (vs2 as i32).saturating_add(x[rs1] as i32) as u64,
                BaseSew::E64 => (vs2 as i64).saturating_add(x[rs1] as i64) as u64,
            }
        })
        .collect_with_eew(v.vec_engine.sew);

    v.apply(vd, vreg);
}

pub fn vi(Opivi { vd, imm5, vs2, vm }: Opivi, v: &mut VectorContext<'_>) {
    let vreg = v
        .get(vs2)
        .iter_eew()
        .masked_map(v.default_mask(vm), v.get(vd).iter_eew(), |vs2| {
            match v.vec_engine.sew {
                BaseSew::E8 => (vs2 as i8).saturating_add(imm5 as i8) as u64,
                BaseSew::E16 => (vs2 as i16).saturating_add(imm5 as i16) as u64,
                BaseSew::E32 => (vs2 as i32).saturating_add(imm5) as u64,
                BaseSew::E64 => (vs2 as i64).saturating_add(imm5 as i64) as u64,
            }
        })
        .collect_with_eew(v.vec_engine.sew);

    v.apply(vd, vreg);
}