Statistics
| Branch: | Revision:

root / target-sh4 / op.c @ a73d39ba

History | View | Annotate | Download (16.5 kB)

1
/*
2
 *  SH4 emulation
3
 *
4
 *  Copyright (c) 2005 Samuel Tardieu
5
 *
6
 * This library is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2 of the License, or (at your option) any later version.
10
 *
11
 * This library 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 GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this library; if not, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
 */
20
#include "exec.h"
21

    
22
static inline void set_t(void)
23
{
24
    env->sr |= SR_T;
25
}
26

    
27
static inline void clr_t(void)
28
{
29
    env->sr &= ~SR_T;
30
}
31

    
32
static inline void cond_t(int cond)
33
{
34
    if (cond)
35
        set_t();
36
    else
37
        clr_t();
38
}
39

    
40
void OPPROTO op_cmp_eq_imm_T0(void)
41
{
42
    cond_t((int32_t) T0 == (int32_t) PARAM1);
43
    RETURN();
44
}
45

    
46
void OPPROTO op_not_T0(void)
47
{
48
    T0 = ~T0;
49
    RETURN();
50
}
51

    
52
void OPPROTO op_bf_s(void)
53
{
54
    env->delayed_pc = PARAM1;
55
    if (!(env->sr & SR_T)) {
56
        env->flags |= DELAY_SLOT_TRUE;
57
    }
58
    RETURN();
59
}
60

    
61
void OPPROTO op_bt_s(void)
62
{
63
    env->delayed_pc = PARAM1;
64
    if (env->sr & SR_T) {
65
        env->flags |= DELAY_SLOT_TRUE;
66
    }
67
    RETURN();
68
}
69

    
70
void OPPROTO op_store_flags(void)
71
{
72
    env->flags &= DELAY_SLOT_TRUE;
73
    env->flags |= PARAM1;
74
    RETURN();
75
}
76

    
77
void OPPROTO op_bra(void)
78
{
79
    env->delayed_pc = PARAM1;
80
    RETURN();
81
}
82

    
83
void OPPROTO op_braf_T0(void)
84
{
85
    env->delayed_pc = PARAM1 + T0;
86
    RETURN();
87
}
88

    
89
void OPPROTO op_bsr(void)
90
{
91
    env->pr = PARAM1;
92
    env->delayed_pc = PARAM2;
93
    RETURN();
94
}
95

    
96
void OPPROTO op_bsrf_T0(void)
97
{
98
    env->pr = PARAM1;
99
    env->delayed_pc = PARAM1 + T0;
100
    RETURN();
101
}
102

    
103
void OPPROTO op_jsr_T0(void)
104
{
105
    env->pr = PARAM1;
106
    env->delayed_pc = T0;
107
    RETURN();
108
}
109

    
110
void OPPROTO op_rts(void)
111
{
112
    env->delayed_pc = env->pr;
113
    RETURN();
114
}
115

    
116
void OPPROTO op_addl_imm_T0(void)
117
{
118
    T0 += PARAM1;
119
    RETURN();
120
}
121

    
122
void OPPROTO op_addl_imm_T1(void)
123
{
124
    T1 += PARAM1;
125
    RETURN();
126
}
127

    
128
void OPPROTO op_clrmac(void)
129
{
130
    env->mach = env->macl = 0;
131
    RETURN();
132
}
133

    
134
void OPPROTO op_clrs(void)
135
{
136
    env->sr &= ~SR_S;
137
    RETURN();
138
}
139

    
140
void OPPROTO op_clrt(void)
141
{
142
    env->sr &= ~SR_T;
143
    RETURN();
144
}
145

    
146
void OPPROTO op_ldtlb(void)
147
{
148
    helper_ldtlb();
149
    RETURN();
150
}
151

    
152
void OPPROTO op_sets(void)
153
{
154
    env->sr |= SR_S;
155
    RETURN();
156
}
157

    
158
void OPPROTO op_sett(void)
159
{
160
    env->sr |= SR_T;
161
    RETURN();
162
}
163

    
164
void OPPROTO op_frchg(void)
165
{
166
    env->fpscr ^= FPSCR_FR;
167
    RETURN();
168
}
169

    
170
void OPPROTO op_fschg(void)
171
{
172
    env->fpscr ^= FPSCR_SZ;
173
    RETURN();
174
}
175

    
176
void OPPROTO op_rte(void)
177
{
178
    env->sr = env->ssr;
179
    env->delayed_pc = env->spc;
180
    RETURN();
181
}
182

    
183
void OPPROTO op_swapb_T0(void)
184
{
185
    T0 = (T0 & 0xffff0000) | ((T0 & 0xff) << 8) | ((T0 >> 8) & 0xff);
186
    RETURN();
187
}
188

    
189
void OPPROTO op_swapw_T0(void)
190
{
191
    T0 = ((T0 & 0xffff) << 16) | ((T0 >> 16) & 0xffff);
192
    RETURN();
193
}
194

    
195
void OPPROTO op_xtrct_T0_T1(void)
196
{
197
    T1 = ((T0 & 0xffff) << 16) | ((T1 >> 16) & 0xffff);
198
    RETURN();
199
}
200

    
201
void OPPROTO op_add_T0_T1(void)
202
{
203
    T1 += T0;
204
    RETURN();
205
}
206

    
207
void OPPROTO op_addc_T0_T1(void)
208
{
209
    helper_addc_T0_T1();
210
    RETURN();
211
}
212

    
213
void OPPROTO op_addv_T0_T1(void)
214
{
215
    helper_addv_T0_T1();
216
    RETURN();
217
}
218

    
219
void OPPROTO op_cmp_eq_T0_T1(void)
220
{
221
    cond_t(T1 == T0);
222
    RETURN();
223
}
224

    
225
void OPPROTO op_cmp_ge_T0_T1(void)
226
{
227
    cond_t((int32_t) T1 >= (int32_t) T0);
228
    RETURN();
229
}
230

    
231
void OPPROTO op_cmp_gt_T0_T1(void)
232
{
233
    cond_t((int32_t) T1 > (int32_t) T0);
234
    RETURN();
235
}
236

    
237
void OPPROTO op_cmp_hi_T0_T1(void)
238
{
239
    cond_t((uint32_t) T1 > (uint32_t) T0);
240
    RETURN();
241
}
242

    
243
void OPPROTO op_cmp_hs_T0_T1(void)
244
{
245
    cond_t((uint32_t) T1 >= (uint32_t) T0);
246
    RETURN();
247
}
248

    
249
void OPPROTO op_cmp_str_T0_T1(void)
250
{
251
    cond_t((T0 & 0x000000ff) == (T1 & 0x000000ff) ||
252
           (T0 & 0x0000ff00) == (T1 & 0x0000ff00) ||
253
           (T0 & 0x00ff0000) == (T1 & 0x00ff0000) ||
254
           (T0 & 0xff000000) == (T1 & 0xff000000));
255
    RETURN();
256
}
257

    
258
void OPPROTO op_tst_T0_T1(void)
259
{
260
    cond_t((T1 & T0) == 0);
261
    RETURN();
262
}
263

    
264
void OPPROTO op_div0s_T0_T1(void)
265
{
266
    if (T1 & 0x80000000)
267
        env->sr |= SR_Q;
268
    else
269
        env->sr &= ~SR_Q;
270
    if (T0 & 0x80000000)
271
        env->sr |= SR_M;
272
    else
273
        env->sr &= ~SR_M;
274
    cond_t((T1 ^ T0) & 0x80000000);
275
    RETURN();
276
}
277

    
278
void OPPROTO op_div0u(void)
279
{
280
    env->sr &= ~(SR_M | SR_Q | SR_T);
281
    RETURN();
282
}
283

    
284
void OPPROTO op_div1_T0_T1(void)
285
{
286
    helper_div1_T0_T1();
287
    RETURN();
288
}
289

    
290
void OPPROTO op_dmulsl_T0_T1(void)
291
{
292
    helper_dmulsl_T0_T1();
293
    RETURN();
294
}
295

    
296
void OPPROTO op_dmulul_T0_T1(void)
297
{
298
    helper_dmulul_T0_T1();
299
    RETURN();
300
}
301

    
302
void OPPROTO op_macl_T0_T1(void)
303
{
304
    helper_macl_T0_T1();
305
    RETURN();
306
}
307

    
308
void OPPROTO op_macw_T0_T1(void)
309
{
310
    helper_macw_T0_T1();
311
    RETURN();
312
}
313

    
314
void OPPROTO op_mull_T0_T1(void)
315
{
316
    env->macl = (T0 * T1) & 0xffffffff;
317
    RETURN();
318
}
319

    
320
void OPPROTO op_mulsw_T0_T1(void)
321
{
322
    env->macl = (int32_t)(int16_t) T0 *(int32_t)(int16_t) T1;
323
    RETURN();
324
}
325

    
326
void OPPROTO op_muluw_T0_T1(void)
327
{
328
    env->macl = (uint32_t)(uint16_t) T0 *(uint32_t)(uint16_t) T1;
329
    RETURN();
330
}
331

    
332
void OPPROTO op_neg_T0(void)
333
{
334
    T0 = -T0;
335
    RETURN();
336
}
337

    
338
void OPPROTO op_negc_T0(void)
339
{
340
    helper_negc_T0();
341
    RETURN();
342
}
343

    
344
void OPPROTO op_shad_T0_T1(void)
345
{
346
    if ((T0 & 0x80000000) == 0)
347
        T1 <<= (T0 & 0x1f);
348
    else if ((T0 & 0x1f) == 0)
349
        T1 = (T1 & 0x80000000)? 0xffffffff : 0;
350
    else
351
        T1 = ((int32_t) T1) >> ((~T0 & 0x1f) + 1);
352
    RETURN();
353
}
354

    
355
void OPPROTO op_shld_T0_T1(void)
356
{
357
    if ((T0 & 0x80000000) == 0)
358
        T1 <<= (T0 & 0x1f);
359
    else if ((T0 & 0x1f) == 0)
360
        T1 = 0;
361
    else
362
        T1 = ((uint32_t) T1) >> ((~T0 & 0x1f) + 1);
363
    RETURN();
364
}
365

    
366
void OPPROTO op_subc_T0_T1(void)
367
{
368
    helper_subc_T0_T1();
369
    RETURN();
370
}
371

    
372
void OPPROTO op_subv_T0_T1(void)
373
{
374
    helper_subv_T0_T1();
375
    RETURN();
376
}
377

    
378
void OPPROTO op_trapa(void)
379
{
380
    env->tra = PARAM1 << 2;
381
    env->exception_index = 0x160;
382
    do_raise_exception();
383
    RETURN();
384
}
385

    
386
void OPPROTO op_cmp_pl_T0(void)
387
{
388
    cond_t((int32_t) T0 > 0);
389
    RETURN();
390
}
391

    
392
void OPPROTO op_cmp_pz_T0(void)
393
{
394
    cond_t((int32_t) T0 >= 0);
395
    RETURN();
396
}
397

    
398
void OPPROTO op_jmp_T0(void)
399
{
400
    env->delayed_pc = T0;
401
    RETURN();
402
}
403

    
404
void OPPROTO op_movl_rN_rN(void)
405
{
406
    env->gregs[PARAM2] = env->gregs[PARAM1];
407
    RETURN();
408
}
409

    
410
void OPPROTO op_ldcl_rMplus_rN_bank(void)
411
{
412
    env->gregs[PARAM2] = env->gregs[PARAM1];
413
    env->gregs[PARAM1] += 4;
414
    RETURN();
415
}
416

    
417
void OPPROTO op_ldc_T0_sr(void)
418
{
419
    env->sr = T0 & 0x700083f3;
420
    RETURN();
421
}
422

    
423
void OPPROTO op_stc_sr_T0(void)
424
{
425
    T0 = env->sr;
426
    RETURN();
427
}
428

    
429
#define LDSTOPS(target,load,store) \
430
void OPPROTO op_##load##_T0_##target (void) \
431
{ env ->target = T0;   RETURN(); \
432
} \
433
void OPPROTO op_##store##_##target##_T0 (void) \
434
{ T0 = env->target;   RETURN(); \
435
} \
436

    
437
    LDSTOPS(gbr, ldc, stc)
