blob: 6e5ff44bfa6990c2538ea20bfce893dbdf8568d9 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
definition module MIPS.MIPS32
from StdOverloaded import class toString
:: Line
= StartSection !String
| Align !Int
| Label !Label
| Global !Label
| Instr !Instruction
| RawByte !Int
| RawWord !Int
| RawAscii !String
instance toString Line
:: Instruction
= LoadByte !Signedness !TargetRegister !Offset !Base
| LoadHalfword !Signedness !TargetRegister !Offset !Base
| LoadWord !TargetRegister !Offset !Base
| StoreByte !TargetRegister !Offset !Base
| StoreHalfword !TargetRegister !Offset !Base
| StoreWord !TargetRegister !Offset !Base
| AddImmediate !Signedness !DestinationRegister !SourceRegister !Immediate
| AndImmediate !DestinationRegister !SourceRegister !Immediate
| LoadUpperImmediate !DestinationRegister !Immediate
| OrImmediate !DestinationRegister !SourceRegister !Immediate
| XorImmediate !DestinationRegister !SourceRegister !Immediate
| AddWord !Signedness !DestinationRegister !SourceRegister !TargetRegister
| AndWord !DestinationRegister !SourceRegister !TargetRegister
| NorWord !DestinationRegister !SourceRegister !TargetRegister
| OrWord !DestinationRegister !SourceRegister !TargetRegister
| SubWord !Signedness !DestinationRegister !SourceRegister !TargetRegister
| XorWord !DestinationRegister !SourceRegister !TargetRegister
| Jump !Link !JumpTarget
| BranchOn1 !BranchCondition1 !SourceRegister !Offset
| BranchOn2 !BranchCondition2 !SourceRegister !TargetRegister !Offset
| Break !Int
| Syscall !Int /* applications should also set v0 to the syscall argument */
| LoadAddress !DestinationRegister !Immediate
| Nop
Move rd rs :== OrImmediate rd rs (Immediate 0)
instance toString Instruction
:: Signedness
= Signed
| Unsigned
:: Base :== Register
:: Offset :== Int /* 16-bit signed */
:: DestinationRegister :== Register
:: SourceRegister :== Register
:: TargetRegister :== Register
:: Register
= R0 /* always zero */
| AT /* reserved for assembler; do not use */
| V0 | V1 /* expression evaluations, integer results, static link for nested procedures */
| A !Int /* 0-3, integer arguments, values not preserved */
| T !Int /* 0-9, temporary, values not preserved */
| S !Int /* 0-7, saved, values preserved */
| K0 | K1 /* reserved for the kernel */
| GP /* global (heap) pointer */
| SP /* stack pointer */
| FP /* frame pointer if needed; otherwise saved register */
| RA /* return address; temporary */
:: Immediate
= Immediate !Int /* 16-bit */
| Address !Offset !Label
:: Link
= Link
| NoLink
:: JumpTarget
= Direct !Immediate
| Register !Register
:: Label :== String
:: BranchCondition1
= BCGeZero !Link
| BCGtZero
| BCLeZero
| BCLtZero !Link
:: BranchCondition2
= BCEq
| BCNe
|