aboutsummaryrefslogtreecommitdiff
path: root/snug-clean/src/MIPS/MIPS32.dcl
diff options
context:
space:
mode:
Diffstat (limited to 'snug-clean/src/MIPS/MIPS32.dcl')
-rw-r--r--snug-clean/src/MIPS/MIPS32.dcl96
1 files changed, 96 insertions, 0 deletions
diff --git a/snug-clean/src/MIPS/MIPS32.dcl b/snug-clean/src/MIPS/MIPS32.dcl
new file mode 100644
index 0000000..4789507
--- /dev/null
+++ b/snug-clean/src/MIPS/MIPS32.dcl
@@ -0,0 +1,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