438
    LDSTOPS(vbr, ldc, stc)
439
    LDSTOPS(ssr, ldc, stc)
440
    LDSTOPS(spc, ldc, stc)
441
    LDSTOPS(sgr, ldc, stc)
442
    LDSTOPS(dbr, ldc, stc)
443
    LDSTOPS(mach, lds, sts)
444
    LDSTOPS(macl, lds, sts)
445
    LDSTOPS(pr, lds, sts)
446
    LDSTOPS(fpul, lds, sts)
447

    
448
void OPPROTO op_lds_T0_fpscr(void)
449
{
450
    env->fpscr = T0 & 0x003fffff;
451
    env->fp_status.float_rounding_mode = T0 & 0x01 ?
452
      float_round_to_zero : float_round_nearest_even;
453

    
454
    RETURN();
455
}
456

    
457
void OPPROTO op_sts_fpscr_T0(void)
458
{
459
    T0 = env->fpscr & 0x003fffff;
460
    RETURN();
461
}
462

    
463
void OPPROTO op_movt_rN(void)
464
{
465
    env->gregs[PARAM1] = env->sr & SR_T;
466
    RETURN();
467
}
468

    
469
void OPPROTO op_rotcl_Rn(void)
470
{
471
    helper_rotcl(&env->gregs[PARAM1]);
472
    RETURN();
473
}
474

    
475
void OPPROTO op_rotcr_Rn(void)
476
{
477
    helper_rotcr(&env->gregs[PARAM1]);
478
    RETURN();
479
}
480

    
481
void OPPROTO op_rotl_Rn(void)
482
{
483
    cond_t(env->gregs[PARAM1] & 0x80000000);
484
    env->gregs[PARAM1] = (env->gregs[PARAM1] << 1) | (env->sr & SR_T);
485
    RETURN();
486
}
487

    
488
void OPPROTO op_rotr_Rn(void)
489
{
490
    cond_t(env->gregs[PARAM1] & 1);
491
    env->gregs[PARAM1] = (env->gregs[PARAM1] >> 1) |
492
        ((env->sr & SR_T) ? 0x80000000 : 0);
493
    RETURN();
494
}
495

    
496
void OPPROTO op_shal_Rn(void)
497
{
498
    cond_t(env->gregs[PARAM1] & 0x80000000);
499
    env->gregs[PARAM1] <<= 1;
500
    RETURN();
501
}
502

    
503
void OPPROTO op_shar_Rn(void)
504
{
505
    cond_t(env->gregs[PARAM1] & 1);
506
    *(int32_t *)&env->gregs[PARAM1] >>= 1;
507
    RETURN();
508
}
509

    
510
void OPPROTO op_shlr_Rn(void)
511
{
512
    cond_t(env->gregs[PARAM1] & 1);
513
    env->gregs[PARAM1] >>= 1;
514
    RETURN();
515
}
516

    
517
void OPPROTO op_shll2_Rn(void)
518
{
519
    env->gregs[PARAM1] <<= 2;
520
    RETURN();
521
}
522

    
523
void OPPROTO op_shll8_Rn(void)
524
{
525
    env->gregs[PARAM1] <<= 8;
526
    RETURN();
527
}
528

    
529
void OPPROTO op_shll16_Rn(void)
530
{
531
    env->gregs[PARAM1] <<= 16;
532
    RETURN();
533
}
534

    
535
void OPPROTO op_shlr2_Rn(void)
536
{
537
    env->gregs[PARAM1] >>= 2;
538
    RETURN();
539
}
540

    
541
void OPPROTO op_shlr8_Rn(void)
542
{
543
    env->gregs[PARAM1] >>= 8;
544
    RETURN();
545
}
546

    
547
void OPPROTO op_shlr16_Rn(void)
548
{
549
    env->gregs[PARAM1] >>= 16;
550
    RETURN();
551
}
552

    
553
void OPPROTO op_movl_T0_rN(void)
554
{
555
    env->gregs[PARAM1] = T0;
556
    RETURN();
557
}
558

    
559
void OPPROTO op_movl_T1_rN(void)
560
{
561
    env->gregs[PARAM1] = T1;
562
    RETURN();
563
}
564

    
565
void OPPROTO op_movb_rN_T0(void)
566
{
567
    T0 = (int32_t) (int8_t) (env->gregs[PARAM1] & 0xff);
568
    RETURN();
569
}
570

    
571
void OPPROTO op_movub_rN_T0(void)
572
{
573
    T0 = env->gregs[PARAM1] & 0xff;
574
    RETURN();
575
}
576

    
577
void OPPROTO op_movw_rN_T0(void)
578
{
579
    T0 = (int32_t) (int16_t) (env->gregs[PARAM1] & 0xffff);
580
    RETURN();
581
}
582

    
583
void OPPROTO op_movuw_rN_T0(void)
584
{
585
    T0 = env->gregs[PARAM1] & 0xffff;
586
    RETURN();
587
}
588

    
589
void OPPROTO op_movl_rN_T0(void)
590
{
591
    T0 = env->gregs[PARAM1];
592
    RETURN();
593
}
594

    
595
void OPPROTO op_movb_rN_T1(void)
596
{
597
    T1 = (int32_t) (int8_t) (env->gregs[PARAM1] & 0xff);
598
    RETURN();
599
}
600

    
601
void OPPROTO op_movub_rN_T1(void)
602
{
603
    T1 = env->gregs[PARAM1] & 0xff;
604
    RETURN();
605
}
606

    
607
void OPPROTO op_movw_rN_T1(void)
608
{
609
    T1 = (int32_t) (int16_t) (env->gregs[PARAM1] & 0xffff);
610
    RETURN();
611
}
612

    
613
void OPPROTO op_movuw_rN_T1(void)
614
{
615
    T1 = env->gregs[PARAM1] & 0xffff;
616
    RETURN();
617
}
618

    
619
void OPPROTO op_movl_rN_T1(void)
620
{
621
    T1 = env->gregs[PARAM1];
622
    RETURN();
623
}
624

    
625
void OPPROTO op_movl_imm_rN(void)
626
{
627
    env->gregs[PARAM2] = PARAM1;
628
    RETURN();
629
}
630

    
631
void OPPROTO op_fmov_frN_FT0(void)
632
{
633
    FT0 = env->fregs[PARAM1];
634
    RETURN();
635
}
636

    
637
void OPPROTO op_fmov_drN_DT0(void)
638
{
639
    CPU_DoubleU d;
640

    
641
    d.l.upper = *(uint32_t *)&env->fregs[PARAM1];
642
    d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1];
