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