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