Statistics
| Branch: | Revision:

root / target-sh4 / op.c @ 8f99cc6c

History | View | Annotate | Download (15.2 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_ldcl_rMplus_rN_bank(void)
405
{
406
    env->gregs[PARAM2] = env->gregs[PARAM1];
407
    env->gregs[PARAM1] += 4;
408
    RETURN();
409
}
410

    
411
void OPPROTO op_ldc_T0_sr(void)
412
{
413
    env->sr = T0 & 0x700083f3;
414
    RETURN();
415
}
416

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

    
423
#define LDSTOPS(target,load,store) \
424
void OPPROTO op_##load##_T0_##target (void) \
425
{ env ->target = T0;   RETURN(); \
426
} \
427
void OPPROTO op_##store##_##target##_T0 (void) \
428
{ T0 = env->target;   RETURN(); \
429
} \
430

    
431
    LDSTOPS(gbr, ldc, stc)
432
    LDSTOPS(vbr, ldc, stc)
433
    LDSTOPS(ssr, ldc, stc)
434
    LDSTOPS(spc, ldc, stc)
435
    LDSTOPS(sgr, ldc, stc)
436
    LDSTOPS(dbr, ldc, stc)
437
    LDSTOPS(mach, lds, sts)
438
    LDSTOPS(macl, lds, sts)
439
    LDSTOPS(pr, lds, sts)
440
    LDSTOPS(fpul, lds, sts)
441

    
442
void OPPROTO op_lds_T0_fpscr(void)
443
{
444
    env->fpscr = T0 & 0x003fffff;
445
    env->fp_status.float_rounding_mode = T0 & 0x01 ?
446
      float_round_to_zero : float_round_nearest_even;
447

    
448
    RETURN();
449
}
450

    
451
void OPPROTO op_sts_fpscr_T0(void)
452
{
453
    T0 = env->fpscr & 0x003fffff;
454
    RETURN();
455
}
456

    
457
void OPPROTO op_movt_rN(void)
458
{
459
    env->gregs[PARAM1] = env->sr & SR_T;
460
    RETURN();
461
}
462

    
463
void OPPROTO op_rotcl_Rn(void)
464
{
465
    helper_rotcl(&env->gregs[PARAM1]);
466
    RETURN();
467
}
468

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

    
475
void OPPROTO op_rotl_Rn(void)
476
{
477
    cond_t(env->gregs[PARAM1] & 0x80000000);
478
    env->gregs[PARAM1] = (env->gregs[PARAM1] << 1) | (env->sr & SR_T);
479
    RETURN();
480
}
481

    
482
void OPPROTO op_rotr_Rn(void)
483
{
484
    cond_t(env->gregs[PARAM1] & 1);
485
    env->gregs[PARAM1] = (env->gregs[PARAM1] >> 1) |
486
        ((env->sr & SR_T) ? 0x80000000 : 0);
487
    RETURN();
488
}
489

    
490
void OPPROTO op_shal_Rn(void)
491
{
492
    cond_t(env->gregs[PARAM1] & 0x80000000);
493
    env->gregs[PARAM1] <<= 1;
494
    RETURN();
495
}
496

    
497
void OPPROTO op_shar_Rn(void)
498
{
499
    cond_t(env->gregs[PARAM1] & 1);
500
    *(int32_t *)&env->gregs[PARAM1] >>= 1;
501
    RETURN();
502
}
503

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

    
511
void OPPROTO op_shll2_Rn(void)
512
{
513
    env->gregs[PARAM1] <<= 2;
514
    RETURN();
515
}
516

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

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

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

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

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

    
547
void OPPROTO op_fmov_frN_FT0(void)
548
{
549
    FT0 = env->fregs[PARAM1];
550
    RETURN();
551
}
552

    
553
void OPPROTO op_fmov_drN_DT0(void)
554
{
555
    CPU_DoubleU d;
556

    
557
    d.l.upper = *(uint32_t *)&env->fregs[PARAM1];
558
    d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1];
559
    DT0 = d.d;
560
    RETURN();
561
}
562

    
563
void OPPROTO op_fmov_frN_FT1(void)
564
{
565
    FT1 = env->fregs[PARAM1];
566
    RETURN();
567
}
568

    
569
void OPPROTO op_fmov_drN_DT1(void)
570
{
571
    CPU_DoubleU d;
572

    
573
    d.l.upper = *(uint32_t *)&env->fregs[PARAM1];
574
    d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1];
575
    DT1 = d.d;
576
    RETURN();
