valheim_asm/isa/
untyped16.rs

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/// untyped instruction
124#[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 {}