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

1use crate::rv_core::instruction::executor::prelude::*;
2
3pub fn vv(
4    Opivv {
5        vd,
6        vs1,
7        vs2: _,
8        vm: _,
9    }: Opivv,
10    v: &mut VectorContext<'_>,
11) {
12    let vreg = v.get(vs1);
13
14    v.apply(vd, vreg);
15}
16
17pub fn vx(
18    Opivx {
19        vd,
20        rs1,
21        vs2: _,
22        vm: _,
23    }: Opivx,
24    v: &mut VectorContext<'_>,
25    x: &IntegerRegisters,
26) {
27    let vreg = v
28        .get(vd)
29        .iter_eew()
30        .map(|_| x[rs1])
31        .collect_with_eew(v.vec_engine.sew);
32
33    v.apply(vd, vreg);
34}
35
36pub fn vi(
37    Opivi {
38        vd,
39        imm5,
40        vs2: _,
41        vm: _,
42    }: Opivi,
43    v: &mut VectorContext<'_>,
44) {
45    let vreg = v
46        .get(vd)
47        .iter_eew()
48        .map(|_| imm5 as u64)
49        .collect_with_eew(v.vec_engine.sew);
50
51    v.apply(vd, vreg);
52}
53
54pub fn xs(
55    Vwxunary0 {
56        dest: rd,
57        vs2,
58        vm: _,
59        ..
60    }: Vwxunary0,
61    v: &VectorContext<'_>,
62    x: &mut IntegerRegisters,
63) {
64    let first_value = v.get(vs2).iter_eew().next().unwrap();
65
66    x[rd] = first_value;
67}
68
69pub fn sx(
70    Vrxunary0 {
71        dest: vd,
72        rs1,
73        vm: _,
74        ..
75    }: Vrxunary0,
76    v: &mut VectorContext<'_>,
77    x: &IntegerRegisters,
78) {
79    let first_value = u64::to_le_bytes(x[rs1]);
80
81    let vreg = v.get(vd);
82    let mut vreg_data = vreg.iter_byte().collect_vec();
83
84    vreg_data[..v.vec_engine.sew.byte_length()]
85        .copy_from_slice(&first_value[..v.vec_engine.sew.byte_length()]);
86
87    v.apply(vd, vreg_data.into_iter().collect());
88}