577
}
578

    
579
void OPPROTO op_fmov_FT0_frN(void)
580
{
581
    env->fregs[PARAM1] = FT0;
582
    RETURN();
583
}
584

    
585
void OPPROTO op_fmov_DT0_drN(void)
586
{
587
    CPU_DoubleU d;
588

    
589
    d.d = DT0;
590
    *(uint32_t *)&env->fregs[PARAM1] = d.l.upper;
591
    *(uint32_t *)&env->fregs[PARAM1 + 1] = d.l.lower;
592
    RETURN();
593
}
594

    
595
void OPPROTO op_fadd_FT(void)
596
{
597
    FT0 = float32_add(FT0, FT1, &env->fp_status);
598
    RETURN();
599
}
600

    
601
void OPPROTO op_fadd_DT(void)
602
{
603
    DT0 = float64_add(DT0, DT1, &env->fp_status);
604
    RETURN();
605
}
606

    
607
void OPPROTO op_fsub_FT(void)
608
{
609
    FT0 = float32_sub(FT0, FT1, &env->fp_status);
610
    RETURN();
611
}
612

    
613
void OPPROTO op_fsub_DT(void)
614
{
615
    DT0 = float64_sub(DT0, DT1, &env->fp_status);
616
    RETURN();
617
}
618

    
619
void OPPROTO op_fmul_FT(void)
620
{
621
    FT0 = float32_mul(FT0, FT1, &env->fp_status);
622
    RETURN();
623
}
624

    
625
void OPPROTO op_fmul_DT(void)
626
{
627
    DT0 = float64_mul(DT0, DT1, &env->fp_status);
628
    RETURN();
629
}
630

    
631
void OPPROTO op_fdiv_FT(void)
632
{
633
    FT0 = float32_div(FT0, FT1, &env->fp_status);
634
    RETURN();
635
}
636

    
637
void OPPROTO op_fdiv_DT(void)
638
{
639
    DT0 = float64_div(DT0, DT1, &env->fp_status);
640
    RETURN();
641
}
642

    
643
void OPPROTO op_fcmp_eq_FT(void)
644
{
645
    cond_t(float32_compare(FT0, FT1, &env->fp_status) == 0);
646
    RETURN();
647
}
648

    
649
void OPPROTO op_fcmp_eq_DT(void)
650
{
651
    cond_t(float64_compare(DT0, DT1, &env->fp_status) == 0);
652
    RETURN();
653
}
654

    
655
void OPPROTO op_fcmp_gt_FT(void)
656
{
657
    cond_t(float32_compare(FT0, FT1, &env->fp_status) == 1);
658
    RETURN();
659
}
660

    
661
void OPPROTO op_fcmp_gt_DT(void)
662
{
663
    cond_t(float64_compare(DT0, DT1, &env->fp_status) == 1);
664
    RETURN();
665
}
666

    
667
void OPPROTO op_float_FT(void)
668
{
669
    FT0 = int32_to_float32(env->fpul, &env->fp_status);
670
    RETURN();
671
}
672

    
673
void OPPROTO op_float_DT(void)
674
{
675
    DT0 = int32_to_float64(env->fpul, &env->fp_status);
676
    RETURN();
677
}
678

    
679
void OPPROTO op_ftrc_FT(void)
680
{
681
    env->fpul = float32_to_int32_round_to_zero(FT0, &env->fp_status);
682
    RETURN();
683
}
684

    
685
void OPPROTO op_ftrc_DT(void)
686
{
687
    env->fpul = float64_to_int32_round_to_zero(DT0, &env->fp_status);
688
    RETURN();
689
}
690

    
691
void OPPROTO op_fneg_frN(void)
692
{
693
    env->fregs[PARAM1] = float32_chs(env->fregs[PARAM1]);
694
    RETURN();
695
}
696

    
697
void OPPROTO op_fabs_FT(void)
698
{
699
    FT0 = float32_abs(FT0);
700
    RETURN();
701
}
702

    
703
void OPPROTO op_fabs_DT(void)
704
{
705
    DT0 = float64_abs(DT0);
706
    RETURN();
707
}
708

    
709
void OPPROTO op_fcnvsd_FT_DT(void)
710
{
711
    DT0 = float32_to_float64(FT0, &env->fp_status);
712
    RETURN();
713
}
714

    
715
void OPPROTO op_fcnvds_DT_FT(void)
716
{
717
    FT0 = float64_to_float32(DT0, &env->fp_status);
718
    RETURN();
719
}
720

    
721
void OPPROTO op_fsqrt_FT(void)
722
{
723
    FT0 = float32_sqrt(FT0, &env->fp_status);
724
    RETURN();
725
}
726

    
727
void OPPROTO op_fsqrt_DT(void)
728
{
729
    DT0 = float64_sqrt(DT0, &env->fp_status);
730
    RETURN();
731
}
732

    
733
void OPPROTO op_fmov_T0_frN(void)
734
{
735
    *(uint32_t *)&env->fregs[PARAM1] = T0;
736
    RETURN();
737
}
738

    
739
void OPPROTO op_dec1_rN(void)
740
{
741
    env->gregs[PARAM1] -= 1;
742
    RETURN();
743
}
744

    
745
void OPPROTO op_dec2_rN(void)
746
{
747
    env->gregs[PARAM1] -= 2;
748
    RETURN();
749
}
750

    
751
void OPPROTO op_dec4_rN(void)
752
{
753
    env->gregs[PARAM1] -= 4;
754
    RETURN();
755
}
756

    
757
void OPPROTO op_dec8_rN(void)
758
{
759
    env->gregs[PARAM1] -= 8;
760
    RETURN();
761
}
762

    
763
void OPPROTO op_inc1_rN(void)
764
{
765
    env->gregs[PARAM1] += 1;
766
    RETURN();
767
}
768

    
769
void OPPROTO op_inc2_rN(void)
770
{
771
    env->gregs[PARAM1] += 2;
772
    RETURN();
773
}
774

    
775
void OPPROTO op_inc4_rN(void)
776
{
777
    env->gregs[PARAM1] += 4;
778
    RETURN();
779
}
780

    
781
void OPPROTO op_inc8_rN(void)
782
{
783
    env->gregs[PARAM1] += 8;
784
    RETURN();
785
}
786

    
787
void OPPROTO op_add_T0_rN(void)
788
{
789
    env->gregs[PARAM1] += T0;
790
    RETURN();
791
}
792

    
793
void OPPROTO op_sub_T0_rN(void)
794
{
795
    env->gregs[PARAM1] -= T0;
796
    RETURN();
797
}
798

    
799
void OPPROTO op_and_T0_rN(void)
800
{
801
    env->gregs[PARAM1] &= T0;
802
    RETURN();
803
}
804

    
805
void OPPROTO op_or_T0_rN(void)
806
{
807
    env->gregs[PARAM1] |= T0;
808
    RETURN();
809
}
810

    
811
void OPPROTO op_xor_T0_rN(void)
812
{
813
    env->gregs[PARAM1] ^= T0;
814
    RETURN();
815
}
816

    
817
void OPPROTO op_add_rN_T0(void)
818
{
819
    T0 += env->gregs[PARAM1];
820
    RETURN();
821
}
822

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

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

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

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

    
847
void OPPROTO op_xor_imm_rN(void)
848
{
849
    env->gregs[PARAM2] ^= PARAM1;
850
    RETURN();
851
}
852

    
853
void OPPROTO op_dt_rN(void)
854
{
855
    cond_t((--env->gregs[PARAM1]) == 0);
856
    RETURN();
857
}
858

    
859
void OPPROTO op_tst_imm_rN(void)
860
{
861
    cond_t((env->gregs[PARAM2] & PARAM1) == 0);
862
    RETURN();
863
}
864

    
865
void OPPROTO op_movl_fpul_FT0(void)
866
{
867
    FT0 = *(float32 *)&env->fpul;
868
    RETURN();
869
}
870

    
871
void OPPROTO op_movl_FT0_fpul(void)
872
{
873
    *(float32 *)&env->fpul = FT0;
874
    RETURN();
875
}
876

    
877
void OPPROTO op_movl_imm_PC(void)
878
{
879
    env->pc = PARAM1;
880
    RETURN();
881
}
882

    
883
void OPPROTO op_jT(void)
884
{
885
    if (env->sr & SR_T)
886
        GOTO_LABEL_PARAM(1);
887
    RETURN();
888
}
889

    
890
void OPPROTO op_jdelayed(void)
891
{
892
    if (env->flags & DELAY_SLOT_TRUE) {
893
        env->flags &= ~DELAY_SLOT_TRUE;
894
        GOTO_LABEL_PARAM(1);
895
    }
896
    RETURN();
897
}
898

    
899
void OPPROTO op_movl_delayed_pc_PC(void)
900
{
901
    env->pc = env->delayed_pc;
902
    RETURN();
903
}
904

    
905
void OPPROTO op_addl_GBR_T0(void)
906
{
907
    T0 += env->gbr;
908
    RETURN();
909
}
910

    
911
void OPPROTO op_and_imm_T0(void)
912
{
913
    T0 &= PARAM1;
914
    RETURN();
915
}
916

    
917
void OPPROTO op_or_imm_T0(void)
918
{
919
    T0 |= PARAM1;
920
    RETURN();
921
}
922

    
923
void OPPROTO op_xor_imm_T0(void)
924
{
925
    T0 ^= PARAM1;
926
    RETURN();
927
}
928

    
929
void OPPROTO op_tst_imm_T0(void)
930
{
931
    cond_t((T0 & PARAM1) == 0);
932
    RETURN();
933
}
934

    
935
void OPPROTO op_raise_illegal_instruction(void)
936
{
937
    env->exception_index = 0x180;
938
    do_raise_exception();
939
    RETURN();
940
}
941

    
942
void OPPROTO op_raise_slot_illegal_instruction(void)
943
{
944
    env->exception_index = 0x1a0;
945
    do_raise_exception();
946
    RETURN();
947
}
948

    
949
void OPPROTO op_debug(void)
950
{
951
    env->exception_index = EXCP_DEBUG;
952
    cpu_loop_exit();
953
}
954

    
955
void OPPROTO op_sleep(void)
956
{
957
    env->halted = 1;
958
    env->exception_index = EXCP_HLT;
959
    cpu_loop_exit();
960
}
961

    
962
/* Load and store */
963
#define MEMSUFFIX _raw
964
#include "op_mem.c"
965
#undef MEMSUFFIX
966
#if !defined(CONFIG_USER_ONLY)
967
#define MEMSUFFIX _user
968
#include "op_mem.c"
969
#undef MEMSUFFIX
970

    
971
#define MEMSUFFIX _kernel
972
#include "op_mem.c"
973
#undef MEMSUFFIX
974
#endif