eeric/rv_core/instruction/executor/v/
vssubu.rs1use crate::rv_core::instruction::executor::prelude::*;
2
3pub fn vv(Opivv { vd, vs1, vs2, vm }: Opivv, v: &mut VectorContext<'_>) {
4 let vreg = izip!(v.get(vs2).iter_eew(), v.get(vs1).iter_eew())
5 .masked_map(
6 v.default_mask(vm),
7 v.get(vd).iter_eew(),
8 |(vs2, vs1)| match v.vec_engine.sew {
9 BaseSew::E8 => (vs2 as u8).saturating_sub(vs1 as u8) as u64,
10 BaseSew::E16 => (vs2 as u16).saturating_sub(vs1 as u16) as u64,
11 BaseSew::E32 => (vs2 as u32).saturating_sub(vs1 as u32) as u64,
12 BaseSew::E64 => vs2.saturating_sub(vs1),
13 },
14 )
15 .collect_with_eew(v.vec_engine.sew);
16
17 v.apply(vd, vreg);
18}
19
20pub fn vx(Opivx { vd, rs1, vs2, vm }: Opivx, v: &mut VectorContext<'_>, x: &IntegerRegisters) {
21 let vreg = v
22 .get(vs2)
23 .iter_eew()
24 .masked_map(v.default_mask(vm), v.get(vd).iter_eew(), |vs2| {
25 match v.vec_engine.sew {
26 BaseSew::E8 => (vs2 as u8).saturating_sub(x[rs1] as u8) as u64,
27 BaseSew::E16 => (vs2 as u16).saturating_sub(x[rs1] as u16) as u64,
28 BaseSew::E32 => (vs2 as u32).saturating_sub(x[rs1] as u32) as u64,
29 BaseSew::E64 => vs2.saturating_sub(x[rs1]),
30 }
31 })
32 .collect_with_eew(v.vec_engine.sew);
33
34 v.apply(vd, vreg);
35}