1use std::fmt::{Debug, Formatter};
2
3use modular_bitfield::prelude::*;
4
5use crate::unsafe_wrapper;
6
7#[bitfield(bits = 16)]
8#[derive(Clone, Copy, Debug, Eq, PartialEq)]
9pub struct CRType {
10 pub op: B2,
11 pub rs2: B5,
12 pub rd_or_rs1: B5,
13 pub funct4: B4,
14}
15
16#[bitfield(bits = 16)]
17#[derive(Clone, Copy, Debug, Eq, PartialEq)]
18pub struct CIType {
19 pub op: B2,
20 pub imm_b5: B5,
21 pub rd: B5,
22 pub imm_b1: B1,
23 pub funct3: B3,
24}
25
26#[bitfield(bits = 16)]
27#[derive(Clone, Copy, Debug, Eq, PartialEq)]
28pub struct CSSType {
29 pub op: B2,
30 pub rs2: B5,
31 pub imm_b6: B6,
32 pub funct3: B3,
33}
34
35#[bitfield(bits = 16)]
36#[derive(Clone, Copy, Debug, Eq, PartialEq)]
37pub struct CIWType {
38 pub op: B2,
39 pub rd: B3,
40 pub imm_b8: B8,
41 pub funct3: B3,
42}
43
44#[bitfield(bits = 16)]
45#[derive(Clone, Copy, Debug, Eq, PartialEq)]
46pub struct CLType {
47 pub op: B2,
48 pub rd: B3,
49 pub imm_b2: B2,
50 pub rs1: B3,
51 pub imm_b3: B3,
52 pub funct3: B3,
53}
54
55#[bitfield(bits = 16)]
56#[derive(Clone, Copy, Debug, Eq, PartialEq)]
57pub struct CSType {
58 pub op: B2,
59 pub rs2: B3,
60 pub imm_b2: B2,
61 pub rs1: B3,
62 pub imm_b3: B3,
63 pub funct3: B3,
64}
65
66#[bitfield(bits = 16)]
67#[derive(Clone, Copy, Debug, Eq, PartialEq)]
68pub struct CAType {
69 pub op: B2,
70 pub rs2: B3,
71 pub funct2: B2,
72 pub rd_or_rs1: B3,
73 pub funct6: B6,
74}
75
76#[bitfield(bits = 16)]
77#[derive(Clone, Copy, Debug, Eq, PartialEq)]
78pub struct CBType {
79 pub op: B2,
80 pub imm5: B1,
81 pub imm2_1: B2,
82 pub imm7_6: B2,
83 pub rd_or_rs1: B3,
84 pub imm4_3: B2,
85 pub imm8: B1,
86 pub funct3: B3,
87}
88
89#[bitfield(bits = 16)]
90#[derive(Clone, Copy, Debug, Eq, PartialEq)]
91pub struct CBIType {
92 pub op: B2,
93 pub imm4_0: B5,
94 pub rd_or_rs1: B3,
95 pub funct2: B2,
96 pub imm5: B1,
97 pub funct3: B3,
98}
99
100#[bitfield(bits = 16)]
101#[derive(Clone, Copy, Debug, Eq, PartialEq)]
102pub struct CJType {
103 pub op: B2,
104 pub imm5: B1,
105 pub imm3_1: B3,
106 pub imm7: B1,
107 pub imm6: B1,
108 pub imm10: B1,
109 pub imm9_8: B2,
110 pub imm4: B1,
111 pub imm11: B1,
112 pub funct3: B3,
113}
114
115#[bitfield(bits = 16)]
116#[derive(Clone, Copy, Debug, Eq, PartialEq)]
117pub struct OpcodePeek16 {
118 pub op: B2,
119 pub dummy: B11,
120 pub funct3: B3,
121}
122
123#[derive(Clone, Copy)]
125#[repr(C)]
126pub union Bytecode16 {
127 pub repr: u16,
128 pub peek: OpcodePeek16,
129 pub cr: CRType,
130 pub ci: CIType,
131 pub css: CSSType,
132 pub ciw: CIWType,
133 pub cl: CLType,
134 pub cs: CSType,
135 pub ca: CAType,
136 pub cb: CBType,
137 pub cbi: CBIType,
138 pub cj: CJType,
139}
140
141impl Bytecode16 {
142 #[inline(always)]
143 pub fn opcode(&self) -> u8 {
144 unsafe { self.peek.op() }
145 }
146 #[inline(always)]
147 pub fn funct3(&self) -> u8 {
148 unsafe { self.peek.funct3() }
149 }
150 unsafe_wrapper!(repr, u16);
151 unsafe_wrapper!(cr, CRType);
152 unsafe_wrapper!(ci, CIType);
153 unsafe_wrapper!(css, CSSType);
154 unsafe_wrapper!(ciw, CIWType);
155 unsafe_wrapper!(cl, CLType);
156 unsafe_wrapper!(cs, CSType);
157 unsafe_wrapper!(ca, CAType);
158 unsafe_wrapper!(cb, CBType);
159 unsafe_wrapper!(cbi, CBIType);
160 unsafe_wrapper!(cj, CJType);
161}
162
163impl Debug for Bytecode16 {
164 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
165 write!(f, "Bytecode16({:#06b})", self.repr())
166 }
167}
168
169impl PartialEq for Bytecode16 {
170 fn eq(&self, other: &Self) -> bool {
171 self.repr() == other.repr()
172 }
173}
174
175impl Eq for Bytecode16 {}