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

1use crate::rv_core::instruction::executor::prelude::*;
2
3pub fn vv(
4    Opfvv {
5        dest: vd,
6        vs1,
7        vs2,
8        vm,
9    }: Opfvv,
10    v: &mut VectorContext<'_>,
11) -> Result<(), String> {
12    let vreg = izip!(
13        v.get(vs2).iter_fp()?,
14        v.get(vs1).iter_fp()?,
15        v.get_wide(vd)?.iter_fp()?
16    )
17    .masked_map(
18        v.default_mask(vm),
19        v.get_wide(vd)?.iter_fp()?,
20        |(vs2, vs1, vd)| -(vs2.double_precision() * vs1.double_precision()) - vd,
21    )
22    .collect_fp();
23
24    v.apply(vd, vreg);
25
26    Ok(())
27}
28
29pub fn vf(
30    Opfvf { vd, rs1, vs2, vm }: Opfvf,
31    v: &mut VectorContext<'_>,
32    f: &FloatRegisters,
33) -> Result<(), String> {
34    let vreg = izip!(v.get(vs2).iter_fp()?, v.get(vd).iter_fp()?)
35        .masked_map(
36            v.default_mask(vm),
37            v.get_wide(vd)?.iter_fp()?,
38            |(vs2, vd)| {
39                let vs2 = vs2.double_precision();
40                -(vs2 * ArbitraryFloat::copy_type(&vs2, f[rs1])) - vd
41            },
42        )
43        .collect_fp();
44
45    v.apply(vd, vreg);
46
47    Ok(())
48}