definition module MIPS.MIPS32 from StdOverloaded import class toString :: Line = StartSection !String | Align !Int | Label !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