34 { Ssll, "sll", Iarith },
36 { Ssrl, "srl", Iarith },
37 { Ssra, "sra", Iarith },
38 { Ssllv, "sllv", Iarith },
40 { Ssrlv, "srlv", Iarith },
41 { Ssrav, "srav", Iarith },
42 { Sjr, "jr", Ibranch },
43 { Sjalr, "jalr", Ibranch },
46 { Ssyscall, "sysc", Isyscall },
50 { Smfhi, "mfhi", Ireg },
52 { Smflo, "mflo", Ireg },
58 { Smult, "mult", Iarith },
60 { Sdiv, "div", Iarith },
61 { Sdivu, "divu", Iarith },
66 { Sadd, "add", Iarith },
67 { Saddu, "addu", Iarith },
69 { Ssubu, "subu", Iarith },
70 { Sand, "and", Iarith },
71 { Sor, "or", Iarith },
72 { Sxor, "xor", Iarith },
73 { Snor, "nor", Iarith },
76 { Sslt, "slt", Iarith },
77 { Ssltu, "sltu", Iarith },
106 i = &ispec[inst&0x3f];
117 Get3(rs, rt, rd, inst);
119 itrace("nor\tr%d,r%d,r%d", rd, rs, rt);
124 reg.r[rd] = ~(reg.r[rt]|reg.r[rs]);
132 SpecialGetrtrd(rt, rd, inst);
133 shamt = (inst>>6)&0x1f;
135 itrace("sll\tr%d,r%d,%d", rd, rt, shamt);
137 reg.r[rd] = reg.r[rt]<<shamt;
145 Get3(rs, rt, rd, inst);
147 itrace("sllv\tr%d,r%d,r%d", rd, rt, rs);
149 reg.r[rd] = reg.r[rt]<<(reg.r[rs]&0x1f);
157 Get3(rs, rt, rd, inst);
159 itrace("srlv\tr%d,r%d,r%d", rd, rt, rs);
161 reg.r[rd] = (ulong)reg.r[rt] >> (reg.r[rs]&0x1f);
167 int rd, rt, rs, shamt;
169 Get3(rs, rt, rd, inst);
171 itrace("srav\tr%d,r%d,r%d", rd, rt, rs);
173 shamt = reg.r[rs]&0x1f;
174 if(shamt != 0 && (reg.r[rt] & SIGNBIT))
175 reg.r[rd] = reg.r[rt]>>shamt | ~((1<<(32-shamt))-1);
177 reg.r[rd] = reg.r[rt]>>shamt;
185 SpecialGetrtrd(rt, rd, inst);
186 shamt = (inst>>6)&0x1f;
188 itrace("srl\tr%d,r%d,%d", rd, rt, shamt);
190 reg.r[rd] = (ulong)reg.r[rt] >> shamt;
198 SpecialGetrtrd(rt, rd, inst);
199 shamt = (inst>>6)&0x1f;
201 itrace("sra\tr%d,r%d,%d", rd, rt, shamt);
203 if(shamt != 0 && (reg.r[rt] & SIGNBIT))
204 reg.r[rd] = reg.r[rt]>>shamt | ~((1<<(32-shamt))-1);
206 reg.r[rd] = reg.r[rt]>>shamt;
214 Get3(rs, rt, rd, inst);
216 itrace("slt\tr%d,r%d,r%d", rd, rs, rt);
218 reg.r[rd] = reg.r[rs] < reg.r[rt] ? 1 : 0;
226 Get3(rs, rt, rd, inst);
228 itrace("sltu\tr%d,r%d,r%d", rd, rs, rt);
230 reg.r[rd] = (unsigned)reg.r[rs] < (unsigned)reg.r[rt] ? 1 : 0;
238 Get3(rs, rt, rd, inst);
240 itrace("and\tr%d,r%d,r%d", rd, rs, rt);
242 reg.r[rd] = reg.r[rs] & reg.r[rt];
250 Get3(rs, rt, rd, inst);
252 itrace("addu\tr%d,r%d,r%d", rd, rs, rt);
254 reg.r[rd] = reg.r[rs] + reg.r[rt];
262 Get3(rs, rt, rd, inst);
264 itrace("add\tr%d,r%d,r%d", rd, rs, rt);
266 reg.r[rd] = reg.r[rs] + reg.r[rt];
274 Get3(rs, rt, rd, inst);
276 itrace("subu\tr%d,r%d,r%d", rd, rs, rt);
278 reg.r[rd] = reg.r[rs] - reg.r[rt];
286 Get3(rs, rt, rd, inst);
288 itrace("or\tr%d,r%d,r%d", rd, rs, rt);
290 reg.r[rd] = reg.r[rs] | reg.r[rt];
298 Get3(rs, rt, rd, inst);
300 itrace("or\tr%d,r%d,r%d", rd, rs, rt);
302 reg.r[rd] = reg.r[rs] ^ reg.r[rt];
312 rs = (inst>>21)&0x1f;
316 itrace("jr\t0x%lux", npc);
318 /* Do the delay slot */
319 reg.ir = ifetch(reg.pc+4);
323 if(rs == 31 || rs == 2) {
324 findsym(npc, CTEXT, &s);
325 Bprint(bioout, "%8lux return to %lux %s r1=%lux\n",
326 reg.pc, npc, s.name, reg.r[1]);
339 rs = (inst>>21)&0x1f;
340 rd = (inst>>11)&0x1f;
344 itrace("jalr\tr%d,r%d", rd, rs);
346 reg.r[rd] = reg.pc+8;
347 /* Do the delay slot */
348 reg.ir = ifetch(reg.pc+4);
353 findsym(npc, CTEXT, &s);
355 Bprint(bioout, "%8lux return to %8lux %s\n",
356 reg.pc, npc, s.name);
358 printparams(&s, reg.r[29]);
373 itrace("divu\tr%d,r%d", rs, rt);
375 reg.mlo = (ulong)reg.r[rs]/(ulong)reg.r[rt];
376 reg.mhi = (ulong)reg.r[rs]%(ulong)reg.r[rt];
386 itrace("div\tr%d,r%d", rs, rt);
388 reg.mlo = reg.r[rs]/reg.r[rt];
389 reg.mhi = reg.r[rs]%reg.r[rt];
397 rd = (inst>>11)&0x1ff;
399 itrace("mfhi\tr%d", rd);
409 rd = (inst>>11)&0x1ff;
411 itrace("mflo\tr%d", rd);
424 itrace("mult\tr%d,r%d", rs,rt);
426 m = mul(reg.r[rs], reg.r[rt]);
439 itrace("multu\tr%d,r%d", rs,rt);
441 m = mulu(reg.r[rs], reg.r[rt]);