aboutsummaryrefslogtreecommitdiff
path: root/snug-clean/src/MIPS/MIPS32.dcl
blob: 4789507b3c4565c322505019a365899d331e1341 (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
definition module MIPS.MIPS32

from StdOverloaded import class toString

:: Line
	= StartSection !String
	| Align !Int
	| Label !Label
	| Instr !Instruction
	| 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