36 R0, AT, V0, V1, A0, A1, A2, A3,
37 T0, T1, T2, T3, T4, T5, T6, T7,
38 S0, S1, S2, S3, S4, S5, S6, S7,
39 T8, T9, K0, K1, GP, SP, S8, RA,
43 constexpr uint32_t iclass(uint32_t v) {
return v << 26; }
44 constexpr uint32_t dstVal(Reg r) {
return uint32_t(r) << 11; }
45 constexpr uint32_t tgtVal(Reg r) {
return uint32_t(r) << 16; }
46 constexpr uint32_t srcVal(Reg r) {
return uint32_t(r) << 21; }
49 constexpr uint32_t add(Reg dst, Reg src, Reg tgt) {
return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100000; }
50 constexpr uint32_t addu(Reg dst, Reg src, Reg tgt) {
return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100001; }
51 constexpr uint32_t addi(Reg tgt, Reg src, int16_t value) {
54 return iclass(0b001000) | srcVal(src) | tgtVal(tgt) | v;
56 constexpr uint32_t addiu(Reg tgt, Reg src, int16_t value) {
59 return iclass(0b001001) | srcVal(src) | tgtVal(tgt) | v;
61 constexpr uint32_t andd(Reg dst, Reg src, Reg tgt) {
return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100100; }
62 constexpr uint32_t andi(Reg tgt, Reg src, uint16_t value) {
63 return iclass(0b001100) | srcVal(src) | tgtVal(tgt) | value;
65 constexpr uint32_t lui(Reg tgt, uint16_t value) {
return iclass(0b001111) | tgtVal(tgt) | value; }
66 constexpr uint32_t nor(Reg dst, Reg src, Reg tgt) {
return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100111; }
67 constexpr uint32_t orr(Reg dst, Reg src, Reg tgt) {
return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100101; }
68 constexpr uint32_t ori(Reg tgt, Reg src, uint16_t value) {
69 return iclass(0b001101) | srcVal(src) | tgtVal(tgt) | value;
71 constexpr uint32_t slt(Reg dst, Reg src, Reg tgt) {
return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b101010; }
72 constexpr uint32_t sltu(Reg dst, Reg src, Reg tgt) {
return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b101011; }
73 constexpr uint32_t slti(Reg tgt, Reg src, int16_t value) {
76 return iclass(0b001010) | srcVal(src) | tgtVal(tgt) | v;
78 constexpr uint32_t sltiu(Reg tgt, Reg src, uint16_t value) {
79 return iclass(0b001011) | srcVal(src) | tgtVal(tgt) | value;
81 constexpr uint32_t sub(Reg dst, Reg src, Reg tgt) {
return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100010; }
82 constexpr uint32_t subu(Reg dst, Reg src, Reg tgt) {
return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100011; }
83 constexpr uint32_t xorr(Reg dst, Reg src, Reg tgt) {
return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100110; }
84 constexpr uint32_t xori(Reg tgt, Reg src, uint16_t value) {
85 return iclass(0b001110) | srcVal(src) | tgtVal(tgt) | value;
89 constexpr uint32_t sll(Reg dst, Reg tgt, uint16_t sa) {
return dstVal(dst) | tgtVal(tgt) | (sa << 6) | 0b000000; }
90 constexpr uint32_t sllv(Reg dst, Reg tgt, Reg src) {
return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b000100; }
91 constexpr uint32_t sra(Reg dst, Reg tgt, uint16_t sa) {
return dstVal(dst) | tgtVal(tgt) | (sa << 6) | 0b000011; }
92 constexpr uint32_t srav(Reg dst, Reg tgt, Reg src) {
return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b000111; }
93 constexpr uint32_t srl(Reg dst, Reg tgt, uint16_t sa) {
return dstVal(dst) | tgtVal(tgt) | (sa << 6) | 0b000010; }
94 constexpr uint32_t srlv(Reg dst, Reg tgt, Reg src) {
return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b000110; }
97 constexpr uint32_t div(Reg src, Reg tgt) {
return tgtVal(tgt) | srcVal(src) | 0b011010; }
98 constexpr uint32_t divu(Reg src, Reg tgt) {
return tgtVal(tgt) | srcVal(src) | 0b011011; }
99 constexpr uint32_t mfhi(Reg dst) {
return dstVal(dst) | 0b010000; }
100 constexpr uint32_t mflo(Reg dst) {
return dstVal(dst) | 0b010010; }
101 constexpr uint32_t mthi(Reg dst) {
return dstVal(dst) | 0b010001; }
102 constexpr uint32_t mtlo(Reg dst) {
return dstVal(dst) | 0b010011; }
103 constexpr uint32_t mult(Reg src, Reg tgt) {
return tgtVal(tgt) | srcVal(src) | 0b011000; }
104 constexpr uint32_t multu(Reg src, Reg tgt) {
return tgtVal(tgt) | srcVal(src) | 0b011001; }
107 constexpr uint32_t beq(Reg src, Reg tgt, int16_t offset) {
108 uint32_t o = offset >> 2;
110 return iclass(0b000100) | tgtVal(tgt) | srcVal(src) | o;
112 constexpr uint32_t bgez(Reg src, int16_t offset) {
113 uint32_t o = offset >> 2;
115 return iclass(0b000001) | tgtVal(Reg(0b00001)) | srcVal(src) | o;
117 constexpr uint32_t bgezal(Reg src, int16_t offset) {
118 uint32_t o = offset >> 2;
120 return iclass(0b000001) | tgtVal(Reg(0b10001)) | srcVal(src) | o;
122 constexpr uint32_t bgtz(Reg src, int16_t offset) {
123 uint32_t o = offset >> 2;
125 return iclass(0b000111) | tgtVal(Reg(0b00000)) | srcVal(src) | o;
127 constexpr uint32_t blez(Reg src, int16_t offset) {
128 uint32_t o = offset >> 2;
130 return iclass(0b000110) | tgtVal(Reg(0b00000)) | srcVal(src) | o;
132 constexpr uint32_t bltz(Reg src, int16_t offset) {
133 uint32_t o = offset >> 2;
135 return iclass(0b000001) | tgtVal(Reg(0b00000)) | srcVal(src) | o;
137 constexpr uint32_t bltzal(Reg src, int16_t offset) {
138 uint32_t o = offset >> 2;
140 return iclass(0b000001) | tgtVal(Reg(0b10000)) | srcVal(src) | o;
142 constexpr uint32_t bne(Reg src, Reg tgt, int16_t offset) {
143 uint32_t o = offset >> 2;
145 return iclass(0b000101) | tgtVal(tgt) | srcVal(src) | o;
147 constexpr uint32_t brk(uint32_t code) {
return (code << 6) | 0b001101; }
148 constexpr uint32_t j(uint32_t addr) {
return iclass(0b000010) | ((addr >> 2) & 0x03ffffff); }
149 constexpr uint32_t jal(uint32_t addr) {
return iclass(0b000011) | ((addr >> 2) & 0x03ffffff); }
150 constexpr uint32_t jalr(Reg src, Reg dst = Reg::RA) {
return dstVal(dst) | srcVal(src) | 0b001001; }
151 constexpr uint32_t jr(Reg src) {
return srcVal(src) | 0b001000; }
152 constexpr uint32_t syscall() {
return 0b001100; }
155 constexpr uint32_t lb(Reg tgt, int16_t offset, Reg src) {
158 return iclass(0b100000) | tgtVal(tgt) | srcVal(src) | o;
160 constexpr uint32_t lbu(Reg tgt, int16_t offset, Reg src) {
163 return iclass(0b100100) | tgtVal(tgt) | srcVal(src) | o;
165 constexpr uint32_t lh(Reg tgt, int16_t offset, Reg src) {
168 return iclass(0b100001) | tgtVal(tgt) | srcVal(src) | o;
170 constexpr uint32_t lhu(Reg tgt, int16_t offset, Reg src) {
173 return iclass(0b100101) | tgtVal(tgt) | srcVal(src) | o;
175 constexpr uint32_t lw(Reg tgt, int16_t offset, Reg src) {
178 return iclass(0b100011) | tgtVal(tgt) | srcVal(src) | o;
180 constexpr uint32_t lwl(Reg tgt, int16_t offset, Reg src) {
183 return iclass(0b100010) | tgtVal(tgt) | srcVal(src) | o;
185 constexpr uint32_t lwr(Reg tgt, int16_t offset, Reg src) {
188 return iclass(0b100110) | tgtVal(tgt) | srcVal(src) | o;
190 constexpr uint32_t sb(Reg tgt, int16_t offset, Reg src) {
193 return iclass(0b101000) | tgtVal(tgt) | srcVal(src) | o;
195 constexpr uint32_t sh(Reg tgt, int16_t offset, Reg src) {
198 return iclass(0b101001) | tgtVal(tgt) | srcVal(src) | o;
200 constexpr uint32_t sw(Reg tgt, int16_t offset, Reg src) {
203 return iclass(0b101011) | tgtVal(tgt) | srcVal(src) | o;
205 constexpr uint32_t swl(Reg tgt, int16_t offset, Reg src) {
208 return iclass(0b101010) | tgtVal(tgt) | srcVal(src) | o;
210 constexpr uint32_t swr(Reg tgt, int16_t offset, Reg src) {
213 return iclass(0b101110) | tgtVal(tgt) | srcVal(src) | o;
217 constexpr uint32_t mfc0(Reg tgt, uint8_t dst) {
return iclass(0b010000) | tgtVal(tgt) | (dst << 11); }
218 constexpr uint32_t mtc0(Reg tgt, uint8_t dst) {
return iclass(0b010000) | (4 << 21) | tgtVal(tgt) | (dst << 11); }
219 constexpr uint32_t rfe() {
return 0x42000010; }
222 constexpr uint32_t nop() {
return 0; }