eeric/rv_core/instruction/executor/v/
vfnmsac.rs1use 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}