mips.igen revision 1.1 1 1.1 christos // -*- C -*-
2 1.1 christos //
3 1.1 christos // <insn> ::=
4 1.1 christos // <insn-word> { "+" <insn-word> }
5 1.1 christos // ":" <format-name>
6 1.1 christos // ":" <filter-flags>
7 1.1 christos // ":" <options>
8 1.1 christos // ":" <name>
9 1.1 christos // <nl>
10 1.1 christos // { <insn-model> }
11 1.1 christos // { <insn-mnemonic> }
12 1.1 christos // <code-block>
13 1.1 christos //
14 1.1 christos
15 1.1 christos
16 1.1 christos // IGEN config - mips16
17 1.1 christos // :option:16::insn-bit-size:16
18 1.1 christos // :option:16::hi-bit-nr:15
19 1.1 christos :option:16::insn-specifying-widths:true
20 1.1 christos :option:16::gen-delayed-branch:false
21 1.1 christos
22 1.1 christos // IGEN config - mips32/64..
23 1.1 christos // :option:32::insn-bit-size:32
24 1.1 christos // :option:32::hi-bit-nr:31
25 1.1 christos :option:32::insn-specifying-widths:true
26 1.1 christos :option:32::gen-delayed-branch:false
27 1.1 christos
28 1.1 christos
29 1.1 christos // Generate separate simulators for each target
30 1.1 christos // :option:::multi-sim:true
31 1.1 christos
32 1.1 christos
33 1.1 christos // Models known by this simulator are defined below.
34 1.1 christos //
35 1.1 christos // When placing models in the instruction descriptions, please place
36 1.1 christos // them one per line, in the order given here.
37 1.1 christos
38 1.1 christos // MIPS ISAs:
39 1.1 christos //
40 1.1 christos // Instructions and related functions for these models are included in
41 1.1 christos // this file.
42 1.1 christos :model:::mipsI:mips3000:
43 1.1 christos :model:::mipsII:mips6000:
44 1.1 christos :model:::mipsIII:mips4000:
45 1.1 christos :model:::mipsIV:mips8000:
46 1.1 christos :model:::mipsV:mipsisaV:
47 1.1 christos :model:::mips32:mipsisa32:
48 1.1 christos :model:::mips32r2:mipsisa32r2:
49 1.1 christos :model:::mips64:mipsisa64:
50 1.1 christos :model:::mips64r2:mipsisa64r2:
51 1.1 christos
52 1.1 christos // Vendor ISAs:
53 1.1 christos //
54 1.1 christos // Standard MIPS ISA instructions used for these models are listed here,
55 1.1 christos // as are functions needed by those standard instructions. Instructions
56 1.1 christos // which are model-dependent and which are not in the standard MIPS ISAs
57 1.1 christos // (or which pre-date or use different encodings than the standard
58 1.1 christos // instructions) are (for the most part) in separate .igen files.
59 1.1 christos :model:::vr4100:mips4100: // vr.igen
60 1.1 christos :model:::vr4120:mips4120:
61 1.1 christos :model:::vr5000:mips5000:
62 1.1 christos :model:::vr5400:mips5400:
63 1.1 christos :model:::vr5500:mips5500:
64 1.1 christos :model:::r3900:mips3900: // tx.igen
65 1.1 christos
66 1.1 christos // MIPS Application Specific Extensions (ASEs)
67 1.1 christos //
68 1.1 christos // Instructions for the ASEs are in separate .igen files.
69 1.1 christos // ASEs add instructions on to a base ISA.
70 1.1 christos :model:::mips16:mips16: // m16.igen (and m16.dc)
71 1.1 christos :model:::mips16e:mips16e: // m16e.igen
72 1.1 christos :model:::mips3d:mips3d: // mips3d.igen
73 1.1 christos :model:::mdmx:mdmx: // mdmx.igen
74 1.1 christos :model:::dsp:dsp: // dsp.igen
75 1.1 christos :model:::dsp2:dsp2: // dsp2.igen
76 1.1 christos :model:::smartmips:smartmips: // smartmips.igen
77 1.1 christos
78 1.1 christos // Vendor Extensions
79 1.1 christos //
80 1.1 christos // Instructions specific to these extensions are in separate .igen files.
81 1.1 christos // Extensions add instructions on to a base ISA.
82 1.1 christos :model:::sb1:sb1: // sb1.igen
83 1.1 christos
84 1.1 christos
85 1.1 christos // Pseudo instructions known by IGEN
86 1.1 christos :internal::::illegal:
87 1.1 christos {
88 1.1 christos SignalException (ReservedInstruction, 0);
89 1.1 christos }
90 1.1 christos
91 1.1 christos
92 1.1 christos // Pseudo instructions known by interp.c
93 1.1 christos // For grep - RSVD_INSTRUCTION, RSVD_INSTRUCTION_MASK
94 1.1 christos 000000,5.*,5.*,5.*,5.OP,000101:SPECIAL:32::RSVD
95 1.1 christos "rsvd <OP>"
96 1.1 christos {
97 1.1 christos SignalException (ReservedInstruction, instruction_0);
98 1.1 christos }
99 1.1 christos
100 1.1 christos
101 1.1 christos
102 1.1 christos // Helper:
103 1.1 christos //
104 1.1 christos // Simulate a 32 bit delayslot instruction
105 1.1 christos //
106 1.1 christos
107 1.1 christos :function:::address_word:delayslot32:address_word target
108 1.1 christos {
109 1.1 christos instruction_word delay_insn;
110 1.1 christos sim_events_slip (SD, 1);
111 1.1 christos DSPC = CIA;
112 1.1 christos CIA = CIA + 4; /* NOTE not mips16 */
113 1.1 christos STATE |= simDELAYSLOT;
114 1.1 christos delay_insn = IMEM32 (CIA); /* NOTE not mips16 */
115 1.1 christos ENGINE_ISSUE_PREFIX_HOOK();
116 1.1 christos idecode_issue (CPU_, delay_insn, (CIA));
117 1.1 christos STATE &= ~simDELAYSLOT;
118 1.1 christos return target;
119 1.1 christos }
120 1.1 christos
121 1.1 christos :function:::address_word:nullify_next_insn32:
122 1.1 christos {
123 1.1 christos sim_events_slip (SD, 1);
124 1.1 christos dotrace (SD, CPU, tracefh, 2, CIA + 4, 4, "load instruction");
125 1.1 christos return CIA + 8;
126 1.1 christos }
127 1.1 christos
128 1.1 christos
129 1.1 christos // Helper:
130 1.1 christos //
131 1.1 christos // Calculate an effective address given a base and an offset.
132 1.1 christos //
133 1.1 christos
134 1.1 christos :function:::address_word:loadstore_ea:address_word base, address_word offset
135 1.1 christos *mipsI:
136 1.1 christos *mipsII:
137 1.1 christos *mipsIII:
138 1.1 christos *mipsIV:
139 1.1 christos *mipsV:
140 1.1 christos *mips32:
141 1.1 christos *mips32r2:
142 1.1 christos *vr4100:
143 1.1 christos *vr5000:
144 1.1 christos *r3900:
145 1.1 christos {
146 1.1 christos return base + offset;
147 1.1 christos }
148 1.1 christos
149 1.1 christos :function:::address_word:loadstore_ea:address_word base, address_word offset
150 1.1 christos *mips64:
151 1.1 christos *mips64r2:
152 1.1 christos {
153 1.1 christos #if 0 /* XXX FIXME: enable this only after some additional testing. */
154 1.1 christos /* If in user mode and UX is not set, use 32-bit compatibility effective
155 1.1 christos address computations as defined in the MIPS64 Architecture for
156 1.1 christos Programmers Volume III, Revision 0.95, section 4.9. */
157 1.1 christos if ((SR & (status_KSU_mask|status_EXL|status_ERL|status_UX))
158 1.1 christos == (ksu_user << status_KSU_shift))
159 1.1 christos return (address_word)((signed32)base + (signed32)offset);
160 1.1 christos #endif
161 1.1 christos return base + offset;
162 1.1 christos }
163 1.1 christos
164 1.1 christos
165 1.1 christos // Helper:
166 1.1 christos //
167 1.1 christos // Check that a 32-bit register value is properly sign-extended.
168 1.1 christos // (See NotWordValue in ISA spec.)
169 1.1 christos //
170 1.1 christos
171 1.1 christos :function:::int:not_word_value:unsigned_word value
172 1.1 christos *mipsI:
173 1.1 christos *mipsII:
174 1.1 christos *mipsIII:
175 1.1 christos *mipsIV:
176 1.1 christos *mipsV:
177 1.1 christos *vr4100:
178 1.1 christos *vr5000:
179 1.1 christos *r3900:
180 1.1 christos *mips32:
181 1.1 christos *mips32r2:
182 1.1 christos *mips64:
183 1.1 christos *mips64r2:
184 1.1 christos {
185 1.1 christos #if WITH_TARGET_WORD_BITSIZE == 64
186 1.1 christos return value != (((value & 0xffffffff) ^ 0x80000000) - 0x80000000);
187 1.1 christos #else
188 1.1 christos return 0;
189 1.1 christos #endif
190 1.1 christos }
191 1.1 christos
192 1.1 christos // Helper:
193 1.1 christos //
194 1.1 christos // Handle UNPREDICTABLE operation behaviour. The goal here is to prevent
195 1.1 christos // theoretically portable code which invokes non-portable behaviour from
196 1.1 christos // running with no indication of the portability issue.
197 1.1 christos // (See definition of UNPREDICTABLE in ISA spec.)
198 1.1 christos //
199 1.1 christos
200 1.1 christos :function:::void:unpredictable:
201 1.1 christos *mipsI:
202 1.1 christos *mipsII:
203 1.1 christos *mipsIII:
204 1.1 christos *mipsIV:
205 1.1 christos *mipsV:
206 1.1 christos *vr4100:
207 1.1 christos *vr5000:
208 1.1 christos *r3900:
209 1.1 christos {
210 1.1 christos }
211 1.1 christos
212 1.1 christos :function:::void:unpredictable:
213 1.1 christos *mips32:
214 1.1 christos *mips32r2:
215 1.1 christos *mips64:
216 1.1 christos *mips64r2:
217 1.1 christos {
218 1.1 christos unpredictable_action (CPU, CIA);
219 1.1 christos }
220 1.1 christos
221 1.1 christos
222 1.1 christos // Helpers:
223 1.1 christos //
224 1.1 christos // Check that an access to a HI/LO register meets timing requirements
225 1.1 christos //
226 1.1 christos // In all MIPS ISAs,
227 1.1 christos //
228 1.1 christos // OP {HI and LO} followed by MT{LO or HI} (and not MT{HI or LO})
229 1.1 christos // makes subsequent MF{HI or LO} UNPREDICTABLE. (1)
230 1.1 christos //
231 1.1 christos // The following restrictions exist for MIPS I - MIPS III:
232 1.1 christos //
233 1.1 christos // MF{HI or LO} followed by MT{HI or LO} w/ less than 2 instructions
234 1.1 christos // in between makes MF UNPREDICTABLE. (2)
235 1.1 christos //
236 1.1 christos // MF{HI or LO} followed by OP {HI and LO} w/ less than 2 instructions
237 1.1 christos // in between makes MF UNPREDICTABLE. (3)
238 1.1 christos //
239 1.1 christos // On the r3900, restriction (2) is not present, and restriction (3) is not
240 1.1 christos // present for multiplication.
241 1.1 christos //
242 1.1 christos // Unfortunately, there seems to be some confusion about whether the last
243 1.1 christos // two restrictions should apply to "MIPS IV" as well. One edition of
244 1.1 christos // the MIPS IV ISA says they do, but references in later ISA documents
245 1.1 christos // suggest they don't.
246 1.1 christos //
247 1.1 christos // In reality, some MIPS IV parts, such as the VR5000 and VR5400, do have
248 1.1 christos // these restrictions, while others, like the VR5500, don't. To accomodate
249 1.1 christos // such differences, the MIPS IV and MIPS V version of these helper functions
250 1.1 christos // use auxillary routines to determine whether the restriction applies.
251 1.1 christos
252 1.1 christos // check_mf_cycles:
253 1.1 christos //
254 1.1 christos // Helper used by check_mt_hilo, check_mult_hilo, and check_div_hilo
255 1.1 christos // to check for restrictions (2) and (3) above.
256 1.1 christos //
257 1.1 christos :function:::int:check_mf_cycles:hilo_history *history, signed64 time, const char *new
258 1.1 christos {
259 1.1 christos if (history->mf.timestamp + 3 > time)
260 1.1 christos {
261 1.1 christos sim_engine_abort (SD, CPU, CIA, "HILO: %s: %s at 0x%08lx too close to MF at 0x%08lx\n",
262 1.1 christos itable[MY_INDEX].name,
263 1.1 christos new, (long) CIA,
264 1.1 christos (long) history->mf.cia);
265 1.1 christos return 0;
266 1.1 christos }
267 1.1 christos return 1;
268 1.1 christos }
269 1.1 christos
270 1.1 christos
271 1.1 christos // check_mt_hilo:
272 1.1 christos //
273 1.1 christos // Check for restriction (2) above (for ISAs/processors that have it),
274 1.1 christos // and record timestamps for restriction (1) above.
275 1.1 christos //
276 1.1 christos :function:::int:check_mt_hilo:hilo_history *history
277 1.1 christos *mipsI:
278 1.1 christos *mipsII:
279 1.1 christos *mipsIII:
280 1.1 christos *vr4100:
281 1.1 christos *vr5000:
282 1.1 christos {
283 1.1 christos signed64 time = sim_events_time (SD);
284 1.1 christos int ok = check_mf_cycles (SD_, history, time, "MT");
285 1.1 christos history->mt.timestamp = time;
286 1.1 christos history->mt.cia = CIA;
287 1.1 christos return ok;
288 1.1 christos }
289 1.1 christos
290 1.1 christos :function:::int:check_mt_hilo:hilo_history *history
291 1.1 christos *mipsIV:
292 1.1 christos *mipsV:
293 1.1 christos {
294 1.1 christos signed64 time = sim_events_time (SD);
295 1.1 christos int ok = (! MIPS_MACH_HAS_MT_HILO_HAZARD (SD)
296 1.1 christos || check_mf_cycles (SD_, history, time, "MT"));
297 1.1 christos history->mt.timestamp = time;
298 1.1 christos history->mt.cia = CIA;
299 1.1 christos return ok;
300 1.1 christos }
301 1.1 christos
302 1.1 christos :function:::int:check_mt_hilo:hilo_history *history
303 1.1 christos *mips32:
304 1.1 christos *mips32r2:
305 1.1 christos *mips64:
306 1.1 christos *mips64r2:
307 1.1 christos *r3900:
308 1.1 christos {
309 1.1 christos signed64 time = sim_events_time (SD);
310 1.1 christos history->mt.timestamp = time;
311 1.1 christos history->mt.cia = CIA;
312 1.1 christos return 1;
313 1.1 christos }
314 1.1 christos
315 1.1 christos
316 1.1 christos // check_mf_hilo:
317 1.1 christos //
318 1.1 christos // Check for restriction (1) above, and record timestamps for
319 1.1 christos // restriction (2) and (3) above.
320 1.1 christos //
321 1.1 christos :function:::int:check_mf_hilo:hilo_history *history, hilo_history *peer
322 1.1 christos *mipsI:
323 1.1 christos *mipsII:
324 1.1 christos *mipsIII:
325 1.1 christos *mipsIV:
326 1.1 christos *mipsV:
327 1.1 christos *mips32:
328 1.1 christos *mips32r2:
329 1.1 christos *mips64:
330 1.1 christos *mips64r2:
331 1.1 christos *vr4100:
332 1.1 christos *vr5000:
333 1.1 christos *r3900:
334 1.1 christos {
335 1.1 christos signed64 time = sim_events_time (SD);
336 1.1 christos int ok = 1;
337 1.1 christos if (peer != NULL
338 1.1 christos && peer->mt.timestamp > history->op.timestamp
339 1.1 christos && history->mt.timestamp < history->op.timestamp
340 1.1 christos && ! (history->mf.timestamp > history->op.timestamp
341 1.1 christos && history->mf.timestamp < peer->mt.timestamp)
342 1.1 christos && ! (peer->mf.timestamp > history->op.timestamp
343 1.1 christos && peer->mf.timestamp < peer->mt.timestamp))
344 1.1 christos {
345 1.1 christos /* The peer has been written to since the last OP yet we have
346 1.1 christos not */
347 1.1 christos sim_engine_abort (SD, CPU, CIA, "HILO: %s: MF at 0x%08lx following OP at 0x%08lx corrupted by MT at 0x%08lx\n",
348 1.1 christos itable[MY_INDEX].name,
349 1.1 christos (long) CIA,
350 1.1 christos (long) history->op.cia,
351 1.1 christos (long) peer->mt.cia);
352 1.1 christos ok = 0;
353 1.1 christos }
354 1.1 christos history->mf.timestamp = time;
355 1.1 christos history->mf.cia = CIA;
356 1.1 christos return ok;
357 1.1 christos }
358 1.1 christos
359 1.1 christos
360 1.1 christos
361 1.1 christos // check_mult_hilo:
362 1.1 christos //
363 1.1 christos // Check for restriction (3) above (for ISAs/processors that have it)
364 1.1 christos // for MULT ops, and record timestamps for restriction (1) above.
365 1.1 christos //
366 1.1 christos :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
367 1.1 christos *mipsI:
368 1.1 christos *mipsII:
369 1.1 christos *mipsIII:
370 1.1 christos *vr4100:
371 1.1 christos *vr5000:
372 1.1 christos {
373 1.1 christos signed64 time = sim_events_time (SD);
374 1.1 christos int ok = (check_mf_cycles (SD_, hi, time, "OP")
375 1.1 christos && check_mf_cycles (SD_, lo, time, "OP"));
376 1.1 christos hi->op.timestamp = time;
377 1.1 christos lo->op.timestamp = time;
378 1.1 christos hi->op.cia = CIA;
379 1.1 christos lo->op.cia = CIA;
380 1.1 christos return ok;
381 1.1 christos }
382 1.1 christos
383 1.1 christos :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
384 1.1 christos *mipsIV:
385 1.1 christos *mipsV:
386 1.1 christos {
387 1.1 christos signed64 time = sim_events_time (SD);
388 1.1 christos int ok = (! MIPS_MACH_HAS_MULT_HILO_HAZARD (SD)
389 1.1 christos || (check_mf_cycles (SD_, hi, time, "OP")
390 1.1 christos && check_mf_cycles (SD_, lo, time, "OP")));
391 1.1 christos hi->op.timestamp = time;
392 1.1 christos lo->op.timestamp = time;
393 1.1 christos hi->op.cia = CIA;
394 1.1 christos lo->op.cia = CIA;
395 1.1 christos return ok;
396 1.1 christos }
397 1.1 christos
398 1.1 christos :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
399 1.1 christos *mips32:
400 1.1 christos *mips32r2:
401 1.1 christos *mips64:
402 1.1 christos *mips64r2:
403 1.1 christos *r3900:
404 1.1 christos {
405 1.1 christos /* FIXME: could record the fact that a stall occured if we want */
406 1.1 christos signed64 time = sim_events_time (SD);
407 1.1 christos hi->op.timestamp = time;
408 1.1 christos lo->op.timestamp = time;
409 1.1 christos hi->op.cia = CIA;
410 1.1 christos lo->op.cia = CIA;
411 1.1 christos return 1;
412 1.1 christos }
413 1.1 christos
414 1.1 christos
415 1.1 christos // check_div_hilo:
416 1.1 christos //
417 1.1 christos // Check for restriction (3) above (for ISAs/processors that have it)
418 1.1 christos // for DIV ops, and record timestamps for restriction (1) above.
419 1.1 christos //
420 1.1 christos :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
421 1.1 christos *mipsI:
422 1.1 christos *mipsII:
423 1.1 christos *mipsIII:
424 1.1 christos *vr4100:
425 1.1 christos *vr5000:
426 1.1 christos *r3900:
427 1.1 christos {
428 1.1 christos signed64 time = sim_events_time (SD);
429 1.1 christos int ok = (check_mf_cycles (SD_, hi, time, "OP")
430 1.1 christos && check_mf_cycles (SD_, lo, time, "OP"));
431 1.1 christos hi->op.timestamp = time;
432 1.1 christos lo->op.timestamp = time;
433 1.1 christos hi->op.cia = CIA;
434 1.1 christos lo->op.cia = CIA;
435 1.1 christos return ok;
436 1.1 christos }
437 1.1 christos
438 1.1 christos :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
439 1.1 christos *mipsIV:
440 1.1 christos *mipsV:
441 1.1 christos {
442 1.1 christos signed64 time = sim_events_time (SD);
443 1.1 christos int ok = (! MIPS_MACH_HAS_DIV_HILO_HAZARD (SD)
444 1.1 christos || (check_mf_cycles (SD_, hi, time, "OP")
445 1.1 christos && check_mf_cycles (SD_, lo, time, "OP")));
446 1.1 christos hi->op.timestamp = time;
447 1.1 christos lo->op.timestamp = time;
448 1.1 christos hi->op.cia = CIA;
449 1.1 christos lo->op.cia = CIA;
450 1.1 christos return ok;
451 1.1 christos }
452 1.1 christos
453 1.1 christos :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
454 1.1 christos *mips32:
455 1.1 christos *mips32r2:
456 1.1 christos *mips64:
457 1.1 christos *mips64r2:
458 1.1 christos {
459 1.1 christos signed64 time = sim_events_time (SD);
460 1.1 christos hi->op.timestamp = time;
461 1.1 christos lo->op.timestamp = time;
462 1.1 christos hi->op.cia = CIA;
463 1.1 christos lo->op.cia = CIA;
464 1.1 christos return 1;
465 1.1 christos }
466 1.1 christos
467 1.1 christos
468 1.1 christos // Helper:
469 1.1 christos //
470 1.1 christos // Check that the 64-bit instruction can currently be used, and signal
471 1.1 christos // a ReservedInstruction exception if not.
472 1.1 christos //
473 1.1 christos
474 1.1 christos :function:::void:check_u64:instruction_word insn
475 1.1 christos *mipsIII:
476 1.1 christos *mipsIV:
477 1.1 christos *mipsV:
478 1.1 christos *vr4100:
479 1.1 christos *vr5000:
480 1.1 christos *vr5400:
481 1.1 christos *vr5500:
482 1.1 christos {
483 1.1 christos // The check should be similar to mips64 for any with PX/UX bit equivalents.
484 1.1 christos }
485 1.1 christos
486 1.1 christos :function:::void:check_u64:instruction_word insn
487 1.1 christos *mips16e:
488 1.1 christos *mips64:
489 1.1 christos *mips64r2:
490 1.1 christos {
491 1.1 christos #if 0 /* XXX FIXME: enable this only after some additional testing. */
492 1.1 christos if (UserMode && (SR & (status_UX|status_PX)) == 0)
493 1.1 christos SignalException (ReservedInstruction, insn);
494 1.1 christos #endif
495 1.1 christos }
496 1.1 christos
497 1.1 christos
498 1.1 christos
499 1.1 christos //
500 1.1 christos // MIPS Architecture:
501 1.1 christos //
502 1.1 christos // CPU Instruction Set (mipsI - mipsV, mips32/r2, mips64/r2)
503 1.1 christos //
504 1.1 christos
505 1.1 christos
506 1.1 christos
507 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100000:SPECIAL:32::ADD
508 1.1 christos "add r<RD>, r<RS>, r<RT>"
509 1.1 christos *mipsI:
510 1.1 christos *mipsII:
511 1.1 christos *mipsIII:
512 1.1 christos *mipsIV:
513 1.1 christos *mipsV:
514 1.1 christos *mips32:
515 1.1 christos *mips32r2:
516 1.1 christos *mips64:
517 1.1 christos *mips64r2:
518 1.1 christos *vr4100:
519 1.1 christos *vr5000:
520 1.1 christos *r3900:
521 1.1 christos {
522 1.1 christos if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
523 1.1 christos Unpredictable ();
524 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
525 1.1 christos {
526 1.1 christos ALU32_BEGIN (GPR[RS]);
527 1.1 christos ALU32_ADD (GPR[RT]);
528 1.1 christos ALU32_END (GPR[RD]); /* This checks for overflow. */
529 1.1 christos }
530 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
531 1.1 christos }
532 1.1 christos
533 1.1 christos
534 1.1 christos
535 1.1 christos 001000,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDI
536 1.1 christos "addi r<RT>, r<RS>, <IMMEDIATE>"
537 1.1 christos *mipsI:
538 1.1 christos *mipsII:
539 1.1 christos *mipsIII:
540 1.1 christos *mipsIV:
541 1.1 christos *mipsV:
542 1.1 christos *mips32:
543 1.1 christos *mips32r2:
544 1.1 christos *mips64:
545 1.1 christos *mips64r2:
546 1.1 christos *vr4100:
547 1.1 christos *vr5000:
548 1.1 christos *r3900:
549 1.1 christos {
550 1.1 christos if (NotWordValue (GPR[RS]))
551 1.1 christos Unpredictable ();
552 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], EXTEND16 (IMMEDIATE));
553 1.1 christos {
554 1.1 christos ALU32_BEGIN (GPR[RS]);
555 1.1 christos ALU32_ADD (EXTEND16 (IMMEDIATE));
556 1.1 christos ALU32_END (GPR[RT]); /* This checks for overflow. */
557 1.1 christos }
558 1.1 christos TRACE_ALU_RESULT (GPR[RT]);
559 1.1 christos }
560 1.1 christos
561 1.1 christos
562 1.1 christos
563 1.1 christos :function:::void:do_addiu:int rs, int rt, unsigned16 immediate
564 1.1 christos {
565 1.1 christos if (NotWordValue (GPR[rs]))
566 1.1 christos Unpredictable ();
567 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
568 1.1 christos GPR[rt] = EXTEND32 (GPR[rs] + EXTEND16 (immediate));
569 1.1 christos TRACE_ALU_RESULT (GPR[rt]);
570 1.1 christos }
571 1.1 christos
572 1.1 christos 001001,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDIU
573 1.1 christos "addiu r<RT>, r<RS>, <IMMEDIATE>"
574 1.1 christos *mipsI:
575 1.1 christos *mipsII:
576 1.1 christos *mipsIII:
577 1.1 christos *mipsIV:
578 1.1 christos *mipsV:
579 1.1 christos *mips32:
580 1.1 christos *mips32r2:
581 1.1 christos *mips64:
582 1.1 christos *mips64r2:
583 1.1 christos *vr4100:
584 1.1 christos *vr5000:
585 1.1 christos *r3900:
586 1.1 christos {
587 1.1 christos do_addiu (SD_, RS, RT, IMMEDIATE);
588 1.1 christos }
589 1.1 christos
590 1.1 christos
591 1.1 christos
592 1.1 christos :function:::void:do_addu:int rs, int rt, int rd
593 1.1 christos {
594 1.1 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
595 1.1 christos Unpredictable ();
596 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
597 1.1 christos GPR[rd] = EXTEND32 (GPR[rs] + GPR[rt]);
598 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
599 1.1 christos }
600 1.1 christos
601 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100001:SPECIAL:32::ADDU
602 1.1 christos "addu r<RD>, r<RS>, r<RT>"
603 1.1 christos *mipsI:
604 1.1 christos *mipsII:
605 1.1 christos *mipsIII:
606 1.1 christos *mipsIV:
607 1.1 christos *mipsV:
608 1.1 christos *mips32:
609 1.1 christos *mips32r2:
610 1.1 christos *mips64:
611 1.1 christos *mips64r2:
612 1.1 christos *vr4100:
613 1.1 christos *vr5000:
614 1.1 christos *r3900:
615 1.1 christos {
616 1.1 christos do_addu (SD_, RS, RT, RD);
617 1.1 christos }
618 1.1 christos
619 1.1 christos
620 1.1 christos
621 1.1 christos :function:::void:do_and:int rs, int rt, int rd
622 1.1 christos {
623 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
624 1.1 christos GPR[rd] = GPR[rs] & GPR[rt];
625 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
626 1.1 christos }
627 1.1 christos
628 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100100:SPECIAL:32::AND
629 1.1 christos "and r<RD>, r<RS>, r<RT>"
630 1.1 christos *mipsI:
631 1.1 christos *mipsII:
632 1.1 christos *mipsIII:
633 1.1 christos *mipsIV:
634 1.1 christos *mipsV:
635 1.1 christos *mips32:
636 1.1 christos *mips32r2:
637 1.1 christos *mips64:
638 1.1 christos *mips64r2:
639 1.1 christos *vr4100:
640 1.1 christos *vr5000:
641 1.1 christos *r3900:
642 1.1 christos {
643 1.1 christos do_and (SD_, RS, RT, RD);
644 1.1 christos }
645 1.1 christos
646 1.1 christos
647 1.1 christos
648 1.1 christos 001100,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ANDI
649 1.1 christos "andi r<RT>, r<RS>, %#lx<IMMEDIATE>"
650 1.1 christos *mipsI:
651 1.1 christos *mipsII:
652 1.1 christos *mipsIII:
653 1.1 christos *mipsIV:
654 1.1 christos *mipsV:
655 1.1 christos *mips32:
656 1.1 christos *mips32r2:
657 1.1 christos *mips64:
658 1.1 christos *mips64r2:
659 1.1 christos *vr4100:
660 1.1 christos *vr5000:
661 1.1 christos *r3900:
662 1.1 christos {
663 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE);
664 1.1 christos GPR[RT] = GPR[RS] & IMMEDIATE;
665 1.1 christos TRACE_ALU_RESULT (GPR[RT]);
666 1.1 christos }
667 1.1 christos
668 1.1 christos
669 1.1 christos
670 1.1 christos 000100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQ
671 1.1 christos "beq r<RS>, r<RT>, <OFFSET>"
672 1.1 christos *mipsI:
673 1.1 christos *mipsII:
674 1.1 christos *mipsIII:
675 1.1 christos *mipsIV:
676 1.1 christos *mipsV:
677 1.1 christos *mips32:
678 1.1 christos *mips32r2:
679 1.1 christos *mips64:
680 1.1 christos *mips64r2:
681 1.1 christos *vr4100:
682 1.1 christos *vr5000:
683 1.1 christos *r3900:
684 1.1 christos {
685 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
686 1.1 christos if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
687 1.1 christos {
688 1.1 christos DELAY_SLOT (NIA + offset);
689 1.1 christos }
690 1.1 christos }
691 1.1 christos
692 1.1 christos
693 1.1 christos
694 1.1 christos 010100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQL
695 1.1 christos "beql r<RS>, r<RT>, <OFFSET>"
696 1.1 christos *mipsII:
697 1.1 christos *mipsIII:
698 1.1 christos *mipsIV:
699 1.1 christos *mipsV:
700 1.1 christos *mips32:
701 1.1 christos *mips32r2:
702 1.1 christos *mips64:
703 1.1 christos *mips64r2:
704 1.1 christos *vr4100:
705 1.1 christos *vr5000:
706 1.1 christos *r3900:
707 1.1 christos {
708 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
709 1.1 christos if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
710 1.1 christos {
711 1.1 christos DELAY_SLOT (NIA + offset);
712 1.1 christos }
713 1.1 christos else
714 1.1 christos NULLIFY_NEXT_INSTRUCTION ();
715 1.1 christos }
716 1.1 christos
717 1.1 christos
718 1.1 christos
719 1.1 christos 000001,5.RS,00001,16.OFFSET:REGIMM:32::BGEZ
720 1.1 christos "bgez r<RS>, <OFFSET>"
721 1.1 christos *mipsI:
722 1.1 christos *mipsII:
723 1.1 christos *mipsIII:
724 1.1 christos *mipsIV:
725 1.1 christos *mipsV:
726 1.1 christos *mips32:
727 1.1 christos *mips32r2:
728 1.1 christos *mips64:
729 1.1 christos *mips64r2:
730 1.1 christos *vr4100:
731 1.1 christos *vr5000:
732 1.1 christos *r3900:
733 1.1 christos {
734 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
735 1.1 christos if ((signed_word) GPR[RS] >= 0)
736 1.1 christos {
737 1.1 christos DELAY_SLOT (NIA + offset);
738 1.1 christos }
739 1.1 christos }
740 1.1 christos
741 1.1 christos
742 1.1 christos
743 1.1 christos 000001,5.RS!31,10001,16.OFFSET:REGIMM:32::BGEZAL
744 1.1 christos "bgezal r<RS>, <OFFSET>"
745 1.1 christos *mipsI:
746 1.1 christos *mipsII:
747 1.1 christos *mipsIII:
748 1.1 christos *mipsIV:
749 1.1 christos *mipsV:
750 1.1 christos *mips32:
751 1.1 christos *mips32r2:
752 1.1 christos *mips64:
753 1.1 christos *mips64r2:
754 1.1 christos *vr4100:
755 1.1 christos *vr5000:
756 1.1 christos *r3900:
757 1.1 christos {
758 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
759 1.1 christos if (RS == 31)
760 1.1 christos Unpredictable ();
761 1.1 christos RA = (CIA + 8);
762 1.1 christos if ((signed_word) GPR[RS] >= 0)
763 1.1 christos {
764 1.1 christos DELAY_SLOT (NIA + offset);
765 1.1 christos }
766 1.1 christos }
767 1.1 christos
768 1.1 christos
769 1.1 christos
770 1.1 christos 000001,5.RS!31,10011,16.OFFSET:REGIMM:32::BGEZALL
771 1.1 christos "bgezall r<RS>, <OFFSET>"
772 1.1 christos *mipsII:
773 1.1 christos *mipsIII:
774 1.1 christos *mipsIV:
775 1.1 christos *mipsV:
776 1.1 christos *mips32:
777 1.1 christos *mips32r2:
778 1.1 christos *mips64:
779 1.1 christos *mips64r2:
780 1.1 christos *vr4100:
781 1.1 christos *vr5000:
782 1.1 christos *r3900:
783 1.1 christos {
784 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
785 1.1 christos if (RS == 31)
786 1.1 christos Unpredictable ();
787 1.1 christos RA = (CIA + 8);
788 1.1 christos /* NOTE: The branch occurs AFTER the next instruction has been
789 1.1 christos executed */
790 1.1 christos if ((signed_word) GPR[RS] >= 0)
791 1.1 christos {
792 1.1 christos DELAY_SLOT (NIA + offset);
793 1.1 christos }
794 1.1 christos else
795 1.1 christos NULLIFY_NEXT_INSTRUCTION ();
796 1.1 christos }
797 1.1 christos
798 1.1 christos
799 1.1 christos
800 1.1 christos 000001,5.RS,00011,16.OFFSET:REGIMM:32::BGEZL
801 1.1 christos "bgezl r<RS>, <OFFSET>"
802 1.1 christos *mipsII:
803 1.1 christos *mipsIII:
804 1.1 christos *mipsIV:
805 1.1 christos *mipsV:
806 1.1 christos *mips32:
807 1.1 christos *mips32r2:
808 1.1 christos *mips64:
809 1.1 christos *mips64r2:
810 1.1 christos *vr4100:
811 1.1 christos *vr5000:
812 1.1 christos *r3900:
813 1.1 christos {
814 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
815 1.1 christos if ((signed_word) GPR[RS] >= 0)
816 1.1 christos {
817 1.1 christos DELAY_SLOT (NIA + offset);
818 1.1 christos }
819 1.1 christos else
820 1.1 christos NULLIFY_NEXT_INSTRUCTION ();
821 1.1 christos }
822 1.1 christos
823 1.1 christos
824 1.1 christos
825 1.1 christos 000111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZ
826 1.1 christos "bgtz r<RS>, <OFFSET>"
827 1.1 christos *mipsI:
828 1.1 christos *mipsII:
829 1.1 christos *mipsIII:
830 1.1 christos *mipsIV:
831 1.1 christos *mipsV:
832 1.1 christos *mips32:
833 1.1 christos *mips32r2:
834 1.1 christos *mips64:
835 1.1 christos *mips64r2:
836 1.1 christos *vr4100:
837 1.1 christos *vr5000:
838 1.1 christos *r3900:
839 1.1 christos {
840 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
841 1.1 christos if ((signed_word) GPR[RS] > 0)
842 1.1 christos {
843 1.1 christos DELAY_SLOT (NIA + offset);
844 1.1 christos }
845 1.1 christos }
846 1.1 christos
847 1.1 christos
848 1.1 christos
849 1.1 christos 010111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZL
850 1.1 christos "bgtzl r<RS>, <OFFSET>"
851 1.1 christos *mipsII:
852 1.1 christos *mipsIII:
853 1.1 christos *mipsIV:
854 1.1 christos *mipsV:
855 1.1 christos *mips32:
856 1.1 christos *mips32r2:
857 1.1 christos *mips64:
858 1.1 christos *mips64r2:
859 1.1 christos *vr4100:
860 1.1 christos *vr5000:
861 1.1 christos *r3900:
862 1.1 christos {
863 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
864 1.1 christos /* NOTE: The branch occurs AFTER the next instruction has been
865 1.1 christos executed */
866 1.1 christos if ((signed_word) GPR[RS] > 0)
867 1.1 christos {
868 1.1 christos DELAY_SLOT (NIA + offset);
869 1.1 christos }
870 1.1 christos else
871 1.1 christos NULLIFY_NEXT_INSTRUCTION ();
872 1.1 christos }
873 1.1 christos
874 1.1 christos
875 1.1 christos
876 1.1 christos 000110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZ
877 1.1 christos "blez r<RS>, <OFFSET>"
878 1.1 christos *mipsI:
879 1.1 christos *mipsII:
880 1.1 christos *mipsIII:
881 1.1 christos *mipsIV:
882 1.1 christos *mipsV:
883 1.1 christos *mips32:
884 1.1 christos *mips32r2:
885 1.1 christos *mips64:
886 1.1 christos *mips64r2:
887 1.1 christos *vr4100:
888 1.1 christos *vr5000:
889 1.1 christos *r3900:
890 1.1 christos {
891 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
892 1.1 christos /* NOTE: The branch occurs AFTER the next instruction has been
893 1.1 christos executed */
894 1.1 christos if ((signed_word) GPR[RS] <= 0)
895 1.1 christos {
896 1.1 christos DELAY_SLOT (NIA + offset);
897 1.1 christos }
898 1.1 christos }
899 1.1 christos
900 1.1 christos
901 1.1 christos
902 1.1 christos 010110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZL
903 1.1 christos "bgezl r<RS>, <OFFSET>"
904 1.1 christos *mipsII:
905 1.1 christos *mipsIII:
906 1.1 christos *mipsIV:
907 1.1 christos *mipsV:
908 1.1 christos *mips32:
909 1.1 christos *mips32r2:
910 1.1 christos *mips64:
911 1.1 christos *mips64r2:
912 1.1 christos *vr4100:
913 1.1 christos *vr5000:
914 1.1 christos *r3900:
915 1.1 christos {
916 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
917 1.1 christos if ((signed_word) GPR[RS] <= 0)
918 1.1 christos {
919 1.1 christos DELAY_SLOT (NIA + offset);
920 1.1 christos }
921 1.1 christos else
922 1.1 christos NULLIFY_NEXT_INSTRUCTION ();
923 1.1 christos }
924 1.1 christos
925 1.1 christos
926 1.1 christos
927 1.1 christos 000001,5.RS,00000,16.OFFSET:REGIMM:32::BLTZ
928 1.1 christos "bltz r<RS>, <OFFSET>"
929 1.1 christos *mipsI:
930 1.1 christos *mipsII:
931 1.1 christos *mipsIII:
932 1.1 christos *mipsIV:
933 1.1 christos *mipsV:
934 1.1 christos *mips32:
935 1.1 christos *mips32r2:
936 1.1 christos *mips64:
937 1.1 christos *mips64r2:
938 1.1 christos *vr4100:
939 1.1 christos *vr5000:
940 1.1 christos *r3900:
941 1.1 christos {
942 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
943 1.1 christos if ((signed_word) GPR[RS] < 0)
944 1.1 christos {
945 1.1 christos DELAY_SLOT (NIA + offset);
946 1.1 christos }
947 1.1 christos }
948 1.1 christos
949 1.1 christos
950 1.1 christos
951 1.1 christos 000001,5.RS!31,10000,16.OFFSET:REGIMM:32::BLTZAL
952 1.1 christos "bltzal r<RS>, <OFFSET>"
953 1.1 christos *mipsI:
954 1.1 christos *mipsII:
955 1.1 christos *mipsIII:
956 1.1 christos *mipsIV:
957 1.1 christos *mipsV:
958 1.1 christos *mips32:
959 1.1 christos *mips32r2:
960 1.1 christos *mips64:
961 1.1 christos *mips64r2:
962 1.1 christos *vr4100:
963 1.1 christos *vr5000:
964 1.1 christos *r3900:
965 1.1 christos {
966 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
967 1.1 christos if (RS == 31)
968 1.1 christos Unpredictable ();
969 1.1 christos RA = (CIA + 8);
970 1.1 christos /* NOTE: The branch occurs AFTER the next instruction has been
971 1.1 christos executed */
972 1.1 christos if ((signed_word) GPR[RS] < 0)
973 1.1 christos {
974 1.1 christos DELAY_SLOT (NIA + offset);
975 1.1 christos }
976 1.1 christos }
977 1.1 christos
978 1.1 christos
979 1.1 christos
980 1.1 christos 000001,5.RS!31,10010,16.OFFSET:REGIMM:32::BLTZALL
981 1.1 christos "bltzall r<RS>, <OFFSET>"
982 1.1 christos *mipsII:
983 1.1 christos *mipsIII:
984 1.1 christos *mipsIV:
985 1.1 christos *mipsV:
986 1.1 christos *mips32:
987 1.1 christos *mips32r2:
988 1.1 christos *mips64:
989 1.1 christos *mips64r2:
990 1.1 christos *vr4100:
991 1.1 christos *vr5000:
992 1.1 christos *r3900:
993 1.1 christos {
994 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
995 1.1 christos if (RS == 31)
996 1.1 christos Unpredictable ();
997 1.1 christos RA = (CIA + 8);
998 1.1 christos if ((signed_word) GPR[RS] < 0)
999 1.1 christos {
1000 1.1 christos DELAY_SLOT (NIA + offset);
1001 1.1 christos }
1002 1.1 christos else
1003 1.1 christos NULLIFY_NEXT_INSTRUCTION ();
1004 1.1 christos }
1005 1.1 christos
1006 1.1 christos
1007 1.1 christos
1008 1.1 christos 000001,5.RS,00010,16.OFFSET:REGIMM:32::BLTZL
1009 1.1 christos "bltzl r<RS>, <OFFSET>"
1010 1.1 christos *mipsII:
1011 1.1 christos *mipsIII:
1012 1.1 christos *mipsIV:
1013 1.1 christos *mipsV:
1014 1.1 christos *mips32:
1015 1.1 christos *mips32r2:
1016 1.1 christos *mips64:
1017 1.1 christos *mips64r2:
1018 1.1 christos *vr4100:
1019 1.1 christos *vr5000:
1020 1.1 christos *r3900:
1021 1.1 christos {
1022 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
1023 1.1 christos /* NOTE: The branch occurs AFTER the next instruction has been
1024 1.1 christos executed */
1025 1.1 christos if ((signed_word) GPR[RS] < 0)
1026 1.1 christos {
1027 1.1 christos DELAY_SLOT (NIA + offset);
1028 1.1 christos }
1029 1.1 christos else
1030 1.1 christos NULLIFY_NEXT_INSTRUCTION ();
1031 1.1 christos }
1032 1.1 christos
1033 1.1 christos
1034 1.1 christos
1035 1.1 christos 000101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNE
1036 1.1 christos "bne r<RS>, r<RT>, <OFFSET>"
1037 1.1 christos *mipsI:
1038 1.1 christos *mipsII:
1039 1.1 christos *mipsIII:
1040 1.1 christos *mipsIV:
1041 1.1 christos *mipsV:
1042 1.1 christos *mips32:
1043 1.1 christos *mips32r2:
1044 1.1 christos *mips64:
1045 1.1 christos *mips64r2:
1046 1.1 christos *vr4100:
1047 1.1 christos *vr5000:
1048 1.1 christos *r3900:
1049 1.1 christos {
1050 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
1051 1.1 christos if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
1052 1.1 christos {
1053 1.1 christos DELAY_SLOT (NIA + offset);
1054 1.1 christos }
1055 1.1 christos }
1056 1.1 christos
1057 1.1 christos
1058 1.1 christos
1059 1.1 christos 010101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNEL
1060 1.1 christos "bnel r<RS>, r<RT>, <OFFSET>"
1061 1.1 christos *mipsII:
1062 1.1 christos *mipsIII:
1063 1.1 christos *mipsIV:
1064 1.1 christos *mipsV:
1065 1.1 christos *mips32:
1066 1.1 christos *mips32r2:
1067 1.1 christos *mips64:
1068 1.1 christos *mips64r2:
1069 1.1 christos *vr4100:
1070 1.1 christos *vr5000:
1071 1.1 christos *r3900:
1072 1.1 christos {
1073 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2;
1074 1.1 christos if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
1075 1.1 christos {
1076 1.1 christos DELAY_SLOT (NIA + offset);
1077 1.1 christos }
1078 1.1 christos else
1079 1.1 christos NULLIFY_NEXT_INSTRUCTION ();
1080 1.1 christos }
1081 1.1 christos
1082 1.1 christos
1083 1.1 christos
1084 1.1 christos 000000,20.CODE,001101:SPECIAL:32::BREAK
1085 1.1 christos "break %#lx<CODE>"
1086 1.1 christos *mipsI:
1087 1.1 christos *mipsII:
1088 1.1 christos *mipsIII:
1089 1.1 christos *mipsIV:
1090 1.1 christos *mipsV:
1091 1.1 christos *mips32:
1092 1.1 christos *mips32r2:
1093 1.1 christos *mips64:
1094 1.1 christos *mips64r2:
1095 1.1 christos *vr4100:
1096 1.1 christos *vr5000:
1097 1.1 christos *r3900:
1098 1.1 christos {
1099 1.1 christos /* Check for some break instruction which are reserved for use by the simulator. */
1100 1.1 christos unsigned int break_code = instruction_0 & HALT_INSTRUCTION_MASK;
1101 1.1 christos if (break_code == (HALT_INSTRUCTION & HALT_INSTRUCTION_MASK) ||
1102 1.1 christos break_code == (HALT_INSTRUCTION2 & HALT_INSTRUCTION_MASK))
1103 1.1 christos {
1104 1.1 christos sim_engine_halt (SD, CPU, NULL, cia,
1105 1.1 christos sim_exited, (unsigned int)(A0 & 0xFFFFFFFF));
1106 1.1 christos }
1107 1.1 christos else if (break_code == (BREAKPOINT_INSTRUCTION & HALT_INSTRUCTION_MASK) ||
1108 1.1 christos break_code == (BREAKPOINT_INSTRUCTION2 & HALT_INSTRUCTION_MASK))
1109 1.1 christos {
1110 1.1 christos if (STATE & simDELAYSLOT)
1111 1.1 christos PC = cia - 4; /* reference the branch instruction */
1112 1.1 christos else
1113 1.1 christos PC = cia;
1114 1.1 christos SignalException (BreakPoint, instruction_0);
1115 1.1 christos }
1116 1.1 christos
1117 1.1 christos else
1118 1.1 christos {
1119 1.1 christos /* If we get this far, we're not an instruction reserved by the sim. Raise
1120 1.1 christos the exception. */
1121 1.1 christos SignalException (BreakPoint, instruction_0);
1122 1.1 christos }
1123 1.1 christos }
1124 1.1 christos
1125 1.1 christos
1126 1.1 christos
1127 1.1 christos 011100,5.RS,5.RT,5.RD,00000,100001:SPECIAL2:32::CLO
1128 1.1 christos "clo r<RD>, r<RS>"
1129 1.1 christos *mips32:
1130 1.1 christos *mips32r2:
1131 1.1 christos *mips64:
1132 1.1 christos *mips64r2:
1133 1.1 christos *vr5500:
1134 1.1 christos {
1135 1.1 christos unsigned32 temp = GPR[RS];
1136 1.1 christos unsigned32 i, mask;
1137 1.1 christos if (RT != RD)
1138 1.1 christos Unpredictable ();
1139 1.1 christos if (NotWordValue (GPR[RS]))
1140 1.1 christos Unpredictable ();
1141 1.1 christos TRACE_ALU_INPUT1 (GPR[RS]);
1142 1.1 christos for (mask = ((unsigned32)1<<31), i = 0; i < 32; ++i)
1143 1.1 christos {
1144 1.1 christos if ((temp & mask) == 0)
1145 1.1 christos break;
1146 1.1 christos mask >>= 1;
1147 1.1 christos }
1148 1.1 christos GPR[RD] = EXTEND32 (i);
1149 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
1150 1.1 christos }
1151 1.1 christos
1152 1.1 christos
1153 1.1 christos
1154 1.1 christos 011100,5.RS,5.RT,5.RD,00000,100000:SPECIAL2:32::CLZ
1155 1.1 christos "clz r<RD>, r<RS>"
1156 1.1 christos *mips32:
1157 1.1 christos *mips32r2:
1158 1.1 christos *mips64:
1159 1.1 christos *mips64r2:
1160 1.1 christos *vr5500:
1161 1.1 christos {
1162 1.1 christos unsigned32 temp = GPR[RS];
1163 1.1 christos unsigned32 i, mask;
1164 1.1 christos if (RT != RD)
1165 1.1 christos Unpredictable ();
1166 1.1 christos if (NotWordValue (GPR[RS]))
1167 1.1 christos Unpredictable ();
1168 1.1 christos TRACE_ALU_INPUT1 (GPR[RS]);
1169 1.1 christos for (mask = ((unsigned32)1<<31), i = 0; i < 32; ++i)
1170 1.1 christos {
1171 1.1 christos if ((temp & mask) != 0)
1172 1.1 christos break;
1173 1.1 christos mask >>= 1;
1174 1.1 christos }
1175 1.1 christos GPR[RD] = EXTEND32 (i);
1176 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
1177 1.1 christos }
1178 1.1 christos
1179 1.1 christos
1180 1.1 christos
1181 1.1 christos 000000,5.RS,5.RT,5.RD,00000,101100:SPECIAL:64::DADD
1182 1.1 christos "dadd r<RD>, r<RS>, r<RT>"
1183 1.1 christos *mipsIII:
1184 1.1 christos *mipsIV:
1185 1.1 christos *mipsV:
1186 1.1 christos *mips64:
1187 1.1 christos *mips64r2:
1188 1.1 christos *vr4100:
1189 1.1 christos *vr5000:
1190 1.1 christos {
1191 1.1 christos check_u64 (SD_, instruction_0);
1192 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
1193 1.1 christos {
1194 1.1 christos ALU64_BEGIN (GPR[RS]);
1195 1.1 christos ALU64_ADD (GPR[RT]);
1196 1.1 christos ALU64_END (GPR[RD]); /* This checks for overflow. */
1197 1.1 christos }
1198 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
1199 1.1 christos }
1200 1.1 christos
1201 1.1 christos
1202 1.1 christos
1203 1.1 christos 011000,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDI
1204 1.1 christos "daddi r<RT>, r<RS>, <IMMEDIATE>"
1205 1.1 christos *mipsIII:
1206 1.1 christos *mipsIV:
1207 1.1 christos *mipsV:
1208 1.1 christos *mips64:
1209 1.1 christos *mips64r2:
1210 1.1 christos *vr4100:
1211 1.1 christos *vr5000:
1212 1.1 christos {
1213 1.1 christos check_u64 (SD_, instruction_0);
1214 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], EXTEND16 (IMMEDIATE));
1215 1.1 christos {
1216 1.1 christos ALU64_BEGIN (GPR[RS]);
1217 1.1 christos ALU64_ADD (EXTEND16 (IMMEDIATE));
1218 1.1 christos ALU64_END (GPR[RT]); /* This checks for overflow. */
1219 1.1 christos }
1220 1.1 christos TRACE_ALU_RESULT (GPR[RT]);
1221 1.1 christos }
1222 1.1 christos
1223 1.1 christos
1224 1.1 christos
1225 1.1 christos :function:::void:do_daddiu:int rs, int rt, unsigned16 immediate
1226 1.1 christos {
1227 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
1228 1.1 christos GPR[rt] = GPR[rs] + EXTEND16 (immediate);
1229 1.1 christos TRACE_ALU_RESULT (GPR[rt]);
1230 1.1 christos }
1231 1.1 christos
1232 1.1 christos 011001,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDIU
1233 1.1 christos "daddiu r<RT>, r<RS>, <IMMEDIATE>"
1234 1.1 christos *mipsIII:
1235 1.1 christos *mipsIV:
1236 1.1 christos *mipsV:
1237 1.1 christos *mips64:
1238 1.1 christos *mips64r2:
1239 1.1 christos *vr4100:
1240 1.1 christos *vr5000:
1241 1.1 christos {
1242 1.1 christos check_u64 (SD_, instruction_0);
1243 1.1 christos do_daddiu (SD_, RS, RT, IMMEDIATE);
1244 1.1 christos }
1245 1.1 christos
1246 1.1 christos
1247 1.1 christos
1248 1.1 christos :function:::void:do_daddu:int rs, int rt, int rd
1249 1.1 christos {
1250 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1251 1.1 christos GPR[rd] = GPR[rs] + GPR[rt];
1252 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
1253 1.1 christos }
1254 1.1 christos
1255 1.1 christos 000000,5.RS,5.RT,5.RD,00000,101101:SPECIAL:64::DADDU
1256 1.1 christos "daddu r<RD>, r<RS>, r<RT>"
1257 1.1 christos *mipsIII:
1258 1.1 christos *mipsIV:
1259 1.1 christos *mipsV:
1260 1.1 christos *mips64:
1261 1.1 christos *mips64r2:
1262 1.1 christos *vr4100:
1263 1.1 christos *vr5000:
1264 1.1 christos {
1265 1.1 christos check_u64 (SD_, instruction_0);
1266 1.1 christos do_daddu (SD_, RS, RT, RD);
1267 1.1 christos }
1268 1.1 christos
1269 1.1 christos
1270 1.1 christos
1271 1.1 christos 011100,5.RS,5.RT,5.RD,00000,100101:SPECIAL2:64::DCLO
1272 1.1 christos "dclo r<RD>, r<RS>"
1273 1.1 christos *mips64:
1274 1.1 christos *mips64r2:
1275 1.1 christos *vr5500:
1276 1.1 christos {
1277 1.1 christos unsigned64 temp = GPR[RS];
1278 1.1 christos unsigned32 i;
1279 1.1 christos unsigned64 mask;
1280 1.1 christos check_u64 (SD_, instruction_0);
1281 1.1 christos if (RT != RD)
1282 1.1 christos Unpredictable ();
1283 1.1 christos TRACE_ALU_INPUT1 (GPR[RS]);
1284 1.1 christos for (mask = ((unsigned64)1<<63), i = 0; i < 64; ++i)
1285 1.1 christos {
1286 1.1 christos if ((temp & mask) == 0)
1287 1.1 christos break;
1288 1.1 christos mask >>= 1;
1289 1.1 christos }
1290 1.1 christos GPR[RD] = EXTEND32 (i);
1291 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
1292 1.1 christos }
1293 1.1 christos
1294 1.1 christos
1295 1.1 christos
1296 1.1 christos 011100,5.RS,5.RT,5.RD,00000,100100:SPECIAL2:64::DCLZ
1297 1.1 christos "dclz r<RD>, r<RS>"
1298 1.1 christos *mips64:
1299 1.1 christos *mips64r2:
1300 1.1 christos *vr5500:
1301 1.1 christos {
1302 1.1 christos unsigned64 temp = GPR[RS];
1303 1.1 christos unsigned32 i;
1304 1.1 christos unsigned64 mask;
1305 1.1 christos check_u64 (SD_, instruction_0);
1306 1.1 christos if (RT != RD)
1307 1.1 christos Unpredictable ();
1308 1.1 christos TRACE_ALU_INPUT1 (GPR[RS]);
1309 1.1 christos for (mask = ((unsigned64)1<<63), i = 0; i < 64; ++i)
1310 1.1 christos {
1311 1.1 christos if ((temp & mask) != 0)
1312 1.1 christos break;
1313 1.1 christos mask >>= 1;
1314 1.1 christos }
1315 1.1 christos GPR[RD] = EXTEND32 (i);
1316 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
1317 1.1 christos }
1318 1.1 christos
1319 1.1 christos
1320 1.1 christos
1321 1.1 christos :function:::void:do_ddiv:int rs, int rt
1322 1.1 christos {
1323 1.1 christos check_div_hilo (SD_, HIHISTORY, LOHISTORY);
1324 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1325 1.1 christos {
1326 1.1 christos signed64 n = GPR[rs];
1327 1.1 christos signed64 d = GPR[rt];
1328 1.1 christos signed64 hi;
1329 1.1 christos signed64 lo;
1330 1.1 christos if (d == 0)
1331 1.1 christos {
1332 1.1 christos lo = SIGNED64 (0x8000000000000000);
1333 1.1 christos hi = 0;
1334 1.1 christos }
1335 1.1 christos else if (d == -1 && n == SIGNED64 (0x8000000000000000))
1336 1.1 christos {
1337 1.1 christos lo = SIGNED64 (0x8000000000000000);
1338 1.1 christos hi = 0;
1339 1.1 christos }
1340 1.1 christos else
1341 1.1 christos {
1342 1.1 christos lo = (n / d);
1343 1.1 christos hi = (n % d);
1344 1.1 christos }
1345 1.1 christos HI = hi;
1346 1.1 christos LO = lo;
1347 1.1 christos }
1348 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
1349 1.1 christos }
1350 1.1 christos
1351 1.1 christos 000000,5.RS,5.RT,0000000000,011110:SPECIAL:64::DDIV
1352 1.1 christos "ddiv r<RS>, r<RT>"
1353 1.1 christos *mipsIII:
1354 1.1 christos *mipsIV:
1355 1.1 christos *mipsV:
1356 1.1 christos *mips64:
1357 1.1 christos *mips64r2:
1358 1.1 christos *vr4100:
1359 1.1 christos *vr5000:
1360 1.1 christos {
1361 1.1 christos check_u64 (SD_, instruction_0);
1362 1.1 christos do_ddiv (SD_, RS, RT);
1363 1.1 christos }
1364 1.1 christos
1365 1.1 christos
1366 1.1 christos
1367 1.1 christos :function:::void:do_ddivu:int rs, int rt
1368 1.1 christos {
1369 1.1 christos check_div_hilo (SD_, HIHISTORY, LOHISTORY);
1370 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1371 1.1 christos {
1372 1.1 christos unsigned64 n = GPR[rs];
1373 1.1 christos unsigned64 d = GPR[rt];
1374 1.1 christos unsigned64 hi;
1375 1.1 christos unsigned64 lo;
1376 1.1 christos if (d == 0)
1377 1.1 christos {
1378 1.1 christos lo = SIGNED64 (0x8000000000000000);
1379 1.1 christos hi = 0;
1380 1.1 christos }
1381 1.1 christos else
1382 1.1 christos {
1383 1.1 christos lo = (n / d);
1384 1.1 christos hi = (n % d);
1385 1.1 christos }
1386 1.1 christos HI = hi;
1387 1.1 christos LO = lo;
1388 1.1 christos }
1389 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
1390 1.1 christos }
1391 1.1 christos
1392 1.1 christos 000000,5.RS,5.RT,0000000000,011111:SPECIAL:64::DDIVU
1393 1.1 christos "ddivu r<RS>, r<RT>"
1394 1.1 christos *mipsIII:
1395 1.1 christos *mipsIV:
1396 1.1 christos *mipsV:
1397 1.1 christos *mips64:
1398 1.1 christos *mips64r2:
1399 1.1 christos *vr4100:
1400 1.1 christos *vr5000:
1401 1.1 christos {
1402 1.1 christos check_u64 (SD_, instruction_0);
1403 1.1 christos do_ddivu (SD_, RS, RT);
1404 1.1 christos }
1405 1.1 christos
1406 1.1 christos :function:::void:do_div:int rs, int rt
1407 1.1 christos {
1408 1.1 christos check_div_hilo (SD_, HIHISTORY, LOHISTORY);
1409 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1410 1.1 christos {
1411 1.1 christos signed32 n = GPR[rs];
1412 1.1 christos signed32 d = GPR[rt];
1413 1.1 christos if (d == 0)
1414 1.1 christos {
1415 1.1 christos LO = EXTEND32 (0x80000000);
1416 1.1 christos HI = EXTEND32 (0);
1417 1.1 christos }
1418 1.1 christos else if (n == SIGNED32 (0x80000000) && d == -1)
1419 1.1 christos {
1420 1.1 christos LO = EXTEND32 (0x80000000);
1421 1.1 christos HI = EXTEND32 (0);
1422 1.1 christos }
1423 1.1 christos else
1424 1.1 christos {
1425 1.1 christos LO = EXTEND32 (n / d);
1426 1.1 christos HI = EXTEND32 (n % d);
1427 1.1 christos }
1428 1.1 christos }
1429 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
1430 1.1 christos }
1431 1.1 christos
1432 1.1 christos 000000,5.RS,5.RT,0000000000,011010:SPECIAL:32::DIV
1433 1.1 christos "div r<RS>, r<RT>"
1434 1.1 christos *mipsI:
1435 1.1 christos *mipsII:
1436 1.1 christos *mipsIII:
1437 1.1 christos *mipsIV:
1438 1.1 christos *mipsV:
1439 1.1 christos *mips32:
1440 1.1 christos *mips32r2:
1441 1.1 christos *mips64:
1442 1.1 christos *mips64r2:
1443 1.1 christos *vr4100:
1444 1.1 christos *vr5000:
1445 1.1 christos *r3900:
1446 1.1 christos {
1447 1.1 christos do_div (SD_, RS, RT);
1448 1.1 christos }
1449 1.1 christos
1450 1.1 christos
1451 1.1 christos
1452 1.1 christos :function:::void:do_divu:int rs, int rt
1453 1.1 christos {
1454 1.1 christos check_div_hilo (SD_, HIHISTORY, LOHISTORY);
1455 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1456 1.1 christos {
1457 1.1 christos unsigned32 n = GPR[rs];
1458 1.1 christos unsigned32 d = GPR[rt];
1459 1.1 christos if (d == 0)
1460 1.1 christos {
1461 1.1 christos LO = EXTEND32 (0x80000000);
1462 1.1 christos HI = EXTEND32 (0);
1463 1.1 christos }
1464 1.1 christos else
1465 1.1 christos {
1466 1.1 christos LO = EXTEND32 (n / d);
1467 1.1 christos HI = EXTEND32 (n % d);
1468 1.1 christos }
1469 1.1 christos }
1470 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
1471 1.1 christos }
1472 1.1 christos
1473 1.1 christos 000000,5.RS,5.RT,0000000000,011011:SPECIAL:32::DIVU
1474 1.1 christos "divu r<RS>, r<RT>"
1475 1.1 christos *mipsI:
1476 1.1 christos *mipsII:
1477 1.1 christos *mipsIII:
1478 1.1 christos *mipsIV:
1479 1.1 christos *mipsV:
1480 1.1 christos *mips32:
1481 1.1 christos *mips32r2:
1482 1.1 christos *mips64:
1483 1.1 christos *mips64r2:
1484 1.1 christos *vr4100:
1485 1.1 christos *vr5000:
1486 1.1 christos *r3900:
1487 1.1 christos {
1488 1.1 christos do_divu (SD_, RS, RT);
1489 1.1 christos }
1490 1.1 christos
1491 1.1 christos
1492 1.1 christos :function:::void:do_dmultx:int rs, int rt, int rd, int signed_p
1493 1.1 christos {
1494 1.1 christos unsigned64 lo;
1495 1.1 christos unsigned64 hi;
1496 1.1 christos unsigned64 m00;
1497 1.1 christos unsigned64 m01;
1498 1.1 christos unsigned64 m10;
1499 1.1 christos unsigned64 m11;
1500 1.1 christos unsigned64 mid;
1501 1.1 christos int sign;
1502 1.1 christos unsigned64 op1 = GPR[rs];
1503 1.1 christos unsigned64 op2 = GPR[rt];
1504 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
1505 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1506 1.1 christos /* make signed multiply unsigned */
1507 1.1 christos sign = 0;
1508 1.1 christos if (signed_p)
1509 1.1 christos {
1510 1.1 christos if ((signed64) op1 < 0)
1511 1.1 christos {
1512 1.1 christos op1 = - op1;
1513 1.1 christos ++sign;
1514 1.1 christos }
1515 1.1 christos if ((signed64) op2 < 0)
1516 1.1 christos {
1517 1.1 christos op2 = - op2;
1518 1.1 christos ++sign;
1519 1.1 christos }
1520 1.1 christos }
1521 1.1 christos /* multiply out the 4 sub products */
1522 1.1 christos m00 = ((unsigned64) VL4_8 (op1) * (unsigned64) VL4_8 (op2));
1523 1.1 christos m10 = ((unsigned64) VH4_8 (op1) * (unsigned64) VL4_8 (op2));
1524 1.1 christos m01 = ((unsigned64) VL4_8 (op1) * (unsigned64) VH4_8 (op2));
1525 1.1 christos m11 = ((unsigned64) VH4_8 (op1) * (unsigned64) VH4_8 (op2));
1526 1.1 christos /* add the products */
1527 1.1 christos mid = ((unsigned64) VH4_8 (m00)
1528 1.1 christos + (unsigned64) VL4_8 (m10)
1529 1.1 christos + (unsigned64) VL4_8 (m01));
1530 1.1 christos lo = U8_4 (mid, m00);
1531 1.1 christos hi = (m11
1532 1.1 christos + (unsigned64) VH4_8 (mid)
1533 1.1 christos + (unsigned64) VH4_8 (m01)
1534 1.1 christos + (unsigned64) VH4_8 (m10));
1535 1.1 christos /* fix the sign */
1536 1.1 christos if (sign & 1)
1537 1.1 christos {
1538 1.1 christos lo = -lo;
1539 1.1 christos if (lo == 0)
1540 1.1 christos hi = -hi;
1541 1.1 christos else
1542 1.1 christos hi = -hi - 1;
1543 1.1 christos }
1544 1.1 christos /* save the result HI/LO (and a gpr) */
1545 1.1 christos LO = lo;
1546 1.1 christos HI = hi;
1547 1.1 christos if (rd != 0)
1548 1.1 christos GPR[rd] = lo;
1549 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
1550 1.1 christos }
1551 1.1 christos
1552 1.1 christos :function:::void:do_dmult:int rs, int rt, int rd
1553 1.1 christos {
1554 1.1 christos do_dmultx (SD_, rs, rt, rd, 1);
1555 1.1 christos }
1556 1.1 christos
1557 1.1 christos 000000,5.RS,5.RT,0000000000,011100:SPECIAL:64::DMULT
1558 1.1 christos "dmult r<RS>, r<RT>"
1559 1.1 christos *mipsIII:
1560 1.1 christos *mipsIV:
1561 1.1 christos *mipsV:
1562 1.1 christos *mips64:
1563 1.1 christos *mips64r2:
1564 1.1 christos *vr4100:
1565 1.1 christos {
1566 1.1 christos check_u64 (SD_, instruction_0);
1567 1.1 christos do_dmult (SD_, RS, RT, 0);
1568 1.1 christos }
1569 1.1 christos
1570 1.1 christos 000000,5.RS,5.RT,5.RD,00000,011100:SPECIAL:64::DMULT
1571 1.1 christos "dmult r<RS>, r<RT>":RD == 0
1572 1.1 christos "dmult r<RD>, r<RS>, r<RT>"
1573 1.1 christos *vr5000:
1574 1.1 christos {
1575 1.1 christos check_u64 (SD_, instruction_0);
1576 1.1 christos do_dmult (SD_, RS, RT, RD);
1577 1.1 christos }
1578 1.1 christos
1579 1.1 christos
1580 1.1 christos
1581 1.1 christos :function:::void:do_dmultu:int rs, int rt, int rd
1582 1.1 christos {
1583 1.1 christos do_dmultx (SD_, rs, rt, rd, 0);
1584 1.1 christos }
1585 1.1 christos
1586 1.1 christos 000000,5.RS,5.RT,0000000000,011101:SPECIAL:64::DMULTU
1587 1.1 christos "dmultu r<RS>, r<RT>"
1588 1.1 christos *mipsIII:
1589 1.1 christos *mipsIV:
1590 1.1 christos *mipsV:
1591 1.1 christos *mips64:
1592 1.1 christos *mips64r2:
1593 1.1 christos *vr4100:
1594 1.1 christos {
1595 1.1 christos check_u64 (SD_, instruction_0);
1596 1.1 christos do_dmultu (SD_, RS, RT, 0);
1597 1.1 christos }
1598 1.1 christos
1599 1.1 christos 000000,5.RS,5.RT,5.RD,00000,011101:SPECIAL:64::DMULTU
1600 1.1 christos "dmultu r<RD>, r<RS>, r<RT>":RD == 0
1601 1.1 christos "dmultu r<RS>, r<RT>"
1602 1.1 christos *vr5000:
1603 1.1 christos {
1604 1.1 christos check_u64 (SD_, instruction_0);
1605 1.1 christos do_dmultu (SD_, RS, RT, RD);
1606 1.1 christos }
1607 1.1 christos
1608 1.1 christos
1609 1.1 christos :function:::unsigned64:do_dror:unsigned64 x,unsigned64 y
1610 1.1 christos {
1611 1.1 christos unsigned64 result;
1612 1.1 christos
1613 1.1 christos y &= 63;
1614 1.1 christos TRACE_ALU_INPUT2 (x, y);
1615 1.1 christos result = ROTR64 (x, y);
1616 1.1 christos TRACE_ALU_RESULT (result);
1617 1.1 christos return result;
1618 1.1 christos }
1619 1.1 christos
1620 1.1 christos 000000,00001,5.RT,5.RD,5.SHIFT,111010::64::DROR
1621 1.1 christos "dror r<RD>, r<RT>, <SHIFT>"
1622 1.1 christos *mips64r2:
1623 1.1 christos *vr5400:
1624 1.1 christos *vr5500:
1625 1.1 christos {
1626 1.1 christos check_u64 (SD_, instruction_0);
1627 1.1 christos GPR[RD] = do_dror (SD_, GPR[RT], SHIFT);
1628 1.1 christos }
1629 1.1 christos
1630 1.1 christos 000000,00001,5.RT,5.RD,5.SHIFT,111110::64::DROR32
1631 1.1 christos "dror32 r<RD>, r<RT>, <SHIFT>"
1632 1.1 christos *mips64r2:
1633 1.1 christos *vr5400:
1634 1.1 christos *vr5500:
1635 1.1 christos {
1636 1.1 christos check_u64 (SD_, instruction_0);
1637 1.1 christos GPR[RD] = do_dror (SD_, GPR[RT], SHIFT + 32);
1638 1.1 christos }
1639 1.1 christos
1640 1.1 christos 000000,5.RS,5.RT,5.RD,00001,010110::64::DRORV
1641 1.1 christos "drorv r<RD>, r<RT>, r<RS>"
1642 1.1 christos *mips64r2:
1643 1.1 christos *vr5400:
1644 1.1 christos *vr5500:
1645 1.1 christos {
1646 1.1 christos check_u64 (SD_, instruction_0);
1647 1.1 christos GPR[RD] = do_dror (SD_, GPR[RT], GPR[RS]);
1648 1.1 christos }
1649 1.1 christos
1650 1.1 christos
1651 1.1 christos :function:::void:do_dsll:int rt, int rd, int shift
1652 1.1 christos {
1653 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], shift);
1654 1.1 christos GPR[rd] = GPR[rt] << shift;
1655 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
1656 1.1 christos }
1657 1.1 christos
1658 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,111000:SPECIAL:64::DSLL
1659 1.1 christos "dsll r<RD>, r<RT>, <SHIFT>"
1660 1.1 christos *mipsIII:
1661 1.1 christos *mipsIV:
1662 1.1 christos *mipsV:
1663 1.1 christos *mips64:
1664 1.1 christos *mips64r2:
1665 1.1 christos *vr4100:
1666 1.1 christos *vr5000:
1667 1.1 christos {
1668 1.1 christos check_u64 (SD_, instruction_0);
1669 1.1 christos do_dsll (SD_, RT, RD, SHIFT);
1670 1.1 christos }
1671 1.1 christos
1672 1.1 christos
1673 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,111100:SPECIAL:64::DSLL32
1674 1.1 christos "dsll32 r<RD>, r<RT>, <SHIFT>"
1675 1.1 christos *mipsIII:
1676 1.1 christos *mipsIV:
1677 1.1 christos *mipsV:
1678 1.1 christos *mips64:
1679 1.1 christos *mips64r2:
1680 1.1 christos *vr4100:
1681 1.1 christos *vr5000:
1682 1.1 christos {
1683 1.1 christos int s = 32 + SHIFT;
1684 1.1 christos check_u64 (SD_, instruction_0);
1685 1.1 christos TRACE_ALU_INPUT2 (GPR[RT], s);
1686 1.1 christos GPR[RD] = GPR[RT] << s;
1687 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
1688 1.1 christos }
1689 1.1 christos
1690 1.1 christos :function:::void:do_dsllv:int rs, int rt, int rd
1691 1.1 christos {
1692 1.1 christos int s = MASKED64 (GPR[rs], 5, 0);
1693 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], s);
1694 1.1 christos GPR[rd] = GPR[rt] << s;
1695 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
1696 1.1 christos }
1697 1.1 christos
1698 1.1 christos 000000,5.RS,5.RT,5.RD,00000,010100:SPECIAL:64::DSLLV
1699 1.1 christos "dsllv r<RD>, r<RT>, r<RS>"
1700 1.1 christos *mipsIII:
1701 1.1 christos *mipsIV:
1702 1.1 christos *mipsV:
1703 1.1 christos *mips64:
1704 1.1 christos *mips64r2:
1705 1.1 christos *vr4100:
1706 1.1 christos *vr5000:
1707 1.1 christos {
1708 1.1 christos check_u64 (SD_, instruction_0);
1709 1.1 christos do_dsllv (SD_, RS, RT, RD);
1710 1.1 christos }
1711 1.1 christos
1712 1.1 christos :function:::void:do_dsra:int rt, int rd, int shift
1713 1.1 christos {
1714 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], shift);
1715 1.1 christos GPR[rd] = ((signed64) GPR[rt]) >> shift;
1716 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
1717 1.1 christos }
1718 1.1 christos
1719 1.1 christos
1720 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,111011:SPECIAL:64::DSRA
1721 1.1 christos "dsra r<RD>, r<RT>, <SHIFT>"
1722 1.1 christos *mipsIII:
1723 1.1 christos *mipsIV:
1724 1.1 christos *mipsV:
1725 1.1 christos *mips64:
1726 1.1 christos *mips64r2:
1727 1.1 christos *vr4100:
1728 1.1 christos *vr5000:
1729 1.1 christos {
1730 1.1 christos check_u64 (SD_, instruction_0);
1731 1.1 christos do_dsra (SD_, RT, RD, SHIFT);
1732 1.1 christos }
1733 1.1 christos
1734 1.1 christos
1735 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,111111:SPECIAL:64::DSRA32
1736 1.1 christos "dsra32 r<RD>, r<RT>, <SHIFT>"
1737 1.1 christos *mipsIII:
1738 1.1 christos *mipsIV:
1739 1.1 christos *mipsV:
1740 1.1 christos *mips64:
1741 1.1 christos *mips64r2:
1742 1.1 christos *vr4100:
1743 1.1 christos *vr5000:
1744 1.1 christos {
1745 1.1 christos int s = 32 + SHIFT;
1746 1.1 christos check_u64 (SD_, instruction_0);
1747 1.1 christos TRACE_ALU_INPUT2 (GPR[RT], s);
1748 1.1 christos GPR[RD] = ((signed64) GPR[RT]) >> s;
1749 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
1750 1.1 christos }
1751 1.1 christos
1752 1.1 christos
1753 1.1 christos :function:::void:do_dsrav:int rs, int rt, int rd
1754 1.1 christos {
1755 1.1 christos int s = MASKED64 (GPR[rs], 5, 0);
1756 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], s);
1757 1.1 christos GPR[rd] = ((signed64) GPR[rt]) >> s;
1758 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
1759 1.1 christos }
1760 1.1 christos
1761 1.1 christos 000000,5.RS,5.RT,5.RD,00000,010111:SPECIAL:64::DSRAV
1762 1.1 christos "dsrav r<RD>, r<RT>, r<RS>"
1763 1.1 christos *mipsIII:
1764 1.1 christos *mipsIV:
1765 1.1 christos *mipsV:
1766 1.1 christos *mips64:
1767 1.1 christos *mips64r2:
1768 1.1 christos *vr4100:
1769 1.1 christos *vr5000:
1770 1.1 christos {
1771 1.1 christos check_u64 (SD_, instruction_0);
1772 1.1 christos do_dsrav (SD_, RS, RT, RD);
1773 1.1 christos }
1774 1.1 christos
1775 1.1 christos :function:::void:do_dsrl:int rt, int rd, int shift
1776 1.1 christos {
1777 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], shift);
1778 1.1 christos GPR[rd] = (unsigned64) GPR[rt] >> shift;
1779 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
1780 1.1 christos }
1781 1.1 christos
1782 1.1 christos
1783 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,111010:SPECIAL:64::DSRL
1784 1.1 christos "dsrl r<RD>, r<RT>, <SHIFT>"
1785 1.1 christos *mipsIII:
1786 1.1 christos *mipsIV:
1787 1.1 christos *mipsV:
1788 1.1 christos *mips64:
1789 1.1 christos *mips64r2:
1790 1.1 christos *vr4100:
1791 1.1 christos *vr5000:
1792 1.1 christos {
1793 1.1 christos check_u64 (SD_, instruction_0);
1794 1.1 christos do_dsrl (SD_, RT, RD, SHIFT);
1795 1.1 christos }
1796 1.1 christos
1797 1.1 christos
1798 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,111110:SPECIAL:64::DSRL32
1799 1.1 christos "dsrl32 r<RD>, r<RT>, <SHIFT>"
1800 1.1 christos *mipsIII:
1801 1.1 christos *mipsIV:
1802 1.1 christos *mipsV:
1803 1.1 christos *mips64:
1804 1.1 christos *mips64r2:
1805 1.1 christos *vr4100:
1806 1.1 christos *vr5000:
1807 1.1 christos {
1808 1.1 christos int s = 32 + SHIFT;
1809 1.1 christos check_u64 (SD_, instruction_0);
1810 1.1 christos TRACE_ALU_INPUT2 (GPR[RT], s);
1811 1.1 christos GPR[RD] = (unsigned64) GPR[RT] >> s;
1812 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
1813 1.1 christos }
1814 1.1 christos
1815 1.1 christos
1816 1.1 christos :function:::void:do_dsrlv:int rs, int rt, int rd
1817 1.1 christos {
1818 1.1 christos int s = MASKED64 (GPR[rs], 5, 0);
1819 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], s);
1820 1.1 christos GPR[rd] = (unsigned64) GPR[rt] >> s;
1821 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
1822 1.1 christos }
1823 1.1 christos
1824 1.1 christos
1825 1.1 christos
1826 1.1 christos 000000,5.RS,5.RT,5.RD,00000,010110:SPECIAL:64::DSRLV
1827 1.1 christos "dsrlv r<RD>, r<RT>, r<RS>"
1828 1.1 christos *mipsIII:
1829 1.1 christos *mipsIV:
1830 1.1 christos *mipsV:
1831 1.1 christos *mips64:
1832 1.1 christos *mips64r2:
1833 1.1 christos *vr4100:
1834 1.1 christos *vr5000:
1835 1.1 christos {
1836 1.1 christos check_u64 (SD_, instruction_0);
1837 1.1 christos do_dsrlv (SD_, RS, RT, RD);
1838 1.1 christos }
1839 1.1 christos
1840 1.1 christos
1841 1.1 christos 000000,5.RS,5.RT,5.RD,00000,101110:SPECIAL:64::DSUB
1842 1.1 christos "dsub r<RD>, r<RS>, r<RT>"
1843 1.1 christos *mipsIII:
1844 1.1 christos *mipsIV:
1845 1.1 christos *mipsV:
1846 1.1 christos *mips64:
1847 1.1 christos *mips64r2:
1848 1.1 christos *vr4100:
1849 1.1 christos *vr5000:
1850 1.1 christos {
1851 1.1 christos check_u64 (SD_, instruction_0);
1852 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
1853 1.1 christos {
1854 1.1 christos ALU64_BEGIN (GPR[RS]);
1855 1.1 christos ALU64_SUB (GPR[RT]);
1856 1.1 christos ALU64_END (GPR[RD]); /* This checks for overflow. */
1857 1.1 christos }
1858 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
1859 1.1 christos }
1860 1.1 christos
1861 1.1 christos
1862 1.1 christos :function:::void:do_dsubu:int rs, int rt, int rd
1863 1.1 christos {
1864 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1865 1.1 christos GPR[rd] = GPR[rs] - GPR[rt];
1866 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
1867 1.1 christos }
1868 1.1 christos
1869 1.1 christos 000000,5.RS,5.RT,5.RD,00000,101111:SPECIAL:64::DSUBU
1870 1.1 christos "dsubu r<RD>, r<RS>, r<RT>"
1871 1.1 christos *mipsIII:
1872 1.1 christos *mipsIV:
1873 1.1 christos *mipsV:
1874 1.1 christos *mips64:
1875 1.1 christos *mips64r2:
1876 1.1 christos *vr4100:
1877 1.1 christos *vr5000:
1878 1.1 christos {
1879 1.1 christos check_u64 (SD_, instruction_0);
1880 1.1 christos do_dsubu (SD_, RS, RT, RD);
1881 1.1 christos }
1882 1.1 christos
1883 1.1 christos
1884 1.1 christos 000010,26.INSTR_INDEX:NORMAL:32::J
1885 1.1 christos "j <INSTR_INDEX>"
1886 1.1 christos *mipsI:
1887 1.1 christos *mipsII:
1888 1.1 christos *mipsIII:
1889 1.1 christos *mipsIV:
1890 1.1 christos *mipsV:
1891 1.1 christos *mips32:
1892 1.1 christos *mips32r2:
1893 1.1 christos *mips64:
1894 1.1 christos *mips64r2:
1895 1.1 christos *vr4100:
1896 1.1 christos *vr5000:
1897 1.1 christos *r3900:
1898 1.1 christos {
1899 1.1 christos /* NOTE: The region used is that of the delay slot NIA and NOT the
1900 1.1 christos current instruction */
1901 1.1 christos address_word region = (NIA & MASK (63, 28));
1902 1.1 christos DELAY_SLOT (region | (INSTR_INDEX << 2));
1903 1.1 christos }
1904 1.1 christos
1905 1.1 christos
1906 1.1 christos 000011,26.INSTR_INDEX:NORMAL:32::JAL
1907 1.1 christos "jal <INSTR_INDEX>"
1908 1.1 christos *mipsI:
1909 1.1 christos *mipsII:
1910 1.1 christos *mipsIII:
1911 1.1 christos *mipsIV:
1912 1.1 christos *mipsV:
1913 1.1 christos *mips32:
1914 1.1 christos *mips32r2:
1915 1.1 christos *mips64:
1916 1.1 christos *mips64r2:
1917 1.1 christos *vr4100:
1918 1.1 christos *vr5000:
1919 1.1 christos *r3900:
1920 1.1 christos {
1921 1.1 christos /* NOTE: The region used is that of the delay slot and NOT the
1922 1.1 christos current instruction */
1923 1.1 christos address_word region = (NIA & MASK (63, 28));
1924 1.1 christos GPR[31] = CIA + 8;
1925 1.1 christos DELAY_SLOT (region | (INSTR_INDEX << 2));
1926 1.1 christos }
1927 1.1 christos
1928 1.1 christos 000000,5.RS,00000,5.RD,00000,001001:SPECIAL:32::JALR
1929 1.1 christos "jalr r<RS>":RD == 31
1930 1.1 christos "jalr r<RD>, r<RS>"
1931 1.1 christos *mipsI:
1932 1.1 christos *mipsII:
1933 1.1 christos *mipsIII:
1934 1.1 christos *mipsIV:
1935 1.1 christos *mipsV:
1936 1.1 christos *mips32:
1937 1.1 christos *mips32r2:
1938 1.1 christos *mips64:
1939 1.1 christos *mips64r2:
1940 1.1 christos *vr4100:
1941 1.1 christos *vr5000:
1942 1.1 christos *r3900:
1943 1.1 christos {
1944 1.1 christos address_word temp = GPR[RS];
1945 1.1 christos GPR[RD] = CIA + 8;
1946 1.1 christos DELAY_SLOT (temp);
1947 1.1 christos }
1948 1.1 christos
1949 1.1 christos 000000,5.RS,00000,5.RD,10000,001001:SPECIAL:32::JALR_HB
1950 1.1 christos "jalr.hb r<RS>":RD == 31
1951 1.1 christos "jalr.hb r<RD>, r<RS>"
1952 1.1 christos *mips32r2:
1953 1.1 christos *mips64r2:
1954 1.1 christos {
1955 1.1 christos address_word temp = GPR[RS];
1956 1.1 christos GPR[RD] = CIA + 8;
1957 1.1 christos DELAY_SLOT (temp);
1958 1.1 christos }
1959 1.1 christos
1960 1.1 christos 000000,5.RS,0000000000,00000,001000:SPECIAL:32::JR
1961 1.1 christos "jr r<RS>"
1962 1.1 christos *mipsI:
1963 1.1 christos *mipsII:
1964 1.1 christos *mipsIII:
1965 1.1 christos *mipsIV:
1966 1.1 christos *mipsV:
1967 1.1 christos *mips32:
1968 1.1 christos *mips32r2:
1969 1.1 christos *mips64:
1970 1.1 christos *mips64r2:
1971 1.1 christos *vr4100:
1972 1.1 christos *vr5000:
1973 1.1 christos *r3900:
1974 1.1 christos {
1975 1.1 christos DELAY_SLOT (GPR[RS]);
1976 1.1 christos }
1977 1.1 christos
1978 1.1 christos 000000,5.RS,0000000000,10000,001000:SPECIAL:32::JR_HB
1979 1.1 christos "jr.hb r<RS>"
1980 1.1 christos *mips32r2:
1981 1.1 christos *mips64r2:
1982 1.1 christos {
1983 1.1 christos DELAY_SLOT (GPR[RS]);
1984 1.1 christos }
1985 1.1 christos
1986 1.1 christos :function:::unsigned_word:do_load:unsigned access, address_word base, address_word offset
1987 1.1 christos {
1988 1.1 christos address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
1989 1.1 christos address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0);
1990 1.1 christos address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0);
1991 1.1 christos unsigned int byte;
1992 1.1 christos address_word paddr;
1993 1.1 christos int uncached;
1994 1.1 christos unsigned64 memval;
1995 1.1 christos address_word vaddr;
1996 1.1 christos
1997 1.1 christos vaddr = loadstore_ea (SD_, base, offset);
1998 1.1 christos if ((vaddr & access) != 0)
1999 1.1 christos {
2000 1.1 christos SIM_CORE_SIGNAL (SD, STATE_CPU (SD, 0), cia, read_map, access+1, vaddr, read_transfer, sim_core_unaligned_signal);
2001 1.1 christos }
2002 1.1 christos AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);
2003 1.1 christos paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
2004 1.1 christos LoadMemory (&memval, NULL, uncached, access, paddr, vaddr, isDATA, isREAL);
2005 1.1 christos byte = ((vaddr & mask) ^ bigendiancpu);
2006 1.1 christos return (memval >> (8 * byte));
2007 1.1 christos }
2008 1.1 christos
2009 1.1 christos :function:::unsigned_word:do_load_left:unsigned access, address_word base, address_word offset, unsigned_word rt
2010 1.1 christos {
2011 1.1 christos address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
2012 1.1 christos address_word reverseendian = (ReverseEndian ? -1 : 0);
2013 1.1 christos address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
2014 1.1 christos unsigned int byte;
2015 1.1 christos unsigned int word;
2016 1.1 christos address_word paddr;
2017 1.1 christos int uncached;
2018 1.1 christos unsigned64 memval;
2019 1.1 christos address_word vaddr;
2020 1.1 christos int nr_lhs_bits;
2021 1.1 christos int nr_rhs_bits;
2022 1.1 christos unsigned_word lhs_mask;
2023 1.1 christos unsigned_word temp;
2024 1.1 christos
2025 1.1 christos vaddr = loadstore_ea (SD_, base, offset);
2026 1.1 christos AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);
2027 1.1 christos paddr = (paddr ^ (reverseendian & mask));
2028 1.1 christos if (BigEndianMem == 0)
2029 1.1 christos paddr = paddr & ~access;
2030 1.1 christos
2031 1.1 christos /* compute where within the word/mem we are */
2032 1.1 christos byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */
2033 1.1 christos word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */
2034 1.1 christos nr_lhs_bits = 8 * byte + 8;
2035 1.1 christos nr_rhs_bits = 8 * access - 8 * byte;
2036 1.1 christos /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */
2037 1.1 christos
2038 1.1 christos /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n",
2039 1.1 christos (long) ((unsigned64) vaddr >> 32), (long) vaddr,
2040 1.1 christos (long) ((unsigned64) paddr >> 32), (long) paddr,
2041 1.1 christos word, byte, nr_lhs_bits, nr_rhs_bits); */
2042 1.1 christos
2043 1.1 christos LoadMemory (&memval, NULL, uncached, byte, paddr, vaddr, isDATA, isREAL);
2044 1.1 christos if (word == 0)
2045 1.1 christos {
2046 1.1 christos /* GPR{31..32-NR_LHS_BITS} = memval{NR_LHS_BITS-1..0} */
2047 1.1 christos temp = (memval << nr_rhs_bits);
2048 1.1 christos }
2049 1.1 christos else
2050 1.1 christos {
2051 1.1 christos /* GPR{31..32-NR_LHS_BITS = memval{32+NR_LHS_BITS..32} */
2052 1.1 christos temp = (memval >> nr_lhs_bits);
2053 1.1 christos }
2054 1.1 christos lhs_mask = LSMASK (nr_lhs_bits + nr_rhs_bits - 1, nr_rhs_bits);
2055 1.1 christos rt = (rt & ~lhs_mask) | (temp & lhs_mask);
2056 1.1 christos
2057 1.1 christos /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx & 0x%08lx%08lx -> 0x%08lx%08lx\n",
2058 1.1 christos (long) ((unsigned64) memval >> 32), (long) memval,
2059 1.1 christos (long) ((unsigned64) temp >> 32), (long) temp,
2060 1.1 christos (long) ((unsigned64) lhs_mask >> 32), (long) lhs_mask,
2061 1.1 christos (long) (rt >> 32), (long) rt); */
2062 1.1 christos return rt;
2063 1.1 christos }
2064 1.1 christos
2065 1.1 christos :function:::unsigned_word:do_load_right:unsigned access, address_word base, address_word offset, unsigned_word rt
2066 1.1 christos {
2067 1.1 christos address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
2068 1.1 christos address_word reverseendian = (ReverseEndian ? -1 : 0);
2069 1.1 christos address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
2070 1.1 christos unsigned int byte;
2071 1.1 christos address_word paddr;
2072 1.1 christos int uncached;
2073 1.1 christos unsigned64 memval;
2074 1.1 christos address_word vaddr;
2075 1.1 christos
2076 1.1 christos vaddr = loadstore_ea (SD_, base, offset);
2077 1.1 christos AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);
2078 1.1 christos /* NOTE: SPEC is wrong, has `BigEndianMem == 0' not `BigEndianMem != 0' */
2079 1.1 christos paddr = (paddr ^ (reverseendian & mask));
2080 1.1 christos if (BigEndianMem != 0)
2081 1.1 christos paddr = paddr & ~access;
2082 1.1 christos byte = ((vaddr & mask) ^ (bigendiancpu & mask));
2083 1.1 christos /* NOTE: SPEC is wrong, had `byte' not `access - byte'. See SW. */
2084 1.1 christos LoadMemory (&memval, NULL, uncached, access - (access & byte), paddr, vaddr, isDATA, isREAL);
2085 1.1 christos /* printf ("lr: 0x%08lx %d@0x%08lx 0x%08lx\n",
2086 1.1 christos (long) paddr, byte, (long) paddr, (long) memval); */
2087 1.1 christos {
2088 1.1 christos unsigned_word screen = LSMASK (8 * (access - (byte & access) + 1) - 1, 0);
2089 1.1 christos rt &= ~screen;
2090 1.1 christos rt |= (memval >> (8 * byte)) & screen;
2091 1.1 christos }
2092 1.1 christos return rt;
2093 1.1 christos }
2094 1.1 christos
2095 1.1 christos
2096 1.1 christos 100000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LB
2097 1.1 christos "lb r<RT>, <OFFSET>(r<BASE>)"
2098 1.1 christos *mipsI:
2099 1.1 christos *mipsII:
2100 1.1 christos *mipsIII:
2101 1.1 christos *mipsIV:
2102 1.1 christos *mipsV:
2103 1.1 christos *mips32:
2104 1.1 christos *mips32r2:
2105 1.1 christos *mips64:
2106 1.1 christos *mips64r2:
2107 1.1 christos *vr4100:
2108 1.1 christos *vr5000:
2109 1.1 christos *r3900:
2110 1.1 christos {
2111 1.1 christos GPR[RT] = EXTEND8 (do_load (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET)));
2112 1.1 christos }
2113 1.1 christos
2114 1.1 christos
2115 1.1 christos 100100,5.BASE,5.RT,16.OFFSET:NORMAL:32::LBU
2116 1.1 christos "lbu r<RT>, <OFFSET>(r<BASE>)"
2117 1.1 christos *mipsI:
2118 1.1 christos *mipsII:
2119 1.1 christos *mipsIII:
2120 1.1 christos *mipsIV:
2121 1.1 christos *mipsV:
2122 1.1 christos *mips32:
2123 1.1 christos *mips32r2:
2124 1.1 christos *mips64:
2125 1.1 christos *mips64r2:
2126 1.1 christos *vr4100:
2127 1.1 christos *vr5000:
2128 1.1 christos *r3900:
2129 1.1 christos {
2130 1.1 christos GPR[RT] = do_load (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET));
2131 1.1 christos }
2132 1.1 christos
2133 1.1 christos
2134 1.1 christos 110111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LD
2135 1.1 christos "ld r<RT>, <OFFSET>(r<BASE>)"
2136 1.1 christos *mipsIII:
2137 1.1 christos *mipsIV:
2138 1.1 christos *mipsV:
2139 1.1 christos *mips64:
2140 1.1 christos *mips64r2:
2141 1.1 christos *vr4100:
2142 1.1 christos *vr5000:
2143 1.1 christos {
2144 1.1 christos check_u64 (SD_, instruction_0);
2145 1.1 christos GPR[RT] = EXTEND64 (do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));
2146 1.1 christos }
2147 1.1 christos
2148 1.1 christos
2149 1.1 christos 1101,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDCz
2150 1.1 christos "ldc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2151 1.1 christos *mipsII:
2152 1.1 christos *mipsIII:
2153 1.1 christos *mipsIV:
2154 1.1 christos *mipsV:
2155 1.1 christos *mips32:
2156 1.1 christos *mips32r2:
2157 1.1 christos *mips64:
2158 1.1 christos *mips64r2:
2159 1.1 christos *vr4100:
2160 1.1 christos *vr5000:
2161 1.1 christos *r3900:
2162 1.1 christos {
2163 1.1 christos COP_LD (ZZ, RT, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));
2164 1.1 christos }
2165 1.1 christos
2166 1.1 christos
2167 1.1 christos
2168 1.1 christos
2169 1.1 christos 011010,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDL
2170 1.1 christos "ldl r<RT>, <OFFSET>(r<BASE>)"
2171 1.1 christos *mipsIII:
2172 1.1 christos *mipsIV:
2173 1.1 christos *mipsV:
2174 1.1 christos *mips64:
2175 1.1 christos *mips64r2:
2176 1.1 christos *vr4100:
2177 1.1 christos *vr5000:
2178 1.1 christos {
2179 1.1 christos check_u64 (SD_, instruction_0);
2180 1.1 christos GPR[RT] = do_load_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
2181 1.1 christos }
2182 1.1 christos
2183 1.1 christos
2184 1.1 christos 011011,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDR
2185 1.1 christos "ldr r<RT>, <OFFSET>(r<BASE>)"
2186 1.1 christos *mipsIII:
2187 1.1 christos *mipsIV:
2188 1.1 christos *mipsV:
2189 1.1 christos *mips64:
2190 1.1 christos *mips64r2:
2191 1.1 christos *vr4100:
2192 1.1 christos *vr5000:
2193 1.1 christos {
2194 1.1 christos check_u64 (SD_, instruction_0);
2195 1.1 christos GPR[RT] = do_load_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
2196 1.1 christos }
2197 1.1 christos
2198 1.1 christos
2199 1.1 christos 100001,5.BASE,5.RT,16.OFFSET:NORMAL:32::LH
2200 1.1 christos "lh r<RT>, <OFFSET>(r<BASE>)"
2201 1.1 christos *mipsI:
2202 1.1 christos *mipsII:
2203 1.1 christos *mipsIII:
2204 1.1 christos *mipsIV:
2205 1.1 christos *mipsV:
2206 1.1 christos *mips32:
2207 1.1 christos *mips32r2:
2208 1.1 christos *mips64:
2209 1.1 christos *mips64r2:
2210 1.1 christos *vr4100:
2211 1.1 christos *vr5000:
2212 1.1 christos *r3900:
2213 1.1 christos {
2214 1.1 christos GPR[RT] = EXTEND16 (do_load (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET)));
2215 1.1 christos }
2216 1.1 christos
2217 1.1 christos
2218 1.1 christos 100101,5.BASE,5.RT,16.OFFSET:NORMAL:32::LHU
2219 1.1 christos "lhu r<RT>, <OFFSET>(r<BASE>)"
2220 1.1 christos *mipsI:
2221 1.1 christos *mipsII:
2222 1.1 christos *mipsIII:
2223 1.1 christos *mipsIV:
2224 1.1 christos *mipsV:
2225 1.1 christos *mips32:
2226 1.1 christos *mips32r2:
2227 1.1 christos *mips64:
2228 1.1 christos *mips64r2:
2229 1.1 christos *vr4100:
2230 1.1 christos *vr5000:
2231 1.1 christos *r3900:
2232 1.1 christos {
2233 1.1 christos GPR[RT] = do_load (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET));
2234 1.1 christos }
2235 1.1 christos
2236 1.1 christos
2237 1.1 christos 110000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LL
2238 1.1 christos "ll r<RT>, <OFFSET>(r<BASE>)"
2239 1.1 christos *mipsII:
2240 1.1 christos *mipsIII:
2241 1.1 christos *mipsIV:
2242 1.1 christos *mipsV:
2243 1.1 christos *mips32:
2244 1.1 christos *mips32r2:
2245 1.1 christos *mips64:
2246 1.1 christos *mips64r2:
2247 1.1 christos *vr4100:
2248 1.1 christos *vr5000:
2249 1.1 christos {
2250 1.1 christos address_word base = GPR[BASE];
2251 1.1 christos address_word offset = EXTEND16 (OFFSET);
2252 1.1 christos {
2253 1.1 christos address_word vaddr = loadstore_ea (SD_, base, offset);
2254 1.1 christos address_word paddr;
2255 1.1 christos int uncached;
2256 1.1 christos if ((vaddr & 3) != 0)
2257 1.1 christos {
2258 1.1 christos SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, read_transfer, sim_core_unaligned_signal);
2259 1.1 christos }
2260 1.1 christos else
2261 1.1 christos {
2262 1.1 christos if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2263 1.1 christos {
2264 1.1 christos unsigned64 memval = 0;
2265 1.1 christos unsigned64 memval1 = 0;
2266 1.1 christos unsigned64 mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
2267 1.1 christos unsigned int shift = 2;
2268 1.1 christos unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2269 1.1 christos unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2270 1.1 christos unsigned int byte;
2271 1.1 christos paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2272 1.1 christos LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
2273 1.1 christos byte = ((vaddr & mask) ^ (bigend << shift));
2274 1.1 christos GPR[RT] = EXTEND32 (memval >> (8 * byte));
2275 1.1 christos LLBIT = 1;
2276 1.1 christos }
2277 1.1 christos }
2278 1.1 christos }
2279 1.1 christos }
2280 1.1 christos
2281 1.1 christos
2282 1.1 christos 110100,5.BASE,5.RT,16.OFFSET:NORMAL:64::LLD
2283 1.1 christos "lld r<RT>, <OFFSET>(r<BASE>)"
2284 1.1 christos *mipsIII:
2285 1.1 christos *mipsIV:
2286 1.1 christos *mipsV:
2287 1.1 christos *mips64:
2288 1.1 christos *mips64r2:
2289 1.1 christos *vr4100:
2290 1.1 christos *vr5000:
2291 1.1 christos {
2292 1.1 christos address_word base = GPR[BASE];
2293 1.1 christos address_word offset = EXTEND16 (OFFSET);
2294 1.1 christos check_u64 (SD_, instruction_0);
2295 1.1 christos {
2296 1.1 christos address_word vaddr = loadstore_ea (SD_, base, offset);
2297 1.1 christos address_word paddr;
2298 1.1 christos int uncached;
2299 1.1 christos if ((vaddr & 7) != 0)
2300 1.1 christos {
2301 1.1 christos SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 8, vaddr, read_transfer, sim_core_unaligned_signal);
2302 1.1 christos }
2303 1.1 christos else
2304 1.1 christos {
2305 1.1 christos if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2306 1.1 christos {
2307 1.1 christos unsigned64 memval = 0;
2308 1.1 christos unsigned64 memval1 = 0;
2309 1.1 christos LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
2310 1.1 christos GPR[RT] = memval;
2311 1.1 christos LLBIT = 1;
2312 1.1 christos }
2313 1.1 christos }
2314 1.1 christos }
2315 1.1 christos }
2316 1.1 christos
2317 1.1 christos
2318 1.1 christos 001111,00000,5.RT,16.IMMEDIATE:NORMAL:32::LUI
2319 1.1 christos "lui r<RT>, %#lx<IMMEDIATE>"
2320 1.1 christos *mipsI:
2321 1.1 christos *mipsII:
2322 1.1 christos *mipsIII:
2323 1.1 christos *mipsIV:
2324 1.1 christos *mipsV:
2325 1.1 christos *mips32:
2326 1.1 christos *mips32r2:
2327 1.1 christos *mips64:
2328 1.1 christos *mips64r2:
2329 1.1 christos *vr4100:
2330 1.1 christos *vr5000:
2331 1.1 christos *r3900:
2332 1.1 christos {
2333 1.1 christos TRACE_ALU_INPUT1 (IMMEDIATE);
2334 1.1 christos GPR[RT] = EXTEND32 (IMMEDIATE << 16);
2335 1.1 christos TRACE_ALU_RESULT (GPR[RT]);
2336 1.1 christos }
2337 1.1 christos
2338 1.1 christos
2339 1.1 christos 100011,5.BASE,5.RT,16.OFFSET:NORMAL:32::LW
2340 1.1 christos "lw r<RT>, <OFFSET>(r<BASE>)"
2341 1.1 christos *mipsI:
2342 1.1 christos *mipsII:
2343 1.1 christos *mipsIII:
2344 1.1 christos *mipsIV:
2345 1.1 christos *mipsV:
2346 1.1 christos *mips32:
2347 1.1 christos *mips32r2:
2348 1.1 christos *mips64:
2349 1.1 christos *mips64r2:
2350 1.1 christos *vr4100:
2351 1.1 christos *vr5000:
2352 1.1 christos *r3900:
2353 1.1 christos {
2354 1.1 christos GPR[RT] = EXTEND32 (do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET)));
2355 1.1 christos }
2356 1.1 christos
2357 1.1 christos
2358 1.1 christos 1100,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWCz
2359 1.1 christos "lwc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2360 1.1 christos *mipsI:
2361 1.1 christos *mipsII:
2362 1.1 christos *mipsIII:
2363 1.1 christos *mipsIV:
2364 1.1 christos *mipsV:
2365 1.1 christos *mips32:
2366 1.1 christos *mips32r2:
2367 1.1 christos *mips64:
2368 1.1 christos *mips64r2:
2369 1.1 christos *vr4100:
2370 1.1 christos *vr5000:
2371 1.1 christos *r3900:
2372 1.1 christos {
2373 1.1 christos COP_LW (ZZ, RT, do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET)));
2374 1.1 christos }
2375 1.1 christos
2376 1.1 christos
2377 1.1 christos 100010,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWL
2378 1.1 christos "lwl r<RT>, <OFFSET>(r<BASE>)"
2379 1.1 christos *mipsI:
2380 1.1 christos *mipsII:
2381 1.1 christos *mipsIII:
2382 1.1 christos *mipsIV:
2383 1.1 christos *mipsV:
2384 1.1 christos *mips32:
2385 1.1 christos *mips32r2:
2386 1.1 christos *mips64:
2387 1.1 christos *mips64r2:
2388 1.1 christos *vr4100:
2389 1.1 christos *vr5000:
2390 1.1 christos *r3900:
2391 1.1 christos {
2392 1.1 christos GPR[RT] = EXTEND32 (do_load_left (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]));
2393 1.1 christos }
2394 1.1 christos
2395 1.1 christos
2396 1.1 christos 100110,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWR
2397 1.1 christos "lwr r<RT>, <OFFSET>(r<BASE>)"
2398 1.1 christos *mipsI:
2399 1.1 christos *mipsII:
2400 1.1 christos *mipsIII:
2401 1.1 christos *mipsIV:
2402 1.1 christos *mipsV:
2403 1.1 christos *mips32:
2404 1.1 christos *mips32r2:
2405 1.1 christos *mips64:
2406 1.1 christos *mips64r2:
2407 1.1 christos *vr4100:
2408 1.1 christos *vr5000:
2409 1.1 christos *r3900:
2410 1.1 christos {
2411 1.1 christos GPR[RT] = EXTEND32 (do_load_right (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]));
2412 1.1 christos }
2413 1.1 christos
2414 1.1 christos
2415 1.1 christos 100111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LWU
2416 1.1 christos "lwu r<RT>, <OFFSET>(r<BASE>)"
2417 1.1 christos *mipsIII:
2418 1.1 christos *mipsIV:
2419 1.1 christos *mipsV:
2420 1.1 christos *mips64:
2421 1.1 christos *mips64r2:
2422 1.1 christos *vr4100:
2423 1.1 christos *vr5000:
2424 1.1 christos {
2425 1.1 christos check_u64 (SD_, instruction_0);
2426 1.1 christos GPR[RT] = do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET));
2427 1.1 christos }
2428 1.1 christos
2429 1.1 christos
2430 1.1 christos
2431 1.1 christos 011100,5.RS,5.RT,00000,00000,000000:SPECIAL2:32::MADD
2432 1.1 christos "madd r<RS>, r<RT>"
2433 1.1 christos *mips32:
2434 1.1 christos *mips64:
2435 1.1 christos *vr5500:
2436 1.1 christos {
2437 1.1 christos signed64 temp;
2438 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2439 1.1 christos if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2440 1.1 christos Unpredictable ();
2441 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2442 1.1 christos temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
2443 1.1 christos + ((signed64) EXTEND32 (GPR[RT]) * (signed64) EXTEND32 (GPR[RS])));
2444 1.1 christos LO = EXTEND32 (temp);
2445 1.1 christos HI = EXTEND32 (VH4_8 (temp));
2446 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
2447 1.1 christos }
2448 1.1 christos
2449 1.1 christos
2450 1.1 christos 011100,5.RS,5.RT,000,2.AC,00000,000000:SPECIAL2:32::MADD
2451 1.1 christos "madd r<RS>, r<RT>":AC == 0
2452 1.1 christos "madd ac<AC>, r<RS>, r<RT>"
2453 1.1 christos *mips32r2:
2454 1.1 christos *mips64r2:
2455 1.1 christos *dsp2:
2456 1.1 christos {
2457 1.1 christos signed64 temp;
2458 1.1 christos if (AC == 0)
2459 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2460 1.1 christos if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2461 1.1 christos Unpredictable ();
2462 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2463 1.1 christos temp = (U8_4 (VL4_8 (DSPHI(AC)), VL4_8 (DSPLO(AC)))
2464 1.1 christos + ((signed64) EXTEND32 (GPR[RT]) * (signed64) EXTEND32 (GPR[RS])));
2465 1.1 christos DSPLO(AC) = EXTEND32 (temp);
2466 1.1 christos DSPHI(AC) = EXTEND32 (VH4_8 (temp));
2467 1.1 christos if (AC == 0)
2468 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
2469 1.1 christos }
2470 1.1 christos
2471 1.1 christos
2472 1.1 christos 011100,5.RS,5.RT,00000,00000,000001:SPECIAL2:32::MADDU
2473 1.1 christos "maddu r<RS>, r<RT>"
2474 1.1 christos *mips32:
2475 1.1 christos *mips64:
2476 1.1 christos *vr5500:
2477 1.1 christos {
2478 1.1 christos unsigned64 temp;
2479 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2480 1.1 christos if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2481 1.1 christos Unpredictable ();
2482 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2483 1.1 christos temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
2484 1.1 christos + ((unsigned64) VL4_8 (GPR[RS]) * (unsigned64) VL4_8 (GPR[RT])));
2485 1.1 christos ACX += U8_4 (VL4_8 (HI), VL4_8 (LO)) < temp; /* SmartMIPS */
2486 1.1 christos LO = EXTEND32 (temp);
2487 1.1 christos HI = EXTEND32 (VH4_8 (temp));
2488 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
2489 1.1 christos }
2490 1.1 christos
2491 1.1 christos
2492 1.1 christos 011100,5.RS,5.RT,000,2.AC,00000,000001:SPECIAL2:32::MADDU
2493 1.1 christos "maddu r<RS>, r<RT>":AC == 0
2494 1.1 christos "maddu ac<AC>, r<RS>, r<RT>"
2495 1.1 christos *mips32r2:
2496 1.1 christos *mips64r2:
2497 1.1 christos *dsp2:
2498 1.1 christos {
2499 1.1 christos unsigned64 temp;
2500 1.1 christos if (AC == 0)
2501 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2502 1.1 christos if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2503 1.1 christos Unpredictable ();
2504 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2505 1.1 christos temp = (U8_4 (VL4_8 (DSPHI(AC)), VL4_8 (DSPLO(AC)))
2506 1.1 christos + ((unsigned64) VL4_8 (GPR[RS]) * (unsigned64) VL4_8 (GPR[RT])));
2507 1.1 christos if (AC == 0)
2508 1.1 christos ACX += U8_4 (VL4_8 (HI), VL4_8 (LO)) < temp; /* SmartMIPS */
2509 1.1 christos DSPLO(AC) = EXTEND32 (temp);
2510 1.1 christos DSPHI(AC) = EXTEND32 (VH4_8 (temp));
2511 1.1 christos if (AC == 0)
2512 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
2513 1.1 christos }
2514 1.1 christos
2515 1.1 christos
2516 1.1 christos :function:::void:do_mfhi:int rd
2517 1.1 christos {
2518 1.1 christos check_mf_hilo (SD_, HIHISTORY, LOHISTORY);
2519 1.1 christos TRACE_ALU_INPUT1 (HI);
2520 1.1 christos GPR[rd] = HI;
2521 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
2522 1.1 christos }
2523 1.1 christos
2524 1.1 christos 000000,0000000000,5.RD,00000,010000:SPECIAL:32::MFHI
2525 1.1 christos "mfhi r<RD>"
2526 1.1 christos *mipsI:
2527 1.1 christos *mipsII:
2528 1.1 christos *mipsIII:
2529 1.1 christos *mipsIV:
2530 1.1 christos *mipsV:
2531 1.1 christos *vr4100:
2532 1.1 christos *vr5000:
2533 1.1 christos *r3900:
2534 1.1 christos *mips32:
2535 1.1 christos *mips64:
2536 1.1 christos {
2537 1.1 christos do_mfhi (SD_, RD);
2538 1.1 christos }
2539 1.1 christos
2540 1.1 christos
2541 1.1 christos 000000,000,2.AC,00000,5.RD,00000,010000:SPECIAL:32::MFHI
2542 1.1 christos "mfhi r<RD>":AC == 0
2543 1.1 christos "mfhi r<RD>, ac<AC>"
2544 1.1 christos *mips32r2:
2545 1.1 christos *mips64r2:
2546 1.1 christos *dsp:
2547 1.1 christos {
2548 1.1 christos if (AC == 0)
2549 1.1 christos do_mfhi (SD_, RD);
2550 1.1 christos else
2551 1.1 christos GPR[RD] = DSPHI(AC);
2552 1.1 christos }
2553 1.1 christos
2554 1.1 christos
2555 1.1 christos :function:::void:do_mflo:int rd
2556 1.1 christos {
2557 1.1 christos check_mf_hilo (SD_, LOHISTORY, HIHISTORY);
2558 1.1 christos TRACE_ALU_INPUT1 (LO);
2559 1.1 christos GPR[rd] = LO;
2560 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
2561 1.1 christos }
2562 1.1 christos
2563 1.1 christos 000000,0000000000,5.RD,00000,010010:SPECIAL:32::MFLO
2564 1.1 christos "mflo r<RD>"
2565 1.1 christos *mipsI:
2566 1.1 christos *mipsII:
2567 1.1 christos *mipsIII:
2568 1.1 christos *mipsIV:
2569 1.1 christos *mipsV:
2570 1.1 christos *vr4100:
2571 1.1 christos *vr5000:
2572 1.1 christos *r3900:
2573 1.1 christos *mips32:
2574 1.1 christos *mips64:
2575 1.1 christos {
2576 1.1 christos do_mflo (SD_, RD);
2577 1.1 christos }
2578 1.1 christos
2579 1.1 christos
2580 1.1 christos 000000,000,2.AC,00000,5.RD,00000,010010:SPECIAL:32::MFLO
2581 1.1 christos "mflo r<RD>":AC == 0
2582 1.1 christos "mflo r<RD>, ac<AC>"
2583 1.1 christos *mips32r2:
2584 1.1 christos *mips64r2:
2585 1.1 christos *dsp:
2586 1.1 christos {
2587 1.1 christos if (AC == 0)
2588 1.1 christos do_mflo (SD_, RD);
2589 1.1 christos else
2590 1.1 christos GPR[RD] = DSPLO(AC);
2591 1.1 christos }
2592 1.1 christos
2593 1.1 christos
2594 1.1 christos 000000,5.RS,5.RT,5.RD,00000,001011:SPECIAL:32::MOVN
2595 1.1 christos "movn r<RD>, r<RS>, r<RT>"
2596 1.1 christos *mipsIV:
2597 1.1 christos *mipsV:
2598 1.1 christos *mips32:
2599 1.1 christos *mips32r2:
2600 1.1 christos *mips64:
2601 1.1 christos *mips64r2:
2602 1.1 christos *vr5000:
2603 1.1 christos {
2604 1.1 christos if (GPR[RT] != 0)
2605 1.1 christos {
2606 1.1 christos GPR[RD] = GPR[RS];
2607 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
2608 1.1 christos }
2609 1.1 christos }
2610 1.1 christos
2611 1.1 christos
2612 1.1 christos
2613 1.1 christos 000000,5.RS,5.RT,5.RD,00000,001010:SPECIAL:32::MOVZ
2614 1.1 christos "movz r<RD>, r<RS>, r<RT>"
2615 1.1 christos *mipsIV:
2616 1.1 christos *mipsV:
2617 1.1 christos *mips32:
2618 1.1 christos *mips32r2:
2619 1.1 christos *mips64:
2620 1.1 christos *mips64r2:
2621 1.1 christos *vr5000:
2622 1.1 christos {
2623 1.1 christos if (GPR[RT] == 0)
2624 1.1 christos {
2625 1.1 christos GPR[RD] = GPR[RS];
2626 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
2627 1.1 christos }
2628 1.1 christos }
2629 1.1 christos
2630 1.1 christos
2631 1.1 christos
2632 1.1 christos 011100,5.RS,5.RT,00000,00000,000100:SPECIAL2:32::MSUB
2633 1.1 christos "msub r<RS>, r<RT>"
2634 1.1 christos *mips32:
2635 1.1 christos *mips64:
2636 1.1 christos *vr5500:
2637 1.1 christos {
2638 1.1 christos signed64 temp;
2639 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2640 1.1 christos if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2641 1.1 christos Unpredictable ();
2642 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2643 1.1 christos temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
2644 1.1 christos - ((signed64) EXTEND32 (GPR[RT]) * (signed64) EXTEND32 (GPR[RS])));
2645 1.1 christos LO = EXTEND32 (temp);
2646 1.1 christos HI = EXTEND32 (VH4_8 (temp));
2647 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
2648 1.1 christos }
2649 1.1 christos
2650 1.1 christos
2651 1.1 christos 011100,5.RS,5.RT,000,2.AC,00000,000100:SPECIAL2:32::MSUB
2652 1.1 christos "msub r<RS>, r<RT>":AC == 0
2653 1.1 christos "msub ac<AC>, r<RS>, r<RT>"
2654 1.1 christos *mips32r2:
2655 1.1 christos *mips64r2:
2656 1.1 christos *dsp2:
2657 1.1 christos {
2658 1.1 christos signed64 temp;
2659 1.1 christos if (AC == 0)
2660 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2661 1.1 christos if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2662 1.1 christos Unpredictable ();
2663 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2664 1.1 christos temp = (U8_4 (VL4_8 (DSPHI(AC)), VL4_8 (DSPLO(AC)))
2665 1.1 christos - ((signed64) EXTEND32 (GPR[RT]) * (signed64) EXTEND32 (GPR[RS])));
2666 1.1 christos DSPLO(AC) = EXTEND32 (temp);
2667 1.1 christos DSPHI(AC) = EXTEND32 (VH4_8 (temp));
2668 1.1 christos if (AC == 0)
2669 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
2670 1.1 christos }
2671 1.1 christos
2672 1.1 christos
2673 1.1 christos 011100,5.RS,5.RT,00000,00000,000101:SPECIAL2:32::MSUBU
2674 1.1 christos "msubu r<RS>, r<RT>"
2675 1.1 christos *mips32:
2676 1.1 christos *mips64:
2677 1.1 christos *vr5500:
2678 1.1 christos {
2679 1.1 christos unsigned64 temp;
2680 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2681 1.1 christos if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2682 1.1 christos Unpredictable ();
2683 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2684 1.1 christos temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
2685 1.1 christos - ((unsigned64) VL4_8 (GPR[RS]) * (unsigned64) VL4_8 (GPR[RT])));
2686 1.1 christos LO = EXTEND32 (temp);
2687 1.1 christos HI = EXTEND32 (VH4_8 (temp));
2688 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
2689 1.1 christos }
2690 1.1 christos
2691 1.1 christos
2692 1.1 christos 011100,5.RS,5.RT,000,2.AC,00000,000101:SPECIAL2:32::MSUBU
2693 1.1 christos "msubu r<RS>, r<RT>":AC == 0
2694 1.1 christos "msubu ac<AC>, r<RS>, r<RT>"
2695 1.1 christos *mips32r2:
2696 1.1 christos *mips64r2:
2697 1.1 christos *dsp2:
2698 1.1 christos {
2699 1.1 christos unsigned64 temp;
2700 1.1 christos if (AC == 0)
2701 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2702 1.1 christos if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2703 1.1 christos Unpredictable ();
2704 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2705 1.1 christos temp = (U8_4 (VL4_8 (DSPHI(AC)), VL4_8 (DSPLO(AC)))
2706 1.1 christos - ((unsigned64) VL4_8 (GPR[RS]) * (unsigned64) VL4_8 (GPR[RT])));
2707 1.1 christos DSPLO(AC) = EXTEND32 (temp);
2708 1.1 christos DSPHI(AC) = EXTEND32 (VH4_8 (temp));
2709 1.1 christos if (AC == 0)
2710 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
2711 1.1 christos }
2712 1.1 christos
2713 1.1 christos
2714 1.1 christos 000000,5.RS,000000000000000,010001:SPECIAL:32::MTHI
2715 1.1 christos "mthi r<RS>"
2716 1.1 christos *mipsI:
2717 1.1 christos *mipsII:
2718 1.1 christos *mipsIII:
2719 1.1 christos *mipsIV:
2720 1.1 christos *mipsV:
2721 1.1 christos *vr4100:
2722 1.1 christos *vr5000:
2723 1.1 christos *r3900:
2724 1.1 christos *mips32:
2725 1.1 christos *mips64:
2726 1.1 christos {
2727 1.1 christos check_mt_hilo (SD_, HIHISTORY);
2728 1.1 christos HI = GPR[RS];
2729 1.1 christos }
2730 1.1 christos
2731 1.1 christos
2732 1.1 christos 000000,5.RS,00000,000,2.AC,00000,010001:SPECIAL:32::MTHI
2733 1.1 christos "mthi r<RS>":AC == 0
2734 1.1 christos "mthi r<RS>, ac<AC>"
2735 1.1 christos *mips32r2:
2736 1.1 christos *mips64r2:
2737 1.1 christos *dsp:
2738 1.1 christos {
2739 1.1 christos if (AC == 0)
2740 1.1 christos check_mt_hilo (SD_, HIHISTORY);
2741 1.1 christos DSPHI(AC) = GPR[RS];
2742 1.1 christos }
2743 1.1 christos
2744 1.1 christos
2745 1.1 christos 000000,5.RS,000000000000000,010011:SPECIAL:32::MTLO
2746 1.1 christos "mtlo r<RS>"
2747 1.1 christos *mipsI:
2748 1.1 christos *mipsII:
2749 1.1 christos *mipsIII:
2750 1.1 christos *mipsIV:
2751 1.1 christos *mipsV:
2752 1.1 christos *vr4100:
2753 1.1 christos *vr5000:
2754 1.1 christos *r3900:
2755 1.1 christos *mips32:
2756 1.1 christos *mips64:
2757 1.1 christos {
2758 1.1 christos check_mt_hilo (SD_, LOHISTORY);
2759 1.1 christos LO = GPR[RS];
2760 1.1 christos }
2761 1.1 christos
2762 1.1 christos
2763 1.1 christos 000000,5.RS,00000,000,2.AC,00000,010011:SPECIAL:32::MTLO
2764 1.1 christos "mtlo r<RS>":AC == 0
2765 1.1 christos "mtlo r<RS>, ac<AC>"
2766 1.1 christos *mips32r2:
2767 1.1 christos *mips64r2:
2768 1.1 christos *dsp:
2769 1.1 christos {
2770 1.1 christos if (AC == 0)
2771 1.1 christos check_mt_hilo (SD_, LOHISTORY);
2772 1.1 christos DSPLO(AC) = GPR[RS];
2773 1.1 christos }
2774 1.1 christos
2775 1.1 christos
2776 1.1 christos 011100,5.RS,5.RT,5.RD,00000,000010:SPECIAL2:32::MUL
2777 1.1 christos "mul r<RD>, r<RS>, r<RT>"
2778 1.1 christos *mips32:
2779 1.1 christos *mips32r2:
2780 1.1 christos *mips64:
2781 1.1 christos *mips64r2:
2782 1.1 christos *vr5500:
2783 1.1 christos {
2784 1.1 christos signed64 prod;
2785 1.1 christos if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2786 1.1 christos Unpredictable ();
2787 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2788 1.1 christos prod = (((signed64)(signed32) GPR[RS])
2789 1.1 christos * ((signed64)(signed32) GPR[RT]));
2790 1.1 christos GPR[RD] = EXTEND32 (VL4_8 (prod));
2791 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
2792 1.1 christos }
2793 1.1 christos
2794 1.1 christos
2795 1.1 christos
2796 1.1 christos :function:::void:do_mult:int rs, int rt, int rd
2797 1.1 christos {
2798 1.1 christos signed64 prod;
2799 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2800 1.1 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
2801 1.1 christos Unpredictable ();
2802 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2803 1.1 christos prod = (((signed64)(signed32) GPR[rs])
2804 1.1 christos * ((signed64)(signed32) GPR[rt]));
2805 1.1 christos LO = EXTEND32 (VL4_8 (prod));
2806 1.1 christos HI = EXTEND32 (VH4_8 (prod));
2807 1.1 christos ACX = 0; /* SmartMIPS */
2808 1.1 christos if (rd != 0)
2809 1.1 christos GPR[rd] = LO;
2810 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
2811 1.1 christos }
2812 1.1 christos
2813 1.1 christos 000000,5.RS,5.RT,0000000000,011000:SPECIAL:32::MULT
2814 1.1 christos "mult r<RS>, r<RT>"
2815 1.1 christos *mipsI:
2816 1.1 christos *mipsII:
2817 1.1 christos *mipsIII:
2818 1.1 christos *mipsIV:
2819 1.1 christos *mipsV:
2820 1.1 christos *mips32:
2821 1.1 christos *mips64:
2822 1.1 christos *vr4100:
2823 1.1 christos {
2824 1.1 christos do_mult (SD_, RS, RT, 0);
2825 1.1 christos }
2826 1.1 christos
2827 1.1 christos
2828 1.1 christos 000000,5.RS,5.RT,000,2.AC,00000,011000:SPECIAL:32::MULT
2829 1.1 christos "mult r<RS>, r<RT>":AC == 0
2830 1.1 christos "mult ac<AC>, r<RS>, r<RT>"
2831 1.1 christos *mips32r2:
2832 1.1 christos *mips64r2:
2833 1.1 christos *dsp2:
2834 1.1 christos {
2835 1.1 christos signed64 prod;
2836 1.1 christos if (AC == 0)
2837 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2838 1.1 christos if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2839 1.1 christos Unpredictable ();
2840 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2841 1.1 christos prod = ((signed64)(signed32) GPR[RS])
2842 1.1 christos * ((signed64)(signed32) GPR[RT]);
2843 1.1 christos DSPLO(AC) = EXTEND32 (VL4_8 (prod));
2844 1.1 christos DSPHI(AC) = EXTEND32 (VH4_8 (prod));
2845 1.1 christos if (AC == 0)
2846 1.1 christos {
2847 1.1 christos ACX = 0; /* SmartMIPS */
2848 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
2849 1.1 christos }
2850 1.1 christos }
2851 1.1 christos
2852 1.1 christos
2853 1.1 christos 000000,5.RS,5.RT,5.RD,00000,011000:SPECIAL:32::MULT
2854 1.1 christos "mult r<RS>, r<RT>":RD == 0
2855 1.1 christos "mult r<RD>, r<RS>, r<RT>"
2856 1.1 christos *vr5000:
2857 1.1 christos *r3900:
2858 1.1 christos {
2859 1.1 christos do_mult (SD_, RS, RT, RD);
2860 1.1 christos }
2861 1.1 christos
2862 1.1 christos
2863 1.1 christos :function:::void:do_multu:int rs, int rt, int rd
2864 1.1 christos {
2865 1.1 christos unsigned64 prod;
2866 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2867 1.1 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
2868 1.1 christos Unpredictable ();
2869 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2870 1.1 christos prod = (((unsigned64)(unsigned32) GPR[rs])
2871 1.1 christos * ((unsigned64)(unsigned32) GPR[rt]));
2872 1.1 christos LO = EXTEND32 (VL4_8 (prod));
2873 1.1 christos HI = EXTEND32 (VH4_8 (prod));
2874 1.1 christos if (rd != 0)
2875 1.1 christos GPR[rd] = LO;
2876 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
2877 1.1 christos }
2878 1.1 christos
2879 1.1 christos 000000,5.RS,5.RT,0000000000,011001:SPECIAL:32::MULTU
2880 1.1 christos "multu r<RS>, r<RT>"
2881 1.1 christos *mipsI:
2882 1.1 christos *mipsII:
2883 1.1 christos *mipsIII:
2884 1.1 christos *mipsIV:
2885 1.1 christos *mipsV:
2886 1.1 christos *mips32:
2887 1.1 christos *mips64:
2888 1.1 christos *vr4100:
2889 1.1 christos {
2890 1.1 christos do_multu (SD_, RS, RT, 0);
2891 1.1 christos }
2892 1.1 christos
2893 1.1 christos
2894 1.1 christos 000000,5.RS,5.RT,000,2.AC,00000,011001:SPECIAL:32::MULTU
2895 1.1 christos "multu r<RS>, r<RT>":AC == 0
2896 1.1 christos "multu r<RS>, r<RT>"
2897 1.1 christos *mips32r2:
2898 1.1 christos *mips64r2:
2899 1.1 christos *dsp2:
2900 1.1 christos {
2901 1.1 christos unsigned64 prod;
2902 1.1 christos if (AC == 0)
2903 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2904 1.1 christos if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2905 1.1 christos Unpredictable ();
2906 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2907 1.1 christos prod = ((unsigned64)(unsigned32) GPR[RS])
2908 1.1 christos * ((unsigned64)(unsigned32) GPR[RT]);
2909 1.1 christos DSPLO(AC) = EXTEND32 (VL4_8 (prod));
2910 1.1 christos DSPHI(AC) = EXTEND32 (VH4_8 (prod));
2911 1.1 christos if (AC == 0)
2912 1.1 christos TRACE_ALU_RESULT2 (HI, LO);
2913 1.1 christos }
2914 1.1 christos
2915 1.1 christos
2916 1.1 christos 000000,5.RS,5.RT,5.RD,00000,011001:SPECIAL:32::MULTU
2917 1.1 christos "multu r<RS>, r<RT>":RD == 0
2918 1.1 christos "multu r<RD>, r<RS>, r<RT>"
2919 1.1 christos *vr5000:
2920 1.1 christos *r3900:
2921 1.1 christos {
2922 1.1 christos do_multu (SD_, RS, RT, RD);
2923 1.1 christos }
2924 1.1 christos
2925 1.1 christos
2926 1.1 christos :function:::void:do_nor:int rs, int rt, int rd
2927 1.1 christos {
2928 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2929 1.1 christos GPR[rd] = ~ (GPR[rs] | GPR[rt]);
2930 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
2931 1.1 christos }
2932 1.1 christos
2933 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100111:SPECIAL:32::NOR
2934 1.1 christos "nor r<RD>, r<RS>, r<RT>"
2935 1.1 christos *mipsI:
2936 1.1 christos *mipsII:
2937 1.1 christos *mipsIII:
2938 1.1 christos *mipsIV:
2939 1.1 christos *mipsV:
2940 1.1 christos *mips32:
2941 1.1 christos *mips32r2:
2942 1.1 christos *mips64:
2943 1.1 christos *mips64r2:
2944 1.1 christos *vr4100:
2945 1.1 christos *vr5000:
2946 1.1 christos *r3900:
2947 1.1 christos {
2948 1.1 christos do_nor (SD_, RS, RT, RD);
2949 1.1 christos }
2950 1.1 christos
2951 1.1 christos
2952 1.1 christos :function:::void:do_or:int rs, int rt, int rd
2953 1.1 christos {
2954 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2955 1.1 christos GPR[rd] = (GPR[rs] | GPR[rt]);
2956 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
2957 1.1 christos }
2958 1.1 christos
2959 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100101:SPECIAL:32::OR
2960 1.1 christos "or r<RD>, r<RS>, r<RT>"
2961 1.1 christos *mipsI:
2962 1.1 christos *mipsII:
2963 1.1 christos *mipsIII:
2964 1.1 christos *mipsIV:
2965 1.1 christos *mipsV:
2966 1.1 christos *mips32:
2967 1.1 christos *mips32r2:
2968 1.1 christos *mips64:
2969 1.1 christos *mips64r2:
2970 1.1 christos *vr4100:
2971 1.1 christos *vr5000:
2972 1.1 christos *r3900:
2973 1.1 christos {
2974 1.1 christos do_or (SD_, RS, RT, RD);
2975 1.1 christos }
2976 1.1 christos
2977 1.1 christos
2978 1.1 christos
2979 1.1 christos :function:::void:do_ori:int rs, int rt, unsigned immediate
2980 1.1 christos {
2981 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], immediate);
2982 1.1 christos GPR[rt] = (GPR[rs] | immediate);
2983 1.1 christos TRACE_ALU_RESULT (GPR[rt]);
2984 1.1 christos }
2985 1.1 christos
2986 1.1 christos 001101,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ORI
2987 1.1 christos "ori r<RT>, r<RS>, %#lx<IMMEDIATE>"
2988 1.1 christos *mipsI:
2989 1.1 christos *mipsII:
2990 1.1 christos *mipsIII:
2991 1.1 christos *mipsIV:
2992 1.1 christos *mipsV:
2993 1.1 christos *mips32:
2994 1.1 christos *mips32r2:
2995 1.1 christos *mips64:
2996 1.1 christos *mips64r2:
2997 1.1 christos *vr4100:
2998 1.1 christos *vr5000:
2999 1.1 christos *r3900:
3000 1.1 christos {
3001 1.1 christos do_ori (SD_, RS, RT, IMMEDIATE);
3002 1.1 christos }
3003 1.1 christos
3004 1.1 christos
3005 1.1 christos 110011,5.BASE,5.HINT,16.OFFSET:NORMAL:32::PREF
3006 1.1 christos "pref <HINT>, <OFFSET>(r<BASE>)"
3007 1.1 christos *mipsIV:
3008 1.1 christos *mipsV:
3009 1.1 christos *mips32:
3010 1.1 christos *mips32r2:
3011 1.1 christos *mips64:
3012 1.1 christos *mips64r2:
3013 1.1 christos *vr5000:
3014 1.1 christos {
3015 1.1 christos address_word base = GPR[BASE];
3016 1.1 christos address_word offset = EXTEND16 (OFFSET);
3017 1.1 christos {
3018 1.1 christos address_word vaddr = loadstore_ea (SD_, base, offset);
3019 1.1 christos address_word paddr;
3020 1.1 christos int uncached;
3021 1.1 christos {
3022 1.1 christos if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
3023 1.1 christos Prefetch(uncached,paddr,vaddr,isDATA,HINT);
3024 1.1 christos }
3025 1.1 christos }
3026 1.1 christos }
3027 1.1 christos
3028 1.1 christos
3029 1.1 christos :function:::unsigned64:do_ror:unsigned32 x,unsigned32 y
3030 1.1 christos {
3031 1.1 christos unsigned64 result;
3032 1.1 christos
3033 1.1 christos y &= 31;
3034 1.1 christos TRACE_ALU_INPUT2 (x, y);
3035 1.1 christos result = EXTEND32 (ROTR32 (x, y));
3036 1.1 christos TRACE_ALU_RESULT (result);
3037 1.1 christos return result;
3038 1.1 christos }
3039 1.1 christos
3040 1.1 christos 000000,00001,5.RT,5.RD,5.SHIFT,000010::32::ROR
3041 1.1 christos "ror r<RD>, r<RT>, <SHIFT>"
3042 1.1 christos *mips32r2:
3043 1.1 christos *mips64r2:
3044 1.1 christos *smartmips:
3045 1.1 christos *vr5400:
3046 1.1 christos *vr5500:
3047 1.1 christos {
3048 1.1 christos GPR[RD] = do_ror (SD_, GPR[RT], SHIFT);
3049 1.1 christos }
3050 1.1 christos
3051 1.1 christos 000000,5.RS,5.RT,5.RD,00001,000110::32::RORV
3052 1.1 christos "rorv r<RD>, r<RT>, r<RS>"
3053 1.1 christos *mips32r2:
3054 1.1 christos *mips64r2:
3055 1.1 christos *smartmips:
3056 1.1 christos *vr5400:
3057 1.1 christos *vr5500:
3058 1.1 christos {
3059 1.1 christos GPR[RD] = do_ror (SD_, GPR[RT], GPR[RS]);
3060 1.1 christos }
3061 1.1 christos
3062 1.1 christos
3063 1.1 christos :function:::void:do_store:unsigned access, address_word base, address_word offset, unsigned_word word
3064 1.1 christos {
3065 1.1 christos address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
3066 1.1 christos address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0);
3067 1.1 christos address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0);
3068 1.1 christos unsigned int byte;
3069 1.1 christos address_word paddr;
3070 1.1 christos int uncached;
3071 1.1 christos unsigned64 memval;
3072 1.1 christos address_word vaddr;
3073 1.1 christos
3074 1.1 christos vaddr = loadstore_ea (SD_, base, offset);
3075 1.1 christos if ((vaddr & access) != 0)
3076 1.1 christos {
3077 1.1 christos SIM_CORE_SIGNAL (SD, STATE_CPU(SD, 0), cia, read_map, access+1, vaddr, write_transfer, sim_core_unaligned_signal);
3078 1.1 christos }
3079 1.1 christos AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL);
3080 1.1 christos paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
3081 1.1 christos byte = ((vaddr & mask) ^ bigendiancpu);
3082 1.1 christos memval = (word << (8 * byte));
3083 1.1 christos StoreMemory (uncached, access, memval, 0, paddr, vaddr, isREAL);
3084 1.1 christos }
3085 1.1 christos
3086 1.1 christos :function:::void:do_store_left:unsigned access, address_word base, address_word offset, unsigned_word rt
3087 1.1 christos {
3088 1.1 christos address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
3089 1.1 christos address_word reverseendian = (ReverseEndian ? -1 : 0);
3090 1.1 christos address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
3091 1.1 christos unsigned int byte;
3092 1.1 christos unsigned int word;
3093 1.1 christos address_word paddr;
3094 1.1 christos int uncached;
3095 1.1 christos unsigned64 memval;
3096 1.1 christos address_word vaddr;
3097 1.1 christos int nr_lhs_bits;
3098 1.1 christos int nr_rhs_bits;
3099 1.1 christos
3100 1.1 christos vaddr = loadstore_ea (SD_, base, offset);
3101 1.1 christos AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL);
3102 1.1 christos paddr = (paddr ^ (reverseendian & mask));
3103 1.1 christos if (BigEndianMem == 0)
3104 1.1 christos paddr = paddr & ~access;
3105 1.1 christos
3106 1.1 christos /* compute where within the word/mem we are */
3107 1.1 christos byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */
3108 1.1 christos word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */
3109 1.1 christos nr_lhs_bits = 8 * byte + 8;
3110 1.1 christos nr_rhs_bits = 8 * access - 8 * byte;
3111 1.1 christos /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */
3112 1.1 christos /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n",
3113 1.1 christos (long) ((unsigned64) vaddr >> 32), (long) vaddr,
3114 1.1 christos (long) ((unsigned64) paddr >> 32), (long) paddr,
3115 1.1 christos word, byte, nr_lhs_bits, nr_rhs_bits); */
3116 1.1 christos
3117 1.1 christos if (word == 0)
3118 1.1 christos {
3119 1.1 christos memval = (rt >> nr_rhs_bits);
3120 1.1 christos }
3121 1.1 christos else
3122 1.1 christos {
3123 1.1 christos memval = (rt << nr_lhs_bits);
3124 1.1 christos }
3125 1.1 christos /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx\n",
3126 1.1 christos (long) ((unsigned64) rt >> 32), (long) rt,
3127 1.1 christos (long) ((unsigned64) memval >> 32), (long) memval); */
3128 1.1 christos StoreMemory (uncached, byte, memval, 0, paddr, vaddr, isREAL);
3129 1.1 christos }
3130 1.1 christos
3131 1.1 christos :function:::void:do_store_right:unsigned access, address_word base, address_word offset, unsigned_word rt
3132 1.1 christos {
3133 1.1 christos address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
3134 1.1 christos address_word reverseendian = (ReverseEndian ? -1 : 0);
3135 1.1 christos address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
3136 1.1 christos unsigned int byte;
3137 1.1 christos address_word paddr;
3138 1.1 christos int uncached;
3139 1.1 christos unsigned64 memval;
3140 1.1 christos address_word vaddr;
3141 1.1 christos
3142 1.1 christos vaddr = loadstore_ea (SD_, base, offset);
3143 1.1 christos AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL);
3144 1.1 christos paddr = (paddr ^ (reverseendian & mask));
3145 1.1 christos if (BigEndianMem != 0)
3146 1.1 christos paddr &= ~access;
3147 1.1 christos byte = ((vaddr & mask) ^ (bigendiancpu & mask));
3148 1.1 christos memval = (rt << (byte * 8));
3149 1.1 christos StoreMemory (uncached, access - (access & byte), memval, 0, paddr, vaddr, isREAL);
3150 1.1 christos }
3151 1.1 christos
3152 1.1 christos
3153 1.1 christos 101000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SB
3154 1.1 christos "sb r<RT>, <OFFSET>(r<BASE>)"
3155 1.1 christos *mipsI:
3156 1.1 christos *mipsII:
3157 1.1 christos *mipsIII:
3158 1.1 christos *mipsIV:
3159 1.1 christos *mipsV:
3160 1.1 christos *mips32:
3161 1.1 christos *mips32r2:
3162 1.1 christos *mips64:
3163 1.1 christos *mips64r2:
3164 1.1 christos *vr4100:
3165 1.1 christos *vr5000:
3166 1.1 christos *r3900:
3167 1.1 christos {
3168 1.1 christos do_store (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3169 1.1 christos }
3170 1.1 christos
3171 1.1 christos
3172 1.1 christos 111000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SC
3173 1.1 christos "sc r<RT>, <OFFSET>(r<BASE>)"
3174 1.1 christos *mipsII:
3175 1.1 christos *mipsIII:
3176 1.1 christos *mipsIV:
3177 1.1 christos *mipsV:
3178 1.1 christos *mips32:
3179 1.1 christos *mips32r2:
3180 1.1 christos *mips64:
3181 1.1 christos *mips64r2:
3182 1.1 christos *vr4100:
3183 1.1 christos *vr5000:
3184 1.1 christos {
3185 1.1 christos unsigned32 instruction = instruction_0;
3186 1.1 christos address_word base = GPR[BASE];
3187 1.1 christos address_word offset = EXTEND16 (OFFSET);
3188 1.1 christos {
3189 1.1 christos address_word vaddr = loadstore_ea (SD_, base, offset);
3190 1.1 christos address_word paddr;
3191 1.1 christos int uncached;
3192 1.1 christos if ((vaddr & 3) != 0)
3193 1.1 christos {
3194 1.1 christos SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, write_transfer, sim_core_unaligned_signal);
3195 1.1 christos }
3196 1.1 christos else
3197 1.1 christos {
3198 1.1 christos if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
3199 1.1 christos {
3200 1.1 christos unsigned64 memval = 0;
3201 1.1 christos unsigned64 memval1 = 0;
3202 1.1 christos unsigned64 mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
3203 1.1 christos address_word reverseendian = (ReverseEndian ? (mask ^ AccessLength_WORD) : 0);
3204 1.1 christos address_word bigendiancpu = (BigEndianCPU ? (mask ^ AccessLength_WORD) : 0);
3205 1.1 christos unsigned int byte;
3206 1.1 christos paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
3207 1.1 christos byte = ((vaddr & mask) ^ bigendiancpu);
3208 1.1 christos memval = ((unsigned64) GPR[RT] << (8 * byte));
3209 1.1 christos if (LLBIT)
3210 1.1 christos {
3211 1.1 christos StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
3212 1.1 christos }
3213 1.1 christos GPR[RT] = LLBIT;
3214 1.1 christos }
3215 1.1 christos }
3216 1.1 christos }
3217 1.1 christos }
3218 1.1 christos
3219 1.1 christos
3220 1.1 christos 111100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SCD
3221 1.1 christos "scd r<RT>, <OFFSET>(r<BASE>)"
3222 1.1 christos *mipsIII:
3223 1.1 christos *mipsIV:
3224 1.1 christos *mipsV:
3225 1.1 christos *mips64:
3226 1.1 christos *mips64r2:
3227 1.1 christos *vr4100:
3228 1.1 christos *vr5000:
3229 1.1 christos {
3230 1.1 christos address_word base = GPR[BASE];
3231 1.1 christos address_word offset = EXTEND16 (OFFSET);
3232 1.1 christos check_u64 (SD_, instruction_0);
3233 1.1 christos {
3234 1.1 christos address_word vaddr = loadstore_ea (SD_, base, offset);
3235 1.1 christos address_word paddr;
3236 1.1 christos int uncached;
3237 1.1 christos if ((vaddr & 7) != 0)
3238 1.1 christos {
3239 1.1 christos SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 8, vaddr, write_transfer, sim_core_unaligned_signal);
3240 1.1 christos }
3241 1.1 christos else
3242 1.1 christos {
3243 1.1 christos if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
3244 1.1 christos {
3245 1.1 christos unsigned64 memval = 0;
3246 1.1 christos unsigned64 memval1 = 0;
3247 1.1 christos memval = GPR[RT];
3248 1.1 christos if (LLBIT)
3249 1.1 christos {
3250 1.1 christos StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
3251 1.1 christos }
3252 1.1 christos GPR[RT] = LLBIT;
3253 1.1 christos }
3254 1.1 christos }
3255 1.1 christos }
3256 1.1 christos }
3257 1.1 christos
3258 1.1 christos
3259 1.1 christos 111111,5.BASE,5.RT,16.OFFSET:NORMAL:64::SD
3260 1.1 christos "sd r<RT>, <OFFSET>(r<BASE>)"
3261 1.1 christos *mipsIII:
3262 1.1 christos *mipsIV:
3263 1.1 christos *mipsV:
3264 1.1 christos *mips64:
3265 1.1 christos *mips64r2:
3266 1.1 christos *vr4100:
3267 1.1 christos *vr5000:
3268 1.1 christos {
3269 1.1 christos check_u64 (SD_, instruction_0);
3270 1.1 christos do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3271 1.1 christos }
3272 1.1 christos
3273 1.1 christos
3274 1.1 christos 1111,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDCz
3275 1.1 christos "sdc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
3276 1.1 christos *mipsII:
3277 1.1 christos *mipsIII:
3278 1.1 christos *mipsIV:
3279 1.1 christos *mipsV:
3280 1.1 christos *mips32:
3281 1.1 christos *mips32r2:
3282 1.1 christos *mips64:
3283 1.1 christos *mips64r2:
3284 1.1 christos *vr4100:
3285 1.1 christos *vr5000:
3286 1.1 christos {
3287 1.1 christos do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), COP_SD (ZZ, RT));
3288 1.1 christos }
3289 1.1 christos
3290 1.1 christos
3291 1.1 christos 101100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDL
3292 1.1 christos "sdl r<RT>, <OFFSET>(r<BASE>)"
3293 1.1 christos *mipsIII:
3294 1.1 christos *mipsIV:
3295 1.1 christos *mipsV:
3296 1.1 christos *mips64:
3297 1.1 christos *mips64r2:
3298 1.1 christos *vr4100:
3299 1.1 christos *vr5000:
3300 1.1 christos {
3301 1.1 christos check_u64 (SD_, instruction_0);
3302 1.1 christos do_store_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3303 1.1 christos }
3304 1.1 christos
3305 1.1 christos
3306 1.1 christos 101101,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDR
3307 1.1 christos "sdr r<RT>, <OFFSET>(r<BASE>)"
3308 1.1 christos *mipsIII:
3309 1.1 christos *mipsIV:
3310 1.1 christos *mipsV:
3311 1.1 christos *mips64:
3312 1.1 christos *mips64r2:
3313 1.1 christos *vr4100:
3314 1.1 christos *vr5000:
3315 1.1 christos {
3316 1.1 christos check_u64 (SD_, instruction_0);
3317 1.1 christos do_store_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3318 1.1 christos }
3319 1.1 christos
3320 1.1 christos
3321 1.1 christos
3322 1.1 christos 101001,5.BASE,5.RT,16.OFFSET:NORMAL:32::SH
3323 1.1 christos "sh r<RT>, <OFFSET>(r<BASE>)"
3324 1.1 christos *mipsI:
3325 1.1 christos *mipsII:
3326 1.1 christos *mipsIII:
3327 1.1 christos *mipsIV:
3328 1.1 christos *mipsV:
3329 1.1 christos *mips32:
3330 1.1 christos *mips32r2:
3331 1.1 christos *mips64:
3332 1.1 christos *mips64r2:
3333 1.1 christos *vr4100:
3334 1.1 christos *vr5000:
3335 1.1 christos *r3900:
3336 1.1 christos {
3337 1.1 christos do_store (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3338 1.1 christos }
3339 1.1 christos
3340 1.1 christos
3341 1.1 christos :function:::void:do_sll:int rt, int rd, int shift
3342 1.1 christos {
3343 1.1 christos unsigned32 temp = (GPR[rt] << shift);
3344 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], shift);
3345 1.1 christos GPR[rd] = EXTEND32 (temp);
3346 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
3347 1.1 christos }
3348 1.1 christos
3349 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLLa
3350 1.1 christos "nop":RD == 0 && RT == 0 && SHIFT == 0
3351 1.1 christos "sll r<RD>, r<RT>, <SHIFT>"
3352 1.1 christos *mipsI:
3353 1.1 christos *mipsII:
3354 1.1 christos *mipsIII:
3355 1.1 christos *mipsIV:
3356 1.1 christos *mipsV:
3357 1.1 christos *vr4100:
3358 1.1 christos *vr5000:
3359 1.1 christos *r3900:
3360 1.1 christos {
3361 1.1 christos /* Skip shift for NOP, so that there won't be lots of extraneous
3362 1.1 christos trace output. */
3363 1.1 christos if (RD != 0 || RT != 0 || SHIFT != 0)
3364 1.1 christos do_sll (SD_, RT, RD, SHIFT);
3365 1.1 christos }
3366 1.1 christos
3367 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLLb
3368 1.1 christos "nop":RD == 0 && RT == 0 && SHIFT == 0
3369 1.1 christos "ssnop":RD == 0 && RT == 0 && SHIFT == 1
3370 1.1 christos "sll r<RD>, r<RT>, <SHIFT>"
3371 1.1 christos *mips32:
3372 1.1 christos *mips32r2:
3373 1.1 christos *mips64:
3374 1.1 christos *mips64r2:
3375 1.1 christos {
3376 1.1 christos /* Skip shift for NOP and SSNOP, so that there won't be lots of
3377 1.1 christos extraneous trace output. */
3378 1.1 christos if (RD != 0 || RT != 0 || (SHIFT != 0 && SHIFT != 1))
3379 1.1 christos do_sll (SD_, RT, RD, SHIFT);
3380 1.1 christos }
3381 1.1 christos
3382 1.1 christos
3383 1.1 christos :function:::void:do_sllv:int rs, int rt, int rd
3384 1.1 christos {
3385 1.1 christos int s = MASKED (GPR[rs], 4, 0);
3386 1.1 christos unsigned32 temp = (GPR[rt] << s);
3387 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], s);
3388 1.1 christos GPR[rd] = EXTEND32 (temp);
3389 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
3390 1.1 christos }
3391 1.1 christos
3392 1.1 christos 000000,5.RS,5.RT,5.RD,00000,000100:SPECIAL:32::SLLV
3393 1.1 christos "sllv r<RD>, r<RT>, r<RS>"
3394 1.1 christos *mipsI:
3395 1.1 christos *mipsII:
3396 1.1 christos *mipsIII:
3397 1.1 christos *mipsIV:
3398 1.1 christos *mipsV:
3399 1.1 christos *mips32:
3400 1.1 christos *mips32r2:
3401 1.1 christos *mips64:
3402 1.1 christos *mips64r2:
3403 1.1 christos *vr4100:
3404 1.1 christos *vr5000:
3405 1.1 christos *r3900:
3406 1.1 christos {
3407 1.1 christos do_sllv (SD_, RS, RT, RD);
3408 1.1 christos }
3409 1.1 christos
3410 1.1 christos
3411 1.1 christos :function:::void:do_slt:int rs, int rt, int rd
3412 1.1 christos {
3413 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
3414 1.1 christos GPR[rd] = ((signed_word) GPR[rs] < (signed_word) GPR[rt]);
3415 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
3416 1.1 christos }
3417 1.1 christos
3418 1.1 christos 000000,5.RS,5.RT,5.RD,00000,101010:SPECIAL:32::SLT
3419 1.1 christos "slt r<RD>, r<RS>, r<RT>"
3420 1.1 christos *mipsI:
3421 1.1 christos *mipsII:
3422 1.1 christos *mipsIII:
3423 1.1 christos *mipsIV:
3424 1.1 christos *mipsV:
3425 1.1 christos *mips32:
3426 1.1 christos *mips32r2:
3427 1.1 christos *mips64:
3428 1.1 christos *mips64r2:
3429 1.1 christos *vr4100:
3430 1.1 christos *vr5000:
3431 1.1 christos *r3900:
3432 1.1 christos {
3433 1.1 christos do_slt (SD_, RS, RT, RD);
3434 1.1 christos }
3435 1.1 christos
3436 1.1 christos
3437 1.1 christos :function:::void:do_slti:int rs, int rt, unsigned16 immediate
3438 1.1 christos {
3439 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
3440 1.1 christos GPR[rt] = ((signed_word) GPR[rs] < (signed_word) EXTEND16 (immediate));
3441 1.1 christos TRACE_ALU_RESULT (GPR[rt]);
3442 1.1 christos }
3443 1.1 christos
3444 1.1 christos 001010,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTI
3445 1.1 christos "slti r<RT>, r<RS>, <IMMEDIATE>"
3446 1.1 christos *mipsI:
3447 1.1 christos *mipsII:
3448 1.1 christos *mipsIII:
3449 1.1 christos *mipsIV:
3450 1.1 christos *mipsV:
3451 1.1 christos *mips32:
3452 1.1 christos *mips32r2:
3453 1.1 christos *mips64:
3454 1.1 christos *mips64r2:
3455 1.1 christos *vr4100:
3456 1.1 christos *vr5000:
3457 1.1 christos *r3900:
3458 1.1 christos {
3459 1.1 christos do_slti (SD_, RS, RT, IMMEDIATE);
3460 1.1 christos }
3461 1.1 christos
3462 1.1 christos
3463 1.1 christos :function:::void:do_sltiu:int rs, int rt, unsigned16 immediate
3464 1.1 christos {
3465 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
3466 1.1 christos GPR[rt] = ((unsigned_word) GPR[rs] < (unsigned_word) EXTEND16 (immediate));
3467 1.1 christos TRACE_ALU_RESULT (GPR[rt]);
3468 1.1 christos }
3469 1.1 christos
3470 1.1 christos 001011,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTIU
3471 1.1 christos "sltiu r<RT>, r<RS>, <IMMEDIATE>"
3472 1.1 christos *mipsI:
3473 1.1 christos *mipsII:
3474 1.1 christos *mipsIII:
3475 1.1 christos *mipsIV:
3476 1.1 christos *mipsV:
3477 1.1 christos *mips32:
3478 1.1 christos *mips32r2:
3479 1.1 christos *mips64:
3480 1.1 christos *mips64r2:
3481 1.1 christos *vr4100:
3482 1.1 christos *vr5000:
3483 1.1 christos *r3900:
3484 1.1 christos {
3485 1.1 christos do_sltiu (SD_, RS, RT, IMMEDIATE);
3486 1.1 christos }
3487 1.1 christos
3488 1.1 christos
3489 1.1 christos
3490 1.1 christos :function:::void:do_sltu:int rs, int rt, int rd
3491 1.1 christos {
3492 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
3493 1.1 christos GPR[rd] = ((unsigned_word) GPR[rs] < (unsigned_word) GPR[rt]);
3494 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
3495 1.1 christos }
3496 1.1 christos
3497 1.1 christos 000000,5.RS,5.RT,5.RD,00000,101011:SPECIAL:32::SLTU
3498 1.1 christos "sltu r<RD>, r<RS>, r<RT>"
3499 1.1 christos *mipsI:
3500 1.1 christos *mipsII:
3501 1.1 christos *mipsIII:
3502 1.1 christos *mipsIV:
3503 1.1 christos *mipsV:
3504 1.1 christos *mips32:
3505 1.1 christos *mips32r2:
3506 1.1 christos *mips64:
3507 1.1 christos *mips64r2:
3508 1.1 christos *vr4100:
3509 1.1 christos *vr5000:
3510 1.1 christos *r3900:
3511 1.1 christos {
3512 1.1 christos do_sltu (SD_, RS, RT, RD);
3513 1.1 christos }
3514 1.1 christos
3515 1.1 christos
3516 1.1 christos :function:::void:do_sra:int rt, int rd, int shift
3517 1.1 christos {
3518 1.1 christos signed32 temp = (signed32) GPR[rt] >> shift;
3519 1.1 christos if (NotWordValue (GPR[rt]))
3520 1.1 christos Unpredictable ();
3521 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], shift);
3522 1.1 christos GPR[rd] = EXTEND32 (temp);
3523 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
3524 1.1 christos }
3525 1.1 christos
3526 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,000011:SPECIAL:32::SRA
3527 1.1 christos "sra r<RD>, r<RT>, <SHIFT>"
3528 1.1 christos *mipsI:
3529 1.1 christos *mipsII:
3530 1.1 christos *mipsIII:
3531 1.1 christos *mipsIV:
3532 1.1 christos *mipsV:
3533 1.1 christos *mips32:
3534 1.1 christos *mips32r2:
3535 1.1 christos *mips64:
3536 1.1 christos *mips64r2:
3537 1.1 christos *vr4100:
3538 1.1 christos *vr5000:
3539 1.1 christos *r3900:
3540 1.1 christos {
3541 1.1 christos do_sra (SD_, RT, RD, SHIFT);
3542 1.1 christos }
3543 1.1 christos
3544 1.1 christos
3545 1.1 christos
3546 1.1 christos :function:::void:do_srav:int rs, int rt, int rd
3547 1.1 christos {
3548 1.1 christos int s = MASKED (GPR[rs], 4, 0);
3549 1.1 christos signed32 temp = (signed32) GPR[rt] >> s;
3550 1.1 christos if (NotWordValue (GPR[rt]))
3551 1.1 christos Unpredictable ();
3552 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], s);
3553 1.1 christos GPR[rd] = EXTEND32 (temp);
3554 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
3555 1.1 christos }
3556 1.1 christos
3557 1.1 christos 000000,5.RS,5.RT,5.RD,00000,000111:SPECIAL:32::SRAV
3558 1.1 christos "srav r<RD>, r<RT>, r<RS>"
3559 1.1 christos *mipsI:
3560 1.1 christos *mipsII:
3561 1.1 christos *mipsIII:
3562 1.1 christos *mipsIV:
3563 1.1 christos *mipsV:
3564 1.1 christos *mips32:
3565 1.1 christos *mips32r2:
3566 1.1 christos *mips64:
3567 1.1 christos *mips64r2:
3568 1.1 christos *vr4100:
3569 1.1 christos *vr5000:
3570 1.1 christos *r3900:
3571 1.1 christos {
3572 1.1 christos do_srav (SD_, RS, RT, RD);
3573 1.1 christos }
3574 1.1 christos
3575 1.1 christos
3576 1.1 christos
3577 1.1 christos :function:::void:do_srl:int rt, int rd, int shift
3578 1.1 christos {
3579 1.1 christos unsigned32 temp = (unsigned32) GPR[rt] >> shift;
3580 1.1 christos if (NotWordValue (GPR[rt]))
3581 1.1 christos Unpredictable ();
3582 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], shift);
3583 1.1 christos GPR[rd] = EXTEND32 (temp);
3584 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
3585 1.1 christos }
3586 1.1 christos
3587 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,000010:SPECIAL:32::SRL
3588 1.1 christos "srl r<RD>, r<RT>, <SHIFT>"
3589 1.1 christos *mipsI:
3590 1.1 christos *mipsII:
3591 1.1 christos *mipsIII:
3592 1.1 christos *mipsIV:
3593 1.1 christos *mipsV:
3594 1.1 christos *mips32:
3595 1.1 christos *mips32r2:
3596 1.1 christos *mips64:
3597 1.1 christos *mips64r2:
3598 1.1 christos *vr4100:
3599 1.1 christos *vr5000:
3600 1.1 christos *r3900:
3601 1.1 christos {
3602 1.1 christos do_srl (SD_, RT, RD, SHIFT);
3603 1.1 christos }
3604 1.1 christos
3605 1.1 christos
3606 1.1 christos :function:::void:do_srlv:int rs, int rt, int rd
3607 1.1 christos {
3608 1.1 christos int s = MASKED (GPR[rs], 4, 0);
3609 1.1 christos unsigned32 temp = (unsigned32) GPR[rt] >> s;
3610 1.1 christos if (NotWordValue (GPR[rt]))
3611 1.1 christos Unpredictable ();
3612 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], s);
3613 1.1 christos GPR[rd] = EXTEND32 (temp);
3614 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
3615 1.1 christos }
3616 1.1 christos
3617 1.1 christos 000000,5.RS,5.RT,5.RD,00000,000110:SPECIAL:32::SRLV
3618 1.1 christos "srlv r<RD>, r<RT>, r<RS>"
3619 1.1 christos *mipsI:
3620 1.1 christos *mipsII:
3621 1.1 christos *mipsIII:
3622 1.1 christos *mipsIV:
3623 1.1 christos *mipsV:
3624 1.1 christos *mips32:
3625 1.1 christos *mips32r2:
3626 1.1 christos *mips64:
3627 1.1 christos *mips64r2:
3628 1.1 christos *vr4100:
3629 1.1 christos *vr5000:
3630 1.1 christos *r3900:
3631 1.1 christos {
3632 1.1 christos do_srlv (SD_, RS, RT, RD);
3633 1.1 christos }
3634 1.1 christos
3635 1.1 christos
3636 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100010:SPECIAL:32::SUB
3637 1.1 christos "sub r<RD>, r<RS>, r<RT>"
3638 1.1 christos *mipsI:
3639 1.1 christos *mipsII:
3640 1.1 christos *mipsIII:
3641 1.1 christos *mipsIV:
3642 1.1 christos *mipsV:
3643 1.1 christos *mips32:
3644 1.1 christos *mips32r2:
3645 1.1 christos *mips64:
3646 1.1 christos *mips64r2:
3647 1.1 christos *vr4100:
3648 1.1 christos *vr5000:
3649 1.1 christos *r3900:
3650 1.1 christos {
3651 1.1 christos if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
3652 1.1 christos Unpredictable ();
3653 1.1 christos TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
3654 1.1 christos {
3655 1.1 christos ALU32_BEGIN (GPR[RS]);
3656 1.1 christos ALU32_SUB (GPR[RT]);
3657 1.1 christos ALU32_END (GPR[RD]); /* This checks for overflow. */
3658 1.1 christos }
3659 1.1 christos TRACE_ALU_RESULT (GPR[RD]);
3660 1.1 christos }
3661 1.1 christos
3662 1.1 christos
3663 1.1 christos :function:::void:do_subu:int rs, int rt, int rd
3664 1.1 christos {
3665 1.1 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
3666 1.1 christos Unpredictable ();
3667 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
3668 1.1 christos GPR[rd] = EXTEND32 (GPR[rs] - GPR[rt]);
3669 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
3670 1.1 christos }
3671 1.1 christos
3672 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100011:SPECIAL:32::SUBU
3673 1.1 christos "subu r<RD>, r<RS>, r<RT>"
3674 1.1 christos *mipsI:
3675 1.1 christos *mipsII:
3676 1.1 christos *mipsIII:
3677 1.1 christos *mipsIV:
3678 1.1 christos *mipsV:
3679 1.1 christos *mips32:
3680 1.1 christos *mips32r2:
3681 1.1 christos *mips64:
3682 1.1 christos *mips64r2:
3683 1.1 christos *vr4100:
3684 1.1 christos *vr5000:
3685 1.1 christos *r3900:
3686 1.1 christos {
3687 1.1 christos do_subu (SD_, RS, RT, RD);
3688 1.1 christos }
3689 1.1 christos
3690 1.1 christos
3691 1.1 christos 101011,5.BASE,5.RT,16.OFFSET:NORMAL:32::SW
3692 1.1 christos "sw r<RT>, <OFFSET>(r<BASE>)"
3693 1.1 christos *mipsI:
3694 1.1 christos *mipsII:
3695 1.1 christos *mipsIII:
3696 1.1 christos *mipsIV:
3697 1.1 christos *mipsV:
3698 1.1 christos *mips32:
3699 1.1 christos *mips32r2:
3700 1.1 christos *mips64:
3701 1.1 christos *mips64r2:
3702 1.1 christos *vr4100:
3703 1.1 christos *r3900:
3704 1.1 christos *vr5000:
3705 1.1 christos {
3706 1.1 christos do_store (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3707 1.1 christos }
3708 1.1 christos
3709 1.1 christos
3710 1.1 christos 1110,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWCz
3711 1.1 christos "swc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
3712 1.1 christos *mipsI:
3713 1.1 christos *mipsII:
3714 1.1 christos *mipsIII:
3715 1.1 christos *mipsIV:
3716 1.1 christos *mipsV:
3717 1.1 christos *mips32:
3718 1.1 christos *mips32r2:
3719 1.1 christos *mips64:
3720 1.1 christos *mips64r2:
3721 1.1 christos *vr4100:
3722 1.1 christos *vr5000:
3723 1.1 christos *r3900:
3724 1.1 christos {
3725 1.1 christos do_store (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), COP_SW (ZZ, RT));
3726 1.1 christos }
3727 1.1 christos
3728 1.1 christos
3729 1.1 christos 101010,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWL
3730 1.1 christos "swl r<RT>, <OFFSET>(r<BASE>)"
3731 1.1 christos *mipsI:
3732 1.1 christos *mipsII:
3733 1.1 christos *mipsIII:
3734 1.1 christos *mipsIV:
3735 1.1 christos *mipsV:
3736 1.1 christos *mips32:
3737 1.1 christos *mips32r2:
3738 1.1 christos *mips64:
3739 1.1 christos *mips64r2:
3740 1.1 christos *vr4100:
3741 1.1 christos *vr5000:
3742 1.1 christos *r3900:
3743 1.1 christos {
3744 1.1 christos do_store_left (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3745 1.1 christos }
3746 1.1 christos
3747 1.1 christos
3748 1.1 christos 101110,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWR
3749 1.1 christos "swr r<RT>, <OFFSET>(r<BASE>)"
3750 1.1 christos *mipsI:
3751 1.1 christos *mipsII:
3752 1.1 christos *mipsIII:
3753 1.1 christos *mipsIV:
3754 1.1 christos *mipsV:
3755 1.1 christos *mips32:
3756 1.1 christos *mips32r2:
3757 1.1 christos *mips64:
3758 1.1 christos *mips64r2:
3759 1.1 christos *vr4100:
3760 1.1 christos *vr5000:
3761 1.1 christos *r3900:
3762 1.1 christos {
3763 1.1 christos do_store_right (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3764 1.1 christos }
3765 1.1 christos
3766 1.1 christos
3767 1.1 christos 000000,000000000000000,5.STYPE,001111:SPECIAL:32::SYNC
3768 1.1 christos "sync":STYPE == 0
3769 1.1 christos "sync <STYPE>"
3770 1.1 christos *mipsII:
3771 1.1 christos *mipsIII:
3772 1.1 christos *mipsIV:
3773 1.1 christos *mipsV:
3774 1.1 christos *mips32:
3775 1.1 christos *mips32r2:
3776 1.1 christos *mips64:
3777 1.1 christos *mips64r2:
3778 1.1 christos *vr4100:
3779 1.1 christos *vr5000:
3780 1.1 christos *r3900:
3781 1.1 christos {
3782 1.1 christos SyncOperation (STYPE);
3783 1.1 christos }
3784 1.1 christos
3785 1.1 christos
3786 1.1 christos 000000,20.CODE,001100:SPECIAL:32::SYSCALL
3787 1.1 christos "syscall %#lx<CODE>"
3788 1.1 christos *mipsI:
3789 1.1 christos *mipsII:
3790 1.1 christos *mipsIII:
3791 1.1 christos *mipsIV:
3792 1.1 christos *mipsV:
3793 1.1 christos *mips32:
3794 1.1 christos *mips32r2:
3795 1.1 christos *mips64:
3796 1.1 christos *mips64r2:
3797 1.1 christos *vr4100:
3798 1.1 christos *vr5000:
3799 1.1 christos *r3900:
3800 1.1 christos {
3801 1.1 christos SignalException (SystemCall, instruction_0);
3802 1.1 christos }
3803 1.1 christos
3804 1.1 christos
3805 1.1 christos 000000,5.RS,5.RT,10.CODE,110100:SPECIAL:32::TEQ
3806 1.1 christos "teq r<RS>, r<RT>"
3807 1.1 christos *mipsII:
3808 1.1 christos *mipsIII:
3809 1.1 christos *mipsIV:
3810 1.1 christos *mipsV:
3811 1.1 christos *mips32:
3812 1.1 christos *mips32r2:
3813 1.1 christos *mips64:
3814 1.1 christos *mips64r2:
3815 1.1 christos *vr4100:
3816 1.1 christos *vr5000:
3817 1.1 christos {
3818 1.1 christos if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
3819 1.1 christos SignalException (Trap, instruction_0);
3820 1.1 christos }
3821 1.1 christos
3822 1.1 christos
3823 1.1 christos 000001,5.RS,01100,16.IMMEDIATE:REGIMM:32::TEQI
3824 1.1 christos "teqi r<RS>, <IMMEDIATE>"
3825 1.1 christos *mipsII:
3826 1.1 christos *mipsIII:
3827 1.1 christos *mipsIV:
3828 1.1 christos *mipsV:
3829 1.1 christos *mips32:
3830 1.1 christos *mips32r2:
3831 1.1 christos *mips64:
3832 1.1 christos *mips64r2:
3833 1.1 christos *vr4100:
3834 1.1 christos *vr5000:
3835 1.1 christos {
3836 1.1 christos if ((signed_word) GPR[RS] == (signed_word) EXTEND16 (IMMEDIATE))
3837 1.1 christos SignalException (Trap, instruction_0);
3838 1.1 christos }
3839 1.1 christos
3840 1.1 christos
3841 1.1 christos 000000,5.RS,5.RT,10.CODE,110000:SPECIAL:32::TGE
3842 1.1 christos "tge r<RS>, r<RT>"
3843 1.1 christos *mipsII:
3844 1.1 christos *mipsIII:
3845 1.1 christos *mipsIV:
3846 1.1 christos *mipsV:
3847 1.1 christos *mips32:
3848 1.1 christos *mips32r2:
3849 1.1 christos *mips64:
3850 1.1 christos *mips64r2:
3851 1.1 christos *vr4100:
3852 1.1 christos *vr5000:
3853 1.1 christos {
3854 1.1 christos if ((signed_word) GPR[RS] >= (signed_word) GPR[RT])
3855 1.1 christos SignalException (Trap, instruction_0);
3856 1.1 christos }
3857 1.1 christos
3858 1.1 christos
3859 1.1 christos 000001,5.RS,01000,16.IMMEDIATE:REGIMM:32::TGEI
3860 1.1 christos "tgei r<RS>, <IMMEDIATE>"
3861 1.1 christos *mipsII:
3862 1.1 christos *mipsIII:
3863 1.1 christos *mipsIV:
3864 1.1 christos *mipsV:
3865 1.1 christos *mips32:
3866 1.1 christos *mips32r2:
3867 1.1 christos *mips64:
3868 1.1 christos *mips64r2:
3869 1.1 christos *vr4100:
3870 1.1 christos *vr5000:
3871 1.1 christos {
3872 1.1 christos if ((signed_word) GPR[RS] >= (signed_word) EXTEND16 (IMMEDIATE))
3873 1.1 christos SignalException (Trap, instruction_0);
3874 1.1 christos }
3875 1.1 christos
3876 1.1 christos
3877 1.1 christos 000001,5.RS,01001,16.IMMEDIATE:REGIMM:32::TGEIU
3878 1.1 christos "tgeiu r<RS>, <IMMEDIATE>"
3879 1.1 christos *mipsII:
3880 1.1 christos *mipsIII:
3881 1.1 christos *mipsIV:
3882 1.1 christos *mipsV:
3883 1.1 christos *mips32:
3884 1.1 christos *mips32r2:
3885 1.1 christos *mips64:
3886 1.1 christos *mips64r2:
3887 1.1 christos *vr4100:
3888 1.1 christos *vr5000:
3889 1.1 christos {
3890 1.1 christos if ((unsigned_word) GPR[RS] >= (unsigned_word) EXTEND16 (IMMEDIATE))
3891 1.1 christos SignalException (Trap, instruction_0);
3892 1.1 christos }
3893 1.1 christos
3894 1.1 christos
3895 1.1 christos 000000,5.RS,5.RT,10.CODE,110001:SPECIAL:32::TGEU
3896 1.1 christos "tgeu r<RS>, r<RT>"
3897 1.1 christos *mipsII:
3898 1.1 christos *mipsIII:
3899 1.1 christos *mipsIV:
3900 1.1 christos *mipsV:
3901 1.1 christos *mips32:
3902 1.1 christos *mips32r2:
3903 1.1 christos *mips64:
3904 1.1 christos *mips64r2:
3905 1.1 christos *vr4100:
3906 1.1 christos *vr5000:
3907 1.1 christos {
3908 1.1 christos if ((unsigned_word) GPR[RS] >= (unsigned_word) GPR[RT])
3909 1.1 christos SignalException (Trap, instruction_0);
3910 1.1 christos }
3911 1.1 christos
3912 1.1 christos
3913 1.1 christos 000000,5.RS,5.RT,10.CODE,110010:SPECIAL:32::TLT
3914 1.1 christos "tlt r<RS>, r<RT>"
3915 1.1 christos *mipsII:
3916 1.1 christos *mipsIII:
3917 1.1 christos *mipsIV:
3918 1.1 christos *mipsV:
3919 1.1 christos *mips32:
3920 1.1 christos *mips32r2:
3921 1.1 christos *mips64:
3922 1.1 christos *mips64r2:
3923 1.1 christos *vr4100:
3924 1.1 christos *vr5000:
3925 1.1 christos {
3926 1.1 christos if ((signed_word) GPR[RS] < (signed_word) GPR[RT])
3927 1.1 christos SignalException (Trap, instruction_0);
3928 1.1 christos }
3929 1.1 christos
3930 1.1 christos
3931 1.1 christos 000001,5.RS,01010,16.IMMEDIATE:REGIMM:32::TLTI
3932 1.1 christos "tlti r<RS>, <IMMEDIATE>"
3933 1.1 christos *mipsII:
3934 1.1 christos *mipsIII:
3935 1.1 christos *mipsIV:
3936 1.1 christos *mipsV:
3937 1.1 christos *mips32:
3938 1.1 christos *mips32r2:
3939 1.1 christos *mips64:
3940 1.1 christos *mips64r2:
3941 1.1 christos *vr4100:
3942 1.1 christos *vr5000:
3943 1.1 christos {
3944 1.1 christos if ((signed_word) GPR[RS] < (signed_word) EXTEND16 (IMMEDIATE))
3945 1.1 christos SignalException (Trap, instruction_0);
3946 1.1 christos }
3947 1.1 christos
3948 1.1 christos
3949 1.1 christos 000001,5.RS,01011,16.IMMEDIATE:REGIMM:32::TLTIU
3950 1.1 christos "tltiu r<RS>, <IMMEDIATE>"
3951 1.1 christos *mipsII:
3952 1.1 christos *mipsIII:
3953 1.1 christos *mipsIV:
3954 1.1 christos *mipsV:
3955 1.1 christos *mips32:
3956 1.1 christos *mips32r2:
3957 1.1 christos *mips64:
3958 1.1 christos *mips64r2:
3959 1.1 christos *vr4100:
3960 1.1 christos *vr5000:
3961 1.1 christos {
3962 1.1 christos if ((unsigned_word) GPR[RS] < (unsigned_word) EXTEND16 (IMMEDIATE))
3963 1.1 christos SignalException (Trap, instruction_0);
3964 1.1 christos }
3965 1.1 christos
3966 1.1 christos
3967 1.1 christos 000000,5.RS,5.RT,10.CODE,110011:SPECIAL:32::TLTU
3968 1.1 christos "tltu r<RS>, r<RT>"
3969 1.1 christos *mipsII:
3970 1.1 christos *mipsIII:
3971 1.1 christos *mipsIV:
3972 1.1 christos *mipsV:
3973 1.1 christos *mips32:
3974 1.1 christos *mips32r2:
3975 1.1 christos *mips64:
3976 1.1 christos *mips64r2:
3977 1.1 christos *vr4100:
3978 1.1 christos *vr5000:
3979 1.1 christos {
3980 1.1 christos if ((unsigned_word) GPR[RS] < (unsigned_word) GPR[RT])
3981 1.1 christos SignalException (Trap, instruction_0);
3982 1.1 christos }
3983 1.1 christos
3984 1.1 christos
3985 1.1 christos 000000,5.RS,5.RT,10.CODE,110110:SPECIAL:32::TNE
3986 1.1 christos "tne r<RS>, r<RT>"
3987 1.1 christos *mipsII:
3988 1.1 christos *mipsIII:
3989 1.1 christos *mipsIV:
3990 1.1 christos *mipsV:
3991 1.1 christos *mips32:
3992 1.1 christos *mips32r2:
3993 1.1 christos *mips64:
3994 1.1 christos *mips64r2:
3995 1.1 christos *vr4100:
3996 1.1 christos *vr5000:
3997 1.1 christos {
3998 1.1 christos if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
3999 1.1 christos SignalException (Trap, instruction_0);
4000 1.1 christos }
4001 1.1 christos
4002 1.1 christos
4003 1.1 christos 000001,5.RS,01110,16.IMMEDIATE:REGIMM:32::TNEI
4004 1.1 christos "tnei r<RS>, <IMMEDIATE>"
4005 1.1 christos *mipsII:
4006 1.1 christos *mipsIII:
4007 1.1 christos *mipsIV:
4008 1.1 christos *mipsV:
4009 1.1 christos *mips32:
4010 1.1 christos *mips32r2:
4011 1.1 christos *mips64:
4012 1.1 christos *mips64r2:
4013 1.1 christos *vr4100:
4014 1.1 christos *vr5000:
4015 1.1 christos {
4016 1.1 christos if ((signed_word) GPR[RS] != (signed_word) EXTEND16 (IMMEDIATE))
4017 1.1 christos SignalException (Trap, instruction_0);
4018 1.1 christos }
4019 1.1 christos
4020 1.1 christos
4021 1.1 christos :function:::void:do_xor:int rs, int rt, int rd
4022 1.1 christos {
4023 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
4024 1.1 christos GPR[rd] = GPR[rs] ^ GPR[rt];
4025 1.1 christos TRACE_ALU_RESULT (GPR[rd]);
4026 1.1 christos }
4027 1.1 christos
4028 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100110:SPECIAL:32::XOR
4029 1.1 christos "xor r<RD>, r<RS>, r<RT>"
4030 1.1 christos *mipsI:
4031 1.1 christos *mipsII:
4032 1.1 christos *mipsIII:
4033 1.1 christos *mipsIV:
4034 1.1 christos *mipsV:
4035 1.1 christos *mips32:
4036 1.1 christos *mips32r2:
4037 1.1 christos *mips64:
4038 1.1 christos *mips64r2:
4039 1.1 christos *vr4100:
4040 1.1 christos *vr5000:
4041 1.1 christos *r3900:
4042 1.1 christos {
4043 1.1 christos do_xor (SD_, RS, RT, RD);
4044 1.1 christos }
4045 1.1 christos
4046 1.1 christos
4047 1.1 christos :function:::void:do_xori:int rs, int rt, unsigned16 immediate
4048 1.1 christos {
4049 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], immediate);
4050 1.1 christos GPR[rt] = GPR[rs] ^ immediate;
4051 1.1 christos TRACE_ALU_RESULT (GPR[rt]);
4052 1.1 christos }
4053 1.1 christos
4054 1.1 christos 001110,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::XORI
4055 1.1 christos "xori r<RT>, r<RS>, %#lx<IMMEDIATE>"
4056 1.1 christos *mipsI:
4057 1.1 christos *mipsII:
4058 1.1 christos *mipsIII:
4059 1.1 christos *mipsIV:
4060 1.1 christos *mipsV:
4061 1.1 christos *mips32:
4062 1.1 christos *mips32r2:
4063 1.1 christos *mips64:
4064 1.1 christos *mips64r2:
4065 1.1 christos *vr4100:
4066 1.1 christos *vr5000:
4067 1.1 christos *r3900:
4068 1.1 christos {
4069 1.1 christos do_xori (SD_, RS, RT, IMMEDIATE);
4070 1.1 christos }
4071 1.1 christos
4072 1.1 christos
4074 1.1 christos //
4075 1.1 christos // MIPS Architecture:
4076 1.1 christos //
4077 1.1 christos // FPU Instruction Set (COP1 & COP1X)
4078 1.1 christos //
4079 1.1 christos
4080 1.1 christos
4081 1.1 christos :%s::::FMT:int fmt
4082 1.1 christos {
4083 1.1 christos switch (fmt)
4084 1.1 christos {
4085 1.1 christos case fmt_single: return "s";
4086 1.1 christos case fmt_double: return "d";
4087 1.1 christos case fmt_word: return "w";
4088 1.1 christos case fmt_long: return "l";
4089 1.1 christos case fmt_ps: return "ps";
4090 1.1 christos default: return "?";
4091 1.1 christos }
4092 1.1 christos }
4093 1.1 christos
4094 1.1 christos :%s::::TF:int tf
4095 1.1 christos {
4096 1.1 christos if (tf)
4097 1.1 christos return "t";
4098 1.1 christos else
4099 1.1 christos return "f";
4100 1.1 christos }
4101 1.1 christos
4102 1.1 christos :%s::::ND:int nd
4103 1.1 christos {
4104 1.1 christos if (nd)
4105 1.1 christos return "l";
4106 1.1 christos else
4107 1.1 christos return "";
4108 1.1 christos }
4109 1.1 christos
4110 1.1 christos :%s::::COND:int cond
4111 1.1 christos {
4112 1.1 christos switch (cond)
4113 1.1 christos {
4114 1.1 christos case 00: return "f";
4115 1.1 christos case 01: return "un";
4116 1.1 christos case 02: return "eq";
4117 1.1 christos case 03: return "ueq";
4118 1.1 christos case 04: return "olt";
4119 1.1 christos case 05: return "ult";
4120 1.1 christos case 06: return "ole";
4121 1.1 christos case 07: return "ule";
4122 1.1 christos case 010: return "sf";
4123 1.1 christos case 011: return "ngle";
4124 1.1 christos case 012: return "seq";
4125 1.1 christos case 013: return "ngl";
4126 1.1 christos case 014: return "lt";
4127 1.1 christos case 015: return "nge";
4128 1.1 christos case 016: return "le";
4129 1.1 christos case 017: return "ngt";
4130 1.1 christos default: return "?";
4131 1.1 christos }
4132 1.1 christos }
4133 1.1 christos
4134 1.1 christos
4135 1.1 christos // Helpers:
4136 1.1 christos //
4137 1.1 christos // Check that the given FPU format is usable, and signal a
4138 1.1 christos // ReservedInstruction exception if not.
4139 1.1 christos //
4140 1.1 christos
4141 1.1 christos // check_fmt_p checks that the format is single, double, or paired single.
4142 1.1 christos :function:::void:check_fmt_p:int fmt, instruction_word insn
4143 1.1 christos *mipsI:
4144 1.1 christos *mipsII:
4145 1.1 christos *mipsIII:
4146 1.1 christos *mipsIV:
4147 1.1 christos *mips32:
4148 1.1 christos *vr4100:
4149 1.1 christos *vr5000:
4150 1.1 christos *r3900:
4151 1.1 christos {
4152 1.1 christos /* None of these ISAs support Paired Single, so just fall back to
4153 1.1 christos the single/double check. */
4154 1.1 christos if ((fmt != fmt_single) && (fmt != fmt_double))
4155 1.1 christos SignalException (ReservedInstruction, insn);
4156 1.1 christos }
4157 1.1 christos
4158 1.1 christos :function:::void:check_fmt_p:int fmt, instruction_word insn
4159 1.1 christos *mips32r2:
4160 1.1 christos {
4161 1.1 christos if ((fmt != fmt_single) && (fmt != fmt_double) && (fmt != fmt_ps))
4162 1.1 christos SignalException (ReservedInstruction, insn);
4163 1.1 christos }
4164 1.1 christos
4165 1.1 christos :function:::void:check_fmt_p:int fmt, instruction_word insn
4166 1.1 christos *mipsV:
4167 1.1 christos *mips64:
4168 1.1 christos *mips64r2:
4169 1.1 christos {
4170 1.1 christos if ((fmt != fmt_single) && (fmt != fmt_double)
4171 1.1 christos && (fmt != fmt_ps || (UserMode && (SR & (status_UX|status_PX)) == 0)))
4172 1.1 christos SignalException (ReservedInstruction, insn);
4173 1.1 christos }
4174 1.1 christos
4175 1.1 christos
4176 1.1 christos // Helper:
4177 1.1 christos //
4178 1.1 christos // Check that the FPU is currently usable, and signal a CoProcessorUnusable
4179 1.1 christos // exception if not.
4180 1.1 christos //
4181 1.1 christos
4182 1.1 christos :function:::void:check_fpu:
4183 1.1 christos *mipsI:
4184 1.1 christos *mipsII:
4185 1.1 christos *mipsIII:
4186 1.1 christos *mipsIV:
4187 1.1 christos *mipsV:
4188 1.1 christos *mips32:
4189 1.1 christos *mips32r2:
4190 1.1 christos *mips64:
4191 1.1 christos *mips64r2:
4192 1.1 christos *vr4100:
4193 1.1 christos *vr5000:
4194 1.1 christos *r3900:
4195 1.1 christos {
4196 1.1 christos if (! COP_Usable (1))
4197 1.1 christos SignalExceptionCoProcessorUnusable (1);
4198 1.1 christos }
4199 1.1 christos
4200 1.1 christos
4201 1.1 christos // Helper:
4202 1.1 christos //
4203 1.1 christos // Load a double word FP value using 2 32-bit memory cycles a la MIPS II
4204 1.1 christos // or MIPS32. do_load cannot be used instead because it returns an
4205 1.1 christos // unsigned_word, which is limited to the size of the machine's registers.
4206 1.1 christos //
4207 1.1 christos
4208 1.1 christos :function:::unsigned64:do_load_double:address_word base, address_word offset
4209 1.1 christos *mipsII:
4210 1.1 christos *mips32:
4211 1.1 christos *mips32r2:
4212 1.1 christos {
4213 1.1 christos int bigendian = (BigEndianCPU ? ! ReverseEndian : ReverseEndian);
4214 1.1 christos address_word vaddr;
4215 1.1 christos address_word paddr;
4216 1.1 christos int uncached;
4217 1.1 christos unsigned64 memval;
4218 1.1 christos unsigned64 v;
4219 1.1 christos
4220 1.1 christos vaddr = loadstore_ea (SD_, base, offset);
4221 1.1 christos if ((vaddr & AccessLength_DOUBLEWORD) != 0)
4222 1.1 christos {
4223 1.1 christos SIM_CORE_SIGNAL (SD, STATE_CPU (SD, 0), cia, read_map,
4224 1.1 christos AccessLength_DOUBLEWORD + 1, vaddr, read_transfer,
4225 1.1 christos sim_core_unaligned_signal);
4226 1.1 christos }
4227 1.1 christos AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET,
4228 1.1 christos isREAL);
4229 1.1 christos LoadMemory (&memval, NULL, uncached, AccessLength_WORD, paddr, vaddr,
4230 1.1 christos isDATA, isREAL);
4231 1.1 christos v = (unsigned64)memval;
4232 1.1 christos LoadMemory (&memval, NULL, uncached, AccessLength_WORD, paddr + 4, vaddr + 4,
4233 1.1 christos isDATA, isREAL);
4234 1.1 christos return (bigendian ? ((v << 32) | memval) : (v | (memval << 32)));
4235 1.1 christos }
4236 1.1 christos
4237 1.1 christos
4238 1.1 christos // Helper:
4239 1.1 christos //
4240 1.1 christos // Store a double word FP value using 2 32-bit memory cycles a la MIPS II
4241 1.1 christos // or MIPS32. do_load cannot be used instead because it returns an
4242 1.1 christos // unsigned_word, which is limited to the size of the machine's registers.
4243 1.1 christos //
4244 1.1 christos
4245 1.1 christos :function:::void:do_store_double:address_word base, address_word offset, unsigned64 v
4246 1.1 christos *mipsII:
4247 1.1 christos *mips32:
4248 1.1 christos *mips32r2:
4249 1.1 christos {
4250 1.1 christos int bigendian = (BigEndianCPU ? ! ReverseEndian : ReverseEndian);
4251 1.1 christos address_word vaddr;
4252 1.1 christos address_word paddr;
4253 1.1 christos int uncached;
4254 1.1 christos unsigned64 memval;
4255 1.1 christos
4256 1.1 christos vaddr = loadstore_ea (SD_, base, offset);
4257 1.1 christos if ((vaddr & AccessLength_DOUBLEWORD) != 0)
4258 1.1 christos {
4259 1.1 christos SIM_CORE_SIGNAL (SD, STATE_CPU(SD, 0), cia, read_map,
4260 1.1 christos AccessLength_DOUBLEWORD + 1, vaddr, write_transfer,
4261 1.1 christos sim_core_unaligned_signal);
4262 1.1 christos }
4263 1.1 christos AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET,
4264 1.1 christos isREAL);
4265 1.1 christos memval = (bigendian ? (v >> 32) : (v & 0xFFFFFFFF));
4266 1.1 christos StoreMemory (uncached, AccessLength_WORD, memval, 0, paddr, vaddr,
4267 1.1 christos isREAL);
4268 1.1 christos memval = (bigendian ? (v & 0xFFFFFFFF) : (v >> 32));
4269 1.1 christos StoreMemory (uncached, AccessLength_WORD, memval, 0, paddr + 4, vaddr + 4,
4270 1.1 christos isREAL);
4271 1.1 christos }
4272 1.1 christos
4273 1.1 christos
4274 1.1 christos 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000101:COP1:32,f::ABS.fmt
4275 1.1 christos "abs.%s<FMT> f<FD>, f<FS>"
4276 1.1 christos *mipsI:
4277 1.1 christos *mipsII:
4278 1.1 christos *mipsIII:
4279 1.1 christos *mipsIV:
4280 1.1 christos *mipsV:
4281 1.1 christos *mips32:
4282 1.1 christos *mips32r2:
4283 1.1 christos *mips64:
4284 1.1 christos *mips64r2:
4285 1.1 christos *vr4100:
4286 1.1 christos *vr5000:
4287 1.1 christos *r3900:
4288 1.1 christos {
4289 1.1 christos int fmt = FMT;
4290 1.1 christos check_fpu (SD_);
4291 1.1 christos check_fmt_p (SD_, fmt, instruction_0);
4292 1.1 christos StoreFPR (FD, fmt, AbsoluteValue (ValueFPR (FS, fmt), fmt));
4293 1.1 christos }
4294 1.1 christos
4295 1.1 christos
4296 1.1 christos
4297 1.1 christos 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000000:COP1:32,f::ADD.fmt
4298 1.1 christos "add.%s<FMT> f<FD>, f<FS>, f<FT>"
4299 1.1 christos *mipsI:
4300 1.1 christos *mipsII:
4301 1.1 christos *mipsIII:
4302 1.1 christos *mipsIV:
4303 1.1 christos *mipsV:
4304 1.1 christos *mips32:
4305 1.1 christos *mips32r2:
4306 1.1 christos *mips64:
4307 1.1 christos *mips64r2:
4308 1.1 christos *vr4100:
4309 1.1 christos *vr5000:
4310 1.1 christos *r3900:
4311 1.1 christos {
4312 1.1 christos int fmt = FMT;
4313 1.1 christos check_fpu (SD_);
4314 1.1 christos check_fmt_p (SD_, fmt, instruction_0);
4315 1.1 christos StoreFPR (FD, fmt, Add (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt));
4316 1.1 christos }
4317 1.1 christos
4318 1.1 christos
4319 1.1 christos 010011,5.RS,5.FT,5.FS,5.FD,011,110:COP1X:32,f::ALNV.PS
4320 1.1 christos "alnv.ps f<FD>, f<FS>, f<FT>, r<RS>"
4321 1.1 christos *mipsV:
4322 1.1 christos *mips32r2:
4323 1.1 christos *mips64:
4324 1.1 christos *mips64r2:
4325 1.1 christos {
4326 1.1 christos unsigned64 fs;
4327 1.1 christos unsigned64 ft;
4328 1.1 christos unsigned64 fd;
4329 1.1 christos check_fpu (SD_);
4330 1.1 christos check_u64 (SD_, instruction_0);
4331 1.1 christos fs = ValueFPR (FS, fmt_ps);
4332 1.1 christos if ((GPR[RS] & 0x3) != 0)
4333 1.1 christos Unpredictable ();
4334 1.1 christos if ((GPR[RS] & 0x4) == 0)
4335 1.1 christos fd = fs;
4336 1.1 christos else
4337 1.1 christos {
4338 1.1 christos ft = ValueFPR (FT, fmt_ps);
4339 1.1 christos if (BigEndianCPU)
4340 1.1 christos fd = PackPS (PSLower (fs), PSUpper (ft));
4341 1.1 christos else
4342 1.1 christos fd = PackPS (PSLower (ft), PSUpper (fs));
4343 1.1 christos }
4344 1.1 christos StoreFPR (FD, fmt_ps, fd);
4345 1.1 christos }
4346 1.1 christos
4347 1.1 christos
4348 1.1 christos // BC1F
4349 1.1 christos // BC1FL
4350 1.1 christos // BC1T
4351 1.1 christos // BC1TL
4352 1.1 christos
4353 1.1 christos 010001,01000,3.0,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1a
4354 1.1 christos "bc1%s<TF>%s<ND> <OFFSET>"
4355 1.1 christos *mipsI:
4356 1.1 christos *mipsII:
4357 1.1 christos *mipsIII:
4358 1.1 christos {
4359 1.1 christos check_fpu (SD_);
4360 1.1 christos TRACE_BRANCH_INPUT (PREVCOC1());
4361 1.1 christos if (PREVCOC1() == TF)
4362 1.1 christos {
4363 1.1 christos address_word dest = NIA + (EXTEND16 (OFFSET) << 2);
4364 1.1 christos TRACE_BRANCH_RESULT (dest);
4365 1.1 christos DELAY_SLOT (dest);
4366 1.1 christos }
4367 1.1 christos else if (ND)
4368 1.1 christos {
4369 1.1 christos TRACE_BRANCH_RESULT (0);
4370 1.1 christos NULLIFY_NEXT_INSTRUCTION ();
4371 1.1 christos }
4372 1.1 christos else
4373 1.1 christos {
4374 1.1 christos TRACE_BRANCH_RESULT (NIA);
4375 1.1 christos }
4376 1.1 christos }
4377 1.1 christos
4378 1.1 christos 010001,01000,3.CC,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1b
4379 1.1 christos "bc1%s<TF>%s<ND> <OFFSET>":CC == 0
4380 1.1 christos "bc1%s<TF>%s<ND> <CC>, <OFFSET>"
4381 1.1 christos *mipsIV:
4382 1.1 christos *mipsV:
4383 1.1 christos *mips32:
4384 1.1 christos *mips32r2:
4385 1.1 christos *mips64:
4386 1.1 christos *mips64r2:
4387 1.1 christos #*vr4100:
4388 1.1 christos *vr5000:
4389 1.1 christos *r3900:
4390 1.1 christos {
4391 1.1 christos check_fpu (SD_);
4392 1.1 christos if (GETFCC(CC) == TF)
4393 1.1 christos {
4394 1.1 christos address_word dest = NIA + (EXTEND16 (OFFSET) << 2);
4395 1.1 christos DELAY_SLOT (dest);
4396 1.1 christos }
4397 1.1 christos else if (ND)
4398 1.1 christos {
4399 1.1 christos NULLIFY_NEXT_INSTRUCTION ();
4400 1.1 christos }
4401 1.1 christos }
4402 1.1 christos
4403 1.1 christos
4404 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,5.FT,5.FS,3.0,00,11,4.COND:COP1:32,f::C.cond.fmta
4405 1.1 christos "c.%s<COND>.%s<FMT> f<FS>, f<FT>"
4406 1.1 christos *mipsI:
4407 1.1 christos *mipsII:
4408 1.1 christos *mipsIII:
4409 1.1 christos {
4410 1.1 christos int fmt = FMT;
4411 1.1 christos check_fpu (SD_);
4412 1.1 christos Compare (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt, COND, 0);
4413 1.1 christos TRACE_ALU_RESULT (ValueFCR (31));
4414 1.1 christos }
4415 1.1 christos
4416 1.1 christos 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,3.CC,00,11,4.COND:COP1:32,f::C.cond.fmtb
4417 1.1 christos "c.%s<COND>.%s<FMT> f<FS>, f<FT>":CC == 0
4418 1.1 christos "c.%s<COND>.%s<FMT> <CC>, f<FS>, f<FT>"
4419 1.1 christos *mipsIV:
4420 1.1 christos *mipsV:
4421 1.1 christos *mips32:
4422 1.1 christos *mips32r2:
4423 1.1 christos *mips64:
4424 1.1 christos *mips64r2:
4425 1.1 christos *vr4100:
4426 1.1 christos *vr5000:
4427 1.1 christos *r3900:
4428 1.1 christos {
4429 1.1 christos int fmt = FMT;
4430 1.1 christos check_fpu (SD_);
4431 1.1 christos check_fmt_p (SD_, fmt, instruction_0);
4432 1.1 christos Compare (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt, COND, CC);
4433 1.1 christos TRACE_ALU_RESULT (ValueFCR (31));
4434 1.1 christos }
4435 1.1 christos
4436 1.1 christos
4437 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001010:COP1:32,f::CEIL.L.fmt
4438 1.1 christos "ceil.l.%s<FMT> f<FD>, f<FS>"
4439 1.1 christos *mipsIII:
4440 1.1 christos *mipsIV:
4441 1.1 christos *mipsV:
4442 1.1 christos *mips32r2:
4443 1.1 christos *mips64:
4444 1.1 christos *mips64r2:
4445 1.1 christos *vr4100:
4446 1.1 christos *vr5000:
4447 1.1 christos *r3900:
4448 1.1 christos {
4449 1.1 christos int fmt = FMT;
4450 1.1 christos check_fpu (SD_);
4451 1.1 christos StoreFPR (FD, fmt_long, Convert (FP_RM_TOPINF, ValueFPR (FS, fmt), fmt,
4452 1.1 christos fmt_long));
4453 1.1 christos }
4454 1.1 christos
4455 1.1 christos
4456 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001110:COP1:32,f::CEIL.W
4457 1.1 christos "ceil.w.%s<FMT> f<FD>, f<FS>"
4458 1.1 christos *mipsII:
4459 1.1 christos *mipsIII:
4460 1.1 christos *mipsIV:
4461 1.1 christos *mipsV:
4462 1.1 christos *mips32:
4463 1.1 christos *mips32r2:
4464 1.1 christos *mips64:
4465 1.1 christos *mips64r2:
4466 1.1 christos *vr4100:
4467 1.1 christos *vr5000:
4468 1.1 christos *r3900:
4469 1.1 christos {
4470 1.1 christos int fmt = FMT;
4471 1.1 christos check_fpu (SD_);
4472 1.1 christos StoreFPR (FD, fmt_word, Convert (FP_RM_TOPINF, ValueFPR (FS, fmt), fmt,
4473 1.1 christos fmt_word));
4474 1.1 christos }
4475 1.1 christos
4476 1.1 christos
4477 1.1 christos 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1a
4478 1.1 christos "cfc1 r<RT>, f<FS>"
4479 1.1 christos *mipsI:
4480 1.1 christos *mipsII:
4481 1.1 christos *mipsIII:
4482 1.1 christos {
4483 1.1 christos check_fpu (SD_);
4484 1.1 christos if (FS == 0)
4485 1.1 christos PENDING_FILL (RT, EXTEND32 (FCR0));
4486 1.1 christos else if (FS == 31)
4487 1.1 christos PENDING_FILL (RT, EXTEND32 (FCR31));
4488 1.1 christos /* else NOP */
4489 1.1 christos }
4490 1.1 christos
4491 1.1 christos 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1b
4492 1.1 christos "cfc1 r<RT>, f<FS>"
4493 1.1 christos *mipsIV:
4494 1.1 christos *vr4100:
4495 1.1 christos *vr5000:
4496 1.1 christos *r3900:
4497 1.1 christos {
4498 1.1 christos check_fpu (SD_);
4499 1.1 christos if (FS == 0 || FS == 31)
4500 1.1 christos {
4501 1.1 christos unsigned_word fcr = ValueFCR (FS);
4502 1.1 christos TRACE_ALU_INPUT1 (fcr);
4503 1.1 christos GPR[RT] = fcr;
4504 1.1 christos }
4505 1.1 christos /* else NOP */
4506 1.1 christos TRACE_ALU_RESULT (GPR[RT]);
4507 1.1 christos }
4508 1.1 christos
4509 1.1 christos 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1c
4510 1.1 christos "cfc1 r<RT>, f<FS>"
4511 1.1 christos *mipsV:
4512 1.1 christos *mips32:
4513 1.1 christos *mips32r2:
4514 1.1 christos *mips64:
4515 1.1 christos *mips64r2:
4516 1.1 christos {
4517 1.1 christos check_fpu (SD_);
4518 1.1 christos if (FS == 0 || FS == 25 || FS == 26 || FS == 28 || FS == 31)
4519 1.1 christos {
4520 1.1 christos unsigned_word fcr = ValueFCR (FS);
4521 1.1 christos TRACE_ALU_INPUT1 (fcr);
4522 1.1 christos GPR[RT] = fcr;
4523 1.1 christos }
4524 1.1 christos /* else NOP */
4525 1.1 christos TRACE_ALU_RESULT (GPR[RT]);
4526 1.1 christos }
4527 1.1 christos
4528 1.1 christos 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1a
4529 1.1 christos "ctc1 r<RT>, f<FS>"
4530 1.1 christos *mipsI:
4531 1.1 christos *mipsII:
4532 1.1 christos *mipsIII:
4533 1.1 christos {
4534 1.1 christos check_fpu (SD_);
4535 1.1 christos if (FS == 31)
4536 1.1 christos PENDING_FILL (FCRCS_REGNUM, VL4_8 (GPR[RT]));
4537 1.1 christos /* else NOP */
4538 1.1 christos }
4539 1.1 christos
4540 1.1 christos 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1b
4541 1.1 christos "ctc1 r<RT>, f<FS>"
4542 1.1 christos *mipsIV:
4543 1.1 christos *vr4100:
4544 1.1 christos *vr5000:
4545 1.1 christos *r3900:
4546 1.1 christos {
4547 1.1 christos check_fpu (SD_);
4548 1.1 christos TRACE_ALU_INPUT1 (GPR[RT]);
4549 1.1 christos if (FS == 31)
4550 1.1 christos StoreFCR (FS, GPR[RT]);
4551 1.1 christos /* else NOP */
4552 1.1 christos }
4553 1.1 christos
4554 1.1 christos 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1c
4555 1.1 christos "ctc1 r<RT>, f<FS>"
4556 1.1 christos *mipsV:
4557 1.1 christos *mips32:
4558 1.1 christos *mips32r2:
4559 1.1 christos *mips64:
4560 1.1 christos *mips64r2:
4561 1.1 christos {
4562 1.1 christos check_fpu (SD_);
4563 1.1 christos TRACE_ALU_INPUT1 (GPR[RT]);
4564 1.1 christos if (FS == 25 || FS == 26 || FS == 28 || FS == 31)
4565 1.1 christos StoreFCR (FS, GPR[RT]);
4566 1.1 christos /* else NOP */
4567 1.1 christos }
4568 1.1 christos
4569 1.1 christos
4570 1.1 christos //
4571 1.1 christos // FIXME: Does not correctly differentiate between mips*
4572 1.1 christos //
4573 1.1 christos 010001,10,3.FMT!1!2!3!6!7,00000,5.FS,5.FD,100001:COP1:32,f::CVT.D.fmt
4574 1.1 christos "cvt.d.%s<FMT> f<FD>, f<FS>"
4575 1.1 christos *mipsI:
4576 1.1 christos *mipsII:
4577 1.1 christos *mipsIII:
4578 1.1 christos *mipsIV:
4579 1.1 christos *mipsV:
4580 1.1 christos *mips32:
4581 1.1 christos *mips32r2:
4582 1.1 christos *mips64:
4583 1.1 christos *mips64r2:
4584 1.1 christos *vr4100:
4585 1.1 christos *vr5000:
4586 1.1 christos *r3900:
4587 1.1 christos {
4588 1.1 christos int fmt = FMT;
4589 1.1 christos check_fpu (SD_);
4590 1.1 christos if ((fmt == fmt_double) | 0)
4591 1.1 christos SignalException (ReservedInstruction, instruction_0);
4592 1.1 christos StoreFPR (FD, fmt_double, Convert (GETRM (), ValueFPR (FS, fmt), fmt,
4593 1.1 christos fmt_double));
4594 1.1 christos }
4595 1.1 christos
4596 1.1 christos
4597 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,100101:COP1:32,f::CVT.L.fmt
4598 1.1 christos "cvt.l.%s<FMT> f<FD>, f<FS>"
4599 1.1 christos *mipsIII:
4600 1.1 christos *mipsIV:
4601 1.1 christos *mipsV:
4602 1.1 christos *mips32r2:
4603 1.1 christos *mips64:
4604 1.1 christos *mips64r2:
4605 1.1 christos *vr4100:
4606 1.1 christos *vr5000:
4607 1.1 christos *r3900:
4608 1.1 christos {
4609 1.1 christos int fmt = FMT;
4610 1.1 christos check_fpu (SD_);
4611 1.1 christos if ((fmt == fmt_long) | ((fmt == fmt_long) || (fmt == fmt_word)))
4612 1.1 christos SignalException (ReservedInstruction, instruction_0);
4613 1.1 christos StoreFPR (FD, fmt_long, Convert (GETRM (), ValueFPR (FS, fmt), fmt,
4614 1.1 christos fmt_long));
4615 1.1 christos }
4616 1.1 christos
4617 1.1 christos
4618 1.1 christos 010001,10,000,5.FT,5.FS,5.FD,100110:COP1:32,f::CVT.PS.S
4619 1.1 christos "cvt.ps.s f<FD>, f<FS>, f<FT>"
4620 1.1 christos *mipsV:
4621 1.1 christos *mips32r2:
4622 1.1 christos *mips64:
4623 1.1 christos *mips64r2:
4624 1.1 christos {
4625 1.1 christos check_fpu (SD_);
4626 1.1 christos check_u64 (SD_, instruction_0);
4627 1.1 christos StoreFPR (FD, fmt_ps, PackPS (ValueFPR (FS, fmt_single),
4628 1.1 christos ValueFPR (FT, fmt_single)));
4629 1.1 christos }
4630 1.1 christos
4631 1.1 christos
4632 1.1 christos //
4633 1.1 christos // FIXME: Does not correctly differentiate between mips*
4634 1.1 christos //
4635 1.1 christos 010001,10,3.FMT!0!2!3!6!7,00000,5.FS,5.FD,100000:COP1:32,f::CVT.S.fmt
4636 1.1 christos "cvt.s.%s<FMT> f<FD>, f<FS>"
4637 1.1 christos *mipsI:
4638 1.1 christos *mipsII:
4639 1.1 christos *mipsIII:
4640 1.1 christos *mipsIV:
4641 1.1 christos *mipsV:
4642 1.1 christos *mips32:
4643 1.1 christos *mips32r2:
4644 1.1 christos *mips64:
4645 1.1 christos *mips64r2:
4646 1.1 christos *vr4100:
4647 1.1 christos *vr5000:
4648 1.1 christos *r3900:
4649 1.1 christos {
4650 1.1 christos int fmt = FMT;
4651 1.1 christos check_fpu (SD_);
4652 1.1 christos if ((fmt == fmt_single) | 0)
4653 1.1 christos SignalException (ReservedInstruction, instruction_0);
4654 1.1 christos StoreFPR (FD, fmt_single, Convert (GETRM (), ValueFPR (FS, fmt), fmt,
4655 1.1 christos fmt_single));
4656 1.1 christos }
4657 1.1 christos
4658 1.1 christos
4659 1.1 christos 010001,10,110,00000,5.FS,5.FD,101000:COP1:32,f::CVT.S.PL
4660 1.1 christos "cvt.s.pl f<FD>, f<FS>"
4661 1.1 christos *mipsV:
4662 1.1 christos *mips32r2:
4663 1.1 christos *mips64:
4664 1.1 christos *mips64r2:
4665 1.1 christos {
4666 1.1 christos check_fpu (SD_);
4667 1.1 christos check_u64 (SD_, instruction_0);
4668 1.1 christos StoreFPR (FD, fmt_single, PSLower (ValueFPR (FS, fmt_ps)));
4669 1.1 christos }
4670 1.1 christos
4671 1.1 christos
4672 1.1 christos 010001,10,110,00000,5.FS,5.FD,100000:COP1:32,f::CVT.S.PU
4673 1.1 christos "cvt.s.pu f<FD>, f<FS>"
4674 1.1 christos *mipsV:
4675 1.1 christos *mips32r2:
4676 1.1 christos *mips64:
4677 1.1 christos *mips64r2:
4678 1.1 christos {
4679 1.1 christos check_fpu (SD_);
4680 1.1 christos check_u64 (SD_, instruction_0);
4681 1.1 christos StoreFPR (FD, fmt_single, PSUpper (ValueFPR (FS, fmt_ps)));
4682 1.1 christos }
4683 1.1 christos
4684 1.1 christos
4685 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,100100:COP1:32,f::CVT.W.fmt
4686 1.1 christos "cvt.w.%s<FMT> f<FD>, f<FS>"
4687 1.1 christos *mipsI:
4688 1.1 christos *mipsII:
4689 1.1 christos *mipsIII:
4690 1.1 christos *mipsIV:
4691 1.1 christos *mipsV:
4692 1.1 christos *mips32:
4693 1.1 christos *mips32r2:
4694 1.1 christos *mips64:
4695 1.1 christos *mips64r2:
4696 1.1 christos *vr4100:
4697 1.1 christos *vr5000:
4698 1.1 christos *r3900:
4699 1.1 christos {
4700 1.1 christos int fmt = FMT;
4701 1.1 christos check_fpu (SD_);
4702 1.1 christos if ((fmt == fmt_word) | ((fmt == fmt_long) || (fmt == fmt_word)))
4703 1.1 christos SignalException (ReservedInstruction, instruction_0);
4704 1.1 christos StoreFPR (FD, fmt_word, Convert (GETRM (), ValueFPR (FS, fmt), fmt,
4705 1.1 christos fmt_word));
4706 1.1 christos }
4707 1.1 christos
4708 1.1 christos
4709 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,5.FT,5.FS,5.FD,000011:COP1:32,f::DIV.fmt
4710 1.1 christos "div.%s<FMT> f<FD>, f<FS>, f<FT>"
4711 1.1 christos *mipsI:
4712 1.1 christos *mipsII:
4713 1.1 christos *mipsIII:
4714 1.1 christos *mipsIV:
4715 1.1 christos *mipsV:
4716 1.1 christos *mips32:
4717 1.1 christos *mips32r2:
4718 1.1 christos *mips64:
4719 1.1 christos *mips64r2:
4720 1.1 christos *vr4100:
4721 1.1 christos *vr5000:
4722 1.1 christos *r3900:
4723 1.1 christos {
4724 1.1 christos int fmt = FMT;
4725 1.1 christos check_fpu (SD_);
4726 1.1 christos StoreFPR (FD, fmt, Divide (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt));
4727 1.1 christos }
4728 1.1 christos
4729 1.1 christos
4730 1.1 christos 010001,00001,5.RT,5.FS,00000000000:COP1:64,f::DMFC1a
4731 1.1 christos "dmfc1 r<RT>, f<FS>"
4732 1.1 christos *mipsIII:
4733 1.1 christos {
4734 1.1 christos unsigned64 v;
4735 1.1 christos check_fpu (SD_);
4736 1.1 christos check_u64 (SD_, instruction_0);
4737 1.1 christos if (SizeFGR () == 64)
4738 1.1 christos v = FGR[FS];
4739 1.1 christos else if ((FS & 0x1) == 0)
4740 1.1 christos v = SET64HI (FGR[FS+1]) | FGR[FS];
4741 1.1 christos else
4742 1.1 christos v = SET64HI (0xDEADC0DE) | 0xBAD0BAD0;
4743 1.1 christos PENDING_FILL (RT, v);
4744 1.1 christos TRACE_ALU_RESULT (v);
4745 1.1 christos }
4746 1.1 christos
4747 1.1 christos 010001,00001,5.RT,5.FS,00000000000:COP1:64,f::DMFC1b
4748 1.1 christos "dmfc1 r<RT>, f<FS>"
4749 1.1 christos *mipsIV:
4750 1.1 christos *mipsV:
4751 1.1 christos *mips64:
4752 1.1 christos *mips64r2:
4753 1.1 christos *vr4100:
4754 1.1 christos *vr5000:
4755 1.1 christos *r3900:
4756 1.1 christos {
4757 1.1 christos check_fpu (SD_);
4758 1.1 christos check_u64 (SD_, instruction_0);
4759 1.1 christos if (SizeFGR () == 64)
4760 1.1 christos GPR[RT] = FGR[FS];
4761 1.1 christos else if ((FS & 0x1) == 0)
4762 1.1 christos GPR[RT] = SET64HI (FGR[FS+1]) | FGR[FS];
4763 1.1 christos else
4764 1.1 christos GPR[RT] = SET64HI (0xDEADC0DE) | 0xBAD0BAD0;
4765 1.1 christos TRACE_ALU_RESULT (GPR[RT]);
4766 1.1 christos }
4767 1.1 christos
4768 1.1 christos
4769 1.1 christos 010001,00101,5.RT,5.FS,00000000000:COP1:64,f::DMTC1a
4770 1.1 christos "dmtc1 r<RT>, f<FS>"
4771 1.1 christos *mipsIII:
4772 1.1 christos {
4773 1.1 christos unsigned64 v;
4774 1.1 christos check_fpu (SD_);
4775 1.1 christos check_u64 (SD_, instruction_0);
4776 1.1 christos if (SizeFGR () == 64)
4777 1.1 christos PENDING_FILL ((FS + FGR_BASE), GPR[RT]);
4778 1.1 christos else if ((FS & 0x1) == 0)
4779 1.1 christos {
4780 1.1 christos PENDING_FILL (((FS + 1) + FGR_BASE), VH4_8 (GPR[RT]));
4781 1.1 christos PENDING_FILL ((FS + FGR_BASE), VL4_8 (GPR[RT]));
4782 1.1 christos }
4783 1.1 christos else
4784 1.1 christos Unpredictable ();
4785 1.1 christos TRACE_FP_RESULT (GPR[RT]);
4786 1.1 christos }
4787 1.1 christos
4788 1.1 christos 010001,00101,5.RT,5.FS,00000000000:COP1:64,f::DMTC1b
4789 1.1 christos "dmtc1 r<RT>, f<FS>"
4790 1.1 christos *mipsIV:
4791 1.1 christos *mipsV:
4792 1.1 christos *mips64:
4793 1.1 christos *mips64r2:
4794 1.1 christos *vr4100:
4795 1.1 christos *vr5000:
4796 1.1 christos *r3900:
4797 1.1 christos {
4798 1.1 christos check_fpu (SD_);
4799 1.1 christos check_u64 (SD_, instruction_0);
4800 1.1 christos if (SizeFGR () == 64)
4801 1.1 christos StoreFPR (FS, fmt_uninterpreted_64, GPR[RT]);
4802 1.1 christos else if ((FS & 0x1) == 0)
4803 1.1 christos StoreFPR (FS, fmt_uninterpreted_64, GPR[RT]);
4804 1.1 christos else
4805 1.1 christos Unpredictable ();
4806 1.1 christos }
4807 1.1 christos
4808 1.1 christos
4809 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001011:COP1:32,f::FLOOR.L.fmt
4810 1.1 christos "floor.l.%s<FMT> f<FD>, f<FS>"
4811 1.1 christos *mipsIII:
4812 1.1 christos *mipsIV:
4813 1.1 christos *mipsV:
4814 1.1 christos *mips32r2:
4815 1.1 christos *mips64:
4816 1.1 christos *mips64r2:
4817 1.1 christos *vr4100:
4818 1.1 christos *vr5000:
4819 1.1 christos *r3900:
4820 1.1 christos {
4821 1.1 christos int fmt = FMT;
4822 1.1 christos check_fpu (SD_);
4823 1.1 christos StoreFPR (FD, fmt_long, Convert (FP_RM_TOMINF, ValueFPR (FS, fmt), fmt,
4824 1.1 christos fmt_long));
4825 1.1 christos }
4826 1.1 christos
4827 1.1 christos
4828 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001111:COP1:32,f::FLOOR.W.fmt
4829 1.1 christos "floor.w.%s<FMT> f<FD>, f<FS>"
4830 1.1 christos *mipsII:
4831 1.1 christos *mipsIII:
4832 1.1 christos *mipsIV:
4833 1.1 christos *mipsV:
4834 1.1 christos *mips32:
4835 1.1 christos *mips32r2:
4836 1.1 christos *mips64:
4837 1.1 christos *mips64r2:
4838 1.1 christos *vr4100:
4839 1.1 christos *vr5000:
4840 1.1 christos *r3900:
4841 1.1 christos {
4842 1.1 christos int fmt = FMT;
4843 1.1 christos check_fpu (SD_);
4844 1.1 christos StoreFPR (FD, fmt_word, Convert (FP_RM_TOMINF, ValueFPR (FS, fmt), fmt,
4845 1.1 christos fmt_word));
4846 1.1 christos }
4847 1.1 christos
4848 1.1 christos
4849 1.1 christos 110101,5.BASE,5.FT,16.OFFSET:COP1:32,f::LDC1a
4850 1.1 christos "ldc1 f<FT>, <OFFSET>(r<BASE>)"
4851 1.1 christos *mipsII:
4852 1.1 christos *mips32:
4853 1.1 christos *mips32r2:
4854 1.1 christos {
4855 1.1 christos check_fpu (SD_);
4856 1.1 christos COP_LD (1, FT, do_load_double (SD_, GPR[BASE], EXTEND16 (OFFSET)));
4857 1.1 christos }
4858 1.1 christos
4859 1.1 christos
4860 1.1 christos 110101,5.BASE,5.FT,16.OFFSET:COP1:32,f::LDC1b
4861 1.1 christos "ldc1 f<FT>, <OFFSET>(r<BASE>)"
4862 1.1 christos *mipsIII:
4863 1.1 christos *mipsIV:
4864 1.1 christos *mipsV:
4865 1.1 christos *mips64:
4866 1.1 christos *mips64r2:
4867 1.1 christos *vr4100:
4868 1.1 christos *vr5000:
4869 1.1 christos *r3900:
4870 1.1 christos {
4871 1.1 christos check_fpu (SD_);
4872 1.1 christos COP_LD (1, FT, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));
4873 1.1 christos }
4874 1.1 christos
4875 1.1 christos
4876 1.1 christos 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:32,f::LDXC1
4877 1.1 christos "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
4878 1.1 christos *mips32r2:
4879 1.1 christos {
4880 1.1 christos check_fpu (SD_);
4881 1.1 christos COP_LD (1, FD, do_load_double (SD_, GPR[BASE], GPR[INDEX]));
4882 1.1 christos }
4883 1.1 christos
4884 1.1 christos
4885 1.1 christos 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:64,f::LDXC1
4886 1.1 christos "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
4887 1.1 christos *mipsIV:
4888 1.1 christos *mipsV:
4889 1.1 christos *mips64:
4890 1.1 christos *mips64r2:
4891 1.1 christos *vr5000:
4892 1.1 christos {
4893 1.1 christos check_fpu (SD_);
4894 1.1 christos check_u64 (SD_, instruction_0);
4895 1.1 christos COP_LD (1, FD, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX]));
4896 1.1 christos }
4897 1.1 christos
4898 1.1 christos
4899 1.1 christos 010011,5.BASE,5.INDEX,5.0,5.FD,000101:COP1X:32,f::LUXC1
4900 1.1 christos "luxc1 f<FD>, r<INDEX>(r<BASE>)"
4901 1.1 christos *mips32r2:
4902 1.1 christos {
4903 1.1 christos address_word base = GPR[BASE];
4904 1.1 christos address_word index = GPR[INDEX];
4905 1.1 christos address_word vaddr = base + index;
4906 1.1 christos check_fpu (SD_);
4907 1.1 christos if (SizeFGR () != 64)
4908 1.1 christos Unpredictable ();
4909 1.1 christos /* Arrange for the bottom 3 bits of (base + index) to be 0. */
4910 1.1 christos if ((vaddr & 0x7) != 0)
4911 1.1 christos index -= (vaddr & 0x7);
4912 1.1 christos COP_LD (1, FD, do_load_double (SD_, base, index));
4913 1.1 christos }
4914 1.1 christos
4915 1.1 christos
4916 1.1 christos 010011,5.BASE,5.INDEX,5.0,5.FD,000101:COP1X:64,f::LUXC1
4917 1.1 christos "luxc1 f<FD>, r<INDEX>(r<BASE>)"
4918 1.1 christos *mipsV:
4919 1.1 christos *mips64:
4920 1.1 christos *mips64r2:
4921 1.1 christos {
4922 1.1 christos address_word base = GPR[BASE];
4923 1.1 christos address_word index = GPR[INDEX];
4924 1.1 christos address_word vaddr = base + index;
4925 1.1 christos check_fpu (SD_);
4926 1.1 christos check_u64 (SD_, instruction_0);
4927 1.1 christos if (SizeFGR () != 64)
4928 1.1 christos Unpredictable ();
4929 1.1 christos /* Arrange for the bottom 3 bits of (base + index) to be 0. */
4930 1.1 christos if ((vaddr & 0x7) != 0)
4931 1.1 christos index -= (vaddr & 0x7);
4932 1.1 christos COP_LD (1, FD, do_load (SD_, AccessLength_DOUBLEWORD, base, index));
4933 1.1 christos }
4934 1.1 christos
4935 1.1 christos
4936 1.1 christos 110001,5.BASE,5.FT,16.OFFSET:COP1:32,f::LWC1
4937 1.1 christos "lwc1 f<FT>, <OFFSET>(r<BASE>)"
4938 1.1 christos *mipsI:
4939 1.1 christos *mipsII:
4940 1.1 christos *mipsIII:
4941 1.1 christos *mipsIV:
4942 1.1 christos *mipsV:
4943 1.1 christos *mips32:
4944 1.1 christos *mips32r2:
4945 1.1 christos *mips64:
4946 1.1 christos *mips64r2:
4947 1.1 christos *vr4100:
4948 1.1 christos *vr5000:
4949 1.1 christos *r3900:
4950 1.1 christos {
4951 1.1 christos check_fpu (SD_);
4952 1.1 christos COP_LW (1, FT, do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET)));
4953 1.1 christos }
4954 1.1 christos
4955 1.1 christos
4956 1.1 christos 010011,5.BASE,5.INDEX,5.0,5.FD,000000:COP1X:32,f::LWXC1
4957 1.1 christos "lwxc1 f<FD>, r<INDEX>(r<BASE>)"
4958 1.1 christos *mipsIV:
4959 1.1 christos *mipsV:
4960 1.1 christos *mips32r2:
4961 1.1 christos *mips64:
4962 1.1 christos *mips64r2:
4963 1.1 christos *vr5000:
4964 1.1 christos {
4965 1.1 christos check_fpu (SD_);
4966 1.1 christos check_u64 (SD_, instruction_0);
4967 1.1 christos COP_LW (1, FD, do_load (SD_, AccessLength_WORD, GPR[BASE], GPR[INDEX]));
4968 1.1 christos }
4969 1.1 christos
4970 1.1 christos
4971 1.1 christos
4972 1.1 christos 010011,5.FR,5.FT,5.FS,5.FD,100,3.FMT!2!3!4!5!7:COP1X:32,f::MADD.fmt
4973 1.1 christos "madd.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
4974 1.1 christos *mipsIV:
4975 1.1 christos *mipsV:
4976 1.1 christos *mips32r2:
4977 1.1 christos *mips64:
4978 1.1 christos *mips64r2:
4979 1.1 christos *vr5000:
4980 1.1 christos {
4981 1.1 christos int fmt = FMT;
4982 1.1 christos check_fpu (SD_);
4983 1.1 christos check_u64 (SD_, instruction_0);
4984 1.1 christos check_fmt_p (SD_, fmt, instruction_0);
4985 1.1 christos StoreFPR (FD, fmt, MultiplyAdd (ValueFPR (FS, fmt), ValueFPR (FT, fmt),
4986 1.1 christos ValueFPR (FR, fmt), fmt));
4987 1.1 christos }
4988 1.1 christos
4989 1.1 christos
4990 1.1 christos 010001,00000,5.RT,5.FS,00000000000:COP1:32,f::MFC1a
4991 1.1 christos "mfc1 r<RT>, f<FS>"
4992 1.1 christos *mipsI:
4993 1.1 christos *mipsII:
4994 1.1 christos *mipsIII:
4995 1.1 christos {
4996 1.1 christos unsigned64 v;
4997 1.1 christos check_fpu (SD_);
4998 1.1 christos v = EXTEND32 (FGR[FS]);
4999 1.1 christos PENDING_FILL (RT, v);
5000 1.1 christos TRACE_ALU_RESULT (v);
5001 1.1 christos }
5002 1.1 christos
5003 1.1 christos 010001,00000,5.RT,5.FS,00000000000:COP1:32,f::MFC1b
5004 1.1 christos "mfc1 r<RT>, f<FS>"
5005 1.1 christos *mipsIV:
5006 1.1 christos *mipsV:
5007 1.1 christos *mips32:
5008 1.1 christos *mips32r2:
5009 1.1 christos *mips64:
5010 1.1 christos *mips64r2:
5011 1.1 christos *vr4100:
5012 1.1 christos *vr5000:
5013 1.1 christos *r3900:
5014 1.1 christos {
5015 1.1 christos check_fpu (SD_);
5016 1.1 christos GPR[RT] = EXTEND32 (FGR[FS]);
5017 1.1 christos TRACE_ALU_RESULT (GPR[RT]);
5018 1.1 christos }
5019 1.1 christos
5020 1.1 christos
5021 1.1 christos 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000110:COP1:32,f::MOV.fmt
5022 1.1 christos "mov.%s<FMT> f<FD>, f<FS>"
5023 1.1 christos *mipsI:
5024 1.1 christos *mipsII:
5025 1.1 christos *mipsIII:
5026 1.1 christos *mipsIV:
5027 1.1 christos *mipsV:
5028 1.1 christos *mips32:
5029 1.1 christos *mips32r2:
5030 1.1 christos *mips64:
5031 1.1 christos *mips64r2:
5032 1.1 christos *vr4100:
5033 1.1 christos *vr5000:
5034 1.1 christos *r3900:
5035 1.1 christos {
5036 1.1 christos int fmt = FMT;
5037 1.1 christos check_fpu (SD_);
5038 1.1 christos check_fmt_p (SD_, fmt, instruction_0);
5039 1.1 christos StoreFPR (FD, fmt, ValueFPR (FS, fmt));
5040 1.1 christos }
5041 1.1 christos
5042 1.1 christos
5043 1.1 christos // MOVF
5044 1.1 christos // MOVT
5045 1.1 christos 000000,5.RS,3.CC,0,1.TF,5.RD,00000,000001:SPECIAL:32,f::MOVtf
5046 1.1 christos "mov%s<TF> r<RD>, r<RS>, <CC>"
5047 1.1 christos *mipsIV:
5048 1.1 christos *mipsV:
5049 1.1 christos *mips32:
5050 1.1 christos *mips32r2:
5051 1.1 christos *mips64:
5052 1.1 christos *mips64r2:
5053 1.1 christos *vr5000:
5054 1.1 christos {
5055 1.1 christos check_fpu (SD_);
5056 1.1 christos if (GETFCC(CC) == TF)
5057 1.1 christos GPR[RD] = GPR[RS];
5058 1.1 christos }
5059 1.1 christos
5060 1.1 christos
5061 1.1 christos // MOVF.fmt
5062 1.1 christos // MOVT.fmt
5063 1.1 christos 010001,10,3.FMT!2!3!4!5!7,3.CC,0,1.TF,5.FS,5.FD,010001:COP1:32,f::MOVtf.fmt
5064 1.1 christos "mov%s<TF>.%s<FMT> f<FD>, f<FS>, <CC>"
5065 1.1 christos *mipsIV:
5066 1.1 christos *mipsV:
5067 1.1 christos *mips32:
5068 1.1 christos *mips32r2:
5069 1.1 christos *mips64:
5070 1.1 christos *mips64r2:
5071 1.1 christos *vr5000:
5072 1.1 christos {
5073 1.1 christos int fmt = FMT;
5074 1.1 christos check_fpu (SD_);
5075 1.1 christos if (fmt != fmt_ps)
5076 1.1 christos {
5077 1.1 christos if (GETFCC(CC) == TF)
5078 1.1 christos StoreFPR (FD, fmt, ValueFPR (FS, fmt));
5079 1.1 christos else
5080 1.1 christos StoreFPR (FD, fmt, ValueFPR (FD, fmt)); /* set fmt */
5081 1.1 christos }
5082 1.1 christos else
5083 1.1 christos {
5084 1.1 christos unsigned64 fd;
5085 1.1 christos fd = PackPS (PSUpper (ValueFPR ((GETFCC (CC+1) == TF) ? FS : FD,
5086 1.1 christos fmt_ps)),
5087 1.1 christos PSLower (ValueFPR ((GETFCC (CC+0) == TF) ? FS : FD,
5088 1.1 christos fmt_ps)));
5089 1.1 christos StoreFPR (FD, fmt_ps, fd);
5090 1.1 christos }
5091 1.1 christos }
5092 1.1 christos
5093 1.1 christos
5094 1.1 christos 010001,10,3.FMT!2!3!4!5!7,5.RT,5.FS,5.FD,010011:COP1:32,f::MOVN.fmt
5095 1.1 christos "movn.%s<FMT> f<FD>, f<FS>, r<RT>"
5096 1.1 christos *mipsIV:
5097 1.1 christos *mipsV:
5098 1.1 christos *mips32:
5099 1.1 christos *mips32r2:
5100 1.1 christos *mips64:
5101 1.1 christos *mips64r2:
5102 1.1 christos *vr5000:
5103 1.1 christos {
5104 1.1 christos check_fpu (SD_);
5105 1.1 christos if (GPR[RT] != 0)
5106 1.1 christos StoreFPR (FD, FMT, ValueFPR (FS, FMT));
5107 1.1 christos else
5108 1.1 christos StoreFPR (FD, FMT, ValueFPR (FD, FMT));
5109 1.1 christos }
5110 1.1 christos
5111 1.1 christos
5112 1.1 christos // MOVT see MOVtf
5113 1.1 christos
5114 1.1 christos
5115 1.1 christos // MOVT.fmt see MOVtf.fmt
5116 1.1 christos
5117 1.1 christos
5118 1.1 christos
5119 1.1 christos 010001,10,3.FMT!2!3!4!5!7,5.RT,5.FS,5.FD,010010:COP1:32,f::MOVZ.fmt
5120 1.1 christos "movz.%s<FMT> f<FD>, f<FS>, r<RT>"
5121 1.1 christos *mipsIV:
5122 1.1 christos *mipsV:
5123 1.1 christos *mips32:
5124 1.1 christos *mips32r2:
5125 1.1 christos *mips64:
5126 1.1 christos *mips64r2:
5127 1.1 christos *vr5000:
5128 1.1 christos {
5129 1.1 christos check_fpu (SD_);
5130 1.1 christos if (GPR[RT] == 0)
5131 1.1 christos StoreFPR (FD, FMT, ValueFPR (FS, FMT));
5132 1.1 christos else
5133 1.1 christos StoreFPR (FD, FMT, ValueFPR (FD, FMT));
5134 1.1 christos }
5135 1.1 christos
5136 1.1 christos
5137 1.1 christos 010011,5.FR,5.FT,5.FS,5.FD,101,3.FMT!2!3!4!5!7:COP1X:32,f::MSUB.fmt
5138 1.1 christos "msub.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
5139 1.1 christos *mipsIV:
5140 1.1 christos *mipsV:
5141 1.1 christos *mips32r2:
5142 1.1 christos *mips64:
5143 1.1 christos *mips64r2:
5144 1.1 christos *vr5000:
5145 1.1 christos {
5146 1.1 christos int fmt = FMT;
5147 1.1 christos check_fpu (SD_);
5148 1.1 christos check_u64 (SD_, instruction_0);
5149 1.1 christos check_fmt_p (SD_, fmt, instruction_0);
5150 1.1 christos StoreFPR (FD, fmt, MultiplySub (ValueFPR (FS, fmt), ValueFPR (FT, fmt),
5151 1.1 christos ValueFPR (FR, fmt), fmt));
5152 1.1 christos }
5153 1.1 christos
5154 1.1 christos
5155 1.1 christos 010001,00100,5.RT,5.FS,00000000000:COP1:32,f::MTC1a
5156 1.1 christos "mtc1 r<RT>, f<FS>"
5157 1.1 christos *mipsI:
5158 1.1 christos *mipsII:
5159 1.1 christos *mipsIII:
5160 1.1 christos {
5161 1.1 christos check_fpu (SD_);
5162 1.1 christos if (SizeFGR () == 64)
5163 1.1 christos PENDING_FILL ((FS + FGR_BASE), (SET64HI (0xDEADC0DE) | VL4_8 (GPR[RT])));
5164 1.1 christos else
5165 1.1 christos PENDING_FILL ((FS + FGR_BASE), VL4_8 (GPR[RT]));
5166 1.1 christos TRACE_FP_RESULT (GPR[RT]);
5167 1.1 christos }
5168 1.1 christos
5169 1.1 christos 010001,00100,5.RT,5.FS,00000000000:COP1:32,f::MTC1b
5170 1.1 christos "mtc1 r<RT>, f<FS>"
5171 1.1 christos *mipsIV:
5172 1.1 christos *mipsV:
5173 1.1 christos *mips32:
5174 1.1 christos *mips32r2:
5175 1.1 christos *mips64:
5176 1.1 christos *mips64r2:
5177 1.1 christos *vr4100:
5178 1.1 christos *vr5000:
5179 1.1 christos *r3900:
5180 1.1 christos {
5181 1.1 christos check_fpu (SD_);
5182 1.1 christos StoreFPR (FS, fmt_uninterpreted_32, VL4_8 (GPR[RT]));
5183 1.1 christos }
5184 1.1 christos
5185 1.1 christos
5186 1.1 christos 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000010:COP1:32,f::MUL.fmt
5187 1.1 christos "mul.%s<FMT> f<FD>, f<FS>, f<FT>"
5188 1.1 christos *mipsI:
5189 1.1 christos *mipsII:
5190 1.1 christos *mipsIII:
5191 1.1 christos *mipsIV:
5192 1.1 christos *mipsV:
5193 1.1 christos *mips32:
5194 1.1 christos *mips32r2:
5195 1.1 christos *mips64:
5196 1.1 christos *mips64r2:
5197 1.1 christos *vr4100:
5198 1.1 christos *vr5000:
5199 1.1 christos *r3900:
5200 1.1 christos {
5201 1.1 christos int fmt = FMT;
5202 1.1 christos check_fpu (SD_);
5203 1.1 christos check_fmt_p (SD_, fmt, instruction_0);
5204 1.1 christos StoreFPR (FD, fmt, Multiply (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt));
5205 1.1 christos }
5206 1.1 christos
5207 1.1 christos
5208 1.1 christos 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000111:COP1:32,f::NEG.fmt
5209 1.1 christos "neg.%s<FMT> f<FD>, f<FS>"
5210 1.1 christos *mipsI:
5211 1.1 christos *mipsII:
5212 1.1 christos *mipsIII:
5213 1.1 christos *mipsIV:
5214 1.1 christos *mipsV:
5215 1.1 christos *mips32:
5216 1.1 christos *mips32r2:
5217 1.1 christos *mips64:
5218 1.1 christos *mips64r2:
5219 1.1 christos *vr4100:
5220 1.1 christos *vr5000:
5221 1.1 christos *r3900:
5222 1.1 christos {
5223 1.1 christos int fmt = FMT;
5224 1.1 christos check_fpu (SD_);
5225 1.1 christos check_fmt_p (SD_, fmt, instruction_0);
5226 1.1 christos StoreFPR (FD, fmt, Negate (ValueFPR (FS, fmt), fmt));
5227 1.1 christos }
5228 1.1 christos
5229 1.1 christos
5230 1.1 christos 010011,5.FR,5.FT,5.FS,5.FD,110,3.FMT!2!3!4!5!7:COP1X:32,f::NMADD.fmt
5231 1.1 christos "nmadd.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
5232 1.1 christos *mipsIV:
5233 1.1 christos *mipsV:
5234 1.1 christos *mips32r2:
5235 1.1 christos *mips64:
5236 1.1 christos *mips64r2:
5237 1.1 christos *vr5000:
5238 1.1 christos {
5239 1.1 christos int fmt = FMT;
5240 1.1 christos check_fpu (SD_);
5241 1.1 christos check_u64 (SD_, instruction_0);
5242 1.1 christos check_fmt_p (SD_, fmt, instruction_0);
5243 1.1 christos StoreFPR (FD, fmt, NegMultiplyAdd (ValueFPR (FS, fmt), ValueFPR (FT, fmt),
5244 1.1 christos ValueFPR (FR, fmt), fmt));
5245 1.1 christos }
5246 1.1 christos
5247 1.1 christos
5248 1.1 christos 010011,5.FR,5.FT,5.FS,5.FD,111,3.FMT!2!3!4!5!7:COP1X:32,f::NMSUB.fmt
5249 1.1 christos "nmsub.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
5250 1.1 christos *mipsIV:
5251 1.1 christos *mipsV:
5252 1.1 christos *mips32r2:
5253 1.1 christos *mips64:
5254 1.1 christos *mips64r2:
5255 1.1 christos *vr5000:
5256 1.1 christos {
5257 1.1 christos int fmt = FMT;
5258 1.1 christos check_fpu (SD_);
5259 1.1 christos check_u64 (SD_, instruction_0);
5260 1.1 christos check_fmt_p (SD_, fmt, instruction_0);
5261 1.1 christos StoreFPR (FD, fmt, NegMultiplySub (ValueFPR (FS, fmt), ValueFPR (FT, fmt),
5262 1.1 christos ValueFPR (FR, fmt), fmt));
5263 1.1 christos }
5264 1.1 christos
5265 1.1 christos
5266 1.1 christos 010001,10,110,5.FT,5.FS,5.FD,101100:COP1:32,f::PLL.PS
5267 1.1 christos "pll.ps f<FD>, f<FS>, f<FT>"
5268 1.1 christos *mipsV:
5269 1.1 christos *mips32r2:
5270 1.1 christos *mips64:
5271 1.1 christos *mips64r2:
5272 1.1 christos {
5273 1.1 christos check_fpu (SD_);
5274 1.1 christos check_u64 (SD_, instruction_0);
5275 1.1 christos StoreFPR (FD, fmt_ps, PackPS (PSLower (ValueFPR (FS, fmt_ps)),
5276 1.1 christos PSLower (ValueFPR (FT, fmt_ps))));
5277 1.1 christos }
5278 1.1 christos
5279 1.1 christos
5280 1.1 christos 010001,10,110,5.FT,5.FS,5.FD,101101:COP1:32,f::PLU.PS
5281 1.1 christos "plu.ps f<FD>, f<FS>, f<FT>"
5282 1.1 christos *mipsV:
5283 1.1 christos *mips32r2:
5284 1.1 christos *mips64:
5285 1.1 christos *mips64r2:
5286 1.1 christos {
5287 1.1 christos check_fpu (SD_);
5288 1.1 christos check_u64 (SD_, instruction_0);
5289 1.1 christos StoreFPR (FD, fmt_ps, PackPS (PSLower (ValueFPR (FS, fmt_ps)),
5290 1.1 christos PSUpper (ValueFPR (FT, fmt_ps))));
5291 1.1 christos }
5292 1.1 christos
5293 1.1 christos
5294 1.1 christos 010011,5.BASE,5.INDEX,5.HINT,00000,001111:COP1X:32::PREFX
5295 1.1 christos "prefx <HINT>, r<INDEX>(r<BASE>)"
5296 1.1 christos *mipsIV:
5297 1.1 christos *mipsV:
5298 1.1 christos *mips32r2:
5299 1.1 christos *mips64:
5300 1.1 christos *mips64r2:
5301 1.1 christos *vr5000:
5302 1.1 christos {
5303 1.1 christos address_word base = GPR[BASE];
5304 1.1 christos address_word index = GPR[INDEX];
5305 1.1 christos {
5306 1.1 christos address_word vaddr = loadstore_ea (SD_, base, index);
5307 1.1 christos address_word paddr;
5308 1.1 christos int uncached;
5309 1.1 christos if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
5310 1.1 christos Prefetch(uncached,paddr,vaddr,isDATA,HINT);
5311 1.1 christos }
5312 1.1 christos }
5313 1.1 christos
5314 1.1 christos
5315 1.1 christos 010001,10,110,5.FT,5.FS,5.FD,101110:COP1:32,f::PUL.PS
5316 1.1 christos "pul.ps f<FD>, f<FS>, f<FT>"
5317 1.1 christos *mipsV:
5318 1.1 christos *mips32r2:
5319 1.1 christos *mips64:
5320 1.1 christos *mips64r2:
5321 1.1 christos {
5322 1.1 christos check_fpu (SD_);
5323 1.1 christos check_u64 (SD_, instruction_0);
5324 1.1 christos StoreFPR (FD, fmt_ps, PackPS (PSUpper (ValueFPR (FS, fmt_ps)),
5325 1.1 christos PSLower (ValueFPR (FT, fmt_ps))));
5326 1.1 christos }
5327 1.1 christos
5328 1.1 christos
5329 1.1 christos 010001,10,110,5.FT,5.FS,5.FD,101111:COP1:32,f::PUU.PS
5330 1.1 christos "puu.ps f<FD>, f<FS>, f<FT>"
5331 1.1 christos *mipsV:
5332 1.1 christos *mips32r2:
5333 1.1 christos *mips64:
5334 1.1 christos *mips64r2:
5335 1.1 christos {
5336 1.1 christos check_fpu (SD_);
5337 1.1 christos check_u64 (SD_, instruction_0);
5338 1.1 christos StoreFPR (FD, fmt_ps, PackPS (PSUpper (ValueFPR (FS, fmt_ps)),
5339 1.1 christos PSUpper (ValueFPR (FT, fmt_ps))));
5340 1.1 christos }
5341 1.1 christos
5342 1.1 christos
5343 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,010101:COP1:32,f::RECIP.fmt
5344 1.1 christos "recip.%s<FMT> f<FD>, f<FS>"
5345 1.1 christos *mipsIV:
5346 1.1 christos *mipsV:
5347 1.1 christos *mips32r2:
5348 1.1 christos *mips64:
5349 1.1 christos *mips64r2:
5350 1.1 christos *vr5000:
5351 1.1 christos {
5352 1.1 christos int fmt = FMT;
5353 1.1 christos check_fpu (SD_);
5354 1.1 christos StoreFPR (FD, fmt, Recip (ValueFPR (FS, fmt), fmt));
5355 1.1 christos }
5356 1.1 christos
5357 1.1 christos
5358 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001000:COP1:32,f::ROUND.L.fmt
5359 1.1 christos "round.l.%s<FMT> f<FD>, f<FS>"
5360 1.1 christos *mipsIII:
5361 1.1 christos *mipsIV:
5362 1.1 christos *mipsV:
5363 1.1 christos *mips32r2:
5364 1.1 christos *mips64:
5365 1.1 christos *mips64r2:
5366 1.1 christos *vr4100:
5367 1.1 christos *vr5000:
5368 1.1 christos *r3900:
5369 1.1 christos {
5370 1.1 christos int fmt = FMT;
5371 1.1 christos check_fpu (SD_);
5372 1.1 christos StoreFPR (FD, fmt_long, Convert (FP_RM_NEAREST, ValueFPR (FS, fmt), fmt,
5373 1.1 christos fmt_long));
5374 1.1 christos }
5375 1.1 christos
5376 1.1 christos
5377 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001100:COP1:32,f::ROUND.W.fmt
5378 1.1 christos "round.w.%s<FMT> f<FD>, f<FS>"
5379 1.1 christos *mipsII:
5380 1.1 christos *mipsIII:
5381 1.1 christos *mipsIV:
5382 1.1 christos *mipsV:
5383 1.1 christos *mips32:
5384 1.1 christos *mips32r2:
5385 1.1 christos *mips64:
5386 1.1 christos *mips64r2:
5387 1.1 christos *vr4100:
5388 1.1 christos *vr5000:
5389 1.1 christos *r3900:
5390 1.1 christos {
5391 1.1 christos int fmt = FMT;
5392 1.1 christos check_fpu (SD_);
5393 1.1 christos StoreFPR (FD, fmt_word, Convert (FP_RM_NEAREST, ValueFPR (FS, fmt), fmt,
5394 1.1 christos fmt_word));
5395 1.1 christos }
5396 1.1 christos
5397 1.1 christos
5398 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,010110:COP1:32,f::RSQRT.fmt
5399 1.1 christos "rsqrt.%s<FMT> f<FD>, f<FS>"
5400 1.1 christos *mipsIV:
5401 1.1 christos *mipsV:
5402 1.1 christos *mips32r2:
5403 1.1 christos *mips64:
5404 1.1 christos *mips64r2:
5405 1.1 christos *vr5000:
5406 1.1 christos {
5407 1.1 christos int fmt = FMT;
5408 1.1 christos check_fpu (SD_);
5409 1.1 christos StoreFPR (FD, fmt, RSquareRoot (ValueFPR (FS, fmt), fmt));
5410 1.1 christos }
5411 1.1 christos
5412 1.1 christos
5413 1.1 christos 111101,5.BASE,5.FT,16.OFFSET:COP1:32,f::SDC1a
5414 1.1 christos "sdc1 f<FT>, <OFFSET>(r<BASE>)"
5415 1.1 christos *mipsII:
5416 1.1 christos *mips32:
5417 1.1 christos *mips32r2:
5418 1.1 christos {
5419 1.1 christos check_fpu (SD_);
5420 1.1 christos do_store_double (SD_, GPR[BASE], EXTEND16 (OFFSET), COP_SD (1, FT));
5421 1.1 christos }
5422 1.1 christos
5423 1.1 christos
5424 1.1 christos 111101,5.BASE,5.FT,16.OFFSET:COP1:32,f::SDC1b
5425 1.1 christos "sdc1 f<FT>, <OFFSET>(r<BASE>)"
5426 1.1 christos *mipsIII:
5427 1.1 christos *mipsIV:
5428 1.1 christos *mipsV:
5429 1.1 christos *mips64:
5430 1.1 christos *mips64r2:
5431 1.1 christos *vr4100:
5432 1.1 christos *vr5000:
5433 1.1 christos *r3900:
5434 1.1 christos {
5435 1.1 christos check_fpu (SD_);
5436 1.1 christos do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), COP_SD (1, FT));
5437 1.1 christos }
5438 1.1 christos
5439 1.1 christos
5440 1.1 christos 010011,5.BASE,5.INDEX,5.FS,00000001001:COP1X:32,f::SDXC1
5441 1.1 christos "sdxc1 f<FS>, r<INDEX>(r<BASE>)"
5442 1.1 christos *mips32r2
5443 1.1 christos {
5444 1.1 christos check_fpu (SD_);
5445 1.1 christos do_store_double (SD_, GPR[BASE], GPR[INDEX], COP_SD (1, FS));
5446 1.1 christos }
5447 1.1 christos
5448 1.1 christos
5449 1.1 christos 010011,5.BASE,5.INDEX,5.FS,00000001001:COP1X:64,f::SDXC1
5450 1.1 christos "sdxc1 f<FS>, r<INDEX>(r<BASE>)"
5451 1.1 christos *mipsIV:
5452 1.1 christos *mipsV:
5453 1.1 christos *mips64:
5454 1.1 christos *mips64r2:
5455 1.1 christos *vr5000:
5456 1.1 christos {
5457 1.1 christos check_fpu (SD_);
5458 1.1 christos check_u64 (SD_, instruction_0);
5459 1.1 christos do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX], COP_SD (1, FS));
5460 1.1 christos }
5461 1.1 christos
5462 1.1 christos
5463 1.1 christos 010011,5.BASE,5.INDEX,5.FS,00000,001101:COP1X:32,f::SUXC1
5464 1.1 christos "suxc1 f<FS>, r<INDEX>(r<BASE>)"
5465 1.1 christos *mips32r2:
5466 1.1 christos {
5467 1.1 christos address_word base = GPR[BASE];
5468 1.1 christos address_word index = GPR[INDEX];
5469 1.1 christos address_word vaddr = base + index;
5470 1.1 christos check_fpu (SD_);
5471 1.1 christos if (SizeFGR () != 64)
5472 1.1 christos Unpredictable ();
5473 1.1 christos /* Arrange for the bottom 3 bits of (base + index) to be 0. */
5474 1.1 christos if ((vaddr & 0x7) != 0)
5475 1.1 christos index -= (vaddr & 0x7);
5476 1.1 christos do_store_double (SD_, base, index, COP_SD (1, FS));
5477 1.1 christos }
5478 1.1 christos
5479 1.1 christos
5480 1.1 christos 010011,5.BASE,5.INDEX,5.FS,00000,001101:COP1X:64,f::SUXC1
5481 1.1 christos "suxc1 f<FS>, r<INDEX>(r<BASE>)"
5482 1.1 christos *mipsV:
5483 1.1 christos *mips64:
5484 1.1 christos *mips64r2:
5485 1.1 christos {
5486 1.1 christos address_word base = GPR[BASE];
5487 1.1 christos address_word index = GPR[INDEX];
5488 1.1 christos address_word vaddr = base + index;
5489 1.1 christos check_fpu (SD_);
5490 1.1 christos check_u64 (SD_, instruction_0);
5491 1.1 christos if (SizeFGR () != 64)
5492 1.1 christos Unpredictable ();
5493 1.1 christos /* Arrange for the bottom 3 bits of (base + index) to be 0. */
5494 1.1 christos if ((vaddr & 0x7) != 0)
5495 1.1 christos index -= (vaddr & 0x7);
5496 1.1 christos do_store (SD_, AccessLength_DOUBLEWORD, base, index, COP_SD (1, FS));
5497 1.1 christos }
5498 1.1 christos
5499 1.1 christos
5500 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,000100:COP1:32,f::SQRT.fmt
5501 1.1 christos "sqrt.%s<FMT> f<FD>, f<FS>"
5502 1.1 christos *mipsII:
5503 1.1 christos *mipsIII:
5504 1.1 christos *mipsIV:
5505 1.1 christos *mipsV:
5506 1.1 christos *mips32:
5507 1.1 christos *mips32r2:
5508 1.1 christos *mips64:
5509 1.1 christos *mips64r2:
5510 1.1 christos *vr4100:
5511 1.1 christos *vr5000:
5512 1.1 christos *r3900:
5513 1.1 christos {
5514 1.1 christos int fmt = FMT;
5515 1.1 christos check_fpu (SD_);
5516 1.1 christos StoreFPR (FD, fmt, (SquareRoot (ValueFPR (FS, fmt), fmt)));
5517 1.1 christos }
5518 1.1 christos
5519 1.1 christos
5520 1.1 christos 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000001:COP1:32,f::SUB.fmt
5521 1.1 christos "sub.%s<FMT> f<FD>, f<FS>, f<FT>"
5522 1.1 christos *mipsI:
5523 1.1 christos *mipsII:
5524 1.1 christos *mipsIII:
5525 1.1 christos *mipsIV:
5526 1.1 christos *mipsV:
5527 1.1 christos *mips32:
5528 1.1 christos *mips32r2:
5529 1.1 christos *mips64:
5530 1.1 christos *mips64r2:
5531 1.1 christos *vr4100:
5532 1.1 christos *vr5000:
5533 1.1 christos *r3900:
5534 1.1 christos {
5535 1.1 christos int fmt = FMT;
5536 1.1 christos check_fpu (SD_);
5537 1.1 christos check_fmt_p (SD_, fmt, instruction_0);
5538 1.1 christos StoreFPR (FD, fmt, Sub (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt));
5539 1.1 christos }
5540 1.1 christos
5541 1.1 christos
5542 1.1 christos
5543 1.1 christos 111001,5.BASE,5.FT,16.OFFSET:COP1:32,f::SWC1
5544 1.1 christos "swc1 f<FT>, <OFFSET>(r<BASE>)"
5545 1.1 christos *mipsI:
5546 1.1 christos *mipsII:
5547 1.1 christos *mipsIII:
5548 1.1 christos *mipsIV:
5549 1.1 christos *mipsV:
5550 1.1 christos *mips32:
5551 1.1 christos *mips32r2:
5552 1.1 christos *mips64:
5553 1.1 christos *mips64r2:
5554 1.1 christos *vr4100:
5555 1.1 christos *vr5000:
5556 1.1 christos *r3900:
5557 1.1 christos {
5558 1.1 christos address_word base = GPR[BASE];
5559 1.1 christos address_word offset = EXTEND16 (OFFSET);
5560 1.1 christos check_fpu (SD_);
5561 1.1 christos {
5562 1.1 christos address_word vaddr = loadstore_ea (SD_, base, offset);
5563 1.1 christos address_word paddr;
5564 1.1 christos int uncached;
5565 1.1 christos if ((vaddr & 3) != 0)
5566 1.1 christos {
5567 1.1 christos SIM_CORE_SIGNAL (SD, CPU, cia, read_map, AccessLength_WORD+1, vaddr, write_transfer, sim_core_unaligned_signal);
5568 1.1 christos }
5569 1.1 christos else
5570 1.1 christos {
5571 1.1 christos if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5572 1.1 christos {
5573 1.1 christos uword64 memval = 0;
5574 1.1 christos uword64 memval1 = 0;
5575 1.1 christos uword64 mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
5576 1.1 christos address_word reverseendian = (ReverseEndian ?(mask ^ AccessLength_WORD): 0);
5577 1.1 christos address_word bigendiancpu = (BigEndianCPU ?(mask ^ AccessLength_WORD): 0);
5578 1.1 christos unsigned int byte;
5579 1.1 christos paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
5580 1.1 christos byte = ((vaddr & mask) ^ bigendiancpu);
5581 1.1 christos memval = (((uword64)COP_SW(((instruction_0 >> 26) & 0x3),FT)) << (8 * byte));
5582 1.1 christos StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
5583 1.1 christos }
5584 1.1 christos }
5585 1.1 christos }
5586 1.1 christos }
5587 1.1 christos
5588 1.1 christos
5589 1.1 christos 010011,5.BASE,5.INDEX,5.FS,00000,001000:COP1X:32,f::SWXC1
5590 1.1 christos "swxc1 f<FS>, r<INDEX>(r<BASE>)"
5591 1.1 christos *mipsIV:
5592 1.1 christos *mipsV:
5593 1.1 christos *mips32r2:
5594 1.1 christos *mips64:
5595 1.1 christos *mips64r2:
5596 1.1 christos *vr5000:
5597 1.1 christos {
5598 1.1 christos
5599 1.1 christos address_word base = GPR[BASE];
5600 1.1 christos address_word index = GPR[INDEX];
5601 1.1 christos check_fpu (SD_);
5602 1.1 christos check_u64 (SD_, instruction_0);
5603 1.1 christos {
5604 1.1 christos address_word vaddr = loadstore_ea (SD_, base, index);
5605 1.1 christos address_word paddr;
5606 1.1 christos int uncached;
5607 1.1 christos if ((vaddr & 3) != 0)
5608 1.1 christos {
5609 1.1 christos SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, write_transfer, sim_core_unaligned_signal);
5610 1.1 christos }
5611 1.1 christos else
5612 1.1 christos {
5613 1.1 christos if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5614 1.1 christos {
5615 1.1 christos unsigned64 memval = 0;
5616 1.1 christos unsigned64 memval1 = 0;
5617 1.1 christos unsigned64 mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
5618 1.1 christos address_word reverseendian = (ReverseEndian ? (mask ^ AccessLength_WORD) : 0);
5619 1.1 christos address_word bigendiancpu = (BigEndianCPU ? (mask ^ AccessLength_WORD) : 0);
5620 1.1 christos unsigned int byte;
5621 1.1 christos paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
5622 1.1 christos byte = ((vaddr & mask) ^ bigendiancpu);
5623 1.1 christos memval = (((unsigned64)COP_SW(1,FS)) << (8 * byte));
5624 1.1 christos {
5625 1.1 christos StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
5626 1.1 christos }
5627 1.1 christos }
5628 1.1 christos }
5629 1.1 christos }
5630 1.1 christos }
5631 1.1 christos
5632 1.1 christos
5633 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001001:COP1:32,f::TRUNC.L.fmt
5634 1.1 christos "trunc.l.%s<FMT> f<FD>, f<FS>"
5635 1.1 christos *mipsIII:
5636 1.1 christos *mipsIV:
5637 1.1 christos *mipsV:
5638 1.1 christos *mips32r2:
5639 1.1 christos *mips64:
5640 1.1 christos *mips64r2:
5641 1.1 christos *vr4100:
5642 1.1 christos *vr5000:
5643 1.1 christos *r3900:
5644 1.1 christos {
5645 1.1 christos int fmt = FMT;
5646 1.1 christos check_fpu (SD_);
5647 1.1 christos StoreFPR (FD, fmt_long, Convert (FP_RM_TOZERO, ValueFPR (FS, fmt), fmt,
5648 1.1 christos fmt_long));
5649 1.1 christos }
5650 1.1 christos
5651 1.1 christos
5652 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001101:COP1:32,f::TRUNC.W
5653 1.1 christos "trunc.w.%s<FMT> f<FD>, f<FS>"
5654 1.1 christos *mipsII:
5655 1.1 christos *mipsIII:
5656 1.1 christos *mipsIV:
5657 1.1 christos *mipsV:
5658 1.1 christos *mips32:
5659 1.1 christos *mips32r2:
5660 1.1 christos *mips64:
5661 1.1 christos *mips64r2:
5662 1.1 christos *vr4100:
5663 1.1 christos *vr5000:
5664 1.1 christos *r3900:
5665 1.1 christos {
5666 1.1 christos int fmt = FMT;
5667 1.1 christos check_fpu (SD_);
5668 1.1 christos StoreFPR (FD, fmt_word, Convert (FP_RM_TOZERO, ValueFPR (FS, fmt), fmt,
5669 1.1 christos fmt_word));
5670 1.1 christos }
5671 1.1 christos
5672 1.1 christos
5674 1.1 christos //
5675 1.1 christos // MIPS Architecture:
5676 1.1 christos //
5677 1.1 christos // System Control Instruction Set (COP0)
5678 1.1 christos //
5679 1.1 christos
5680 1.1 christos
5681 1.1 christos 010000,01000,00000,16.OFFSET:COP0:32::BC0F
5682 1.1 christos "bc0f <OFFSET>"
5683 1.1 christos *mipsI:
5684 1.1 christos *mipsII:
5685 1.1 christos *mipsIII:
5686 1.1 christos *mipsIV:
5687 1.1 christos *mipsV:
5688 1.1 christos *mips32:
5689 1.1 christos *mips32r2:
5690 1.1 christos *mips64:
5691 1.1 christos *mips64r2:
5692 1.1 christos *vr4100:
5693 1.1 christos *vr5000:
5694 1.1 christos
5695 1.1 christos 010000,01000,00000,16.OFFSET:COP0:32::BC0F
5696 1.1 christos "bc0f <OFFSET>"
5697 1.1 christos // stub needed for eCos as tx39 hardware bug workaround
5698 1.1 christos *r3900:
5699 1.1 christos {
5700 1.1 christos /* do nothing */
5701 1.1 christos }
5702 1.1 christos
5703 1.1 christos
5704 1.1 christos 010000,01000,00010,16.OFFSET:COP0:32::BC0FL
5705 1.1 christos "bc0fl <OFFSET>"
5706 1.1 christos *mipsI:
5707 1.1 christos *mipsII:
5708 1.1 christos *mipsIII:
5709 1.1 christos *mipsIV:
5710 1.1 christos *mipsV:
5711 1.1 christos *mips32:
5712 1.1 christos *mips32r2:
5713 1.1 christos *mips64:
5714 1.1 christos *mips64r2:
5715 1.1 christos *vr4100:
5716 1.1 christos *vr5000:
5717 1.1 christos
5718 1.1 christos
5719 1.1 christos 010000,01000,00001,16.OFFSET:COP0:32::BC0T
5720 1.1 christos "bc0t <OFFSET>"
5721 1.1 christos *mipsI:
5722 1.1 christos *mipsII:
5723 1.1 christos *mipsIII:
5724 1.1 christos *mipsIV:
5725 1.1 christos *mipsV:
5726 1.1 christos *mips32:
5727 1.1 christos *mips32r2:
5728 1.1 christos *mips64:
5729 1.1 christos *mips64r2:
5730 1.1 christos *vr4100:
5731 1.1 christos
5732 1.1 christos
5733 1.1 christos 010000,01000,00011,16.OFFSET:COP0:32::BC0TL
5734 1.1 christos "bc0tl <OFFSET>"
5735 1.1 christos *mipsI:
5736 1.1 christos *mipsII:
5737 1.1 christos *mipsIII:
5738 1.1 christos *mipsIV:
5739 1.1 christos *mipsV:
5740 1.1 christos *mips32:
5741 1.1 christos *mips32r2:
5742 1.1 christos *mips64:
5743 1.1 christos *mips64r2:
5744 1.1 christos *vr4100:
5745 1.1 christos *vr5000:
5746 1.1 christos
5747 1.1 christos
5748 1.1 christos 101111,5.BASE,5.OP,16.OFFSET:NORMAL:32::CACHE
5749 1.1 christos "cache <OP>, <OFFSET>(r<BASE>)"
5750 1.1 christos *mipsIII:
5751 1.1 christos *mipsIV:
5752 1.1 christos *mipsV:
5753 1.1 christos *mips32:
5754 1.1 christos *mips32r2:
5755 1.1 christos *mips64:
5756 1.1 christos *mips64r2:
5757 1.1 christos *vr4100:
5758 1.1 christos *vr5000:
5759 1.1 christos *r3900:
5760 1.1 christos {
5761 1.1 christos address_word base = GPR[BASE];
5762 1.1 christos address_word offset = EXTEND16 (OFFSET);
5763 1.1 christos {
5764 1.1 christos address_word vaddr = loadstore_ea (SD_, base, offset);
5765 1.1 christos address_word paddr;
5766 1.1 christos int uncached;
5767 1.1 christos if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
5768 1.1 christos CacheOp(OP,vaddr,paddr,instruction_0);
5769 1.1 christos }
5770 1.1 christos }
5771 1.1 christos
5772 1.1 christos
5773 1.1 christos 010000,00001,5.RT,5.RD,00000000000:COP0:64::DMFC0
5774 1.1 christos "dmfc0 r<RT>, r<RD>"
5775 1.1 christos *mipsIII:
5776 1.1 christos *mipsIV:
5777 1.1 christos *mipsV:
5778 1.1 christos *mips64:
5779 1.1 christos *mips64r2:
5780 1.1 christos {
5781 1.1 christos check_u64 (SD_, instruction_0);
5782 1.1 christos DecodeCoproc (instruction_0);
5783 1.1 christos }
5784 1.1 christos
5785 1.1 christos
5786 1.1 christos 010000,00101,5.RT,5.RD,00000000000:COP0:64::DMTC0
5787 1.1 christos "dmtc0 r<RT>, r<RD>"
5788 1.1 christos *mipsIII:
5789 1.1 christos *mipsIV:
5790 1.1 christos *mipsV:
5791 1.1 christos *mips64:
5792 1.1 christos *mips64r2:
5793 1.1 christos {
5794 1.1 christos check_u64 (SD_, instruction_0);
5795 1.1 christos DecodeCoproc (instruction_0);
5796 1.1 christos }
5797 1.1 christos
5798 1.1 christos
5799 1.1 christos 010000,1,0000000000000000000,011000:COP0:32::ERET
5800 1.1 christos "eret"
5801 1.1 christos *mipsIII:
5802 1.1 christos *mipsIV:
5803 1.1 christos *mipsV:
5804 1.1 christos *mips32:
5805 1.1 christos *mips32r2:
5806 1.1 christos *mips64:
5807 1.1 christos *mips64r2:
5808 1.1 christos *vr4100:
5809 1.1 christos *vr5000:
5810 1.1 christos {
5811 1.1 christos if (SR & status_ERL)
5812 1.1 christos {
5813 1.1 christos /* Oops, not yet available */
5814 1.1 christos sim_io_printf (SD, "Warning: ERET when SR[ERL] set not supported");
5815 1.1 christos NIA = EPC;
5816 1.1 christos SR &= ~status_ERL;
5817 1.1 christos }
5818 1.1 christos else
5819 1.1 christos {
5820 1.1 christos NIA = EPC;
5821 1.1 christos SR &= ~status_EXL;
5822 1.1 christos }
5823 1.1 christos }
5824 1.1 christos
5825 1.1 christos
5826 1.1 christos 010000,00000,5.RT,5.RD,00000,6.REGX:COP0:32::MFC0
5827 1.1 christos "mfc0 r<RT>, r<RD> # <REGX>"
5828 1.1 christos *mipsI:
5829 1.1 christos *mipsII:
5830 1.1 christos *mipsIII:
5831 1.1 christos *mipsIV:
5832 1.1 christos *mipsV:
5833 1.1 christos *mips32:
5834 1.1 christos *mips32r2:
5835 1.1 christos *mips64:
5836 1.1 christos *mips64r2:
5837 1.1 christos *vr4100:
5838 1.1 christos *vr5000:
5839 1.1 christos *r3900:
5840 1.1 christos {
5841 1.1 christos TRACE_ALU_INPUT0 ();
5842 1.1 christos DecodeCoproc (instruction_0);
5843 1.1 christos TRACE_ALU_RESULT (GPR[RT]);
5844 1.1 christos }
5845 1.1 christos
5846 1.1 christos 010000,00100,5.RT,5.RD,00000,6.REGX:COP0:32::MTC0
5847 1.1 christos "mtc0 r<RT>, r<RD> # <REGX>"
5848 1.1 christos *mipsI:
5849 1.1 christos *mipsII:
5850 1.1 christos *mipsIII:
5851 1.1 christos *mipsIV:
5852 1.1 christos *mipsV:
5853 1.1 christos *mips32:
5854 1.1 christos *mips32r2:
5855 1.1 christos *mips64:
5856 1.1 christos *mips64r2:
5857 1.1 christos *vr4100:
5858 1.1 christos *vr5000:
5859 1.1 christos *r3900:
5860 1.1 christos {
5861 1.1 christos DecodeCoproc (instruction_0);
5862 1.1 christos }
5863 1.1 christos
5864 1.1 christos
5865 1.1 christos 010000,1,0000000000000000000,010000:COP0:32::RFE
5866 1.1 christos "rfe"
5867 1.1 christos *mipsI:
5868 1.1 christos *mipsII:
5869 1.1 christos *mipsIII:
5870 1.1 christos *mipsIV:
5871 1.1 christos *mipsV:
5872 1.1 christos *vr4100:
5873 1.1 christos *vr5000:
5874 1.1 christos *r3900:
5875 1.1 christos {
5876 1.1 christos DecodeCoproc (instruction_0);
5877 1.1 christos }
5878 1.1 christos
5879 1.1 christos
5880 1.1 christos 0100,ZZ!0!1!3,5.COP_FUN0!8,5.COP_FUN1,16.COP_FUN2:NORMAL:32::COPz
5881 1.1 christos "cop<ZZ> <COP_FUN0><COP_FUN1><COP_FUN2>"
5882 1.1 christos *mipsI:
5883 1.1 christos *mipsII:
5884 1.1 christos *mipsIII:
5885 1.1 christos *mipsIV:
5886 1.1 christos *mipsV:
5887 1.1 christos *mips32:
5888 1.1 christos *mips32r2:
5889 1.1 christos *mips64:
5890 1.1 christos *mips64r2:
5891 1.1 christos *vr4100:
5892 1.1 christos *r3900:
5893 1.1 christos {
5894 1.1 christos DecodeCoproc (instruction_0);
5895 1.1 christos }
5896 1.1 christos
5897 1.1 christos
5898 1.1 christos
5899 1.1 christos 010000,1,0000000000000000000,001000:COP0:32::TLBP
5900 1.1 christos "tlbp"
5901 1.1 christos *mipsI:
5902 1.1 christos *mipsII:
5903 1.1 christos *mipsIII:
5904 1.1 christos *mipsIV:
5905 1.1 christos *mipsV:
5906 1.1 christos *mips32:
5907 1.1 christos *mips32r2:
5908 1.1 christos *mips64:
5909 1.1 christos *mips64r2:
5910 1.1 christos *vr4100:
5911 1.1 christos *vr5000:
5912 1.1 christos
5913 1.1 christos
5914 1.1 christos 010000,1,0000000000000000000,000001:COP0:32::TLBR
5915 1.1 christos "tlbr"
5916 1.1 christos *mipsI:
5917 1.1 christos *mipsII:
5918 1.1 christos *mipsIII:
5919 1.1 christos *mipsIV:
5920 1.1 christos *mipsV:
5921 1.1 christos *mips32:
5922 1.1 christos *mips32r2:
5923 1.1 christos *mips64:
5924 1.1 christos *mips64r2:
5925 1.1 christos *vr4100:
5926 1.1 christos *vr5000:
5927 1.1 christos
5928 1.1 christos
5929 1.1 christos 010000,1,0000000000000000000,000010:COP0:32::TLBWI
5930 1.1 christos "tlbwi"
5931 1.1 christos *mipsI:
5932 1.1 christos *mipsII:
5933 1.1 christos *mipsIII:
5934 1.1 christos *mipsIV:
5935 1.1 christos *mipsV:
5936 1.1 christos *mips32:
5937 1.1 christos *mips32r2:
5938 1.1 christos *mips64:
5939 1.1 christos *mips64r2:
5940 1.1 christos *vr4100:
5941 1.1 christos *vr5000:
5942 1.1 christos
5943 1.1 christos
5944 1.1 christos 010000,1,0000000000000000000,000110:COP0:32::TLBWR
5945 1.1 christos "tlbwr"
5946 1.1 christos *mipsI:
5947 1.1 christos *mipsII:
5948 1.1 christos *mipsIII:
5949 1.1 christos *mipsIV:
5950 1.1 christos *mipsV:
5951 1.1 christos *mips32:
5952 1.1 christos *mips32r2:
5953 1.1 christos *mips64:
5954 1.1 christos *mips64r2:
5955 1.1 christos *vr4100:
5956 1.1 christos *vr5000:
5957 1.1 christos
5958 1.1 christos
5959 1.1 christos :include:::mips3264r2.igen
5960 1.1 christos :include:::m16.igen
5961 1.1 christos :include:::m16e.igen
5962 1.1 christos :include:::mdmx.igen
5963 1.1 christos :include:::mips3d.igen
5964 1.1 christos :include:::sb1.igen
5965 1.1 christos :include:::tx.igen
5966 1.1 christos :include:::vr.igen
5967 1.1 christos :include:::dsp.igen
5968 1.1 christos :include:::dsp2.igen
5969 :include:::smartmips.igen
5970
5971