Statistics
| Branch: | Revision:

root / target-sh4 / op.c @ 6f551262

History | View | Annotate | Download (17.1 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_movl_imm_T0(void)
41
{
42
    T0 = (uint32_t) PARAM1;
43
    RETURN();
44
}
45

    
46
void OPPROTO op_movl_imm_T1(void)
47
{
48
    T1 = (uint32_t) PARAM1;
49
    RETURN();
50
}
51

    
52
void OPPROTO op_cmp_eq_imm_T0(void)
53
{
54
    cond_t((int32_t) T0 == (int32_t) PARAM1);
55
    RETURN();
56
}
57

    
58
void OPPROTO op_cmd_eq_T0_T1(void)
59
{
60
    cond_t(T0 == T1);
61
    RETURN();
62
}
63

    
64
void OPPROTO op_cmd_hs_T0_T1(void)
65
{
66
    cond_t((uint32_t) T0 <= (uint32_t) T1);
67
    RETURN();
68
}
69

    
70
void OPPROTO op_cmd_ge_T0_T1(void)
71
{
72
    cond_t((int32_t) T0 <= (int32_t) T1);
73
    RETURN();
74
}
75

    
76
void OPPROTO op_cmd_hi_T0_T1(void)
77
{
78
    cond_t((uint32_t) T0 < (uint32_t) T1);
79
    RETURN();
80
}
81

    
82
void OPPROTO op_cmd_gt_T0_T1(void)
83
{
84
    cond_t((int32_t) T0 < (int32_t) T1);
85
    RETURN();
86
}
87

    
88
void OPPROTO op_not_T0(void)
89
{
90
    T0 = ~T0;
91
    RETURN();
92
}
93

    
94
void OPPROTO op_bf_s(void)
95
{
96
    env->delayed_pc = PARAM1;
97
    if (!(env->sr & SR_T)) {
98
        env->flags |= DELAY_SLOT_TRUE;
99
    }
100
    RETURN();
101
}
102

    
103
void OPPROTO op_bt_s(void)
104
{
105
    env->delayed_pc = PARAM1;
106
    if (env->sr & SR_T) {
107
        env->flags |= DELAY_SLOT_TRUE;
108
    }
109
    RETURN();
110
}
111

    
112
void OPPROTO op_store_flags(void)
113
{
114
    env->flags &= DELAY_SLOT_TRUE;
115
    env->flags |= PARAM1;
116
    RETURN();
117
}
118

    
119
void OPPROTO op_bra(void)
120
{
121
    env->delayed_pc = PARAM1;
122
    RETURN();
123
}
124

    
125
void OPPROTO op_braf_T0(void)
126
{
127
    env->delayed_pc = PARAM1 + T0;
128
    RETURN();
129
}
130

    
131
void OPPROTO op_bsr(void)
132
{
133
    env->pr = PARAM1;
134
    env->delayed_pc = PARAM2;
135
    RETURN();
136
}
137

    
138
void OPPROTO op_bsrf_T0(void)
139
{
140
    env->pr = PARAM1;
141
    env->delayed_pc = PARAM1 + T0;
142
    RETURN();
143
}
144

    
145
void OPPROTO op_jsr_T0(void)
146
{
147
    env->pr = PARAM1;
148
    env->delayed_pc = T0;
149
    RETURN();
150
}
151

    
152
void OPPROTO op_rts(void)
153
{
154
    env->delayed_pc = env->pr;
155
    RETURN();
156
}
157

    
158
void OPPROTO op_addl_imm_T0(void)
159
{
160
    T0 += PARAM1;
161
    RETURN();
162
}
163

    
164
void OPPROTO op_addl_imm_T1(void)
165
{
166
    T1 += PARAM1;
167
    RETURN();
168
}
169

    
170
void OPPROTO op_clrmac(void)
171
{
172
    env->mach = env->macl = 0;
173
    RETURN();
174
}
175

    
176
void OPPROTO op_clrs(void)
177
{
178
    env->sr &= ~SR_S;
179
    RETURN();
180
}
181

    
182
void OPPROTO op_clrt(void)
183
{
184
    env->sr &= ~SR_T;
185
    RETURN();
186
}
187

    
188
void OPPROTO op_sets(void)
189
{
190
    env->sr |= SR_S;
191
    RETURN();
192
}
193

    
194
void OPPROTO op_sett(void)
195
{
196
    env->sr |= SR_T;
197
    RETURN();
198
}
199

    
200
void OPPROTO op_frchg(void)
201
{
202
    env->fpscr ^= FPSCR_FR;
203
    RETURN();
204
}
205

    
206
void OPPROTO op_fschg(void)
207
{
208
    env->fpscr ^= FPSCR_SZ;
209
    RETURN();
210
}
211

    
212
void OPPROTO op_rte(void)
213
{
214
    env->sr = env->ssr;
215
    env->delayed_pc = env->spc;
216
    RETURN();
217
}
218

    
219
void OPPROTO op_swapb_T0(void)
220
{
221
    T0 = (T0 & 0xffff0000) | ((T0 & 0xff) << 8) | ((T0 >> 8) & 0xff);
222
    RETURN();
223
}
224

    
225
void OPPROTO op_swapw_T0(void)
226
{
227
    T0 = ((T0 & 0xffff) << 16) | ((T0 >> 16) & 0xffff);
228
    RETURN();
229
}
230

    
231
void OPPROTO op_xtrct_T0_T1(void)
232
{
233
    T1 = ((T0 & 0xffff) << 16) | ((T1 >> 16) & 0xffff);
234
    RETURN();
235
}
236

    
237
void OPPROTO op_add_T0_T1(void)
238
{
239
    T1 += T0;
240
    RETURN();
241
}
242

    
243
void OPPROTO op_addc_T0_T1(void)
244
{
245
    helper_addc_T0_T1();
246
    RETURN();
247
}
248

    
249
void OPPROTO op_addv_T0_T1(void)
250
{
251
    helper_addv_T0_T1();
252
    RETURN();
253
}
254

    
255
void OPPROTO op_cmp_eq_T0_T1(void)
256
{
257
    cond_t(T1 == T0);
258
    RETURN();
259
}
260

    
261
void OPPROTO op_cmp_ge_T0_T1(void)
262
{
263
    cond_t((int32_t) T1 >= (int32_t) T0);
264
    RETURN();
265
}
266

    
267
void OPPROTO op_cmp_gt_T0_T1(void)
268
{
269
    cond_t((int32_t) T1 > (int32_t) T0);
270
    RETURN();
271
}
272

    
273
void OPPROTO op_cmp_hi_T0_T1(void)
274
{
275
    cond_t((uint32_t) T1 > (uint32_t) T0);
276
    RETURN();
277
}
278

    
279
void OPPROTO op_cmp_hs_T0_T1(void)
280
{
281
    cond_t((uint32_t) T1 >= (uint32_t) T0);
282
    RETURN();
283
}
284

    
285
void OPPROTO op_cmp_str_T0_T1(void)
286
{
287
    cond_t((T0 & 0x000000ff) == (T1 & 0x000000ff) ||
288
           (T0 & 0x0000ff00) == (T1 & 0x0000ff00) ||
289
           (T0 & 0x00ff0000) == (T1 & 0x00ff0000) ||
290
           (T0 & 0xff000000) == (T1 & 0xff000000));
291
    RETURN();
292
}
293

    
294
void OPPROTO op_tst_T0_T1(void)
295
{
296
    cond_t((T1 & T0) == 0);
297
    RETURN();
298
}
299

    
300
void OPPROTO op_div0s_T0_T1(void)
301
{
302
    if (T1 & 0x80000000)
303
        env->sr |= SR_Q;
304
    else
305
        env->sr &= ~SR_Q;
306
    if (T0 & 0x80000000)
307
        env->sr |= SR_M;
308
    else
309
        env->sr &= ~SR_M;
310
    cond_t((T1 ^ T0) & 0x80000000);
311
    RETURN();
312
}
313

    
314
void OPPROTO op_div0u(void)
315
{
316
    env->sr &= ~(SR_M | SR_Q | SR_T);
317
    RETURN();
318
}
319

    
320
void OPPROTO op_div1_T0_T1(void)
321
{
322
    helper_div1_T0_T1();
323
    RETURN();
324
}
325

    
326
void OPPROTO op_dmulsl_T0_T1(void)
327
{
328
    helper_dmulsl_T0_T1();
329
    RETURN();
330
}
331

    
332
void OPPROTO op_dmulul_T0_T1(void)
333
{
334
    helper_dmulul_T0_T1();
335
    RETURN();
336
}
337

    
338
void OPPROTO op_macl_T0_T1(void)
339
{
340
    helper_macl_T0_T1();
341
    RETURN();
342
}
343

    
344
void OPPROTO op_macw_T0_T1(void)
345
{
346
    helper_macw_T0_T1();
347
    RETURN();
348
}
349

    
350
void OPPROTO op_mull_T0_T1(void)
351
{
352
    env->macl = (T0 * T1) & 0xffffffff;
353
    RETURN();
354
}
355

    
356
void OPPROTO op_mulsw_T0_T1(void)
357
{
358
    env->macl = (int32_t)(int16_t) T0 *(int32_t)(int16_t) T1;
359
    RETURN();
360
}
361

    
362
void OPPROTO op_muluw_T0_T1(void)
363
{
364
    env->macl = (uint32_t)(uint16_t) T0 *(uint32_t)(uint16_t) T1;
365
    RETURN();
366
}
367

    
368
void OPPROTO op_neg_T0(void)
369
{
370
    T0 = -T0;
371
    RETURN();
372
}
373

    
374
void OPPROTO op_negc_T0(void)
375
{
376
    helper_negc_T0();
377
    RETURN();
378
}
379

    
380
void OPPROTO op_shad_T0_T1(void)
381
{
382
    if ((T0 & 0x80000000) == 0)
383
        T1 <<= (T0 & 0x1f);
384
    else if ((T0 & 0x1f) == 0)
385
        T1 = (T1 & 0x80000000)? 0xffffffff : 0;
386
    else
387
        T1 = ((int32_t) T1) >> ((~T0 & 0x1f) + 1);
388
    RETURN();
389
}
390

    
391
void OPPROTO op_shld_T0_T1(void)
392
{
393
    if ((T0 & 0x80000000) == 0)
394
        T1 <<= (T0 & 0x1f);
395
    else if ((T0 & 0x1f) == 0)
396
        T1 = 0;
397
    else
398
        T1 = ((uint32_t) T1) >> ((~T0 & 0x1f) + 1);
399
    RETURN();
400
}
401

    
402
void OPPROTO op_subc_T0_T1(void)
403
{
404
    helper_subc_T0_T1();
405
    RETURN();
406
}
407

    
408
void OPPROTO op_subv_T0_T1(void)
409
{
410
    helper_subv_T0_T1();
411
    RETURN();
412
}
413

    
414
void OPPROTO op_trapa(void)
415
{
416
    env->tra = PARAM1 << 2;
417
    env->exception_index = 0x160;
418
    do_raise_exception();
419
    RETURN();
420
}
421

    
422
void OPPROTO op_cmp_pl_T0(void)
423
{
424
    cond_t((int32_t) T0 > 0);
425
    RETURN();
426
}
427

    
428
void OPPROTO op_cmp_pz_T0(void)
429
{
430
    cond_t((int32_t) T0 >= 0);
431
    RETURN();
432
}
433

    
434
void OPPROTO op_jmp_T0(void)
435
{
436
    env->delayed_pc = T0;
437
    RETURN();
438
}
439

    
440
void OPPROTO op_movl_rN_rN(void)
441
{
442
    env->gregs[PARAM2] = env->gregs[PARAM1];
443
    RETURN();
444
}
445

    
446
void OPPROTO op_ldcl_rMplus_rN_bank(void)
447
{
448
    env->gregs[PARAM2] = env->gregs[PARAM1];
449
    env->gregs[PARAM1] += 4;
450
    RETURN();
451
}
452

    
453
void OPPROTO op_ldc_T0_sr(void)
454
{
455
    env->sr = T0 & 0x700083f3;
456
    RETURN();
457
}
458

    
459
void OPPROTO op_stc_sr_T0(void)
460
{
461
    T0 = env->sr;
462
    RETURN();
463
}
464

    
465
#define LDSTOPS(target,load,store) \
466
void OPPROTO op_##load##_T0_##target (void) \
467
{ env ->target = T0;   RETURN(); \
468
} \
469
void OPPROTO op_##store##_##target##_T0 (void) \
470
{ T0 = env->target;   RETURN(); \
471
} \
472

    
473
    LDSTOPS(gbr, ldc, stc)
474
    LDSTOPS(vbr, ldc, stc)
475
    LDSTOPS(ssr, ldc, stc)
476
    LDSTOPS(spc, ldc, stc)
477
    LDSTOPS(sgr, ldc, stc)
478
    LDSTOPS(dbr, ldc, stc)
479
    LDSTOPS(mach, lds, sts)
480
    LDSTOPS(macl, lds, sts)
481
    LDSTOPS(pr, lds, sts)
482
    LDSTOPS(fpul, lds, sts)
483

    
484
void OPPROTO op_lds_T0_fpscr(void)
485
{
486
    env->fpscr = T0 & 0x003fffff;
487
    env->fp_status.float_rounding_mode = T0 & 0x01 ?
488
      float_round_to_zero : float_round_nearest_even;
489

    
490
    RETURN();
491
}
492

    
493
void OPPROTO op_sts_fpscr_T0(void)
494
{
495
    T0 = env->fpscr & 0x003fffff;
496
    RETURN();
497
}
498

    
499
void OPPROTO op_movt_rN(void)
500
{
501
    env->gregs[PARAM1] = env->sr & SR_T;
502
    RETURN();
503
}
504

    
505
void OPPROTO op_rotcl_Rn(void)
506
{
507
    helper_rotcl(&env->gregs[PARAM1]);
508
    RETURN();
509
}
510

    
511
void OPPROTO op_rotcr_Rn(void)
512
{
513
    helper_rotcr(&env->gregs[PARAM1]);
514
    RETURN();
515
}
516

    
517
void OPPROTO op_rotl_Rn(void)
518
{
519
    cond_t(env->gregs[PARAM1] & 0x80000000);
520
    env->gregs[PARAM1] = (env->gregs[PARAM1] << 1) | (env->sr & SR_T);
521
    RETURN();
522
}
523

    
524
void OPPROTO op_rotr_Rn(void)
525
{
526
    cond_t(env->gregs[PARAM1] & 1);
527
    env->gregs[PARAM1] = (env->gregs[PARAM1] >> 1) |
528
        ((env->sr & SR_T) ? 0x80000000 : 0);
529
    RETURN();
530
}
531

    
532
void OPPROTO op_shal_Rn(void)
533
{
534
    cond_t(env->gregs[PARAM1] & 0x80000000);
535
    env->gregs[PARAM1] <<= 1;
536
    RETURN();
537
}
538

    
539
void OPPROTO op_shar_Rn(void)
540
{
541
    cond_t(env->gregs[PARAM1] & 1);
542
    *(int32_t *)&env->gregs[PARAM1] >>= 1;
543
    RETURN();
544
}
545

    
546
void OPPROTO op_shlr_Rn(void)
547
{
548
    cond_t(env->gregs[PARAM1] & 1);
549
    env->gregs[PARAM1] >>= 1;
550
    RETURN();
551
}
552

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

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

    
565
void OPPROTO op_shll16_Rn(void)
566
{
567
    env->gregs[PARAM1] <<= 16;
568
    RETURN();
569
}
570

    
571
void OPPROTO op_shlr2_Rn(void)
572
{
573
    env->gregs[PARAM1] >>= 2;
574
    RETURN();
575
}
576

    
577
void OPPROTO op_shlr8_Rn(void)
578
{
579
    env->gregs[PARAM1] >>= 8;
580
    RETURN();
581
}
582

    
583
void OPPROTO op_shlr16_Rn(void)
584
{
585
    env->gregs[PARAM1] >>= 16;
586
    RETURN();
587
}
588

    
589
void OPPROTO op_tasb_rN(void)
590
{
591
    cond_t(*(int8_t *) env->gregs[PARAM1] == 0);
592
    *(int8_t *) env->gregs[PARAM1] |= 0x80;
593
    RETURN();
594
}
595

    
596
void OPPROTO op_movl_T0_rN(void)
597
{
598
    env->gregs[PARAM1] = T0;
599
    RETURN();
600
}
601

    
602
void OPPROTO op_movl_T1_rN(void)
603
{
604
    env->gregs[PARAM1] = T1;
605
    RETURN();
606
}
607

    
608
void OPPROTO op_movb_rN_T0(void)
609
{
610
    T0 = (int32_t) (int8_t) (env->gregs[PARAM1] & 0xff);
611
    RETURN();
612
}
613

    
614
void OPPROTO op_movub_rN_T0(void)
615
{
616
    T0 = env->gregs[PARAM1] & 0xff;
617
    RETURN();
618
}
619

    
620
void OPPROTO op_movw_rN_T0(void)
621
{
622
    T0 = (int32_t) (int16_t) (env->gregs[PARAM1] & 0xffff);
623
    RETURN();
624
}
625

    
626
void OPPROTO op_movuw_rN_T0(void)
627
{
628
    T0 = env->gregs[PARAM1] & 0xffff;
629
    RETURN();
630
}
631

    
632
void OPPROTO op_movl_rN_T0(void)
633
{
634
    T0 = env->gregs[PARAM1];
635
    RETURN();
636
}
637

    
638
void OPPROTO op_movb_rN_T1(void)
639
{
640
    T1 = (int32_t) (int8_t) (env->gregs[PARAM1] & 0xff);
641
    RETURN();
642
}
643

    
644
void OPPROTO op_movub_rN_T1(void)
645
{
646
    T1 = env->gregs[PARAM1] & 0xff;
647
    RETURN();
648
}
649

    
650
void OPPROTO op_movw_rN_T1(void)
651
{
652
    T1 = (int32_t) (int16_t) (env->gregs[PARAM1] & 0xffff);
653
    RETURN();
654
}
655

    
656
void OPPROTO op_movuw_rN_T1(void)
657
{
658
    T1 = env->gregs[PARAM1] & 0xffff;
659
    RETURN();
660
}
661

    
662
void OPPROTO op_movl_rN_T1(void)
663
{
664
    T1 = env->gregs[PARAM1];
665
    RETURN();
666
}
667

    
668
void OPPROTO op_movl_imm_rN(void)
669
{
670
    env->gregs[PARAM2] = PARAM1;
671
    RETURN();
672
}
673

    
674
void OPPROTO op_fmov_frN_FT0(void)
675
{
676
    FT0 = env->fregs[PARAM1];
677
    RETURN();
678
}
679

    
680
void OPPROTO op_fmov_drN_DT0(void)
681
{
682
    CPU_DoubleU d;
683

    
684
    d.l.upper = *(uint32_t *)&env->fregs[PARAM1];
685
    d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1];
686
    DT0 = d.d;
687
    RETURN();
688
}
689

    
690
void OPPROTO op_fmov_frN_FT1(void)
691
{
692
    FT1 = env->fregs[PARAM1];
693
    RETURN();
694
}
695

    
696
void OPPROTO op_fmov_drN_DT1(void)
697
{
698
    CPU_DoubleU d;
699

    
700
    d.l.upper = *(uint32_t *)&env->fregs[PARAM1];
701
    d.l.lower = *(uint32_t *)&env->fregs[PARAM1 + 1];
702
    DT1 = d.d;
703
    RETURN();
704
}
705

    
706
void OPPROTO op_fmov_FT0_frN(void)
707
{
708
    env->fregs[PARAM1] = FT0;
709
    RETURN();
710
}
711

    
712
void OPPROTO op_fmov_DT0_drN(void)
713
{
714
    CPU_DoubleU d;
715

    
716
    d.d = DT0;
717
    *(uint32_t *)&env->fregs[PARAM1] = d.l.upper;
718
    *(uint32_t *)&env->fregs[PARAM1 + 1] = d.l.lower;
719
    RETURN();
720
}
721

    
722
void OPPROTO op_fadd_FT(void)
723
{
724
    FT0 = float32_add(FT0, FT1, &env->fp_status);
725
    RETURN();
726
}
727

    
728
void OPPROTO op_fadd_DT(void)
729
{
730
    DT0 = float64_add(DT0, DT1, &env->fp_status);
731
    RETURN();
732
}
733

    
734
void OPPROTO op_fsub_FT(void)
735
{
736
    FT0 = float32_sub(FT0, FT1, &env->fp_status);
737
    RETURN();
738
}
739

    
740
void OPPROTO op_fsub_DT(void)
741
{
742
    DT0 = float64_sub(DT0, DT1, &env->fp_status);
743
    RETURN();
744
}
745

    
746
void OPPROTO op_fmul_FT(void)
747
{
748
    FT0 = float32_mul(FT0, FT1, &env->fp_status);
749
    RETURN();
750
}
751

    
752
void OPPROTO op_fmul_DT(void)
753
{
754
    DT0 = float64_mul(DT0, DT1, &env->fp_status);
755
    RETURN();
756
}
757

    
758
void OPPROTO op_fdiv_FT(void)
759
{
760
    FT0 = float32_div(FT0, FT1, &env->fp_status);
761
    RETURN();
762
}
763

    
764
void OPPROTO op_fdiv_DT(void)
765
{
766
    DT0 = float64_div(DT0, DT1, &env->fp_status);
767
    RETURN();
768
}
769

    
770
void OPPROTO op_fcmp_eq_FT(void)
771
{
772
    cond_t(float32_compare(FT0, FT1, &env->fp_status) == 0);
773
    RETURN();
774
}
775

    
776
void OPPROTO op_fcmp_eq_DT(void)
777
{
778
    cond_t(float64_compare(DT0, DT1, &env->fp_status) == 0);
779
    RETURN();
780
}
781

    
782
void OPPROTO op_fcmp_gt_FT(void)
783
{
784
    cond_t(float32_compare(FT0, FT1, &env->fp_status) == 1);
785
    RETURN();
786
}
787

    
788
void OPPROTO op_fcmp_gt_DT(void)
789
{
790
    cond_t(float64_compare(DT0, DT1, &env->fp_status) == 1);
791
    RETURN();
792
}
793

    
794
void OPPROTO op_float_FT(void)
795
{
796
    FT0 = int32_to_float32(env->fpul, &env->fp_status);
797
    RETURN();
798
}
799

    
800
void OPPROTO op_float_DT(void)
801
{
802
    DT0 = int32_to_float64(env->fpul, &env->fp_status);
803
    RETURN();
804
}
805

    
806
void OPPROTO op_ftrc_FT(void)
807
{
808
    env->fpul = float32_to_int32_round_to_zero(FT0, &env->fp_status);
809
    RETURN();
810
}
811

    
812
void OPPROTO op_ftrc_DT(void)
813
{
814
    env->fpul = float64_to_int32_round_to_zero(DT0, &env->fp_status);
815
    RETURN();
816
}
817

    
818
void OPPROTO op_fneg_frN(void)
819
{
820
    env->fregs[PARAM1] = float32_chs(env->fregs[PARAM1]);
821
    RETURN();
822
}
823

    
824
void OPPROTO op_fabs_FT(void)
825
{
826
    FT0 = float32_abs(FT0);
827
    RETURN();
828
}
829

    
830
void OPPROTO op_fabs_DT(void)
831
{
832
    DT0 = float64_abs(DT0);
833
    RETURN();
834
}
835

    
836
void OPPROTO op_fcnvsd_FT_DT(void)
837
{
838
    DT0 = float32_to_float64(FT0, &env->fp_status);
839
    RETURN();
840
}
841

    
842
void OPPROTO op_fcnvds_DT_FT(void)
843
{
844
    FT0 = float64_to_float32(DT0, &env->fp_status);
845
    RETURN();
846
}
847

    
848
void OPPROTO op_fsqrt_FT(void)
849
{
850
    FT0 = float32_sqrt(FT0, &env->fp_status);
851
    RETURN();
852
}
853

    
854
void OPPROTO op_fsqrt_DT(void)
855
{
856
    DT0 = float64_sqrt(DT0, &env->fp_status);
857
    RETURN();
858
}
859

    
860
void OPPROTO op_fmov_T0_frN(void)
861
{
862
    *(uint32_t *)&env->fregs[PARAM1] = T0;
863
    RETURN();
864
}
865

    
866
void OPPROTO op_dec1_rN(void)
867
{
868
    env->gregs[PARAM1] -= 1;
869
    RETURN();
870
}
871

    
872
void OPPROTO op_dec2_rN(void)
873
{
874
    env->gregs[PARAM1] -= 2;
875
    RETURN();
876
}
877

    
878
void OPPROTO op_dec4_rN(void)
879
{
880
    env->gregs[PARAM1] -= 4;
881
    RETURN();
882
}
883

    
884
void OPPROTO op_dec8_rN(void)
885
{
886
    env->gregs[PARAM1] -= 8;
887
    RETURN();
888
}
889

    
890
void OPPROTO op_inc1_rN(void)
891
{
892
    env->gregs[PARAM1] += 1;
893
    RETURN();
894
}
895

    
896
void OPPROTO op_inc2_rN(void)
897
{
898
    env->gregs[PARAM1] += 2;
899
    RETURN();
900
}
901

    
902
void OPPROTO op_inc4_rN(void)
903
{
904
    env->gregs[PARAM1] += 4;
905
    RETURN();
906
}
907

    
908
void OPPROTO op_inc8_rN(void)
909
{
910
    env->gregs[PARAM1] += 8;
911
    RETURN();
912
}
913

    
914
void OPPROTO op_add_T0_rN(void)
915
{
916
    env->gregs[PARAM1] += T0;
917
    RETURN();
918
}
919

    
920
void OPPROTO op_sub_T0_rN(void)
921
{
922
    env->gregs[PARAM1] -= T0;
923
    RETURN();
924
}
925

    
926
void OPPROTO op_and_T0_rN(void)
927
{
928
    env->gregs[PARAM1] &= T0;
929
    RETURN();
930
}
931

    
932
void OPPROTO op_or_T0_rN(void)
933
{
934
    env->gregs[PARAM1] |= T0;
935
    RETURN();
936
}
937

    
938
void OPPROTO op_xor_T0_rN(void)
939
{
940
    env->gregs[PARAM1] ^= T0;
941
    RETURN();
942
}
943

    
944
void OPPROTO op_add_rN_T0(void)
945
{
946
    T0 += env->gregs[PARAM1];
947
    RETURN();
948
}
949

    
950
void OPPROTO op_add_rN_T1(void)
951
{
952
    T1 += env->gregs[PARAM1];
953
    RETURN();
954
}
955

    
956
void OPPROTO op_add_imm_rN(void)
957
{
958
    env->gregs[PARAM2] += PARAM1;
959
    RETURN();
960
}
961

    
962
void OPPROTO op_and_imm_rN(void)
963
{
964
    env->gregs[PARAM2] &= PARAM1;
965
    RETURN();
966
}
967

    
968
void OPPROTO op_or_imm_rN(void)
969
{
970
    env->gregs[PARAM2] |= PARAM1;
971
    RETURN();
972
}
973

    
974
void OPPROTO op_xor_imm_rN(void)
975
{
976
    env->gregs[PARAM2] ^= PARAM1;
977
    RETURN();
978
}
979

    
980
void OPPROTO op_dt_rN(void)
981
{
982
    cond_t((--env->gregs[PARAM1]) == 0);
983
    RETURN();
984
}
985

    
986
void OPPROTO op_tst_imm_rN(void)
987
{
988
    cond_t((env->gregs[PARAM2] & PARAM1) == 0);
989
    RETURN();
990
}
991

    
992
void OPPROTO op_movl_T0_T1(void)
993
{
994
    T1 = T0;
995
    RETURN();
996
}
997

    
998
void OPPROTO op_movl_fpul_FT0(void)
999
{
1000
    FT0 = *(float32 *)&env->fpul;
1001
    RETURN();
1002
}
1003

    
1004
void OPPROTO op_movl_FT0_fpul(void)
1005
{
1006
    *(float32 *)&env->fpul = FT0;
1007
    RETURN();
1008
}
1009

    
1010
void OPPROTO op_movl_imm_PC(void)
1011
{
1012
    env->pc = PARAM1;
1013
    RETURN();
1014
}
1015

    
1016
void OPPROTO op_jT(void)
1017
{
1018
    if (env->sr & SR_T)
1019
        GOTO_LABEL_PARAM(1);
1020
    RETURN();
1021
}
1022

    
1023
void OPPROTO op_jdelayed(void)
1024
{
1025
    if (env->flags & DELAY_SLOT_TRUE) {
1026
        env->flags &= ~DELAY_SLOT_TRUE;
1027
        GOTO_LABEL_PARAM(1);
1028
    }
1029
    RETURN();
1030
}
1031

    
1032
void OPPROTO op_movl_delayed_pc_PC(void)
1033
{
1034
    env->pc = env->delayed_pc;
1035
    RETURN();
1036
}
1037

    
1038
void OPPROTO op_addl_GBR_T0(void)
1039
{
1040
    T0 += env->gbr;
1041
    RETURN();
1042
}
1043

    
1044
void OPPROTO op_and_imm_T0(void)
1045
{
1046
    T0 &= PARAM1;
1047
    RETURN();
1048
}
1049

    
1050
void OPPROTO op_or_imm_T0(void)
1051
{
1052
    T0 |= PARAM1;
1053
    RETURN();
1054
}
1055

    
1056
void OPPROTO op_xor_imm_T0(void)
1057
{
1058
    T0 ^= PARAM1;
1059
    RETURN();
1060
}
1061

    
1062
void OPPROTO op_tst_imm_T0(void)
1063
{
1064
    cond_t((T0 & PARAM1) == 0);
1065
    RETURN();
1066
}
1067

    
1068
void OPPROTO op_raise_illegal_instruction(void)
1069
{
1070
    env->exception_index = 0x180;
1071
    do_raise_exception();
1072
    RETURN();
1073
}
1074

    
1075
void OPPROTO op_raise_slot_illegal_instruction(void)
1076
{
1077
    env->exception_index = 0x1a0;
1078
    do_raise_exception();
1079
    RETURN();
1080
}
1081

    
1082
void OPPROTO op_debug(void)
1083
{
1084
    env->exception_index = EXCP_DEBUG;
1085
    cpu_loop_exit();
1086
}
1087

    
1088
/* Load and store */
1089
#define MEMSUFFIX _raw
1090
#include "op_mem.c"
1091
#undef MEMSUFFIX
1092
#if !defined(CONFIG_USER_ONLY)
1093
#define MEMSUFFIX _user
1094
#include "op_mem.c"
1095
#undef MEMSUFFIX
1096

    
1097
#define MEMSUFFIX _kernel
1098
#include "op_mem.c"
1099
#undef MEMSUFFIX
1100
#endif