1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2 * Mupen64plus - interpreter_r4300.def *
3 * Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
4 * Copyright (C) 2002 Hacktarux *
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. *
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. *
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 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
22 DECLARE_JUMP(J, (PC->f.j.inst_index<<2) | ((PCADDR+4) & 0xF0000000), 1, ®[0], 0, 0)
23 DECLARE_JUMP(JAL, (PC->f.j.inst_index<<2) | ((PCADDR+4) & 0xF0000000), 1, ®[31], 0, 0)
24 DECLARE_JUMP(BEQ, PCADDR + (iimmediate+1)*4, irs == irt, ®[0], 0, 0)
25 DECLARE_JUMP(BNE, PCADDR + (iimmediate+1)*4, irs != irt, ®[0], 0, 0)
26 DECLARE_JUMP(BLEZ, PCADDR + (iimmediate+1)*4, irs <= 0, ®[0], 0, 0)
27 DECLARE_JUMP(BGTZ, PCADDR + (iimmediate+1)*4, irs > 0, ®[0], 0, 0)
29 DECLARE_INSTRUCTION(ADDI)
31 irt32 = irs32 + iimmediate;
36 DECLARE_INSTRUCTION(ADDIU)
38 irt32 = irs32 + iimmediate;
43 DECLARE_INSTRUCTION(SLTI)
45 if (irs < iimmediate) irt = 1;
50 DECLARE_INSTRUCTION(SLTIU)
52 if ((unsigned long long)irs < (unsigned long long)((long long)iimmediate))
58 DECLARE_INSTRUCTION(ANDI)
60 irt = irs & (unsigned short)iimmediate;
64 DECLARE_INSTRUCTION(ORI)
66 irt = irs | (unsigned short)iimmediate;
70 DECLARE_INSTRUCTION(XORI)
72 irt = irs ^ (unsigned short)iimmediate;
76 DECLARE_INSTRUCTION(LUI)
78 irt32 = iimmediate << 16;
83 DECLARE_JUMP(BEQL, PCADDR + (iimmediate+1)*4, irs == irt, ®[0], 1, 0)
84 DECLARE_JUMP(BNEL, PCADDR + (iimmediate+1)*4, irs != irt, ®[0], 1, 0)
85 DECLARE_JUMP(BLEZL, PCADDR + (iimmediate+1)*4, irs <= 0, ®[0], 1, 0)
86 DECLARE_JUMP(BGTZL, PCADDR + (iimmediate+1)*4, irs > 0, ®[0], 1, 0)
88 DECLARE_INSTRUCTION(DADDI)
90 irt = irs + iimmediate;
94 DECLARE_INSTRUCTION(DADDIU)
96 irt = irs + iimmediate;
100 // TODOXXX refactor the following functions to remove the
101 // lsaddr and lsrpt locals. this may lead to a small speedup too
103 DECLARE_INSTRUCTION(LDL)
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;
109 switch ((lsaddr) & 7)
112 address = (unsigned int) lsaddr;
113 rdword = (unsigned long long *) lsrtp;
114 read_dword_in_memory();
117 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
119 read_dword_in_memory();
121 *lsrtp = (*lsrtp & 0xFF) | (word << 8);
124 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
126 read_dword_in_memory();
128 *lsrtp = (*lsrtp & 0xFFFF) | (word << 16);
131 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
133 read_dword_in_memory();
135 *lsrtp = (*lsrtp & 0xFFFFFF) | (word << 24);
138 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
140 read_dword_in_memory();
142 *lsrtp = (*lsrtp & 0xFFFFFFFF) | (word << 32);
145 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
147 read_dword_in_memory();
149 *lsrtp = (*lsrtp & 0xFFFFFFFFFFLL) | (word << 40);
152 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
154 read_dword_in_memory();
156 *lsrtp = (*lsrtp & 0xFFFFFFFFFFFFLL) | (word << 48);
159 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
161 read_dword_in_memory();
163 *lsrtp = (*lsrtp & 0xFFFFFFFFFFFFFFLL) | (word << 56);
168 DECLARE_INSTRUCTION(LDR)
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;
174 switch ((lsaddr) & 7)
177 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
179 read_dword_in_memory();
181 *lsrtp = (*lsrtp & 0xFFFFFFFFFFFFFF00LL) | (word >> 56);
184 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
186 read_dword_in_memory();
188 *lsrtp = (*lsrtp & 0xFFFFFFFFFFFF0000LL) | (word >> 48);
191 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
193 read_dword_in_memory();
195 *lsrtp = (*lsrtp & 0xFFFFFFFFFF000000LL) | (word >> 40);
198 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
200 read_dword_in_memory();
202 *lsrtp = (*lsrtp & 0xFFFFFFFF00000000LL) | (word >> 32);
205 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
207 read_dword_in_memory();
209 *lsrtp = (*lsrtp & 0xFFFFFF0000000000LL) | (word >> 24);
212 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
214 read_dword_in_memory();
216 *lsrtp = (*lsrtp & 0xFFFF000000000000LL) | (word >> 16);
219 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
221 read_dword_in_memory();
223 *lsrtp = (*lsrtp & 0xFF00000000000000LL) | (word >> 8);
226 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
227 rdword = (unsigned long long *) lsrtp;
228 read_dword_in_memory();
233 DECLARE_INSTRUCTION(LB)
235 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
236 long long int *lsrtp = PC->f.i.rt;
238 address = (unsigned int) lsaddr;
239 rdword = (unsigned long long *) lsrtp;
240 read_byte_in_memory();
242 sign_extendedb(*lsrtp);
245 DECLARE_INSTRUCTION(LH)
247 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
248 long long int *lsrtp = PC->f.i.rt;
250 address = (unsigned int) lsaddr;
251 rdword = (unsigned long long *) lsrtp;
252 read_hword_in_memory();
254 sign_extendedh(*lsrtp);
257 DECLARE_INSTRUCTION(LWL)
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;
263 switch ((lsaddr) & 3)
266 address = (unsigned int) lsaddr;
267 rdword = (unsigned long long *) lsrtp;
268 read_word_in_memory();
271 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
273 read_word_in_memory();
275 *lsrtp = (*lsrtp & 0xFF) | (word << 8);
278 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
280 read_word_in_memory();
282 *lsrtp = (*lsrtp & 0xFFFF) | (word << 16);
285 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
287 read_word_in_memory();
289 *lsrtp = (*lsrtp & 0xFFFFFF) | (word << 24);
293 sign_extended(*lsrtp);
296 DECLARE_INSTRUCTION(LW)
298 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
299 long long int *lsrtp = PC->f.i.rt;
301 address = (unsigned int) lsaddr;
302 rdword = (unsigned long long *) lsrtp;
303 read_word_in_memory();
305 sign_extended(*lsrtp);
308 DECLARE_INSTRUCTION(LBU)
310 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
311 long long int *lsrtp = PC->f.i.rt;
313 address = (unsigned int) lsaddr;
314 rdword = (unsigned long long *) lsrtp;
315 read_byte_in_memory();
318 DECLARE_INSTRUCTION(LHU)
320 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
321 long long int *lsrtp = PC->f.i.rt;
323 address = (unsigned int) lsaddr;
324 rdword = (unsigned long long *) lsrtp;
325 read_hword_in_memory();
328 DECLARE_INSTRUCTION(LWR)
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;
334 switch ((lsaddr) & 3)
337 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
339 read_word_in_memory();
341 *lsrtp = (*lsrtp & 0xFFFFFFFFFFFFFF00LL) | ((word >> 24) & 0xFF);
344 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
346 read_word_in_memory();
348 *lsrtp = (*lsrtp & 0xFFFFFFFFFFFF0000LL) | ((word >> 16) & 0xFFFF);
351 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
353 read_word_in_memory();
355 *lsrtp = (*lsrtp & 0xFFFFFFFFFF000000LL) | ((word >> 8) & 0XFFFFFF);
358 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
359 rdword = (unsigned long long *) lsrtp;
360 read_word_in_memory();
362 sign_extended(*lsrtp);
366 DECLARE_INSTRUCTION(LWU)
368 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
369 long long int *lsrtp = PC->f.i.rt;
371 address = (unsigned int) lsaddr;
372 rdword = (unsigned long long *) lsrtp;
373 read_word_in_memory();
376 DECLARE_INSTRUCTION(SB)
378 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
379 long long int *lsrtp = PC->f.i.rt;
381 address = (unsigned int) lsaddr;
382 cpu_byte = (unsigned char)(*lsrtp & 0xFF);
383 write_byte_in_memory();
387 DECLARE_INSTRUCTION(SH)
389 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
390 long long int *lsrtp = PC->f.i.rt;
392 address = (unsigned int) lsaddr;
393 hword = (unsigned short)(*lsrtp & 0xFFFF);
394 write_hword_in_memory();
398 DECLARE_INSTRUCTION(SWL)
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;
404 switch ((lsaddr) & 3)
407 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
408 word = (unsigned int)*lsrtp;
409 write_word_in_memory();
413 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
415 read_word_in_memory();
418 word = ((unsigned int)*lsrtp >> 8) | ((unsigned int) old_word & 0xFF000000);
419 write_word_in_memory();
424 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
426 read_word_in_memory();
429 word = ((unsigned int)*lsrtp >> 16) | ((unsigned int) old_word & 0xFFFF0000);
430 write_word_in_memory();
435 address = (unsigned int) lsaddr;
436 cpu_byte = (unsigned char)(*lsrtp >> 24);
437 write_byte_in_memory();
443 DECLARE_INSTRUCTION(SW)
445 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
446 long long int *lsrtp = PC->f.i.rt;
448 address = (unsigned int) lsaddr;
449 word = (unsigned int)(*lsrtp & 0xFFFFFFFF);
450 write_word_in_memory();
454 DECLARE_INSTRUCTION(SDL)
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;
460 switch ((lsaddr) & 7)
463 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
465 write_dword_in_memory();
469 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
471 read_dword_in_memory();
474 dword = ((unsigned long long)*lsrtp >> 8)|(old_word & 0xFF00000000000000LL);
475 write_dword_in_memory();
480 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
482 read_dword_in_memory();
485 dword = ((unsigned long long)*lsrtp >> 16)|(old_word & 0xFFFF000000000000LL);
486 write_dword_in_memory();
491 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
493 read_dword_in_memory();
496 dword = ((unsigned long long)*lsrtp >> 24)|(old_word & 0xFFFFFF0000000000LL);
497 write_dword_in_memory();
502 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
504 read_dword_in_memory();
507 dword = ((unsigned long long)*lsrtp >> 32)|(old_word & 0xFFFFFFFF00000000LL);
508 write_dword_in_memory();
513 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
515 read_dword_in_memory();
518 dword = ((unsigned long long)*lsrtp >> 40)|(old_word & 0xFFFFFFFFFF000000LL);
519 write_dword_in_memory();
524 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
526 read_dword_in_memory();
529 dword = ((unsigned long long)*lsrtp >> 48)|(old_word & 0xFFFFFFFFFFFF0000LL);
530 write_dword_in_memory();
535 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
537 read_dword_in_memory();
540 dword = ((unsigned long long)*lsrtp >> 56)|(old_word & 0xFFFFFFFFFFFFFF00LL);
541 write_dword_in_memory();
548 DECLARE_INSTRUCTION(SDR)
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;
554 switch ((lsaddr) & 7)
557 address = (unsigned int) lsaddr;
559 read_dword_in_memory();
562 dword = (*lsrtp << 56) | (old_word & 0x00FFFFFFFFFFFFFFLL);
563 write_dword_in_memory();
568 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
570 read_dword_in_memory();
573 dword = (*lsrtp << 48) | (old_word & 0x0000FFFFFFFFFFFFLL);
574 write_dword_in_memory();
579 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
581 read_dword_in_memory();
584 dword = (*lsrtp << 40) | (old_word & 0x000000FFFFFFFFFFLL);
585 write_dword_in_memory();
590 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
592 read_dword_in_memory();
595 dword = (*lsrtp << 32) | (old_word & 0x00000000FFFFFFFFLL);
596 write_dword_in_memory();
601 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
603 read_dword_in_memory();
606 dword = (*lsrtp << 24) | (old_word & 0x0000000000FFFFFFLL);
607 write_dword_in_memory();
612 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
614 read_dword_in_memory();
617 dword = (*lsrtp << 16) | (old_word & 0x000000000000FFFFLL);
618 write_dword_in_memory();
623 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
625 read_dword_in_memory();
628 dword = (*lsrtp << 8) | (old_word & 0x00000000000000FFLL);
629 write_dword_in_memory();
634 address = ((unsigned int) lsaddr) & 0xFFFFFFF8;
636 write_dword_in_memory();
642 DECLARE_INSTRUCTION(SWR)
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;
648 switch ((lsaddr) & 3)
651 address = (unsigned int) lsaddr;
653 read_word_in_memory();
656 word = ((unsigned int)*lsrtp << 24) | ((unsigned int) old_word & 0x00FFFFFF);
657 write_word_in_memory();
662 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
664 read_word_in_memory();
667 word = ((unsigned int)*lsrtp << 16) | ((unsigned int) old_word & 0x0000FFFF);
668 write_word_in_memory();
673 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
675 read_word_in_memory();
678 word = ((unsigned int)*lsrtp << 8) | ((unsigned int) old_word & 0x000000FF);
679 write_word_in_memory();
684 address = ((unsigned int) lsaddr) & 0xFFFFFFFC;
685 word = (unsigned int)*lsrtp;
686 write_word_in_memory();
692 DECLARE_INSTRUCTION(CACHE)
697 DECLARE_INSTRUCTION(LL)
699 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
700 long long int *lsrtp = PC->f.i.rt;
702 address = (unsigned int) lsaddr;
703 rdword = (unsigned long long *) lsrtp;
704 read_word_in_memory();
707 sign_extended(*lsrtp);
712 DECLARE_INSTRUCTION(LWC1)
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;
719 address = (unsigned int) lslfaddr;
721 read_word_in_memory();
723 *((int*)reg_cop1_simple[lslfft]) = (int) *rdword;
726 DECLARE_INSTRUCTION(LDC1)
728 const unsigned char lslfft = lfft;
729 const unsigned int lslfaddr = (unsigned int)(lfoffset + reg[lfbase]);
730 if (check_cop1_unusable()) return;
732 address = (unsigned int) lslfaddr;
733 rdword = (unsigned long long *)reg_cop1_double[lslfft];
734 read_dword_in_memory();
737 DECLARE_INSTRUCTION(LD)
739 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
740 long long int *lsrtp = PC->f.i.rt;
742 address = (unsigned int) lsaddr;
743 rdword = (unsigned long long *) lsrtp;
744 read_dword_in_memory();
747 DECLARE_INSTRUCTION(SC)
749 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
750 long long int *lsrtp = PC->f.i.rt;
754 address = (unsigned int) lsaddr;
755 word = (unsigned int)(*lsrtp & 0xFFFFFFFF);
756 write_word_in_memory();
767 DECLARE_INSTRUCTION(SWC1)
769 const unsigned char lslfft = lfft;
770 const unsigned int lslfaddr = (unsigned int)(lfoffset + reg[lfbase]);
771 if (check_cop1_unusable()) return;
773 address = (unsigned int) lslfaddr;
774 word = *((int*)reg_cop1_simple[lslfft]);
775 write_word_in_memory();
779 DECLARE_INSTRUCTION(SDC1)
781 const unsigned char lslfft = lfft;
782 const unsigned int lslfaddr = (unsigned int)(lfoffset + reg[lfbase]);
783 if (check_cop1_unusable()) return;
785 address = (unsigned int) lslfaddr;
786 dword = *((unsigned long long*)reg_cop1_double[lslfft]);
787 write_dword_in_memory();
791 DECLARE_INSTRUCTION(SD)
793 const unsigned int lsaddr = (unsigned int)(iimmediate + irs32);
794 long long int *lsrtp = PC->f.i.rt;
796 address = (unsigned int) lsaddr;
798 write_dword_in_memory();