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