ALL: Huge upstream synch + PerRom DelaySI & CountPerOp parameters
[mupen64plus-pandora.git] / source / mupen64plus-core / src / r4300 / interpreter_r4300.def
CommitLineData
451ab91e 1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2 * Mupen64plus - interpreter_r4300.def *
3 * Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
4 * Copyright (C) 2002 Hacktarux *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the *
18 * Free Software Foundation, Inc., *
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
20 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
21
22DECLARE_JUMP(J, (PC->f.j.inst_index<<2) | ((PCADDR+4) & 0xF0000000), 1, &reg[0], 0, 0)
23DECLARE_JUMP(JAL, (PC->f.j.inst_index<<2) | ((PCADDR+4) & 0xF0000000), 1, &reg[31], 0, 0)
24DECLARE_JUMP(BEQ, PCADDR + (iimmediate+1)*4, irs == irt, &reg[0], 0, 0)
25DECLARE_JUMP(BNE, PCADDR + (iimmediate+1)*4, irs != irt, &reg[0], 0, 0)
26DECLARE_JUMP(BLEZ, PCADDR + (iimmediate+1)*4, irs <= 0, &reg[0], 0, 0)
27DECLARE_JUMP(BGTZ, PCADDR + (iimmediate+1)*4, irs > 0, &reg[0], 0, 0)
28
29DECLARE_INSTRUCTION(ADDI)
30{
31 irt32 = irs32 + iimmediate;
32 sign_extended(irt);
33 ADD_TO_PC(1);
34}
35
36DECLARE_INSTRUCTION(ADDIU)
37{
38 irt32 = irs32 + iimmediate;
39 sign_extended(irt);
40 ADD_TO_PC(1);
41}
42
43DECLARE_INSTRUCTION(SLTI)
44{
45 if (irs < iimmediate) irt = 1;
46 else irt = 0;
47 ADD_TO_PC(1);
48}
49
50DECLARE_INSTRUCTION(SLTIU)
51{
52 if ((unsigned long long)irs < (unsigned long long)((long long)iimmediate))
53 irt = 1;
54 else irt = 0;
55 ADD_TO_PC(1);
56}
57
58DECLARE_INSTRUCTION(ANDI)
59{
60 irt = irs & (unsigned short)iimmediate;
61 ADD_TO_PC(1);
62}
63
64DECLARE_INSTRUCTION(ORI)
65{
66 irt = irs | (unsigned short)iimmediate;
67 ADD_TO_PC(1);
68}
69
70DECLARE_INSTRUCTION(XORI)
71{
72 irt = irs ^ (unsigned short)iimmediate;
73 ADD_TO_PC(1);
74}
75
76DECLARE_INSTRUCTION(LUI)
77{
78 irt32 = iimmediate << 16;
79 sign_extended(irt);
80 ADD_TO_PC(1);
81}
82
83DECLARE_JUMP(BEQL, PCADDR + (iimmediate+1)*4, irs == irt, &reg[0], 1, 0)
84DECLARE_JUMP(BNEL, PCADDR + (iimmediate+1)*4, irs != irt, &reg[0], 1, 0)
85DECLARE_JUMP(BLEZL, PCADDR + (iimmediate+1)*4, irs <= 0, &reg[0], 1, 0)
86DECLARE_JUMP(BGTZL, PCADDR + (iimmediate+1)*4, irs > 0, &reg[0], 1, 0)
87
88DECLARE_INSTRUCTION(DADDI)
89{
90 irt = irs + iimmediate;
91 ADD_TO_PC(1);
92}
93
94DECLARE_INSTRUCTION(DADDIU)
95{
96 irt = irs + iimmediate;
97 ADD_TO_PC(1);
98}
99
100// TODOXXX refactor the following functions to remove the
101// lsaddr and lsrpt locals. this may lead to a small speedup too
102
103DECLARE_INSTRUCTION(LDL)
104{
105 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
106 long long int *lsrtp = PC->f.i.rt;
107 unsigned long long int word = 0;
108 ADD_TO_PC(1);
109 switch ((lsaddr) & 7)
110 {
111 case 0:
112 address = (unsigned int) lsaddr;
113 rdword = (unsigned long long *) lsrtp;
114 read_dword_in_memory();
115 break;
116 case 1:
117 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
118 rdword = &word;
119 read_dword_in_memory();
120 if(address)
121 *lsrtp = (*lsrtp & 0xFF) | (word << 8);
122 break;
123 case 2:
124 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
125 rdword = &word;
126 read_dword_in_memory();
127 if(address)
128 *lsrtp = (*lsrtp & 0xFFFF) | (word << 16);
129 break;
130 case 3:
131 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
132 rdword = &word;
133 read_dword_in_memory();
134 if(address)
135 *lsrtp = (*lsrtp & 0xFFFFFF) | (word << 24);
136 break;
137 case 4:
138 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
139 rdword = &word;
140 read_dword_in_memory();
141 if(address)
142 *lsrtp = (*lsrtp & 0xFFFFFFFF) | (word << 32);
143 break;
144 case 5:
145 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
146 rdword = &word;
147 read_dword_in_memory();
148 if(address)
149 *lsrtp = (*lsrtp & 0xFFFFFFFFFFLL) | (word << 40);
150 break;
151 case 6:
152 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
153 rdword = &word;
154 read_dword_in_memory();
155 if(address)
156 *lsrtp = (*lsrtp & 0xFFFFFFFFFFFFLL) | (word << 48);
157 break;
158 case 7:
159 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
160 rdword = &word;
161 read_dword_in_memory();
162 if(address)
163 *lsrtp = (*lsrtp & 0xFFFFFFFFFFFFFFLL) | (word << 56);
164 break;
165 }
166}
167
168DECLARE_INSTRUCTION(LDR)
169{
170 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
171 long long int *lsrtp = PC->f.i.rt;
172 unsigned long long int word = 0;
173 ADD_TO_PC(1);
174 switch ((lsaddr) & 7)
175 {
176 case 0:
177 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
178 rdword = &word;
179 read_dword_in_memory();
180 if(address)
181 *lsrtp = (*lsrtp & 0xFFFFFFFFFFFFFF00LL) | (word >> 56);
182 break;
183 case 1:
184 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
185 rdword = &word;
186 read_dword_in_memory();
187 if(address)
188 *lsrtp = (*lsrtp & 0xFFFFFFFFFFFF0000LL) | (word >> 48);
189 break;
190 case 2:
191 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
192 rdword = &word;
193 read_dword_in_memory();
194 if(address)
195 *lsrtp = (*lsrtp & 0xFFFFFFFFFF000000LL) | (word >> 40);
196 break;
197 case 3:
198 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
199 rdword = &word;
200 read_dword_in_memory();
201 if(address)
202 *lsrtp = (*lsrtp & 0xFFFFFFFF00000000LL) | (word >> 32);
203 break;
204 case 4:
205 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
206 rdword = &word;
207 read_dword_in_memory();
208 if(address)
209 *lsrtp = (*lsrtp & 0xFFFFFF0000000000LL) | (word >> 24);
210 break;
211 case 5:
212 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
213 rdword = &word;
214 read_dword_in_memory();
215 if(address)
216 *lsrtp = (*lsrtp & 0xFFFF000000000000LL) | (word >> 16);
217 break;
218 case 6:
219 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
220 rdword = &word;
221 read_dword_in_memory();
222 if(address)
223 *lsrtp = (*lsrtp & 0xFF00000000000000LL) | (word >> 8);
224 break;
225 case 7:
226 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
227 rdword = (unsigned long long *) lsrtp;
228 read_dword_in_memory();
229 break;
230 }
231}
232
233DECLARE_INSTRUCTION(LB)
234{
235 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
236 long long int *lsrtp = PC->f.i.rt;
237 ADD_TO_PC(1);
238 address = (unsigned int) lsaddr;
239 rdword = (unsigned long long *) lsrtp;
240 read_byte_in_memory();
241 if (address)
242 sign_extendedb(*lsrtp);
243}
244
245DECLARE_INSTRUCTION(LH)
246{
247 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
248 long long int *lsrtp = PC->f.i.rt;
249 ADD_TO_PC(1);
250 address = (unsigned int) lsaddr;
251 rdword = (unsigned long long *) lsrtp;
252 read_hword_in_memory();
253 if (address)
254 sign_extendedh(*lsrtp);
255}
256
257DECLARE_INSTRUCTION(LWL)
258{
259 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
260 long long int *lsrtp = PC->f.i.rt;
261 unsigned long long int word = 0;
262 ADD_TO_PC(1);
263 switch ((lsaddr) & 3)
264 {
265 case 0:
266 address = (unsigned int) lsaddr;
267 rdword = (unsigned long long *) lsrtp;
268 read_word_in_memory();
269 break;
270 case 1:
271 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
272 rdword = &word;
273 read_word_in_memory();
274 if(address)
275 *lsrtp = (*lsrtp & 0xFF) | (word << 8);
276 break;
277 case 2:
278 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
279 rdword = &word;
280 read_word_in_memory();
281 if(address)
282 *lsrtp = (*lsrtp & 0xFFFF) | (word << 16);
283 break;
284 case 3:
285 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
286 rdword = &word;
287 read_word_in_memory();
288 if(address)
289 *lsrtp = (*lsrtp & 0xFFFFFF) | (word << 24);
290 break;
291 }
292 if(address)
293 sign_extended(*lsrtp);
294}
295
296DECLARE_INSTRUCTION(LW)
297{
298 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
299 long long int *lsrtp = PC->f.i.rt;
300 ADD_TO_PC(1);
301 address = (unsigned int) lsaddr;
302 rdword = (unsigned long long *) lsrtp;
303 read_word_in_memory();
304 if (address)
305 sign_extended(*lsrtp);
306}
307
308DECLARE_INSTRUCTION(LBU)
309{
310 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
311 long long int *lsrtp = PC->f.i.rt;
312 ADD_TO_PC(1);
313 address = (unsigned int) lsaddr;
314 rdword = (unsigned long long *) lsrtp;
315 read_byte_in_memory();
316}
317
318DECLARE_INSTRUCTION(LHU)
319{
320 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
321 long long int *lsrtp = PC->f.i.rt;
322 ADD_TO_PC(1);
323 address = (unsigned int) lsaddr;
324 rdword = (unsigned long long *) lsrtp;
325 read_hword_in_memory();
326}
327
328DECLARE_INSTRUCTION(LWR)
329{
330 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
331 long long int *lsrtp = PC->f.i.rt;
332 unsigned long long int word = 0;
333 ADD_TO_PC(1);
334 switch ((lsaddr) & 3)
335 {
336 case 0:
337 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
338 rdword = &word;
339 read_word_in_memory();
340 if(address)
341 *lsrtp = (*lsrtp & 0xFFFFFFFFFFFFFF00LL) | ((word >> 24) & 0xFF);
342 break;
343 case 1:
344 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
345 rdword = &word;
346 read_word_in_memory();
347 if(address)
348 *lsrtp = (*lsrtp & 0xFFFFFFFFFFFF0000LL) | ((word >> 16) & 0xFFFF);
349 break;
350 case 2:
351 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
352 rdword = &word;
353 read_word_in_memory();
354 if(address)
355 *lsrtp = (*lsrtp & 0xFFFFFFFFFF000000LL) | ((word >> 8) & 0XFFFFFF);
356 break;
357 case 3:
358 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
359 rdword = (unsigned long long *) lsrtp;
360 read_word_in_memory();
361 if(address)
362 sign_extended(*lsrtp);
363 }
364}
365
366DECLARE_INSTRUCTION(LWU)
367{
368 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
369 long long int *lsrtp = PC->f.i.rt;
370 ADD_TO_PC(1);
371 address = (unsigned int) lsaddr;
372 rdword = (unsigned long long *) lsrtp;
373 read_word_in_memory();
374}
375
376DECLARE_INSTRUCTION(SB)
377{
378 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
379 long long int *lsrtp = PC->f.i.rt;
380 ADD_TO_PC(1);
381 address = (unsigned int) lsaddr;
382 cpu_byte = (unsigned char)(*lsrtp & 0xFF);
383 write_byte_in_memory();
384 CHECK_MEMORY();
385}
386
387DECLARE_INSTRUCTION(SH)
388{
389 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
390 long long int *lsrtp = PC->f.i.rt;
391 ADD_TO_PC(1);
392 address = (unsigned int) lsaddr;
393 hword = (unsigned short)(*lsrtp & 0xFFFF);
394 write_hword_in_memory();
395 CHECK_MEMORY();
396}
397
398DECLARE_INSTRUCTION(SWL)
399{
400 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
401 long long int *lsrtp = PC->f.i.rt;
402 unsigned long long int old_word = 0;
403 ADD_TO_PC(1);
404 switch ((lsaddr) & 3)
405 {
406 case 0:
407 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
408 word = (unsigned int)*lsrtp;
409 write_word_in_memory();
410 CHECK_MEMORY();
411 break;
412 case 1:
413 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
414 rdword = &old_word;
415 read_word_in_memory();
416 if(address)
417 {
418 word = ((unsigned int)*lsrtp >> 8) | ((unsigned int) old_word & 0xFF000000);
419 write_word_in_memory();
420 CHECK_MEMORY();
421 }
422 break;
423 case 2:
424 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
425 rdword = &old_word;
426 read_word_in_memory();
427 if(address)
428 {
429 word = ((unsigned int)*lsrtp >> 16) | ((unsigned int) old_word & 0xFFFF0000);
430 write_word_in_memory();
431 CHECK_MEMORY();
432 }
433 break;
434 case 3:
435 address = (unsigned int) lsaddr;
436 cpu_byte = (unsigned char)(*lsrtp >> 24);
437 write_byte_in_memory();
438 CHECK_MEMORY();
439 break;
440 }
441}
442
443DECLARE_INSTRUCTION(SW)
444{
445 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
446 long long int *lsrtp = PC->f.i.rt;
447 ADD_TO_PC(1);
448 address = (unsigned int) lsaddr;
449 word = (unsigned int)(*lsrtp & 0xFFFFFFFF);
450 write_word_in_memory();
451 CHECK_MEMORY();
452}
453
454DECLARE_INSTRUCTION(SDL)
455{
456 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
457 long long int *lsrtp = PC->f.i.rt;
458 unsigned long long int old_word = 0;
459 ADD_TO_PC(1);
460 switch ((lsaddr) & 7)
461 {
462 case 0:
463 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
464 dword = *lsrtp;
465 write_dword_in_memory();
466 CHECK_MEMORY();
467 break;
468 case 1:
469 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
470 rdword = &old_word;
471 read_dword_in_memory();
472 if(address)
473 {
474 dword = ((unsigned long long)*lsrtp >> 8)|(old_word & 0xFF00000000000000LL);
475 write_dword_in_memory();
476 CHECK_MEMORY();
477 }
478 break;
479 case 2:
480 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
481 rdword = &old_word;
482 read_dword_in_memory();
483 if(address)
484 {
485 dword = ((unsigned long long)*lsrtp >> 16)|(old_word & 0xFFFF000000000000LL);
486 write_dword_in_memory();
487 CHECK_MEMORY();
488 }
489 break;
490 case 3:
491 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
492 rdword = &old_word;
493 read_dword_in_memory();
494 if(address)
495 {
496 dword = ((unsigned long long)*lsrtp >> 24)|(old_word & 0xFFFFFF0000000000LL);
497 write_dword_in_memory();
498 CHECK_MEMORY();
499 }
500 break;
501 case 4:
502 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
503 rdword = &old_word;
504 read_dword_in_memory();
505 if(address)
506 {
507 dword = ((unsigned long long)*lsrtp >> 32)|(old_word & 0xFFFFFFFF00000000LL);
508 write_dword_in_memory();
509 CHECK_MEMORY();
510 }
511 break;
512 case 5:
513 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
514 rdword = &old_word;
515 read_dword_in_memory();
516 if(address)
517 {
518 dword = ((unsigned long long)*lsrtp >> 40)|(old_word & 0xFFFFFFFFFF000000LL);
519 write_dword_in_memory();
520 CHECK_MEMORY();
521 }
522 break;
523 case 6:
524 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
525 rdword = &old_word;
526 read_dword_in_memory();
527 if(address)
528 {
529 dword = ((unsigned long long)*lsrtp >> 48)|(old_word & 0xFFFFFFFFFFFF0000LL);
530 write_dword_in_memory();
531 CHECK_MEMORY();
532 }
533 break;
534 case 7:
535 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
536 rdword = &old_word;
537 read_dword_in_memory();
538 if(address)
539 {
540 dword = ((unsigned long long)*lsrtp >> 56)|(old_word & 0xFFFFFFFFFFFFFF00LL);
541 write_dword_in_memory();
542 CHECK_MEMORY();
543 }
544 break;
545 }
546}
547
548DECLARE_INSTRUCTION(SDR)
549{
550 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
551 long long int *lsrtp = PC->f.i.rt;
552 unsigned long long int old_word = 0;
553 ADD_TO_PC(1);
554 switch ((lsaddr) & 7)
555 {
556 case 0:
557 address = (unsigned int) lsaddr;
558 rdword = &old_word;
559 read_dword_in_memory();
560 if(address)
561 {
562 dword = (*lsrtp << 56) | (old_word & 0x00FFFFFFFFFFFFFFLL);
563 write_dword_in_memory();
564 CHECK_MEMORY();
565 }
566 break;
567 case 1:
568 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
569 rdword = &old_word;
570 read_dword_in_memory();
571 if(address)
572 {
573 dword = (*lsrtp << 48) | (old_word & 0x0000FFFFFFFFFFFFLL);
574 write_dword_in_memory();
575 CHECK_MEMORY();
576 }
577 break;
578 case 2:
579 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
580 rdword = &old_word;
581 read_dword_in_memory();
582 if(address)
583 {
584 dword = (*lsrtp << 40) | (old_word & 0x000000FFFFFFFFFFLL);
585 write_dword_in_memory();
586 CHECK_MEMORY();
587 }
588 break;
589 case 3:
590 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
591 rdword = &old_word;
592 read_dword_in_memory();
593 if(address)
594 {
595 dword = (*lsrtp << 32) | (old_word & 0x00000000FFFFFFFFLL);
596 write_dword_in_memory();
597 CHECK_MEMORY();
598 }
599 break;
600 case 4:
601 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
602 rdword = &old_word;
603 read_dword_in_memory();
604 if(address)
605 {
606 dword = (*lsrtp << 24) | (old_word & 0x0000000000FFFFFFLL);
607 write_dword_in_memory();
608 CHECK_MEMORY();
609 }
610 break;
611 case 5:
612 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
613 rdword = &old_word;
614 read_dword_in_memory();
615 if(address)
616 {
617 dword = (*lsrtp << 16) | (old_word & 0x000000000000FFFFLL);
618 write_dword_in_memory();
619 CHECK_MEMORY();
620 }
621 break;
622 case 6:
623 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
624 rdword = &old_word;
625 read_dword_in_memory();
626 if(address)
627 {
628 dword = (*lsrtp << 8) | (old_word & 0x00000000000000FFLL);
629 write_dword_in_memory();
630 CHECK_MEMORY();
631 }
632 break;
633 case 7:
634 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
635 dword = *lsrtp;
636 write_dword_in_memory();
637 CHECK_MEMORY();
638 break;
639 }
640}
641
642DECLARE_INSTRUCTION(SWR)
643{
644 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
645 long long int *lsrtp = PC->f.i.rt;
646 unsigned long long int old_word = 0;
647 ADD_TO_PC(1);
648 switch ((lsaddr) & 3)
649 {
650 case 0:
651 address = (unsigned int) lsaddr;
652 rdword = &old_word;
653 read_word_in_memory();
654 if(address)
655 {
656 word = ((unsigned int)*lsrtp << 24) | ((unsigned int) old_word & 0x00FFFFFF);
657 write_word_in_memory();
658 CHECK_MEMORY();
659 }
660 break;
661 case 1:
662 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
663 rdword = &old_word;
664 read_word_in_memory();
665 if(address)
666 {
667 word = ((unsigned int)*lsrtp << 16) | ((unsigned int) old_word & 0x0000FFFF);
668 write_word_in_memory();
669 CHECK_MEMORY();
670 }
671 break;
672 case 2:
673 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
674 rdword = &old_word;
675 read_word_in_memory();
676 if(address)
677 {
678 word = ((unsigned int)*lsrtp << 8) | ((unsigned int) old_word & 0x000000FF);
679 write_word_in_memory();
680 CHECK_MEMORY();
681 }
682 break;
683 case 3:
684 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
685 word = (unsigned int)*lsrtp;
686 write_word_in_memory();
687 CHECK_MEMORY();
688 break;
689 }
690}
691
692DECLARE_INSTRUCTION(CACHE)
693{
694 ADD_TO_PC(1);
695}
696
697DECLARE_INSTRUCTION(LL)
698{
699 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
700 long long int *lsrtp = PC->f.i.rt;
701 ADD_TO_PC(1);
702 address = (unsigned int) lsaddr;
703 rdword = (unsigned long long *) lsrtp;
704 read_word_in_memory();
705 if (address)
706 {
707 sign_extended(*lsrtp);
708 llbit = 1;
709 }
710}
711
712DECLARE_INSTRUCTION(LWC1)
713{
714 const unsigned char lslfft = lfft;
715 const unsigned int lslfaddr = (unsigned int)(lfoffset + reg[lfbase]);
716 unsigned long long int temp;
717 if (check_cop1_unusable()) return;
718 ADD_TO_PC(1);
719 address = (unsigned int) lslfaddr;
720 rdword = &temp;
721 read_word_in_memory();
722 if (address)
723 *((int*)reg_cop1_simple[lslfft]) = (int) *rdword;
724}
725
726DECLARE_INSTRUCTION(LDC1)
727{
728 const unsigned char lslfft = lfft;
729 const unsigned int lslfaddr = (unsigned int)(lfoffset + reg[lfbase]);
730 if (check_cop1_unusable()) return;
731 ADD_TO_PC(1);
732 address = (unsigned int) lslfaddr;
733 rdword = (unsigned long long *)reg_cop1_double[lslfft];
734 read_dword_in_memory();
735}
736
737DECLARE_INSTRUCTION(LD)
738{
739 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
740 long long int *lsrtp = PC->f.i.rt;
741 ADD_TO_PC(1);
742 address = (unsigned int) lsaddr;
743 rdword = (unsigned long long *) lsrtp;
744 read_dword_in_memory();
745}
746
747DECLARE_INSTRUCTION(SC)
748{
749 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
750 long long int *lsrtp = PC->f.i.rt;
751 ADD_TO_PC(1);
752 if(llbit)
753 {
754 address = (unsigned int) lsaddr;
755 word = (unsigned int)(*lsrtp & 0xFFFFFFFF);
756 write_word_in_memory();
757 CHECK_MEMORY();
758 llbit = 0;
759 *lsrtp = 1;
760 }
761 else
762 {
763 *lsrtp = 0;
764 }
765}
766
767DECLARE_INSTRUCTION(SWC1)
768{
769 const unsigned char lslfft = lfft;
770 const unsigned int lslfaddr = (unsigned int)(lfoffset + reg[lfbase]);
771 if (check_cop1_unusable()) return;
772 ADD_TO_PC(1);
773 address = (unsigned int) lslfaddr;
774 word = *((int*)reg_cop1_simple[lslfft]);
775 write_word_in_memory();
776 CHECK_MEMORY();
777}
778
779DECLARE_INSTRUCTION(SDC1)
780{
781 const unsigned char lslfft = lfft;
782 const unsigned int lslfaddr = (unsigned int)(lfoffset + reg[lfbase]);
783 if (check_cop1_unusable()) return;
784 ADD_TO_PC(1);
785 address = (unsigned int) lslfaddr;
786 dword = *((unsigned long long*)reg_cop1_double[lslfft]);
787 write_dword_in_memory();
788 CHECK_MEMORY();
789}
790
791DECLARE_INSTRUCTION(SD)
792{
793 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
794 long long int *lsrtp = PC->f.i.rt;
795 ADD_TO_PC(1);
796 address = (unsigned int) lsaddr;
797 dword = *lsrtp;
798 write_dword_in_memory();
799 CHECK_MEMORY();
800}