From 88d6c8cd60753037c6316bc618a9d2fde14ecef9 Mon Sep 17 00:00:00 2001 From: iximeow Date: Fri, 2 Aug 2019 23:06:40 -0700 Subject: kinda start mips --- src/lib.rs | 1 + src/mips_data.rs | 561 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ test/test.rs | 43 +++++ 3 files changed, 605 insertions(+) create mode 100644 src/lib.rs create mode 100644 src/mips_data.rs create mode 100644 test/test.rs diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..36d8589 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1 @@ +mod data; diff --git a/src/mips_data.rs b/src/mips_data.rs new file mode 100644 index 0000000..33c8f41 --- /dev/null +++ b/src/mips_data.rs @@ -0,0 +1,561 @@ +struct Instruction { + opcode: Opcode, + operands: Operands +} + +enum Opcode { + DADD + DADDI + DADDIU + DADDU + DSUB + DSUBU + DMULT + DMULTU + DDIV + DDIVU + + ADD + ADDU + ADDI + ADDIU + SUB + SUBU + MULT + MULTU + DIV + DIVU + + NOR + AND + OR + XOR + ANDI + ORI + XORI + + BEQ + BEQL + BGEZ + BGEZAL + BGEZALL + BGEZL + BGTZ + BGTZL + BLEZ + BLEZL + BLTZ + BLTZAL + BLTZALL + BLTZL + BNE + BNEL + BREAK + COPz + DSLL + DSLL32 + DSLLV + DSRA + DSRA32 + DSRAV + DSRL + DSRL32 + DSRLV + J + JAL + JALR + JR + LB + LBU + LD + LDCz + LDL + LDR + LH + LHU + LL + LLD + LUI + LW + LWCz + LWL + LWR + LWU + MFHI + MFLO + MOVN + MOVZ + MTHI + MTLO + PREF + REGIMM + SB + SC + SCD + SD + SDCz + SDL + SDR + SH + SLL + SLLV + SLT + SLTI + SLTII + SRA + SRAV + SRL + SRLV + SW + SWCz + SWL + SWR + SYNC + SYSCALL + + TEQ + TGE + TGEU + TLT + TLTU + TNE + TEQI + TGEI + TGEIU + TLTI + TLTIU + TNEI +} + +struct RRR(u32); +struct RImm(u32); +struct RRImm(u32); + +enum Operands { + RRR(RRR), + RImm(RImm), + RRImm(RRImm), + CoProc(u32), + Code(u32), // 20-bit number for BREAK or SYSCALL + Offset(u32), // J or JAL +} + +// ADD +// SPECIAL rs rt rd 0 ADD +// 000000 XXXXX XXXXX XXXXX 00000 100000 +// +// ADDU +// SPECIAL rs rt rd 0 ADDU +// 000000 XXXXX XXXXX XXXXX 00000 100001 +// +// AND +// SPECIAL rs rt rd 0 ADDU +// 000000 XXXXX XXXXX XXXXX 00000 100100 +// +// ADDI rs rt imm16 +// 001000 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// ADDIU rs rt imm16 +// 001001 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// ANDI rs rt imm16 +// 001100 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// BEQ rs rt imm16 +// 000100 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// BEQL rs rt imm16 +// 010100 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// BGEZ +// REGIMM rs BGEZ imm16 +// 000001 XXXXX 00001 YYYYYYYYYYYYYYYY +// +// BGEZAL +// REGIMM rs BGEZAL imm16 +// 000001 XXXXX 10001 YYYYYYYYYYYYYYYY +// +// BGEZALL +// REGIMM rs BGEZALLimm16 +// 000001 XXXXX 10011 YYYYYYYYYYYYYYYY +// +// BGEZL +// REGIMM rs BGEZL imm16 +// 000001 XXXXX 00011 YYYYYYYYYYYYYYYY +// +// BGTZ rs 0 imm16 +// 000111 XXXXX 00000 YYYYYYYYYYYYYYYY +// +// BGTZL rs 0 imm16 +// 010111 XXXXX 00000 YYYYYYYYYYYYYYYY +// +// BLEZ rs 0 imm16 +// 000110 XXXXX 00000 YYYYYYYYYYYYYYYY +// +// BLEZL rs 0 imm16 +// 010110 XXXXX 00000 YYYYYYYYYYYYYYYY +// +// BLTZ +// REGIMM rs BLTZ imm16 +// 000001 XXXXX 00000 YYYYYYYYYYYYYYYY +// +// BLTZAL +// REGIMM rs BLTZAL imm16 +// 000001 XXXXX 10000 YYYYYYYYYYYYYYYY +// +// BLTZALL +// REGIMM rs BLTZALLimm16 +// 000001 XXXXX 10010 YYYYYYYYYYYYYYYY +// +// BLTZL +// REGIMM rs BLTZL imm16 +// 000001 XXXXX 00010 YYYYYYYYYYYYYYYY +// +// BNE rs rt imm16 +// 000101 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// BNEL rs rt imm16 +// 010101 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// BREAK +// SPECIAL code BREAK +// 000000 XXXXXXXXXXXXXXXXXXXX 001101 +// +// COPz cop_fun +// 0100zz XXXXXXXXXXXXXXXXXXXXXXXXXX +// +// DADD +// SPECIAL rs rt rd 0 DADD +// 000000 XXXXX XXXXX XXXXX 00000 101100 +// +// DADDU +// SPECIAL rs rt rd 0 DADDU +// 000000 XXXXX XXXXX XXXXX 00000 101101 +// +// DADDI rs rt imm16 +// 011000 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// DADDIU rs rt imm16 +// 011001 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// DSUB +// SPECIAL rs rt rd 0 DSUB +// 000000 XXXXX XXXXX XXXXX 00000 101110 +// +// DSUBU +// SPECIAL rs rt rd 0 DSUBU +// 000000 XXXXX XXXXX XXXXX 00000 101111 +// +// DIV +// SPECIAL rs rt 0 DIV +// 000000 XXXXX XXXXX 0000000000 011010 +// +// DIVU +// SPECIAL rs rt 0 DIVU +// 000000 XXXXX XXXXX 0000000000 011011 +// +// DDIV +// SPECIAL rs rt 0 DDIV +// 000000 XXXXX XXXXX 0000000000 011110 +// +// DDIVU +// SPECIAL rs rt 0 DDIVU +// 000000 XXXXX XXXXX 0000000000 011111 +// +// DMULT +// SPECIAL rs rt 0 DMULT +// 000000 XXXXX XXXXX 0000000000 011100 +// +// DMULTU +// SPECIAL rs rt 0 DMULTU +// 000000 XXXXX XXXXX 0000000000 011101 +// +// DSLL +// SPECIAL 0 rt rd sa DSLL +// 000000 00000 XXXXX XXXXX XXXXX 111000 +// +// DSLL32 +// SPECIAL 0 rt rd sa DSLL32 +// 000000 00000 XXXXX XXXXX XXXXX 111100 +// +// DSLLV +// SPECIAL rs rt rd 0 DSLLV +// 000000 XXXXX XXXXX XXXXX 00000 010100 +// +// DSRA +// SPECIAL 0 rt rd sa DSRA +// 000000 00000 XXXXX XXXXX XXXXX 111011 +// +// DSRA32 +// SPECIAL 0 rt rd sa DSRA32 +// 000000 00000 XXXXX XXXXX XXXXX 111111 +// +// DSRAV +// SPECIAL rs rt rd 0 DSRAV +// 000000 XXXXX XXXXX XXXXX 00000 010111 +// +// DSRL +// SPECIAL 0 rt rd sa DSRL +// 000000 00000 XXXXX XXXXX XXXXX 111010 +// +// DSRL32 +// SPECIAL 0 rt rd sa DSRL32 +// 000000 00000 XXXXX XXXXX XXXXX 111110 +// +// DSRLV +// SPECIAL rs rt rd 0 DSRLV +// 000000 XXXXX XXXXX XXXXX 00000 010110 +// +// J instr_index +// 000010 XXXXXXXXXXXXXXXXXXXXXXXXXX +// +// JAL instr_index +// 000011 XXXXXXXXXXXXXXXXXXXXXXXXXX +// +// JALR v-------------v--- reserved? might not be? unknown +// SPECIAL rs rd JALR +// 000000 XXXXX 00000 XXXXX 00000 001001 +// +// JR v-----v--- reserved? might not be? unknown +// SPECIAL rs JR +// 000000 XXXXX 000000000000000 001000 +// +// LB base rt offset +// 100000 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LBU base rt offset +// 100100 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LD base rt offset +// 110111 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LDCz base rt offset +// 1101zz XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LDL base rt offset +// 011010 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LDR base rt offset +// 011011 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LH base rt offset +// 100001 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LHU base rt offset +// 100101 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LL base rt offset +// 110000 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LLD base rt offset +// 110100 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LUI 0 rt imm16 +// 001111 00000 XXXXX XXXXXXXXXXXXXXXX +// +// LW base rt offset +// 100011 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LWCz base rt offset +// 1100zz XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LWL base rt offset +// 100010 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LWR base rt offset +// 100110 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// LWU base rt offset +// 100111 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// MFHI +// SPECIAL 0 rd 0 MFHI +// 000000 0000000000 XXXXX 00000 010000 +// +// MFLO +// SPECIAL 0 rd 0 MFLO +// 000000 0000000000 XXXXX 00000 010010 +// +// MOVN +// SPECIAL rs rt rd 0 MOVN +// 000000 XXXXX XXXXX XXXXX 00000 001011 +// +// MOVZ +// SPECIAL rs rt rd 0 MOVZ +// 000000 XXXXX XXXXX XXXXX 00000 001010 +// +// MTHI +// SPECIAL rs 0 MTHI +// 000000 XXXXX 000000000000000 010001 +// +// MTLO +// SPECIAL rs 0 MTLO +// 000000 XXXXX 000000000000000 010011 +// +// MULT +// SPECIAL rs rt 0 MULT +// 000000 XXXXX XXXXX 0000000000 011000 +// +// MULTU +// SPECIAL rs rt 0 MULTU +// 000000 XXXXX XXXXX 0000000000 011001 +// +// NOR +// SPECIAL rs rt rd 0 NOR +// 000000 XXXXX XXXXX XXXXX 00000 100111 +// +// OR +// SPECIAL rs rt rd 0 OR +// 000000 XXXXX XXXXX XXXXX 00000 100101 +// +// ORI rs rt imm16 +// 001101 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// PREF base hint imm16 +// 1100111 XXXXX XXXXX XXXXXXXXXXXXXXXX +// +// SB base rt imm16 +// 101000 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SC base rt imm16 +// 111000 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SCD base rt imm16 +// 111100 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SD base rt imm16 +// 111111 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SDCz base rt imm16 +// 1111zz XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SDL base rt imm16 +// 101100 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SDR base rt imm16 +// 101101 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SH base rt imm16 +// 101001 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SLL +// SPECIAL 0 rt rd sa SLL +// 000000 00000 XXXXX XXXXX XXXXX 000000 +// +// SLLV +// SPECIAL rs rt rd 0 SLLV +// 000000 XXXXX XXXXX XXXXX 00000 000100 +// +// SLT +// SPECIAL rs rt rd 0 SLT +// 000000 XXXXX XXXXX XXXXX 00000 101010 +// +// SLTI rs rt imm16 +// 001010 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SLTII rs rt imm16 +// 001011 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SRA +// SPECIAL 0 rt rd sa SRA +// 000000 00000 XXXXX XXXXX XXXXX 000011 +// +// SRAV +// SPECIAL rs rt rd 0 SRAV +// 000000 XXXXX XXXXX XXXXX 00000 000111 +// +// SRL +// SPECIAL 0 rt rd sa SRL +// 000000 00000 XXXXX XXXXX XXXXX 000010 +// +// SRLV +// SPECIAL rs rt rd 0 SRLV +// 000000 XXXXX XXXXX XXXXX 00000 000110 +// +// SUB +// SPECIAL rs rt rd 0 SUB +// 000000 XXXXX XXXXX XXXXX 00000 100010 +// +// SUBU +// SPECIAL rs rt rd 0 SUBU +// 000000 XXXXX XXXXX XXXXX 00000 100011 +// +// SW base rt imm16 +// 101011 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SWCz base rt imm16 +// 1110zz XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SWL base rt imm16 +// 101010 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SWR base rt imm16 +// 101110 XXXXX XXXXX YYYYYYYYYYYYYYYY +// +// SYNC +// SPECIAL 0 stype SYNC +// 000000 000000000000000 XXXXX 001111 +// +// SYSCALL +// SPECIAL Code SYSCALL +// 000000 XXXXXXXXXXXXXXXXXXXX 001100 +// +// TEQ +// SPECIAL rs rt code TEQ +// 000000 XXXXX XXXXX 0000000000 110100 +// +// TEQI +// REGIMM rs TEQI imm16 +// 000001 XXXXX 01100 XXXXXXXXXXXXXXXX +// +// TGE +// SPECIAL rs rt code TGE +// 000000 XXXXX XXXXX 0000000000 110000 +// +// TGEI +// REGIMM rs TGEI imm16 +// 000001 XXXXX 01000 XXXXXXXXXXXXXXXX +// +// TGEU +// SPECIAL rs rt code TGEU +// 000000 XXXXX XXXXX 0000000000 110001 +// +// TGEIU +// REGIMM rs TGEIU imm16 +// 000001 XXXXX 01001 XXXXXXXXXXXXXXXX +// +// TLT +// SPECIAL rs rt code TLT +// 000000 XXXXX XXXXX 0000000000 110010 +// +// TLTI +// REGIMM rs TLTI imm16 +// 000001 XXXXX 01010 XXXXXXXXXXXXXXXX +// +// TLTU +// SPECIAL rs rt code TLTU +// 000000 XXXXX XXXXX 0000000000 110011 +// +// TLTIU +// REGIMM rs TLTIU imm16 +// 000001 XXXXX 01011 XXXXXXXXXXXXXXXX +// +// TNE +// SPECIAL rs rt code TNE +// 000000 XXXXX XXXXX 0000000000 110110 +// +// TNEI +// REGIMM rs TNEI imm16 +// 000001 XXXXX 01110 XXXXXXXXXXXXXXXX +// +// XOR +// SPECIAL rs rt rd 0 XOR +// 000000 XXXXX XXXXX XXXXX 00000 100110 +// +// XORI rs rt imm16 +// 001110 XXXXX XXXXX XXXXXXXXXXXXXXXX + + + + + diff --git a/test/test.rs b/test/test.rs new file mode 100644 index 0000000..7af242d --- /dev/null +++ b/test/test.rs @@ -0,0 +1,43 @@ +#[test] +fn test_arithmetic() { +// 21080008 addi t0, t0, 8 +// 2129fff8 addi t1, t1, -8 +// 2404010c addiu a0, zero, 0x10c +// 2508ae20 addui t0, t0, -0x51e0 +// 352923a0 ori t1, t1, 0x23a0 +// 00042300 sll a0, a0, 0xc +} +#[test] +fn test_br() { +// 1520fffc bnez t1, 0x80001010 +// 01400008 jr t2 +// 03e00008 jr ra +// 10000008 b 0x8000171c +// 0c0005ab jal 0x800016ac +} +#[test] +fn test_cmp() { +// slt +// sltu +// slti +// 2de10007 sltiu at, t7, 1 +} +#[test] +fn test_mov() { +// 8fbf0000 lw ra, (sp) +// 3c088009 lui t0, 0x8009 +// 3c090002 lui t1, 2 +// 6fc07f00 ldr zero, 0x7f00(fp) +// a429d266 sh t1, -0x2d9a(at) +// ad000000 sw zero, (t0) +// ad000004 sw zero, 4(t0) +// 02002025 move a0, s0 +} +#[test] +fn test_misc() { +// 00000000 nop +// 40882800 mtc0 t0, a1, 0 +// 42000002 tlbwi +// 42000008 tlbp +// 40085000 mfc t0, t2, 0 +} -- cgit v1.1