Skip to content

Commit 08e1345

Browse files
committed
Better alu mnemonic typing
1 parent f3aa7a2 commit 08e1345

5 files changed

Lines changed: 141 additions & 64 deletions

File tree

assembler/src/ast.rs

Lines changed: 88 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ pub(crate) enum AsmMnemonic {
106106
Push,
107107
Pop,
108108
Int,
109-
UnaryAlu(CpuMnemonic),
110-
BinaryAlu(CpuMnemonic),
109+
UnaryAlu(UnaryAluCpuMnemonic),
110+
BinaryAlu(BinaryAluCpuMnemonic),
111111
}
112112

113113
#[derive(Debug, Copy, Clone)]
@@ -137,24 +137,92 @@ pub(crate) enum CpuMnemonic {
137137
Ror,
138138
}
139139

140-
impl CpuMnemonic {
141-
pub(crate) fn is_alu_op(&self) -> bool {
142-
matches!(
143-
self,
144-
Self::Pass
145-
| Self::And
146-
| Self::Or
147-
| Self::Xor
148-
| Self::Not
149-
| Self::Add
150-
| Self::Sub
151-
| Self::Neg
152-
| Self::Shl
153-
| Self::Shr
154-
| Self::Ashr
155-
| Self::Rol
156-
| Self::Ror
157-
)
140+
// just for better typing
141+
#[derive(Debug, Copy, Clone)]
142+
pub(crate) enum AluCpuMnemonic {
143+
Pass,
144+
And,
145+
Or,
146+
Xor,
147+
Not,
148+
Add,
149+
Sub,
150+
Neg,
151+
Shl,
152+
Shr,
153+
Ashr,
154+
Rol,
155+
Ror,
156+
}
157+
158+
impl From<AluCpuMnemonic> for CpuMnemonic {
159+
fn from(value: AluCpuMnemonic) -> Self {
160+
match value {
161+
AluCpuMnemonic::Pass => Self::Pass,
162+
AluCpuMnemonic::And => Self::And,
163+
AluCpuMnemonic::Or => Self::Or,
164+
AluCpuMnemonic::Xor => Self::Xor,
165+
AluCpuMnemonic::Not => Self::Not,
166+
AluCpuMnemonic::Add => Self::Add,
167+
AluCpuMnemonic::Sub => Self::Sub,
168+
AluCpuMnemonic::Neg => Self::Neg,
169+
AluCpuMnemonic::Shl => Self::Shl,
170+
AluCpuMnemonic::Shr => Self::Shr,
171+
AluCpuMnemonic::Ashr => Self::Ashr,
172+
AluCpuMnemonic::Rol => Self::Rol,
173+
AluCpuMnemonic::Ror => Self::Ror,
174+
}
175+
}
176+
}
177+
178+
// just for better typing
179+
#[derive(Debug, Copy, Clone)]
180+
pub(crate) enum UnaryAluCpuMnemonic {
181+
#[allow(dead_code)]
182+
Pass,
183+
Not,
184+
Neg,
185+
}
186+
187+
impl From<UnaryAluCpuMnemonic> for AluCpuMnemonic {
188+
fn from(value: UnaryAluCpuMnemonic) -> Self {
189+
match value {
190+
UnaryAluCpuMnemonic::Pass => Self::Pass,
191+
UnaryAluCpuMnemonic::Not => Self::Not,
192+
UnaryAluCpuMnemonic::Neg => Self::Neg,
193+
}
194+
}
195+
}
196+
197+
// just for better typing
198+
#[derive(Debug, Copy, Clone)]
199+
pub(crate) enum BinaryAluCpuMnemonic {
200+
And,
201+
Or,
202+
Xor,
203+
Add,
204+
Sub,
205+
Shl,
206+
Shr,
207+
Ashr,
208+
Rol,
209+
Ror,
210+
}
211+
212+
impl From<BinaryAluCpuMnemonic> for AluCpuMnemonic {
213+
fn from(value: BinaryAluCpuMnemonic) -> Self {
214+
match value {
215+
BinaryAluCpuMnemonic::And => Self::And,
216+
BinaryAluCpuMnemonic::Or => Self::Or,
217+
BinaryAluCpuMnemonic::Xor => Self::Xor,
218+
BinaryAluCpuMnemonic::Add => Self::Add,
219+
BinaryAluCpuMnemonic::Sub => Self::Sub,
220+
BinaryAluCpuMnemonic::Shl => Self::Shl,
221+
BinaryAluCpuMnemonic::Shr => Self::Shr,
222+
BinaryAluCpuMnemonic::Ashr => Self::Ashr,
223+
BinaryAluCpuMnemonic::Rol => Self::Rol,
224+
BinaryAluCpuMnemonic::Ror => Self::Ror,
225+
}
158226
}
159227
}
160228

assembler/src/generator.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::ast::{
2-
AluModifier, AluOpFlags, AsmMnemonic, Block, Condition, CpuMnemonic, Expression, File,
3-
Modifier, Operation, Register,
2+
AluCpuMnemonic, AluModifier, AluOpFlags, AsmMnemonic, Block, Condition, CpuMnemonic,
3+
Expression, File, Modifier, Operation, Register,
44
};
55
use crate::ast::{Ast, Statement};
66
use crate::error::{ATTENTION_COLOR, Error, RecoveredError, RecoveredResult, SpannedError};
@@ -236,6 +236,13 @@ impl Generatable for CpuMnemonic {
236236
}
237237
}
238238

239+
impl Generatable for AluCpuMnemonic {
240+
fn generate(&self) -> u32 {
241+
let cpu_mnemonic: CpuMnemonic = (*self).into();
242+
cpu_mnemonic.generate()
243+
}
244+
}
245+
239246
impl Generatable for AluOpFlags {
240247
fn generate(&self) -> u32 {
241248
(*self as u32) << 16

assembler/src/generator/alu_op.rs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{
2-
ast::{AluOpFlags, AsmMnemonic, CpuMnemonic, Expression, Modifier, Operation, Register},
2+
ast::{AluCpuMnemonic, AluOpFlags, AsmMnemonic, Expression, Modifier, Operation, Register},
33
error::Error,
44
expression::expression_result::{ExpressionResult, Number},
55
generator::{self, Generatable},
@@ -15,12 +15,12 @@ pub(super) fn generate_alu_op(
1515
operation: &Spanned<&Operation>,
1616
symbol_table: &SymbolTable,
1717
) -> Result<u32, Error> {
18-
let mnemonic = if let AsmMnemonic::BinaryAlu(mnemonic) = operation.full_mnemonic.mnemonic.val {
19-
assert!(mnemonic.is_alu_op());
20-
operation.full_mnemonic.mnemonic.span_to(mnemonic)
21-
} else {
22-
panic!("Function was not called with AsmMnemonic::BinaryAlu");
23-
};
18+
let mnemonic: Spanned<AluCpuMnemonic> =
19+
if let AsmMnemonic::BinaryAlu(mnemonic) = operation.full_mnemonic.mnemonic.val {
20+
operation.full_mnemonic.mnemonic.span_to(mnemonic.into())
21+
} else {
22+
panic!("Function was not called with AsmMnemonic::BinaryAlu");
23+
};
2424

2525
if operation.operands.len() == 2 {
2626
generate_alu_op_2(
@@ -47,7 +47,7 @@ pub(super) fn generate_alu_op(
4747
}
4848

4949
fn generate_alu_op_2(
50-
mnemonic: &Spanned<&CpuMnemonic>,
50+
mnemonic: &Spanned<&AluCpuMnemonic>,
5151
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
5252
operands: &Spanned<&Vec<Spanned<Expression>>>,
5353
symbol_table: &SymbolTable,
@@ -71,7 +71,7 @@ fn generate_alu_op_2(
7171
}
7272

7373
fn generate_alu_op_2_reg(
74-
mnemonic: &Spanned<&CpuMnemonic>,
74+
mnemonic: &Spanned<&AluCpuMnemonic>,
7575
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
7676
register: &Spanned<&Register>,
7777
operands: &Spanned<&Vec<Spanned<Expression>>>,
@@ -96,7 +96,7 @@ fn generate_alu_op_2_reg(
9696
}
9797

9898
fn generate_alu_op_2_reg_reg(
99-
mnemonic: &Spanned<&CpuMnemonic>,
99+
mnemonic: &Spanned<&AluCpuMnemonic>,
100100
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
101101
register1: &Spanned<&Register>,
102102
register2: &Spanned<&Register>,
@@ -105,7 +105,7 @@ fn generate_alu_op_2_reg_reg(
105105
}
106106

107107
fn generate_alu_op_2_reg_num(
108-
mnemonic: &Spanned<&CpuMnemonic>,
108+
mnemonic: &Spanned<&AluCpuMnemonic>,
109109
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
110110
register: &Spanned<&Register>,
111111
number: &Spanned<&Number>,
@@ -114,7 +114,7 @@ fn generate_alu_op_2_reg_num(
114114
}
115115

116116
fn generate_alu_op_2_num(
117-
mnemonic: &Spanned<&CpuMnemonic>,
117+
mnemonic: &Spanned<&AluCpuMnemonic>,
118118
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
119119
number: &Spanned<&Number>,
120120
operands: &Spanned<&Vec<Spanned<Expression>>>,
@@ -132,7 +132,7 @@ fn generate_alu_op_2_num(
132132
}
133133

134134
fn generate_alu_op_2_num_reg(
135-
mnemonic: &Spanned<&CpuMnemonic>,
135+
mnemonic: &Spanned<&AluCpuMnemonic>,
136136
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
137137
number: &Spanned<&Number>,
138138
register: &Spanned<&Register>,
@@ -141,7 +141,7 @@ fn generate_alu_op_2_num_reg(
141141
}
142142

143143
fn generate_alu_op_3(
144-
mnemonic: &Spanned<&CpuMnemonic>,
144+
mnemonic: &Spanned<&AluCpuMnemonic>,
145145
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
146146
operands: &Spanned<&Vec<Spanned<Expression>>>,
147147
symbol_table: &SymbolTable,
@@ -158,7 +158,7 @@ fn generate_alu_op_3(
158158
}
159159

160160
fn generate_alu_op_3_reg(
161-
mnemonic: &Spanned<&CpuMnemonic>,
161+
mnemonic: &Spanned<&AluCpuMnemonic>,
162162
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
163163
register: &Spanned<&Register>,
164164
operands: &Spanned<&Vec<Spanned<Expression>>>,
@@ -197,7 +197,7 @@ fn generate_alu_op_3_reg(
197197
}
198198

199199
fn generate_alu_op_3_reg_reg(
200-
mnemonic: &Spanned<&CpuMnemonic>,
200+
mnemonic: &Spanned<&AluCpuMnemonic>,
201201
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
202202
register1: &Spanned<&Register>,
203203
register2: &Spanned<&Register>,
@@ -223,7 +223,7 @@ fn generate_alu_op_3_reg_reg(
223223
}
224224

225225
fn generate_alu_op_3_reg_reg_reg(
226-
mnemonic: &Spanned<&CpuMnemonic>,
226+
mnemonic: &Spanned<&AluCpuMnemonic>,
227227
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
228228
register1: &Spanned<&Register>,
229229
register2: &Spanned<&Register>,
@@ -239,7 +239,7 @@ fn generate_alu_op_3_reg_reg_reg(
239239
}
240240

241241
fn generate_alu_op_3_reg_reg_num(
242-
mnemonic: &Spanned<&CpuMnemonic>,
242+
mnemonic: &Spanned<&AluCpuMnemonic>,
243243
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
244244
register1: &Spanned<&Register>,
245245
register2: &Spanned<&Register>,
@@ -258,7 +258,7 @@ fn generate_alu_op_3_reg_reg_num(
258258
}
259259

260260
fn generate_alu_op_3_reg_num(
261-
mnemonic: &Spanned<&CpuMnemonic>,
261+
mnemonic: &Spanned<&AluCpuMnemonic>,
262262
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
263263
register: &Spanned<&Register>,
264264
number: &Spanned<&Number>,
@@ -277,7 +277,7 @@ fn generate_alu_op_3_reg_num(
277277
}
278278

279279
fn generate_alu_op_3_reg_num_reg(
280-
mnemonic: &Spanned<&CpuMnemonic>,
280+
mnemonic: &Spanned<&AluCpuMnemonic>,
281281
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
282282
register1: &Spanned<&Register>,
283283
number: &Spanned<&Number>,

assembler/src/generator/alu_op/unary_alu_op.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// the least significant bits for it's input (i.e. the second input of a binary operation)
33

44
use crate::{
5-
ast::{AsmMnemonic, CpuMnemonic, Expression, Modifier, Operation},
5+
ast::{AluCpuMnemonic, AsmMnemonic, Expression, Modifier, Operation},
66
error::Error,
77
expression::expression_result::ExpressionResult,
88
generator::alu_op,
@@ -14,12 +14,12 @@ pub(crate) fn generate_unary_alu_op(
1414
operation: &Spanned<&Operation>,
1515
symbol_table: &SymbolTable,
1616
) -> Result<u32, Error> {
17-
let mnemonic = if let AsmMnemonic::UnaryAlu(mnemonic) = operation.full_mnemonic.mnemonic.val {
18-
assert!(mnemonic.is_alu_op());
19-
operation.full_mnemonic.mnemonic.span_to(mnemonic)
20-
} else {
21-
panic!("Function was not called with AsmMnemonic::UnaryAlu");
22-
};
17+
let mnemonic: Spanned<AluCpuMnemonic> =
18+
if let AsmMnemonic::UnaryAlu(mnemonic) = operation.full_mnemonic.mnemonic.val {
19+
operation.full_mnemonic.mnemonic.span_to(mnemonic.into())
20+
} else {
21+
panic!("Function was not called with AsmMnemonic::UnaryAlu");
22+
};
2323

2424
if operation.operands.len() == 1 {
2525
generate_unary_alu_op_1(
@@ -46,7 +46,7 @@ pub(crate) fn generate_unary_alu_op(
4646
}
4747

4848
fn generate_unary_alu_op_1(
49-
mnemonic: &Spanned<&CpuMnemonic>,
49+
mnemonic: &Spanned<&AluCpuMnemonic>,
5050
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
5151
operands: &Spanned<&Vec<Spanned<Expression>>>,
5252
symbol_table: &SymbolTable,
@@ -63,7 +63,7 @@ fn generate_unary_alu_op_1(
6363
}
6464

6565
fn generate_unary_alu_op_2(
66-
mnemonic: &Spanned<&CpuMnemonic>,
66+
mnemonic: &Spanned<&AluCpuMnemonic>,
6767
modifiers: &Spanned<&Vec<Spanned<Modifier>>>,
6868
operands: &Spanned<&Vec<Spanned<Expression>>>,
6969
symbol_table: &SymbolTable,

assembler/src/parser/keywords.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use crate::ast::{AluModifier, AsmMnemonic, Condition, CpuMnemonic, Register};
1+
use crate::ast::{
2+
AluModifier, AsmMnemonic, BinaryAluCpuMnemonic, Condition, Register, UnaryAluCpuMnemonic,
3+
};
24
use crate::parser::{Extra, Input};
35
use chumsky::prelude::*;
46

@@ -10,18 +12,18 @@ pub(super) fn mnemonic_parser<'src, I: Input<'src>>()
1012
text::keyword("push").to(AsmMnemonic::Push),
1113
text::keyword("pop").to(AsmMnemonic::Pop),
1214
text::keyword("int").to(AsmMnemonic::Int),
13-
text::keyword("and").to(AsmMnemonic::BinaryAlu(CpuMnemonic::And)),
14-
text::keyword("or").to(AsmMnemonic::BinaryAlu(CpuMnemonic::Or)),
15-
text::keyword("xor").to(AsmMnemonic::BinaryAlu(CpuMnemonic::Xor)),
16-
text::keyword("not").to(AsmMnemonic::UnaryAlu(CpuMnemonic::Not)),
17-
text::keyword("add").to(AsmMnemonic::BinaryAlu(CpuMnemonic::Add)),
18-
text::keyword("sub").to(AsmMnemonic::BinaryAlu(CpuMnemonic::Sub)),
19-
text::keyword("neg").to(AsmMnemonic::UnaryAlu(CpuMnemonic::Neg)),
20-
text::keyword("shl").to(AsmMnemonic::BinaryAlu(CpuMnemonic::Shl)),
21-
text::keyword("shr").to(AsmMnemonic::BinaryAlu(CpuMnemonic::Shr)),
22-
text::keyword("ashr").to(AsmMnemonic::BinaryAlu(CpuMnemonic::Ashr)),
23-
text::keyword("rol").to(AsmMnemonic::BinaryAlu(CpuMnemonic::Rol)),
24-
text::keyword("ror").to(AsmMnemonic::BinaryAlu(CpuMnemonic::Ror)),
15+
text::keyword("and").to(AsmMnemonic::BinaryAlu(BinaryAluCpuMnemonic::And)),
16+
text::keyword("or").to(AsmMnemonic::BinaryAlu(BinaryAluCpuMnemonic::Or)),
17+
text::keyword("xor").to(AsmMnemonic::BinaryAlu(BinaryAluCpuMnemonic::Xor)),
18+
text::keyword("not").to(AsmMnemonic::UnaryAlu(UnaryAluCpuMnemonic::Not)),
19+
text::keyword("add").to(AsmMnemonic::BinaryAlu(BinaryAluCpuMnemonic::Add)),
20+
text::keyword("sub").to(AsmMnemonic::BinaryAlu(BinaryAluCpuMnemonic::Sub)),
21+
text::keyword("neg").to(AsmMnemonic::UnaryAlu(UnaryAluCpuMnemonic::Neg)),
22+
text::keyword("shl").to(AsmMnemonic::BinaryAlu(BinaryAluCpuMnemonic::Shl)),
23+
text::keyword("shr").to(AsmMnemonic::BinaryAlu(BinaryAluCpuMnemonic::Shr)),
24+
text::keyword("ashr").to(AsmMnemonic::BinaryAlu(BinaryAluCpuMnemonic::Ashr)),
25+
text::keyword("rol").to(AsmMnemonic::BinaryAlu(BinaryAluCpuMnemonic::Rol)),
26+
text::keyword("ror").to(AsmMnemonic::BinaryAlu(BinaryAluCpuMnemonic::Ror)),
2527
))
2628
.labelled("mnemonic")
2729
}

0 commit comments

Comments
 (0)