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

1use crate::rv_core::instruction::executor::prelude::*;
2
3pub fn vf2(
4    Vxunary0 {
5        dest: vd, vs2, vm, ..
6    }: Vxunary0,
7    v: &mut VectorContext<'_>,
8) -> Result<(), String> {
9    let half_sew = v.vec_engine.sew.half()?;
10
11    let vreg = v
12        .get(vs2)
13        .iter_custom_eew(half_sew)
14        .take(v.vlmax() / 2)
15        .masked_map(v.default_mask(vm), v.get(vd).iter_eew(), |vs2| vs2)
16        .collect_with_eew(v.vec_engine.sew);
17
18    v.apply(vd, vreg);
19
20    Ok(())
21}
22
23pub fn vf4(
24    Vxunary0 {
25        dest: vd, vs2, vm, ..
26    }: Vxunary0,
27    v: &mut VectorContext<'_>,
28) -> Result<(), String> {
29    let fourth_sew = v.vec_engine.sew.fourth()?;
30
31    let vreg = v
32        .get(vs2)
33        .iter_custom_eew(fourth_sew)
34        .take(v.vlmax() / 4)
35        .masked_map(v.default_mask(vm), v.get(vd).iter_eew(), |vs2| vs2)
36        .collect_with_eew(v.vec_engine.sew);
37
38    v.apply(vd, vreg);
39
40    Ok(())
41}
42
43pub fn vf8(
44    Vxunary0 {
45        dest: vd, vs2, vm, ..
46    }: Vxunary0,
47    v: &mut VectorContext<'_>,
48) -> Result<(), String> {
49    let eighth = v.vec_engine.sew.eighth()?;
50
51    let vreg = v
52        .get(vs2)
53        .iter_custom_eew(eighth)
54        .take(v.vlmax() / 8)
55        .masked_map(v.default_mask(vm), v.get(vd).iter_eew(), |vs2| vs2)
56        .collect_with_eew(v.vec_engine.sew);
57
58    v.apply(vd, vreg);
59
60    Ok(())
61}