1 #define ZFLAG 0x00001
\r
2 #define CFLAG 0x00002
\r
3 #define NFLAG 0x00004
\r
4 #define IFLAG 0x00008
\r
5 static UINT8 * condition_table=0;
\r
7 #define CONDITION(x) condition_table[(x) + ((jaguar_FLAGS & 7) << 5)]
\r
8 static UINT16 * mirror_table;
\r
13 /*###################################################################################################
\r
15 **#################################################################################################*/
\r
17 #define ROPCODE(pc) (gpu_word_read(pc))
\r
20 int32 jaguar_icount;
\r
21 static const UINT32 convert_zero[32] =
\r
22 { 32,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 };
\r
24 static uint32 cnt_opcode=0;
\r
25 int jaguargpu_execute(int cycles)
\r
28 /* allocate the mirror table */
\r
31 mirror_table = (UINT16*)malloc(65536 * sizeof(mirror_table[0]));
\r
33 /* fill in the mirror table */
\r
35 for (i = 0; i < 65536; i++)
\r
36 mirror_table[i] = ((i >> 15) & 0x0001) | ((i >> 13) & 0x0002) |
\r
37 ((i >> 11) & 0x0004) | ((i >> 9) & 0x0008) |
\r
38 ((i >> 7) & 0x0010) | ((i >> 5) & 0x0020) |
\r
39 ((i >> 3) & 0x0040) | ((i >> 1) & 0x0080) |
\r
40 ((i << 1) & 0x0100) | ((i << 3) & 0x0200) |
\r
41 ((i << 5) & 0x0400) | ((i << 7) & 0x0800) |
\r
42 ((i << 9) & 0x1000) | ((i << 11) & 0x2000) |
\r
43 ((i << 13) & 0x4000) | ((i << 15) & 0x8000);
\r
46 if (!condition_table)
\r
48 condition_table = (uint8*)malloc(32 * 8 * sizeof(condition_table[0]));
\r
50 /* fill in the condition table */
\r
51 if (condition_table)
\r
52 for (i = 0; i < 8; i++)
\r
53 for (j = 0; j < 32; j++)
\r
57 if (i & ZFLAG) result = 0;
\r
59 if (!(i & ZFLAG)) result = 0;
\r
61 if (i & (CFLAG << (j >> 4))) result = 0;
\r
63 if (!(i & (CFLAG << (j >> 4)))) result = 0;
\r
64 condition_table[i * 32 + j] = result;
\r
67 /* if we're halted, we shouldn't be here */
\r
72 jaguar_icount=cycles;
\r
76 gpu_flag_c=(gpu_flag_c?1:0);
\r
77 gpu_flag_z=(gpu_flag_z?1:0);
\r
78 gpu_flag_n=(gpu_flag_n?1:0);
\r
80 // fprintf(log_get(),"%i 0x%.8x [%i %i %i]\n",cnt_opcode++,gpu_pc,gpu_flag_c,gpu_flag_z,gpu_flag_n);
\r
81 jaguar_ppc = gpu_pc;
\r
83 /* instruction fetch */
\r
84 jaguar_op = ROPCODE(gpu_pc);
\r
87 /* parse the instruction */
\r
88 (*gpu_op_table[jaguar_op >> 10])();
\r
91 } while ((jaguar_icount > 0)&&(gpu_running));
\r
93 return cycles - jaguar_icount;
\r
95 /*###################################################################################################
\r
97 **#################################################################################################*/
\r
101 int dreg = jaguar_op & 31;
\r
102 UINT32 res = gpu_reg[dreg];
\r
104 if (res & 0x80000000)
\r
106 gpu_reg[dreg] = res = -res;
\r
112 void add_rn_rn(void)
\r
114 int dreg = jaguar_op & 31;
\r
115 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
116 UINT32 r2 = gpu_reg[dreg];
\r
117 UINT32 res = r2 + r1;
\r
118 gpu_reg[dreg] = res;
\r
119 CLR_ZNC; SET_ZNC_ADD(r2,r1,res);
\r
122 void addc_rn_rn(void)
\r
124 int dreg = jaguar_op & 31;
\r
125 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
126 UINT32 r2 = gpu_reg[dreg];
\r
127 UINT32 res = r2 + r1 + gpu_flag_c;
\r
128 gpu_reg[dreg] = res;
\r
129 CLR_ZNC; SET_ZNC_ADD(r2,r1,res);
\r
132 void addq_n_rn(void)
\r
134 int dreg = jaguar_op & 31;
\r
135 UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
136 UINT32 r2 = gpu_reg[dreg];
\r
137 UINT32 res = r2 + r1;
\r
138 gpu_reg[dreg] = res;
\r
139 CLR_ZNC; SET_ZNC_ADD(r2,r1,res);
\r
142 void addqmod_n_rn(void) /* DSP only */
\r
144 int dreg = jaguar_op & 31;
\r
145 UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
146 UINT32 r2 = gpu_reg[dreg];
\r
147 UINT32 res = r2 + r1;
\r
148 res = (res & ~gpu_hidata) | (r2 & ~gpu_hidata);
\r
149 gpu_reg[dreg] = res;
\r
150 CLR_ZNC; SET_ZNC_ADD(r2,r1,res);
\r
153 void addqt_n_rn(void)
\r
155 int dreg = jaguar_op & 31;
\r
156 UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
157 UINT32 r2 = gpu_reg[dreg];
\r
158 UINT32 res = r2 + r1;
\r
159 gpu_reg[dreg] = res;
\r
162 void and_rn_rn(void)
\r
164 int dreg = jaguar_op & 31;
\r
165 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
166 UINT32 r2 = gpu_reg[dreg];
\r
167 UINT32 res = r2 & r1;
\r
168 gpu_reg[dreg] = res;
\r
169 CLR_ZN; SET_ZN(res);
\r
172 void bclr_n_rn(void)
\r
174 int dreg = jaguar_op & 31;
\r
175 UINT32 r1 = (jaguar_op >> 5) & 31;
\r
176 UINT32 r2 = gpu_reg[dreg];
\r
177 UINT32 res = r2 & ~(1 << r1);
\r
178 gpu_reg[dreg] = res;
\r
179 CLR_ZN; SET_ZN(res);
\r
182 void bset_n_rn(void)
\r
184 int dreg = jaguar_op & 31;
\r
185 UINT32 r1 = (jaguar_op >> 5) & 31;
\r
186 UINT32 r2 = gpu_reg[dreg];
\r
187 UINT32 res = r2 | (1 << r1);
\r
188 gpu_reg[dreg] = res;
\r
189 CLR_ZN; SET_ZN(res);
\r
192 void btst_n_rn(void)
\r
194 UINT32 r1 = (jaguar_op >> 5) & 31;
\r
195 UINT32 r2 = gpu_reg[jaguar_op & 31];
\r
196 CLR_Z; gpu_flag_z= (~r2 >> r1) & 1;
\r
199 void cmp_rn_rn(void)
\r
201 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
202 UINT32 r2 = gpu_reg[jaguar_op & 31];
\r
203 UINT32 res = r2 - r1;
\r
204 CLR_ZNC; SET_ZNC_SUB(r2,r1,res);
\r
207 void cmpq_n_rn(void)
\r
209 UINT32 r1 = (INT8)(jaguar_op >> 2) >> 3;
\r
210 UINT32 r2 = gpu_reg[jaguar_op & 31];
\r
211 UINT32 res = r2 - r1;
\r
212 CLR_ZNC; SET_ZNC_SUB(r2,r1,res);
\r
215 void div_rn_rn(void)
\r
217 int dreg = jaguar_op & 31;
\r
218 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
219 UINT32 r2 = gpu_reg[dreg];
\r
222 if (gpu_div_control & 1)
\r
224 gpu_reg[dreg] = ((UINT64)r2 << 16) / r1;
\r
225 gpu_remain = ((UINT64)r2 << 16) % r1;
\r
229 gpu_reg[dreg] = r2 / r1;
\r
230 gpu_remain = r2 % r1;
\r
234 gpu_reg[dreg] = 0xffffffff;
\r
241 void imacn_rn_rn(void)
\r
243 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
244 UINT32 r2 = gpu_reg[jaguar_op & 31];
\r
245 gpu_acc += (INT64)((INT16)r1 * (INT16)r2);
\r
248 void imult_rn_rn(void)
\r
250 int dreg = jaguar_op & 31;
\r
251 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
252 UINT32 r2 = gpu_reg[dreg];
\r
253 UINT32 res = (INT16)r1 * (INT16)r2;
\r
254 gpu_reg[dreg] = res;
\r
255 CLR_ZN; SET_ZN(res);
\r
258 void imultn_rn_rn(void)
\r
260 int dreg = jaguar_op & 31;
\r
261 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
262 UINT32 r2 = gpu_reg[dreg];
\r
263 UINT32 res = (INT16)r1 * (INT16)r2;
\r
264 gpu_acc = (INT32)res;
\r
265 CLR_ZN; SET_ZN(res);
\r
267 jaguar_op = ROPCODE(gpu_pc);
\r
268 while ((jaguar_op >> 10) == 20)
\r
270 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
271 r2 = gpu_reg[jaguar_op & 31];
\r
272 gpu_acc += (INT64)((INT16)r1 * (INT16)r2);
\r
274 jaguar_op = ROPCODE(gpu_pc);
\r
276 if ((jaguar_op >> 10) == 19)
\r
279 gpu_reg[jaguar_op & 31] = (UINT32)gpu_acc;
\r
285 UINT32 jaguar_FLAGS;
\r
287 gpu_flag_c?(gpu_flag_c=1):(gpu_flag_c=0);
\r
288 gpu_flag_z?(gpu_flag_z=1):(gpu_flag_z=0);
\r
289 gpu_flag_n?(gpu_flag_n=1):(gpu_flag_n=0);
\r
291 jaguar_FLAGS=(gpu_flag_n<<2)|(gpu_flag_c<<1)|gpu_flag_z;
\r
293 if (CONDITION(jaguar_op & 31))
\r
295 INT32 r1 = (INT8)((jaguar_op >> 2) & 0xf8) >> 2;
\r
296 UINT32 newpc = gpu_pc + r1;
\r
297 jaguar_op = ROPCODE(gpu_pc);
\r
298 // fprintf(log_get(),"%i 0x%.8x [%i %i %i]\n",cnt_opcode++,gpu_pc,gpu_flag_c,gpu_flag_z,gpu_flag_n);
\r
300 (*gpu_op_table[jaguar_op >> 10])();
\r
302 jaguar_icount -= 3; /* 3 wait states guaranteed */
\r
306 void jump_cc_rn(void)
\r
308 UINT32 jaguar_FLAGS;
\r
310 gpu_flag_c?(gpu_flag_c=1):(gpu_flag_c=0);
\r
311 gpu_flag_z?(gpu_flag_z=1):(gpu_flag_z=0);
\r
312 gpu_flag_n?(gpu_flag_n=1):(gpu_flag_n=0);
\r
314 jaguar_FLAGS=(gpu_flag_n<<2)|(gpu_flag_c<<1)|gpu_flag_z;
\r
315 if (CONDITION(jaguar_op & 31))
\r
317 UINT8 reg = (jaguar_op >> 5) & 31;
\r
319 /* special kludge for risky code in the cojag DSP interrupt handlers */
\r
320 UINT32 newpc = /*(jaguar_icount == bankswitch_icount) ?*/ gpu_reg[reg];// : gpu_reg[reg];
\r
321 jaguar_op = ROPCODE(gpu_pc);
\r
322 // fprintf(log_get(),"%i 0x%.8x [%i %i %i]\n",cnt_opcode++,gpu_pc,gpu_flag_c,gpu_flag_z,gpu_flag_n);
\r
324 (*gpu_op_table[jaguar_op >> 10])();
\r
326 jaguar_icount -= 3; /* 3 wait states guaranteed */
\r
330 void load_rn_rn(void)
\r
332 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
333 gpu_reg[jaguar_op & 31] = gpu_long_read(r1);
\r
336 void load_r14n_rn(void)
\r
338 UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
339 gpu_reg[jaguar_op & 31] = gpu_long_read(gpu_reg[14] + 4 * r1);
\r
342 void load_r15n_rn(void)
\r
344 UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
345 gpu_reg[jaguar_op & 31] = gpu_long_read(gpu_reg[15] + 4 * r1);
\r
348 void load_r14rn_rn(void)
\r
350 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
351 gpu_reg[jaguar_op & 31] = gpu_long_read(gpu_reg[14] + r1);
\r
354 void load_r15rn_rn(void)
\r
356 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
357 gpu_reg[jaguar_op & 31] = gpu_long_read(gpu_reg[15] + r1);
\r
360 void loadb_rn_rn(void)
\r
362 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
363 gpu_reg[jaguar_op & 31] = gpu_byte_read(r1);
\r
366 void loadw_rn_rn(void)
\r
368 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
369 gpu_reg[jaguar_op & 31] = gpu_word_read(r1);
\r
372 void loadp_rn_rn(void) /* GPU only */
\r
374 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
375 gpu_hidata = gpu_word_read(r1);
\r
376 gpu_reg[jaguar_op & 31] = gpu_word_read(r1+4);
\r
379 void mirror_rn(void) /* DSP only */
\r
381 int dreg = jaguar_op & 31;
\r
382 UINT32 r1 = gpu_reg[dreg];
\r
383 UINT32 res = (mirror_table[r1 & 0xffff] << 16) | mirror_table[r1 >> 16];
\r
384 gpu_reg[dreg] = res;
\r
385 CLR_ZN; SET_ZN(res);
\r
388 void mmult_rn_rn(void)
\r
390 int count = gpu_matrix_control & 15, i;
\r
391 int sreg = (jaguar_op >> 5) & 31;
\r
392 int dreg = jaguar_op & 31;
\r
393 UINT32 addr = gpu_pointer_to_matrix;
\r
397 if (!(gpu_matrix_control & 0x10))
\r
399 for (i = 0; i < count; i++)
\r
401 accum += (INT16)(gpu_reg_bank_1[sreg + i/2] >> (16 * ((i & 1) ^ 1))) * (INT16)gpu_word_read(addr);
\r
407 for (i = 0; i < count; i++)
\r
409 accum += (INT16)(gpu_reg_bank_1[sreg + i/2] >> (16 * ((i & 1) ^ 1))) * (INT16)gpu_word_read(addr);
\r
413 gpu_reg[dreg] = res = (UINT32)accum;
\r
414 CLR_ZN; SET_ZN(res);
\r
417 void move_rn_rn(void)
\r
419 gpu_reg[jaguar_op & 31] = gpu_reg[(jaguar_op >> 5) & 31];
\r
422 void move_pc_rn(void)
\r
424 gpu_reg[jaguar_op & 31] = jaguar_ppc;
\r
427 void movefa_rn_rn(void)
\r
429 gpu_reg[jaguar_op & 31] = gpu_alternate_reg[(jaguar_op >> 5) & 31];
\r
432 void movei_n_rn(void)
\r
434 UINT32 res = ROPCODE(gpu_pc) | (ROPCODE(gpu_pc + 2) << 16);
\r
436 gpu_reg[jaguar_op & 31] = res;
\r
439 void moveq_n_rn(void)
\r
441 gpu_reg[jaguar_op & 31] = (jaguar_op >> 5) & 31;
\r
444 void moveta_rn_rn(void)
\r
446 gpu_alternate_reg[jaguar_op & 31] = gpu_reg[(jaguar_op >> 5) & 31];
\r
449 void mtoi_rn_rn(void)
\r
451 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
452 gpu_reg[jaguar_op & 31] = (((INT32)r1 >> 8) & 0xff800000) | (r1 & 0x007fffff);
\r
455 void mult_rn_rn(void)
\r
457 int dreg = jaguar_op & 31;
\r
458 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
459 UINT32 r2 = gpu_reg[dreg];
\r
460 UINT32 res = (UINT16)r1 * (UINT16)r2;
\r
461 gpu_reg[dreg] = res;
\r
462 CLR_ZN; SET_ZN(res);
\r
467 int dreg = jaguar_op & 31;
\r
468 UINT32 r2 = gpu_reg[dreg];
\r
470 gpu_reg[dreg] = res;
\r
471 CLR_ZNC; SET_ZNC_SUB(0,r2,res);
\r
478 void normi_rn_rn(void)
\r
480 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
482 while ((r1 & 0xffc00000) == 0)
\r
487 while ((r1 & 0xff800000) != 0)
\r
492 gpu_reg[jaguar_op & 31] = res;
\r
493 CLR_ZN; SET_ZN(res);
\r
498 int dreg = jaguar_op & 31;
\r
499 UINT32 res = ~gpu_reg[dreg];
\r
500 gpu_reg[dreg] = res;
\r
501 CLR_ZN; SET_ZN(res);
\r
504 void or_rn_rn(void)
\r
506 int dreg = jaguar_op & 31;
\r
507 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
508 UINT32 r2 = gpu_reg[dreg];
\r
509 UINT32 res = r1 | r2;
\r
510 gpu_reg[dreg] = res;
\r
511 CLR_ZN; SET_ZN(res);
\r
514 void pack_rn(void) /* GPU only */
\r
516 int dreg = jaguar_op & 31;
\r
517 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
518 UINT32 r2 = gpu_reg[dreg];
\r
520 if (r1 == 0) /* PACK */
\r
521 res = ((r2 >> 10) & 0xf000) | ((r2 >> 5) & 0x0f00) | (r2 & 0xff);
\r
523 res = ((r2 & 0xf000) << 10) | ((r2 & 0x0f00) << 5) | (r2 & 0xff);
\r
524 gpu_reg[dreg] = res;
\r
525 CLR_ZN; SET_ZN(res);
\r
528 void resmac_rn(void)
\r
530 gpu_reg[jaguar_op & 31] = (UINT32)gpu_acc;
\r
533 void ror_rn_rn(void)
\r
535 int dreg = jaguar_op & 31;
\r
536 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31] & 31;
\r
537 UINT32 r2 = gpu_reg[dreg];
\r
538 UINT32 res = (r2 >> r1) | (r2 << (32 - r1));
\r
539 gpu_reg[dreg] = res;
\r
540 CLR_ZNC; SET_ZN(res); gpu_flag_c = (r2 >> 30) & 2;
\r
543 void rorq_n_rn(void)
\r
545 int dreg = jaguar_op & 31;
\r
546 UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
547 UINT32 r2 = gpu_reg[dreg];
\r
548 UINT32 res = (r2 >> r1) | (r2 << (32 - r1));
\r
549 gpu_reg[dreg] = res;
\r
550 CLR_ZNC; SET_ZN(res); gpu_flag_c= (r2 >> 30) & 2;
\r
553 void sat8_rn(void) /* GPU only */
\r
555 int dreg = jaguar_op & 31;
\r
556 INT32 r2 = gpu_reg[dreg];
\r
557 UINT32 res = (r2 < 0) ? 0 : (r2 > 255) ? 255 : r2;
\r
558 gpu_reg[dreg] = res;
\r
559 CLR_ZN; SET_ZN(res);
\r
562 void sat16_rn(void) /* GPU only */
\r
564 int dreg = jaguar_op & 31;
\r
565 INT32 r2 = gpu_reg[dreg];
\r
566 UINT32 res = (r2 < 0) ? 0 : (r2 > 65535) ? 65535 : r2;
\r
567 gpu_reg[dreg] = res;
\r
568 CLR_ZN; SET_ZN(res);
\r
571 void sat16s_rn(void) /* DSP only */
\r
573 int dreg = jaguar_op & 31;
\r
574 INT32 r2 = gpu_reg[dreg];
\r
575 UINT32 res = (r2 < -32768) ? -32768 : (r2 > 32767) ? 32767 : r2;
\r
576 gpu_reg[dreg] = res;
\r
577 CLR_ZN; SET_ZN(res);
\r
580 void sat24_rn(void) /* GPU only */
\r
582 int dreg = jaguar_op & 31;
\r
583 INT32 r2 = gpu_reg[dreg];
\r
584 UINT32 res = (r2 < 0) ? 0 : (r2 > 16777215) ? 16777215 : r2;
\r
585 gpu_reg[dreg] = res;
\r
586 CLR_ZN; SET_ZN(res);
\r
589 void sat32s_rn(void) /* DSP only */
\r
591 int dreg = jaguar_op & 31;
\r
592 INT32 r2 = (UINT32)gpu_reg[dreg];
\r
593 INT32 temp = gpu_acc >> 32;
\r
594 UINT32 res = (temp < -1) ? (INT32)0x80000000 : (temp > 0) ? (INT32)0x7fffffff : r2;
\r
595 gpu_reg[dreg] = res;
\r
596 CLR_ZN; SET_ZN(res);
\r
599 void sh_rn_rn(void)
\r
601 int dreg = jaguar_op & 31;
\r
602 INT32 r1 = (INT32)gpu_reg[(jaguar_op >> 5) & 31];
\r
603 UINT32 r2 = gpu_reg[dreg];
\r
609 res = (r1 <= -32) ? 0 : (r2 << -r1);
\r
610 gpu_flag_c= (r2 >> 30) & 2;
\r
614 res = (r1 >= 32) ? 0 : (r2 >> r1);
\r
615 gpu_flag_c= (r2 << 1) & 2;
\r
617 gpu_reg[dreg] = res;
\r
621 void sha_rn_rn(void)
\r
623 int dreg = jaguar_op & 31;
\r
624 INT32 r1 = (INT32)gpu_reg[(jaguar_op >> 5) & 31];
\r
625 UINT32 r2 = gpu_reg[dreg];
\r
631 res = (r1 <= -32) ? 0 : (r2 << -r1);
\r
632 gpu_flag_c= (r2 >> 30) & 2;
\r
636 res = (r1 >= 32) ? ((INT32)r2 >> 31) : ((INT32)r2 >> r1);
\r
637 gpu_flag_c= (r2 << 1) & 2;
\r
639 gpu_reg[dreg] = res;
\r
643 void sharq_n_rn(void)
\r
645 int dreg = jaguar_op & 31;
\r
646 INT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
647 UINT32 r2 = gpu_reg[dreg];
\r
648 UINT32 res = (INT32)r2 >> r1;
\r
649 gpu_reg[dreg] = res;
\r
650 CLR_ZNC; SET_ZN(res); gpu_flag_c= (r2 << 1) & 2;
\r
653 void shlq_n_rn(void)
\r
655 int dreg = jaguar_op & 31;
\r
656 INT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
657 UINT32 r2 = gpu_reg[dreg];
\r
658 UINT32 res = r2 << (32 - r1);
\r
659 gpu_reg[dreg] = res;
\r
660 CLR_ZNC; SET_ZN(res); gpu_flag_c= (r2 >> 30) & 2;
\r
663 void shrq_n_rn(void)
\r
665 int dreg = jaguar_op & 31;
\r
666 INT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
667 UINT32 r2 = gpu_reg[dreg];
\r
668 UINT32 res = r2 >> r1;
\r
669 gpu_reg[dreg] = res;
\r
670 CLR_ZNC; SET_ZN(res); gpu_flag_c= (r2 << 1) & 2;
\r
673 void store_rn_rn(void)
\r
675 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
676 gpu_long_write(r1, gpu_reg[jaguar_op & 31]);
\r
679 void store_rn_r14n(void)
\r
681 UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
682 gpu_long_write(gpu_reg[14] + r1 * 4, gpu_reg[jaguar_op & 31]);
\r
685 void store_rn_r15n(void)
\r
687 UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
688 gpu_long_write(gpu_reg[15] + r1 * 4, gpu_reg[jaguar_op & 31]);
\r
691 void store_rn_r14rn(void)
\r
693 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
694 gpu_long_write(gpu_reg[14] + r1, gpu_reg[jaguar_op & 31]);
\r
697 void store_rn_r15rn(void)
\r
699 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
700 gpu_long_write(gpu_reg[15] + r1, gpu_reg[jaguar_op & 31]);
\r
703 void storeb_rn_rn(void)
\r
705 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
706 gpu_byte_write(r1, gpu_reg[jaguar_op & 31]);
\r
709 void storew_rn_rn(void)
\r
711 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
712 gpu_word_write(r1, gpu_reg[jaguar_op & 31]);
\r
715 void storep_rn_rn(void) /* GPU only */
\r
717 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
718 gpu_long_write(r1, gpu_hidata);
\r
719 gpu_long_write(r1+4, gpu_reg[jaguar_op & 31]);
\r
722 void sub_rn_rn(void)
\r
724 int dreg = jaguar_op & 31;
\r
725 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
726 UINT32 r2 = gpu_reg[dreg];
\r
727 // fprintf(log_get(),"r%i=0x%.8x r%i=0x%.8x\n",(jaguar_op >> 5) & 31,r1,dreg,r2);
\r
728 UINT32 res = r2 - r1;
\r
729 gpu_reg[dreg] = res;
\r
730 CLR_ZNC; SET_ZNC_SUB(r2,r1,res);
\r
733 void subc_rn_rn(void)
\r
735 int dreg = jaguar_op & 31;
\r
736 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
737 UINT32 r2 = gpu_reg[dreg];
\r
738 UINT32 res = r2 - r1 - gpu_flag_c;
\r
739 gpu_reg[dreg] = res;
\r
740 CLR_ZNC; SET_ZNC_SUB(r2,r1,res);
\r
743 void subq_n_rn(void)
\r
745 int dreg = jaguar_op & 31;
\r
746 UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
747 UINT32 r2 = gpu_reg[dreg];
\r
748 UINT32 res = r2 - r1;
\r
749 gpu_reg[dreg] = res;
\r
750 CLR_ZNC; SET_ZNC_SUB(r2,r1,res);
\r
753 void subqmod_n_rn(void) /* DSP only */
\r
755 int dreg = jaguar_op & 31;
\r
756 UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
757 UINT32 r2 = gpu_reg[dreg];
\r
758 UINT32 res = r2 - r1;
\r
759 // res = (res & ~jaguar.ctrl[D_MOD]) | (r2 & ~jaguar.ctrl[D_MOD]);
\r
760 gpu_reg[dreg] = res;
\r
761 CLR_ZNC; SET_ZNC_SUB(r2,r1,res);
\r
764 void subqt_n_rn(void)
\r
766 int dreg = jaguar_op & 31;
\r
767 UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];
\r
768 UINT32 r2 = gpu_reg[dreg];
\r
769 UINT32 res = r2 - r1;
\r
770 gpu_reg[dreg] = res;
\r
773 void xor_rn_rn(void)
\r
775 int dreg = jaguar_op & 31;
\r
776 UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];
\r
777 UINT32 r2 = gpu_reg[dreg];
\r
778 UINT32 res = r1 ^ r2;
\r
779 gpu_reg[dreg] = res;
\r
780 CLR_ZN; SET_ZN(res);
\r