643
    DT0 = d.d;
644
    RETURN();
645
}
646

    
647
void OPPROTO op_fmov_frN_FT1(void)
648
{
649
    FT1 = env->fregs[PARAM1];
650
    RETURN();
651
}
652

    
653
void OPPROTO op_fmov_drN_DT1(void)
654
{
655
    CPU_DoubleU d;
656

    
657
    d.l.upper = *(uint32_t *)&env->fregs[PARAM1];
658
    d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1];
659
    DT1 = d.d;
660
    RETURN();
661
}
662

    
663
void OPPROTO op_fmov_FT0_frN(void)
664
{
665
    env->fregs[PARAM1] = FT0;
666
    RETURN();
667
}
668

    
669
void OPPROTO op_fmov_DT0_drN(void)
670
{
671
    CPU_DoubleU d;
672

    
673
    d.d = DT0;
674
    *(uint32_t *)&env->fregs[PARAM1] = d.l.upper;
675
    *(uint32_t *)&env->fregs[PARAM1 + 1] = d.l.lower;
676
    RETURN();
677
}
678

    
679
void OPPROTO op_fadd_FT(void)
680
{
681
    FT0 = float32_add(FT0, FT1, &env->fp_status);
682
    RETURN();
683
}
684

    
685
void OPPROTO op_fadd_DT(void)
686
{
687
    DT0 = float64_add(DT0, DT1, &env->fp_status);
688
    RETURN();
689
}
690

    
691
void OPPROTO op_fsub_FT(void)
692
{
693
    FT0 = float32_sub(FT0, FT1, &env->fp_status);
694
    RETURN();
695
}
696

    
697
void OPPROTO op_fsub_DT(void)
698
{
699
    DT0 = float64_sub(DT0, DT1, &env->fp_status);
700
    RETURN();
701
}
702

    
703
void OPPROTO op_fmul_FT(void)
704
{
705
    FT0 = float32_mul(FT0, FT1, &env->fp_status);
706
    RETURN();
707
}
708

    
709
void OPPROTO op_fmul_DT(void)
710
{
711
    DT0 = float64_mul(DT0, DT1, &env->fp_status);
712
    RETURN();
713
}
714

    
715
void OPPROTO op_fdiv_FT(void)
716
{
717
    FT0 = float32_div(FT0, FT1, &env->fp_status);
718
    RETURN();
719
}
720

    
721
void OPPROTO op_fdiv_DT(void)
722
{
723
    DT0 = float64_div(DT0, DT1, &env->fp_status);
724
    RETURN();
725
}
726

    
727
void OPPROTO op_fcmp_eq_FT(void)
728
{
729
    cond_t(float32_compare(FT0, FT1, &env->fp_status) == 0);
730
    RETURN();
731
}
732

    
733
void OPPROTO op_fcmp_eq_DT(void)
734
{
735
    cond_t(float64_compare(DT0, DT1, &env->fp_status) == 0);
736
    RETURN();
737
}
738

    
739
void OPPROTO op_fcmp_gt_FT(void)
740
{
741
    cond_t(float32_compare(FT0, FT1, &env->fp_status) == 1);
742
    RETURN();
743
}
744

    
745
void OPPROTO op_fcmp_gt_DT(void)
746
{
747
    cond_t(float64_compare(DT0, DT1, &env->fp_status) == 1);
748
    RETURN();
749
}
750

    
751
void OPPROTO op_float_FT(void)
752
{
753
    FT0 = int32_to_float32(env->fpul, &env->fp_status);
754
    RETURN();
755
}
756

    
757
void OPPROTO op_float_DT(void)
758
{
759
    DT0 = int32_to_float64(env->fpul, &env->fp_status);
760
    RETURN();
761
}
762

    
763
void OPPROTO op_ftrc_FT(void)
764
{
765
    env->fpul = float32_to_int32_round_to_zero(FT0, &env->fp_status);
766
    RETURN();
767
}
768

    
769
void OPPROTO op_ftrc_DT(void)
770
{
771
    env->fpul = float64_to_int32_round_to_zero(DT0, &env->fp_status);
772
    RETURN();
773
}
774

    
775
void OPPROTO op_fneg_frN(void)
776
{
777
    env->fregs[PARAM1] = float32_chs(env->fregs[PARAM1]);
778
    RETURN();
779
}
780

    
781
void OPPROTO op_fabs_FT(void)
782
{
783
    FT0 = float32_abs(FT0);
784
    RETURN();
785
}
786

    
787
void OPPROTO op_fabs_DT(void)
788
{
789
    DT0 = float64_abs(DT0);
790
    RETURN();
791
}
792

    
793
void OPPROTO op_fcnvsd_FT_DT(void)
794
{
795
    DT0 = float32_to_float64(FT0, &env->fp_status);
796
    RETURN();
797
}
798

    
799
void OPPROTO op_fcnvds_DT_FT(void)
800
{
801
    FT0 = float64_to_float32(DT0, &env->fp_status);
802
    RETURN();
803
}
804

    
805
void OPPROTO op_fsqrt_FT(void)
806
{
807
    FT0 = float32_sqrt(FT0, &env->fp_status);
808
    RETURN();
809
}
810

    
811
void OPPROTO op_fsqrt_DT(void)
812
{
813
    DT0 = float64_sqrt(DT0, &env->fp_status);
814
    RETURN();
815
}
816

    
817
void OPPROTO op_fmov_T0_frN(void)
818
{
819
    *(uint32_t *)&env->fregs[PARAM1] = T0;
820
    RETURN();
821
}
822

    
823
void OPPROTO op_dec1_rN(void)
824
{
825
    env->gregs[PARAM1] -= 1;
826
    RETURN();
827
}
828

    
829
void OPPROTO op_dec2_rN(void)
830
{
831
    env->gregs[PARAM1] -= 2;
832
    RETURN();
833
}
834

    
835
void OPPROTO op_dec4_rN(void)
836
{
837
    env->gregs[PARAM1] -= 4;
838
    RETURN();
839
}
840

    
841
void OPPROTO op_dec8_rN(void)
842
{
843
    env->gregs[PARAM1] -= 8;
844
    RETURN();
845
}
846

    
847
void OPPROTO op_inc1_rN(void)
848
{
849
    env->gregs[PARAM1] += 1;
850
    RETURN();
851
}
852

    
853
void OPPROTO op_inc2_rN(void)
854
{
855
    env->gregs[PARAM1] += 2;
856
    RETURN();
857
}
858

    
859
void OPPROTO op_inc4_rN(void)
860
{
861
    env->gregs[PARAM1] += 4;
862
    RETURN();
863
}
864

    
865
void OPPROTO op_inc8_rN(void)
866
{
867
    env->gregs[PARAM1] += 8;
868
    RETURN();
869
}
870

    
871
void OPPROTO op_add_T0_rN(void)
872
{
873
    env->gregs[PARAM1] += T0;
874
    RETURN();
875
}
876

    
877
void OPPROTO op_sub_T0_rN(void)
878
{
879
    env->gregs[PARAM1] -= T0;
880
    RETURN();
881
}
882

    
883
void OPPROTO op_and_T0_rN(void)
884
{
885
    env->gregs[PARAM1] &= T0;
886
    RETURN();
887
}
888

    
889
void OPPROTO op_or_T0_rN(void)
890
{
891
    env->gregs[PARAM1] |= T0;
892
    RETURN();
893
}
894

    
895
void OPPROTO op_xor_T0_rN(void)
896
{
897
    env->gregs[PARAM1] ^= T0;
898
    RETURN();
899
}
900

    
901
void OPPROTO op_add_rN_T0(void)
902
{
903
    T0 += env->gregs[PARAM1];
904
    RETURN();
905
}
906

    
907
void OPPROTO op_add_rN_T1(void)
908
{
909
    T1 += env->gregs[PARAM1];
910
    RETURN();
911
}
912

    
913
void OPPROTO op_add_imm_rN(void)
914
{
915
    env->gregs[PARAM2] += PARAM1;
916
    RETURN();
917
}
918

    
919
void OPPROTO op_and_imm_rN(void)
920
{
921
    env->gregs[PARAM2] &= PARAM1;
922
    RETURN();
923
}
924

    
925
void OPPROTO op_or_imm_rN(void)
926
{
927
    env->gregs[PARAM2] |= PARAM1;
928
    RETURN();
929
}
930

    
931
void OPPROTO op_xor_imm_rN(void)
932
{
933
    env->gregs[PARAM2] ^= PARAM1;
934
    RETURN();
935
}
936

    
937
void OPPROTO op_dt_rN(void)
938
{
939
    cond_t((--env->gregs[PARAM1]) == 0);
940
    RETURN();
941
}
942

    
943
void OPPROTO op_tst_imm_rN(void)
944
{
945
    cond_t((env->gregs[PARAM2] & PARAM1) == 0);
946
    RETURN();
947
}
948

    
949
void OPPROTO op_movl_fpul_FT0(void)
950
{
951
    FT0 = *(float32 *)&env->fpul;
952
    RETURN();
953
}
954

    
955
void OPPROTO op_movl_FT0_fpul(void)
956
{
957
    *(float32 *)&env->fpul = FT0;
958
    RETURN();
959
}
960

    
961
void OPPROTO op_movl_imm_PC(void)
962
{
963
    env->pc = PARAM1;
964
    RETURN();
965
}
966

    
967
void OPPROTO op_jT(void)
968
{
969
    if (env->sr & SR_T)
970
        GOTO_LABEL_PARAM(1);
971
    RETURN();
972
}
973

    
974
void OPPROTO op_jdelayed(void)
975
{
976
    if (env->flags & DELAY_SLOT_TRUE) {
977
        env->flags &= ~DELAY_SLOT_TRUE;
978
        GOTO_LABEL_PARAM(1);
979
    }
980
    RETURN();
981
}
982

    
983
void OPPROTO op_movl_delayed_pc_PC(void)
984
{
985
    env->pc = env->delayed_pc;
986
    RETURN();
987
}
988

    
989
void OPPROTO op_addl_GBR_T0(void)
990
{
991
    T0 += env->gbr;
992
    RETURN();
993
}
994

    
995
void OPPROTO op_and_imm_T0(void)
996
{
997
    T0 &= PARAM1;
998
    RETURN();
999
}
1000

    
1001
void OPPROTO op_or_imm_T0(void)
1002
{
1003
    T0 |= PARAM1;
1004
    RETURN();
1005
}
1006

    
1007
void OPPROTO op_xor_imm_T0(void)
1008
{
1009
    T0 ^= PARAM1;
1010
    RETURN();
1011
}
1012

    
1013
void OPPROTO op_tst_imm_T0(void)
1014
{
1015
    cond_t((T0 & PARAM1) == 0);
1016
    RETURN();
1017
}
1018

    
1019
void OPPROTO op_raise_illegal_instruction(void)
1020
{
1021
    env->exception_index = 0x180;
1022
    do_raise_exception();
1023
    RETURN();
1024
}
1025

    
1026
void OPPROTO op_raise_slot_illegal_instruction(void)
1027
{
1028
    env->exception_index = 0x1a0;
1029
    do_raise_exception();
1030
    RETURN();
1031
}
1032

    
1033
void OPPROTO op_debug(void)
1034
{
1035
    env->exception_index = EXCP_DEBUG;
1036
    cpu_loop_exit();
1037
}
1038

    
1039
void OPPROTO op_sleep(void)
1040
{
1041
    env->halted = 1;
1042
    env->exception_index = EXCP_HLT;
1043
    cpu_loop_exit();
1044
}
1045

    
1046
/* Load and store */
1047
#define MEMSUFFIX _raw
1048
#include "op_mem.c"
1049
#undef MEMSUFFIX
1050
#if !defined(CONFIG_USER_ONLY)
1051
#define MEMSUFFIX _user
1052
#include "op_mem.c"
1053
#undef MEMSUFFIX
1054

    
1055
#define MEMSUFFIX _kernel
1056
#include "op_mem.c"
1057
#undef MEMSUFFIX
1058
#endif