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