memcpy/main.rs
1use eeric::prelude::*;
2
3use format as F;
4use Instruction as I;
5
6// Example:
7// loop:
8// vsetvli t0, a2, e8, m8, ta, ma # Vectors of 8b
9// vle8.v v0, (a1) # Load bytes
10// add a1, a1, t0 # Bump pointer
11// sub a2, a2, t0 # Decrement count
12// vse8.v v0, (a3) # Store bytes
13// add a3, a3, t0 # Bump pointer
14// bnez a2, loop # Any more?
15// ret
16
17fn main() {
18 // Important note: eeric as low-level back-end abstraction layer does not support pseudo-instructions
19 // Burden of decoding pseudo-instructions is on the front-end layer
20 // E.G: ret == I::Jalr (F::I { rd: ZERO, rs1: RA, imm: 0 }),
21
22 use alias::*;
23
24 let mut core = RvCoreBuilder::default()
25 .instructions(vec![
26 I::Vsetvli(F::Vsetvli {
27 rd: T0,
28 rs1: A2,
29 vtypei: 0b_1_1_000_011,
30 }),
31 I::Vlv {
32 eew: BaseSew::E8,
33 data: F::Vl {
34 vd: 0,
35 rs1: A1,
36 vm: false,
37 },
38 },
39 I::Add(F::R {
40 rd: A1,
41 rs1: A1,
42 rs2: T0,
43 }),
44 I::Sub(F::R {
45 rd: A2,
46 rs1: A2,
47 rs2: T0,
48 }),
49 I::Vsv {
50 eew: BaseSew::E8,
51 data: F::Vs {
52 vs3: 0,
53 rs1: A3,
54 vm: false,
55 },
56 },
57 I::Add(F::R {
58 rd: A3,
59 rs1: A3,
60 rs2: T0,
61 }),
62 I::Bne(F::S {
63 rs1: A2,
64 rs2: ZERO,
65 imm12: -24,
66 }),
67 I::Jalr(F::I {
68 rd: ZERO,
69 rs1: RA,
70 imm12: 0,
71 }),
72 ])
73 .build();
74
75 for machine_state in core.run() {
76 println!("{:?}", machine_state);
77 }
78}