eeric/rv_core/instruction/executor/v/
vfnmsac.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(vd).iter_fp()?
16    )
17    .masked_map(
18        v.default_mask(vm),
19        v.get(vd).iter_fp()?,
20        |(vs2, vs1, vd)| -(vs2 * vs1) + 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(v.default_mask(vm), v.get(vd).iter_fp()?, |(vs2, vd)| {
36            -(vs2 * ArbitraryFloat::copy_type(&vs2, f[rs1])) + vd
37        })
38        .collect_fp();
39
40    v.apply(vd, vreg);
41
42    Ok(())
43}