Skip to content

Commit 9fd68b3

Browse files
committed
feat(v2foxy) Updated instruction to support foxy.
1 parent 7ffb243 commit 9fd68b3

File tree

9 files changed

+136
-530
lines changed

9 files changed

+136
-530
lines changed

examples/counter.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ extern crate arrseq_lightning;
22

33
use arrseq_lightning::instruction::{address, Instruction, operation, RegisterCode};
44
use arrseq_lightning::instruction::address::{Address};
5-
use arrseq_lightning::instruction::flag::Flag;
5+
use arrseq_lightning::instruction::branch::Flag;
66
use arrseq_lightning::num::MaskedU8;
77

88
fn main() {

src/instruction.rs

+67-87
Original file line numberDiff line numberDiff line change
@@ -1,106 +1,86 @@
1-
pub mod operation;
1+
use crate::instruction::address::{AccessMode, Address};
2+
use crate::num::{MaskedU32, MaskedU8};
3+
24
pub mod address;
35
pub mod vector;
4-
pub mod flag;
6+
pub mod branch;
57
pub mod encoding;
6-
7-
use crate::instruction::address::Address;
8-
use crate::instruction::flag::Flag;
9-
use crate::num::{MaskedU8};
8+
mod register;
9+
mod arithmetic;
1010

1111
pub type SegmentCode = MaskedU8<0x3>;
12-
pub type RegisterCode = MaskedU8<0xF>;
13-
pub type BranchHintCode = MaskedU8<0x3>;
14-
pub type OperandCode = MaskedU8<0x3>;
15-
16-
#[derive(Debug, Clone, Copy, PartialEq)]
17-
pub enum Format {
18-
WaitForInterrupt,
19-
LoadImmediate,
20-
LoadVectorComponents,
21-
ExtractVectorComponents,
22-
MapVector,
23-
Branch,
24-
DualSource(operation::DualSource),
25-
Destination(operation::Destination),
26-
DestinationSource(operation::DestinationSource),
27-
DestinationDualSource(operation::DestinationDualSource),
28-
DestinationTripleSource(operation::DestinationTripleSource),
29-
DualDestinationDualSource(operation::DualDestinationDualSource),
30-
Memory(operation::Memory),
31-
SourceMemory(operation::SourceMemory),
32-
DestinationMemory(operation::DestinationMemory)
33-
}
12+
pub type LargeImmediate = MaskedU32<0x1FFFFF>;
13+
pub type ScaleCode = MaskedU8<0x03>;
3414

3515
#[derive(Debug, Clone, Copy, PartialEq)]
3616
pub enum Instruction {
37-
WaitForInterrupt,
38-
LoadImmediate {
39-
destination: RegisterCode,
17+
None,
18+
Wait,
19+
20+
End,
21+
EndInterrupt,
22+
Interrupt,
23+
24+
Stack { source: register::Code },
25+
Unstack { destination: register::Code },
26+
27+
LoadImmediate {
28+
destination: register::Code,
4029
segment: SegmentCode,
41-
immediate: u16
42-
},
43-
LoadVectorComponents {
44-
destination: RegisterCode,
45-
/// Having [None] means that the component corresponding to the index should be 0.
46-
components: [Option<RegisterCode>; vector::SIZE]
30+
immediate: LargeImmediate
4731
},
48-
ExtractVectorComponents {
49-
source: RegisterCode,
50-
/// Having [None] means that the component corresponding to the index should not be extracted into a register.
51-
destinations: [Option<RegisterCode>; vector::SIZE]
32+
BuildVector {
33+
destination: register::Code,
34+
components: [register::Code; vector::SIZE]
5235
},
53-
/// Only supports 2 operands due to the size constrain of an instruction.
54-
MapVector {
55-
temporary: bool,
56-
operand: OperandCode,
57-
mappings: [vector::ComponentCode; vector::SIZE]
36+
UnBuildVector {
37+
source: register::Code,
38+
destinations: [register::Code; vector::SIZE]
5839
},
59-
Branch {
60-
condition: Flag,
61-
hint: Option<bool>,
62-
address: Address
63-
},
64-
DualSource {
65-
operation: operation::DualSource,
66-
sources: [RegisterCode; 2]
67-
},
68-
Destination {
69-
operation: operation::Destination,
70-
destination: RegisterCode
40+
41+
CopyRegister {
42+
destination: register::Code,
43+
destination_file: register::FileName,
44+
source: register::Code,
45+
source_file: register::FileName
7146
},
72-
DestinationSource {
73-
operation: operation::DestinationSource,
74-
destination: RegisterCode,
75-
source: RegisterCode
47+
48+
Arithmetic {
49+
operation: arithmetic::Operation,
50+
vector: bool,
51+
atomic: bool,
52+
destination: register::Code,
53+
sources: [register::Code; 2]
7654
},
77-
DestinationDualSource {
78-
operation: operation::DestinationDualSource,
79-
destination: RegisterCode,
80-
sources: [RegisterCode; 2]
55+
Address {
56+
operation: address::Operation,
57+
data: address::Meta,
58+
offset: address::LargeOffset
8159
},
82-
DestinationTripleSource {
83-
operation: operation::DestinationTripleSource,
84-
destination: RegisterCode,
85-
sources: [RegisterCode; 3]
60+
AddressWithBase {
61+
operation: address::OperationWithBase,
62+
data: address::Meta,
63+
base: register::Code,
64+
offset: address::SmallOffset
8665
},
87-
DualDestinationDualSource {
88-
operation: operation::DualDestinationDualSource,
89-
destinations: [RegisterCode; 2],
90-
sources: [RegisterCode; 2]
91-
},
92-
Memory {
93-
operation: operation::Memory,
94-
address: Address
66+
Branch {
67+
operation: branch::Operation,
68+
data: branch::Meta,
69+
offset: branch::LargeOffset
9570
},
96-
SourceMemory {
97-
operation: operation::SourceMemory,
98-
destination: RegisterCode,
99-
source: Address
71+
BranchWithBase {
72+
operation: branch::OperationWithBase,
73+
data: branch::Meta,
74+
base: register::Code,
75+
offset: branch::SmallOffset
10076
},
101-
DestinationMemory {
102-
operation: operation::DestinationMemory,
103-
destination: Address,
104-
source: RegisterCode
105-
}
77+
78+
Timer,
79+
80+
Lock,
81+
UnLock,
82+
83+
Free2,
84+
Free3,
85+
Free4
10686
}

src/instruction/address.rs

+13-35
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,24 @@
1-
use crate::instruction::RegisterCode;
2-
use crate::num::{MaskedU16, MaskedU32, MaskedU8};
3-
4-
pub type LargeImmediate = MaskedU32<0x1FFFF>;
5-
pub type ScaleCode = MaskedU8<0x3>;
1+
use crate::instruction::{register, ScaleCode};
2+
use crate::num::MaskedU32;
63

74
#[derive(Debug, Clone, Copy, PartialEq)]
8-
pub enum Mode {
9-
Absolute,
10-
Relative
5+
pub enum AccessMode {
6+
Read,
7+
Write
118
}
129

13-
pub type MediumImmediate = MaskedU16<0x1FFF>;
14-
pub type ShortImmediate = MaskedU16<0x1FF>;
10+
pub type LargeOffset = MaskedU32<0xFFFFF>;
11+
pub type SmallOffset = MaskedU32<0x3FFF>;
1512

1613
#[derive(Debug, Clone, Copy, PartialEq)]
17-
pub enum IndexedBaseOffsetMode {
18-
Immediate(ShortImmediate),
19-
Register(RegisterCode)
14+
pub struct Meta {
15+
pub relative: bool,
16+
pub access_mode: AccessMode,
17+
pub scale: ScaleCode,
2018
}
2119

2220
#[derive(Debug, Clone, Copy, PartialEq)]
23-
pub enum BaseMode {
24-
Offset(MediumImmediate),
25-
RegisterOffset(RegisterCode),
26-
Indexed {
27-
index: RegisterCode,
28-
offset: IndexedBaseOffsetMode
29-
}
30-
}
21+
pub enum Operation {}
3122

3223
#[derive(Debug, Clone, Copy, PartialEq)]
33-
pub enum Address {
34-
Immediate {
35-
mode: Mode,
36-
immediate: LargeImmediate
37-
},
38-
Register {
39-
mode: Mode,
40-
register: RegisterCode
41-
},
42-
Base {
43-
mode: BaseMode,
44-
base: RegisterCode
45-
}
46-
}
24+
pub enum OperationWithBase {}

src/instruction/arithmetic.rs

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#[derive(Debug, Clone, Copy, PartialEq)]
2+
pub enum Operation {
3+
Add,
4+
Subtract,
5+
Multiply,
6+
Divide
7+
}

src/instruction/branch.rs

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use crate::num::{MaskedU32, MaskedU8};
2+
3+
pub type Code = MaskedU8<0x07>;
4+
5+
#[derive(Debug, Clone, Copy, PartialEq)]
6+
pub enum Flag {
7+
Zero,
8+
Negative,
9+
Overflow,
10+
Regrouping,
11+
Parity
12+
}
13+
14+
pub type LargeOffset = MaskedU32<0x1FFFFFF>;
15+
pub type SmallOffset = MaskedU32<0xFFFFF>;
16+
17+
#[derive(Debug, Clone, Copy, PartialEq)]
18+
pub struct Meta {
19+
pub relative: bool,
20+
pub call: bool,
21+
pub demote: bool,
22+
}
23+
24+
#[derive(Debug, Clone, Copy, PartialEq)]
25+
pub enum Operation {}
26+
27+
#[derive(Debug, Clone, Copy, PartialEq)]
28+
pub enum OperationWithBase {}

0 commit comments

Comments
 (0)