Statistics
| Branch: | Revision:

root / target-ppc / op.c @ 39dd32ee

History | View | Annotate | Download (47 kB)

1
/*
2
 *  PowerPC emulation micro-operations for qemu.
3
 *
4
 *  Copyright (c) 2003-2007 Jocelyn Mayer
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

    
21
//#define DEBUG_OP
22

    
23
#include "config.h"
24
#include "exec.h"
25
#include "host-utils.h"
26
#include "helper_regs.h"
27
#include "op_helper.h"
28

    
29
void OPPROTO op_print_mem_EA (void)
30
{
31
    do_print_mem_EA(T0);
32
    RETURN();
33
}
34

    
35
/* PowerPC state maintenance operations */
36
/* set_Rc0 */
37
void OPPROTO op_set_Rc0 (void)
38
{
39
    env->crf[0] = T0 | xer_so;
40
    RETURN();
41
}
42

    
43
/* Generate exceptions */
44
void OPPROTO op_raise_exception_err (void)
45
{
46
    do_raise_exception_err(PARAM1, PARAM2);
47
}
48

    
49
void OPPROTO op_debug (void)
50
{
51
    do_raise_exception(EXCP_DEBUG);
52
}
53

    
54
/* Load/store special registers */
55
void OPPROTO op_load_cr (void)
56
{
57
    do_load_cr();
58
    RETURN();
59
}
60

    
61
void OPPROTO op_store_cr (void)
62
{
63
    do_store_cr(PARAM1);
64
    RETURN();
65
}
66

    
67
void OPPROTO op_load_xer_cr (void)
68
{
69
    T0 = (xer_so << 3) | (xer_ov << 2) | (xer_ca << 1);
70
    RETURN();
71
}
72

    
73
void OPPROTO op_clear_xer_ov (void)
74
{
75
    xer_so = 0;
76
    xer_ov = 0;
77
    RETURN();
78
}
79

    
80
void OPPROTO op_clear_xer_ca (void)
81
{
82
    xer_ca = 0;
83
    RETURN();
84
}
85

    
86
void OPPROTO op_load_xer_bc (void)
87
{
88
    T1 = xer_bc;
89
    RETURN();
90
}
91

    
92
void OPPROTO op_store_xer_bc (void)
93
{
94
    xer_bc = T0;
95
    RETURN();
96
}
97

    
98
void OPPROTO op_load_xer (void)
99
{
100
    T0 = hreg_load_xer(env);
101
    RETURN();
102
}
103

    
104
void OPPROTO op_store_xer (void)
105
{
106
    hreg_store_xer(env, T0);
107
    RETURN();
108
}
109

    
110
#if defined(TARGET_PPC64)
111
void OPPROTO op_store_pri (void)
112
{
113
    do_store_pri(PARAM1);
114
    RETURN();
115
}
116
#endif
117

    
118
#if !defined(CONFIG_USER_ONLY)
119
/* Segment registers load and store */
120
void OPPROTO op_load_sr (void)
121
{
122
    T0 = env->sr[T1];
123
    RETURN();
124
}
125

    
126
void OPPROTO op_store_sr (void)
127
{
128
    do_store_sr(env, T1, T0);
129
    RETURN();
130
}
131

    
132
#if defined(TARGET_PPC64)
133
void OPPROTO op_load_slb (void)
134
{
135
    T0 = ppc_load_slb(env, T1);
136
    RETURN();
137
}
138

    
139
void OPPROTO op_store_slb (void)
140
{
141
    ppc_store_slb(env, T1, T0);
142
    RETURN();
143
}
144
#endif /* defined(TARGET_PPC64) */
145

    
146
void OPPROTO op_load_sdr1 (void)
147
{
148
    T0 = env->sdr1;
149
    RETURN();
150
}
151

    
152
void OPPROTO op_store_sdr1 (void)
153
{
154
    do_store_sdr1(env, T0);
155
    RETURN();
156
}
157

    
158
#if defined (TARGET_PPC64)
159
void OPPROTO op_load_asr (void)
160
{
161
    T0 = env->asr;
162
    RETURN();
163
}
164

    
165
void OPPROTO op_store_asr (void)
166
{
167
    ppc_store_asr(env, T0);
168
    RETURN();
169
}
170
#endif
171

    
172
void OPPROTO op_load_msr (void)
173
{
174
    T0 = env->msr;
175
    RETURN();
176
}
177

    
178
void OPPROTO op_store_msr (void)
179
{
180
    do_store_msr();
181
    RETURN();
182
}
183

    
184
#if defined (TARGET_PPC64)
185
void OPPROTO op_store_msr_32 (void)
186
{
187
    T0 = (env->msr & ~0xFFFFFFFFULL) | (T0 & 0xFFFFFFFF);
188
    do_store_msr();
189
    RETURN();
190
}
191
#endif
192

    
193
void OPPROTO op_update_riee (void)
194
{
195
    /* We don't call do_store_msr here as we won't trigger
196
     * any special case nor change hflags
197
     */
198
    T0 &= (1 << MSR_RI) | (1 << MSR_EE);
199
    env->msr &= ~(1 << MSR_RI) | (1 << MSR_EE);
200
    env->msr |= T0;
201
    RETURN();
202
}
203
#endif
204

    
205
/* SPR */
206
void OPPROTO op_load_spr (void)
207
{
208
    T0 = env->spr[PARAM1];
209
    RETURN();
210
}
211

    
212
void OPPROTO op_store_spr (void)
213
{
214
    env->spr[PARAM1] = T0;
215
    RETURN();
216
}
217

    
218
void OPPROTO op_load_dump_spr (void)
219
{
220
    T0 = ppc_load_dump_spr(PARAM1);
221
    RETURN();
222
}
223

    
224
void OPPROTO op_store_dump_spr (void)
225
{
226
    ppc_store_dump_spr(PARAM1, T0);
227
    RETURN();
228
}
229

    
230
void OPPROTO op_mask_spr (void)
231
{
232
    env->spr[PARAM1] &= ~T0;
233
    RETURN();
234
}
235

    
236
void OPPROTO op_load_lr (void)
237
{
238
    T0 = env->lr;
239
    RETURN();
240
}
241

    
242
void OPPROTO op_store_lr (void)
243
{
244
    env->lr = T0;
245
    RETURN();
246
}
247

    
248
void OPPROTO op_load_ctr (void)
249
{
250
    T0 = env->ctr;
251
    RETURN();
252
}
253

    
254
void OPPROTO op_store_ctr (void)
255
{
256
    env->ctr = T0;
257
    RETURN();
258
}
259

    
260
void OPPROTO op_load_tbl (void)
261
{
262
    T0 = cpu_ppc_load_tbl(env);
263
    RETURN();
264
}
265

    
266
void OPPROTO op_load_tbu (void)
267
{
268
    T0 = cpu_ppc_load_tbu(env);
269
    RETURN();
270
}
271

    
272
void OPPROTO op_load_atbl (void)
273
{
274
    T0 = cpu_ppc_load_atbl(env);
275
    RETURN();
276
}
277

    
278
void OPPROTO op_load_atbu (void)
279
{
280
    T0 = cpu_ppc_load_atbu(env);
281
    RETURN();
282
}
283

    
284
#if !defined(CONFIG_USER_ONLY)
285
void OPPROTO op_store_tbl (void)
286
{
287
    cpu_ppc_store_tbl(env, T0);
288
    RETURN();
289
}
290

    
291
void OPPROTO op_store_tbu (void)
292
{
293
    cpu_ppc_store_tbu(env, T0);
294
    RETURN();
295
}
296

    
297
void OPPROTO op_store_atbl (void)
298
{
299
    cpu_ppc_store_atbl(env, T0);
300
    RETURN();
301
}
302

    
303
void OPPROTO op_store_atbu (void)
304
{
305
    cpu_ppc_store_atbu(env, T0);
306
    RETURN();
307
}
308

    
309
void OPPROTO op_load_decr (void)
310
{
311
    T0 = cpu_ppc_load_decr(env);
312
    RETURN();
313
}
314

    
315
void OPPROTO op_store_decr (void)
316
{
317
    cpu_ppc_store_decr(env, T0);
318
    RETURN();
319
}
320

    
321
void OPPROTO op_load_ibat (void)
322
{
323
    T0 = env->IBAT[PARAM1][PARAM2];
324
    RETURN();
325
}
326

    
327
void OPPROTO op_store_ibatu (void)
328
{
329
    do_store_ibatu(env, PARAM1, T0);
330
    RETURN();
331
}
332

    
333
void OPPROTO op_store_ibatl (void)
334
{
335
#if 1
336
    env->IBAT[1][PARAM1] = T0;
337
#else
338
    do_store_ibatl(env, PARAM1, T0);
339
#endif
340
    RETURN();
341
}
342

    
343
void OPPROTO op_load_dbat (void)
344
{
345
    T0 = env->DBAT[PARAM1][PARAM2];
346
    RETURN();
347
}
348

    
349
void OPPROTO op_store_dbatu (void)
350
{
351
    do_store_dbatu(env, PARAM1, T0);
352
    RETURN();
353
}
354

    
355
void OPPROTO op_store_dbatl (void)
356
{
357
#if 1
358
    env->DBAT[1][PARAM1] = T0;
359
#else
360
    do_store_dbatl(env, PARAM1, T0);
361
#endif
362
    RETURN();
363
}
364
#endif /* !defined(CONFIG_USER_ONLY) */
365

    
366
/* FPSCR */
367
#ifdef CONFIG_SOFTFLOAT
368
void OPPROTO op_reset_fpstatus (void)
369
{
370
    env->fp_status.float_exception_flags = 0;
371
    RETURN();
372
}
373
#endif
374

    
375
void OPPROTO op_compute_fprf (void)
376
{
377
    do_compute_fprf(PARAM1);
378
    RETURN();
379
}
380

    
381
#ifdef CONFIG_SOFTFLOAT
382
void OPPROTO op_float_check_status (void)
383
{
384
    do_float_check_status();
385
    RETURN();
386
}
387
#else
388
void OPPROTO op_float_check_status (void)
389
{
390
    if (env->exception_index == POWERPC_EXCP_PROGRAM &&
391
        (env->error_code & POWERPC_EXCP_FP)) {
392
        /* Differred floating-point exception after target FPR update */
393
        if (msr_fe0 != 0 || msr_fe1 != 0)
394
            do_raise_exception_err(env->exception_index, env->error_code);
395
    }
396
    RETURN();
397
}
398
#endif
399

    
400
void OPPROTO op_load_fpscr_FT0 (void)
401
{
402
    /* The 32 MSB of the target fpr are undefined.
403
     * They'll be zero...
404
     */
405
    CPU_DoubleU u;
406

    
407
    u.l.upper = 0;
408
    u.l.lower = env->fpscr;
409
    FT0 = u.d;
410
    RETURN();
411
}
412

    
413
void OPPROTO op_load_fpscr_T0 (void)
414
{
415
    T0 = (env->fpscr >> PARAM1) & 0xF;
416
    RETURN();
417
}
418

    
419
void OPPROTO op_load_fpcc (void)
420
{
421
    T0 = fpscr_fpcc;
422
    RETURN();
423
}
424

    
425
void OPPROTO op_fpscr_resetbit (void)
426
{
427
    env->fpscr &= PARAM1;
428
    RETURN();
429
}
430

    
431
void OPPROTO op_fpscr_setbit (void)
432
{
433
    do_fpscr_setbit(PARAM1);
434
    RETURN();
435
}
436

    
437
void OPPROTO op_store_fpscr (void)
438
{
439
    do_store_fpscr(PARAM1);
440
    RETURN();
441
}
442

    
443
/* Branch */
444
void OPPROTO op_setlr (void)
445
{
446
    env->lr = (uint32_t)PARAM1;
447
    RETURN();
448
}
449

    
450
#if defined (TARGET_PPC64)
451
void OPPROTO op_setlr_64 (void)
452
{
453
    env->lr = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
454
    RETURN();
455
}
456
#endif
457

    
458
void OPPROTO op_jz_T0 (void)
459
{
460
    if (!T0)
461
        GOTO_LABEL_PARAM(1);
462
    RETURN();
463
}
464

    
465
void OPPROTO op_btest_T1 (void)
466
{
467
    if (T0) {
468
        env->nip = (uint32_t)(T1 & ~3);
469
    } else {
470
        env->nip = (uint32_t)PARAM1;
471
    }
472
    RETURN();
473
}
474

    
475
#if defined (TARGET_PPC64)
476
void OPPROTO op_btest_T1_64 (void)
477
{
478
    if (T0) {
479
        env->nip = (uint64_t)(T1 & ~3);
480
    } else {
481
        env->nip = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
482
    }
483
    RETURN();
484
}
485
#endif
486

    
487
void OPPROTO op_movl_T1_ctr (void)
488
{
489
    T1 = env->ctr;
490
    RETURN();
491
}
492

    
493
void OPPROTO op_movl_T1_lr (void)
494
{
495
    T1 = env->lr;
496
    RETURN();
497
}
498

    
499
/* tests with result in T0 */
500
void OPPROTO op_test_ctr (void)
501
{
502
    T0 = (uint32_t)env->ctr;
503
    RETURN();
504
}
505

    
506
#if defined(TARGET_PPC64)
507
void OPPROTO op_test_ctr_64 (void)
508
{
509
    T0 = (uint64_t)env->ctr;
510
    RETURN();
511
}
512
#endif
513

    
514
void OPPROTO op_test_ctr_true (void)
515
{
516
    T0 = ((uint32_t)env->ctr != 0 && (T0 & PARAM1) != 0);
517
    RETURN();
518
}
519

    
520
#if defined(TARGET_PPC64)
521
void OPPROTO op_test_ctr_true_64 (void)
522
{
523
    T0 = ((uint64_t)env->ctr != 0 && (T0 & PARAM1) != 0);
524
    RETURN();
525
}
526
#endif
527

    
528
void OPPROTO op_test_ctr_false (void)
529
{
530
    T0 = ((uint32_t)env->ctr != 0 && (T0 & PARAM1) == 0);
531
    RETURN();
532
}
533

    
534
#if defined(TARGET_PPC64)
535
void OPPROTO op_test_ctr_false_64 (void)
536
{
537
    T0 = ((uint64_t)env->ctr != 0 && (T0 & PARAM1) == 0);
538
    RETURN();
539
}
540
#endif
541

    
542
void OPPROTO op_test_ctrz (void)
543
{
544
    T0 = ((uint32_t)env->ctr == 0);
545
    RETURN();
546
}
547

    
548
#if defined(TARGET_PPC64)
549
void OPPROTO op_test_ctrz_64 (void)
550
{
551
    T0 = ((uint64_t)env->ctr == 0);
552
    RETURN();
553
}
554
#endif
555

    
556
void OPPROTO op_test_ctrz_true (void)
557
{
558
    T0 = ((uint32_t)env->ctr == 0 && (T0 & PARAM1) != 0);
559
    RETURN();
560
}
561

    
562
#if defined(TARGET_PPC64)
563
void OPPROTO op_test_ctrz_true_64 (void)
564
{
565
    T0 = ((uint64_t)env->ctr == 0 && (T0 & PARAM1) != 0);
566
    RETURN();
567
}
568
#endif
569

    
570
void OPPROTO op_test_ctrz_false (void)
571
{
572
    T0 = ((uint32_t)env->ctr == 0 && (T0 & PARAM1) == 0);
573
    RETURN();
574
}
575

    
576
#if defined(TARGET_PPC64)
577
void OPPROTO op_test_ctrz_false_64 (void)
578
{
579
    T0 = ((uint64_t)env->ctr == 0 && (T0 & PARAM1) == 0);
580
    RETURN();
581
}
582
#endif
583

    
584
void OPPROTO op_test_true (void)
585
{
586
    T0 = (T0 & PARAM1);
587
    RETURN();
588
}
589

    
590
void OPPROTO op_test_false (void)
591
{
592
    T0 = ((T0 & PARAM1) == 0);
593
    RETURN();
594
}
595

    
596
/* CTR maintenance */
597
void OPPROTO op_dec_ctr (void)
598
{
599
    env->ctr--;
600
    RETURN();
601
}
602

    
603
/***                           Integer arithmetic                          ***/
604
/* add */
605
void OPPROTO op_check_addo (void)
606
{
607
    xer_ov = (((uint32_t)T2 ^ (uint32_t)T1 ^ UINT32_MAX) &
608
              ((uint32_t)T2 ^ (uint32_t)T0)) >> 31;
609
    xer_so |= xer_ov;
610
    RETURN();
611
}
612

    
613
#if defined(TARGET_PPC64)
614
void OPPROTO op_check_addo_64 (void)
615
{
616
    xer_ov = (((uint64_t)T2 ^ (uint64_t)T1 ^ UINT64_MAX) &
617
              ((uint64_t)T2 ^ (uint64_t)T0)) >> 63;
618
    xer_so |= xer_ov;
619
    RETURN();
620
}
621
#endif
622

    
623
/* add carrying */
624
void OPPROTO op_check_addc (void)
625
{
626
    if (likely((uint32_t)T0 >= (uint32_t)T2)) {
627
        xer_ca = 0;
628
    } else {
629
        xer_ca = 1;
630
    }
631
    RETURN();
632
}
633

    
634
#if defined(TARGET_PPC64)
635
void OPPROTO op_check_addc_64 (void)
636
{
637
    if (likely((uint64_t)T0 >= (uint64_t)T2)) {
638
        xer_ca = 0;
639
    } else {
640
        xer_ca = 1;
641
    }
642
    RETURN();
643
}
644
#endif
645

    
646
/* add extended */
647
void OPPROTO op_adde (void)
648
{
649
    do_adde();
650
    RETURN();
651
}
652

    
653
#if defined(TARGET_PPC64)
654
void OPPROTO op_adde_64 (void)
655
{
656
    do_adde_64();
657
    RETURN();
658
}
659
#endif
660

    
661
/* add to minus one extended */
662
void OPPROTO op_add_me (void)
663
{
664
    T0 += xer_ca + (-1);
665
    if (likely((uint32_t)T1 != 0))
666
        xer_ca = 1;
667
    else
668
        xer_ca = 0;
669
    RETURN();
670
}
671

    
672
#if defined(TARGET_PPC64)
673
void OPPROTO op_add_me_64 (void)
674
{
675
    T0 += xer_ca + (-1);
676
    if (likely((uint64_t)T1 != 0))
677
        xer_ca = 1;
678
    else
679
        xer_ca = 0;
680
    RETURN();
681
}
682
#endif
683

    
684
void OPPROTO op_addmeo (void)
685
{
686
    do_addmeo();
687
    RETURN();
688
}
689

    
690
void OPPROTO op_addmeo_64 (void)
691
{
692
    do_addmeo();
693
    RETURN();
694
}
695

    
696
/* add to zero extended */
697
void OPPROTO op_add_ze (void)
698
{
699
    T0 += xer_ca;
700
    RETURN();
701
}
702

    
703
/* divide word */
704
void OPPROTO op_divw (void)
705
{
706
    if (unlikely(((int32_t)T0 == INT32_MIN && (int32_t)T1 == (int32_t)-1) ||
707
                 (int32_t)T1 == 0)) {
708
        T0 = (int32_t)(UINT32_MAX * ((uint32_t)T0 >> 31));
709
    } else {
710
        T0 = (int32_t)T0 / (int32_t)T1;
711
    }
712
    RETURN();
713
}
714

    
715
#if defined(TARGET_PPC64)
716
void OPPROTO op_divd (void)
717
{
718
    if (unlikely(((int64_t)T0 == INT64_MIN && (int64_t)T1 == (int64_t)-1LL) ||
719
                 (int64_t)T1 == 0)) {
720
        T0 = (int64_t)(UINT64_MAX * ((uint64_t)T0 >> 63));
721
    } else {
722
        T0 = (int64_t)T0 / (int64_t)T1;
723
    }
724
    RETURN();
725
}
726
#endif
727

    
728
void OPPROTO op_divwo (void)
729
{
730
    do_divwo();
731
    RETURN();
732
}
733

    
734
#if defined(TARGET_PPC64)
735
void OPPROTO op_divdo (void)
736
{
737
    do_divdo();
738
    RETURN();
739
}
740
#endif
741

    
742
/* divide word unsigned */
743
void OPPROTO op_divwu (void)
744
{
745
    if (unlikely(T1 == 0)) {
746
        T0 = 0;
747
    } else {
748
        T0 = (uint32_t)T0 / (uint32_t)T1;
749
    }
750
    RETURN();
751
}
752

    
753
#if defined(TARGET_PPC64)
754
void OPPROTO op_divdu (void)
755
{
756
    if (unlikely(T1 == 0)) {
757
        T0 = 0;
758
    } else {
759
        T0 /= T1;
760
    }
761
    RETURN();
762
}
763
#endif
764

    
765
void OPPROTO op_divwuo (void)
766
{
767
    do_divwuo();
768
    RETURN();
769
}
770

    
771
#if defined(TARGET_PPC64)
772
void OPPROTO op_divduo (void)
773
{
774
    do_divduo();
775
    RETURN();
776
}
777
#endif
778

    
779
/* multiply high word */
780
void OPPROTO op_mulhw (void)
781
{
782
    T0 = ((int64_t)((int32_t)T0) * (int64_t)((int32_t)T1)) >> 32;
783
    RETURN();
784
}
785

    
786
#if defined(TARGET_PPC64)
787
void OPPROTO op_mulhd (void)
788
{
789
    uint64_t tl, th;
790

    
791
    muls64(&tl, &th, T0, T1);
792
    T0 = th;
793
    RETURN();
794
}
795
#endif
796

    
797
/* multiply high word unsigned */
798
void OPPROTO op_mulhwu (void)
799
{
800
    T0 = ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1) >> 32;
801
    RETURN();
802
}
803

    
804
#if defined(TARGET_PPC64)
805
void OPPROTO op_mulhdu (void)
806
{
807
    uint64_t tl, th;
808

    
809
    mulu64(&tl, &th, T0, T1);
810
    T0 = th;
811
    RETURN();
812
}
813
#endif
814

    
815
/* multiply low immediate */
816
void OPPROTO op_mulli (void)
817
{
818
    T0 = ((int32_t)T0 * (int32_t)PARAM1);
819
    RETURN();
820
}
821

    
822
/* multiply low word */
823
void OPPROTO op_mullw (void)
824
{
825
    T0 = (int32_t)(T0 * T1);
826
    RETURN();
827
}
828

    
829
#if defined(TARGET_PPC64)
830
void OPPROTO op_mulld (void)
831
{
832
    T0 *= T1;
833
    RETURN();
834
}
835
#endif
836

    
837
void OPPROTO op_mullwo (void)
838
{
839
    do_mullwo();
840
    RETURN();
841
}
842

    
843
#if defined(TARGET_PPC64)
844
void OPPROTO op_mulldo (void)
845
{
846
    do_mulldo();
847
    RETURN();
848
}
849
#endif
850

    
851
/* negate */
852
void OPPROTO op_neg (void)
853
{
854
    if (likely(T0 != INT32_MIN)) {
855
        T0 = -(int32_t)T0;
856
    }
857
    RETURN();
858
}
859

    
860
#if defined(TARGET_PPC64)
861
void OPPROTO op_neg_64 (void)
862
{
863
    if (likely(T0 != INT64_MIN)) {
864
        T0 = -(int64_t)T0;
865
    }
866
    RETURN();
867
}
868
#endif
869

    
870
void OPPROTO op_nego (void)
871
{
872
    do_nego();
873
    RETURN();
874
}
875

    
876
#if defined(TARGET_PPC64)
877
void OPPROTO op_nego_64 (void)
878
{
879
    do_nego_64();
880
    RETURN();
881
}
882
#endif
883

    
884
/* subtract from */
885
void OPPROTO op_subf (void)
886
{
887
    T0 = T1 - T0;
888
    RETURN();
889
}
890

    
891
/* subtract from carrying */
892
void OPPROTO op_check_subfc (void)
893
{
894
    if (likely((uint32_t)T0 > (uint32_t)T1)) {
895
        xer_ca = 0;
896
    } else {
897
        xer_ca = 1;
898
    }
899
    RETURN();
900
}
901

    
902
#if defined(TARGET_PPC64)
903
void OPPROTO op_check_subfc_64 (void)
904
{
905
    if (likely((uint64_t)T0 > (uint64_t)T1)) {
906
        xer_ca = 0;
907
    } else {
908
        xer_ca = 1;
909
    }
910
    RETURN();
911
}
912
#endif
913

    
914
/* subtract from extended */
915
void OPPROTO op_subfe (void)
916
{
917
    do_subfe();
918
    RETURN();
919
}
920

    
921
#if defined(TARGET_PPC64)
922
void OPPROTO op_subfe_64 (void)
923
{
924
    do_subfe_64();
925
    RETURN();
926
}
927
#endif
928

    
929
/* subtract from immediate carrying */
930
void OPPROTO op_subfic (void)
931
{
932
    T0 = (int32_t)PARAM1 + ~T0 + 1;
933
    if ((uint32_t)T0 <= (uint32_t)PARAM1) {
934
        xer_ca = 1;
935
    } else {
936
        xer_ca = 0;
937
    }
938
    RETURN();
939
}
940

    
941
#if defined(TARGET_PPC64)
942
void OPPROTO op_subfic_64 (void)
943
{
944
    T0 = (int64_t)PARAM1 + ~T0 + 1;
945
    if ((uint64_t)T0 <= (uint64_t)PARAM1) {
946
        xer_ca = 1;
947
    } else {
948
        xer_ca = 0;
949
    }
950
    RETURN();
951
}
952
#endif
953

    
954
/* subtract from minus one extended */
955
void OPPROTO op_subfme (void)
956
{
957
    T0 = ~T0 + xer_ca - 1;
958
    if (likely((uint32_t)T0 != UINT32_MAX))
959
        xer_ca = 1;
960
    else
961
        xer_ca = 0;
962
    RETURN();
963
}
964

    
965
#if defined(TARGET_PPC64)
966
void OPPROTO op_subfme_64 (void)
967
{
968
    T0 = ~T0 + xer_ca - 1;
969
    if (likely((uint64_t)T0 != UINT64_MAX))
970
        xer_ca = 1;
971
    else
972
        xer_ca = 0;
973
    RETURN();
974
}
975
#endif
976

    
977
void OPPROTO op_subfmeo (void)
978
{
979
    do_subfmeo();
980
    RETURN();
981
}
982

    
983
#if defined(TARGET_PPC64)
984
void OPPROTO op_subfmeo_64 (void)
985
{
986
    do_subfmeo_64();
987
    RETURN();
988
}
989
#endif
990

    
991
/* subtract from zero extended */
992
void OPPROTO op_subfze (void)
993
{
994
    T1 = ~T0;
995
    T0 = T1 + xer_ca;
996
    if ((uint32_t)T0 < (uint32_t)T1) {
997
        xer_ca = 1;
998
    } else {
999
        xer_ca = 0;
1000
    }
1001
    RETURN();
1002
}
1003

    
1004
#if defined(TARGET_PPC64)
1005
void OPPROTO op_subfze_64 (void)
1006
{
1007
    T1 = ~T0;
1008
    T0 = T1 + xer_ca;
1009
    if ((uint64_t)T0 < (uint64_t)T1) {
1010
        xer_ca = 1;
1011
    } else {
1012
        xer_ca = 0;
1013
    }
1014
    RETURN();
1015
}
1016
#endif
1017

    
1018
void OPPROTO op_subfzeo (void)
1019
{
1020
    do_subfzeo();
1021
    RETURN();
1022
}
1023

    
1024
#if defined(TARGET_PPC64)
1025
void OPPROTO op_subfzeo_64 (void)
1026
{
1027
    do_subfzeo_64();
1028
    RETURN();
1029
}
1030
#endif
1031

    
1032
/***                           Integer comparison                          ***/
1033
/* compare */
1034
void OPPROTO op_cmp (void)
1035
{
1036
    if ((int32_t)T0 < (int32_t)T1) {
1037
        T0 = 0x08;
1038
    } else if ((int32_t)T0 > (int32_t)T1) {
1039
        T0 = 0x04;
1040
    } else {
1041
        T0 = 0x02;
1042
    }
1043
    T0 |= xer_so;
1044
    RETURN();
1045
}
1046

    
1047
#if defined(TARGET_PPC64)
1048
void OPPROTO op_cmp_64 (void)
1049
{
1050
    if ((int64_t)T0 < (int64_t)T1) {
1051
        T0 = 0x08;
1052
    } else if ((int64_t)T0 > (int64_t)T1) {
1053
        T0 = 0x04;
1054
    } else {
1055
        T0 = 0x02;
1056
    }
1057
    T0 |= xer_so;
1058
    RETURN();
1059
}
1060
#endif
1061

    
1062
/* compare immediate */
1063
void OPPROTO op_cmpi (void)
1064
{
1065
    if ((int32_t)T0 < (int32_t)PARAM1) {
1066
        T0 = 0x08;
1067
    } else if ((int32_t)T0 > (int32_t)PARAM1) {
1068
        T0 = 0x04;
1069
    } else {
1070
        T0 = 0x02;
1071
    }
1072
    T0 |= xer_so;
1073
    RETURN();
1074
}
1075

    
1076
#if defined(TARGET_PPC64)
1077
void OPPROTO op_cmpi_64 (void)
1078
{
1079
    if ((int64_t)T0 < (int64_t)((int32_t)PARAM1)) {
1080
        T0 = 0x08;
1081
    } else if ((int64_t)T0 > (int64_t)((int32_t)PARAM1)) {
1082
        T0 = 0x04;
1083
    } else {
1084
        T0 = 0x02;
1085
    }
1086
    T0 |= xer_so;
1087
    RETURN();
1088
}
1089
#endif
1090

    
1091
/* compare logical */
1092
void OPPROTO op_cmpl (void)
1093
{
1094
    if ((uint32_t)T0 < (uint32_t)T1) {
1095
        T0 = 0x08;
1096
    } else if ((uint32_t)T0 > (uint32_t)T1) {
1097
        T0 = 0x04;
1098
    } else {
1099
        T0 = 0x02;
1100
    }
1101
    T0 |= xer_so;
1102
    RETURN();
1103
}
1104

    
1105
#if defined(TARGET_PPC64)
1106
void OPPROTO op_cmpl_64 (void)
1107
{
1108
    if ((uint64_t)T0 < (uint64_t)T1) {
1109
        T0 = 0x08;
1110
    } else if ((uint64_t)T0 > (uint64_t)T1) {
1111
        T0 = 0x04;
1112
    } else {
1113
        T0 = 0x02;
1114
    }
1115
    T0 |= xer_so;
1116
    RETURN();
1117
}
1118
#endif
1119

    
1120
/* compare logical immediate */
1121
void OPPROTO op_cmpli (void)
1122
{
1123
    if ((uint32_t)T0 < (uint32_t)PARAM1) {
1124
        T0 = 0x08;
1125
    } else if ((uint32_t)T0 > (uint32_t)PARAM1) {
1126
        T0 = 0x04;
1127
    } else {
1128
        T0 = 0x02;
1129
    }
1130
    T0 |= xer_so;
1131
    RETURN();
1132
}
1133

    
1134
#if defined(TARGET_PPC64)
1135
void OPPROTO op_cmpli_64 (void)
1136
{
1137
    if ((uint64_t)T0 < (uint64_t)PARAM1) {
1138
        T0 = 0x08;
1139
    } else if ((uint64_t)T0 > (uint64_t)PARAM1) {
1140
        T0 = 0x04;
1141
    } else {
1142
        T0 = 0x02;
1143
    }
1144
    T0 |= xer_so;
1145
    RETURN();
1146
}
1147
#endif
1148

    
1149
void OPPROTO op_isel (void)
1150
{
1151
    if (T0)
1152
        T0 = T1;
1153
    else
1154
        T0 = T2;
1155
    RETURN();
1156
}
1157

    
1158
void OPPROTO op_popcntb (void)
1159
{
1160
    do_popcntb();
1161
    RETURN();
1162
}
1163

    
1164
#if defined(TARGET_PPC64)
1165
void OPPROTO op_popcntb_64 (void)
1166
{
1167
    do_popcntb_64();
1168
    RETURN();
1169
}
1170
#endif
1171

    
1172
/***                            Integer logical                            ***/
1173
/* and */
1174
void OPPROTO op_and (void)
1175
{
1176
    T0 &= T1;
1177
    RETURN();
1178
}
1179

    
1180
/* andc */
1181
void OPPROTO op_andc (void)
1182
{
1183
    T0 &= ~T1;
1184
    RETURN();
1185
}
1186

    
1187
/* andi. */
1188
void OPPROTO op_andi_T0 (void)
1189
{
1190
    T0 &= (uint32_t)PARAM1;
1191
    RETURN();
1192
}
1193

    
1194
void OPPROTO op_andi_T1 (void)
1195
{
1196
    T1 &= (uint32_t)PARAM1;
1197
    RETURN();
1198
}
1199

    
1200
#if defined(TARGET_PPC64)
1201
void OPPROTO op_andi_T0_64 (void)
1202
{
1203
    T0 &= ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
1204
    RETURN();
1205
}
1206

    
1207
void OPPROTO op_andi_T1_64 (void)
1208
{
1209
    T1 &= ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
1210
    RETURN();
1211
}
1212
#endif
1213

    
1214
/* count leading zero */
1215
void OPPROTO op_cntlzw (void)
1216
{
1217
    do_cntlzw();
1218
    RETURN();
1219
}
1220

    
1221
#if defined(TARGET_PPC64)
1222
void OPPROTO op_cntlzd (void)
1223
{
1224
    do_cntlzd();
1225
    RETURN();
1226
}
1227
#endif
1228

    
1229
/* eqv */
1230
void OPPROTO op_eqv (void)
1231
{
1232
    T0 = ~(T0 ^ T1);
1233
    RETURN();
1234
}
1235

    
1236
/* extend sign byte */
1237
void OPPROTO op_extsb (void)
1238
{
1239
#if defined (TARGET_PPC64)
1240
    T0 = (int64_t)((int8_t)T0);
1241
#else
1242
    T0 = (int32_t)((int8_t)T0);
1243
#endif
1244
    RETURN();
1245
}
1246

    
1247
/* extend sign half word */
1248
void OPPROTO op_extsh (void)
1249
{
1250
#if defined (TARGET_PPC64)
1251
    T0 = (int64_t)((int16_t)T0);
1252
#else
1253
    T0 = (int32_t)((int16_t)T0);
1254
#endif
1255
    RETURN();
1256
}
1257

    
1258
#if defined (TARGET_PPC64)
1259
void OPPROTO op_extsw (void)
1260
{
1261
    T0 = (int64_t)((int32_t)T0);
1262
    RETURN();
1263
}
1264
#endif
1265

    
1266
/* nand */
1267
void OPPROTO op_nand (void)
1268
{
1269
    T0 = ~(T0 & T1);
1270
    RETURN();
1271
}
1272

    
1273
/* nor */
1274
void OPPROTO op_nor (void)
1275
{
1276
    T0 = ~(T0 | T1);
1277
    RETURN();
1278
}
1279

    
1280
/* or */
1281
void OPPROTO op_or (void)
1282
{
1283
    T0 |= T1;
1284
    RETURN();
1285
}
1286

    
1287
/* orc */
1288
void OPPROTO op_orc (void)
1289
{
1290
    T0 |= ~T1;
1291
    RETURN();
1292
}
1293

    
1294
/* ori */
1295
void OPPROTO op_ori (void)
1296
{
1297
    T0 |= (uint32_t)PARAM1;
1298
    RETURN();
1299
}
1300

    
1301
/* xor */
1302
void OPPROTO op_xor (void)
1303
{
1304
    T0 ^= T1;
1305
    RETURN();
1306
}
1307

    
1308
/* xori */
1309
void OPPROTO op_xori (void)
1310
{
1311
    T0 ^= (uint32_t)PARAM1;
1312
    RETURN();
1313
}
1314

    
1315
/***                             Integer rotate                            ***/
1316
void OPPROTO op_rotl32_T0_T1 (void)
1317
{
1318
    T0 = rotl32(T0, T1 & 0x1F);
1319
    RETURN();
1320
}
1321

    
1322
void OPPROTO op_rotli32_T0 (void)
1323
{
1324
    T0 = rotl32(T0, PARAM1);
1325
    RETURN();
1326
}
1327

    
1328
#if defined(TARGET_PPC64)
1329
void OPPROTO op_rotl64_T0_T1 (void)
1330
{
1331
    T0 = rotl64(T0, T1 & 0x3F);
1332
    RETURN();
1333
}
1334

    
1335
void OPPROTO op_rotli64_T0 (void)
1336
{
1337
    T0 = rotl64(T0, PARAM1);
1338
    RETURN();
1339
}
1340
#endif
1341

    
1342
/***                             Integer shift                             ***/
1343
/* shift left word */
1344
void OPPROTO op_slw (void)
1345
{
1346
    if (T1 & 0x20) {
1347
        T0 = 0;
1348
    } else {
1349
        T0 = (uint32_t)(T0 << T1);
1350
    }
1351
    RETURN();
1352
}
1353

    
1354
#if defined(TARGET_PPC64)
1355
void OPPROTO op_sld (void)
1356
{
1357
    if (T1 & 0x40) {
1358
        T0 = 0;
1359
    } else {
1360
        T0 = T0 << T1;
1361
    }
1362
    RETURN();
1363
}
1364
#endif
1365

    
1366
/* shift right algebraic word */
1367
void OPPROTO op_sraw (void)
1368
{
1369
    do_sraw();
1370
    RETURN();
1371
}
1372

    
1373
#if defined(TARGET_PPC64)
1374
void OPPROTO op_srad (void)
1375
{
1376
    do_srad();
1377
    RETURN();
1378
}
1379
#endif
1380

    
1381
/* shift right algebraic word immediate */
1382
void OPPROTO op_srawi (void)
1383
{
1384
    uint32_t mask = (uint32_t)PARAM2;
1385

    
1386
    T0 = (int32_t)T0 >> PARAM1;
1387
    if ((int32_t)T1 < 0 && (T1 & mask) != 0) {
1388
        xer_ca = 1;
1389
    } else {
1390
        xer_ca = 0;
1391
    }
1392
    RETURN();
1393
}
1394

    
1395
#if defined(TARGET_PPC64)
1396
void OPPROTO op_sradi (void)
1397
{
1398
    uint64_t mask = ((uint64_t)PARAM2 << 32) | (uint64_t)PARAM3;
1399

    
1400
    T0 = (int64_t)T0 >> PARAM1;
1401
    if ((int64_t)T1 < 0 && ((uint64_t)T1 & mask) != 0) {
1402
        xer_ca = 1;
1403
    } else {
1404
        xer_ca = 0;
1405
    }
1406
    RETURN();
1407
}
1408
#endif
1409

    
1410
/* shift right word */
1411
void OPPROTO op_srw (void)
1412
{
1413
    if (T1 & 0x20) {
1414
        T0 = 0;
1415
    } else {
1416
        T0 = (uint32_t)T0 >> T1;
1417
    }
1418
    RETURN();
1419
}
1420

    
1421
#if defined(TARGET_PPC64)
1422
void OPPROTO op_srd (void)
1423
{
1424
    if (T1 & 0x40) {
1425
        T0 = 0;
1426
    } else {
1427
        T0 = (uint64_t)T0 >> T1;
1428
    }
1429
    RETURN();
1430
}
1431
#endif
1432

    
1433
void OPPROTO op_sl_T0_T1 (void)
1434
{
1435
    T0 = T0 << T1;
1436
    RETURN();
1437
}
1438

    
1439
void OPPROTO op_sli_T0 (void)
1440
{
1441
    T0 = T0 << PARAM1;
1442
    RETURN();
1443
}
1444

    
1445
void OPPROTO op_sli_T1 (void)
1446
{
1447
    T1 = T1 << PARAM1;
1448
    RETURN();
1449
}
1450

    
1451
void OPPROTO op_srl_T0_T1 (void)
1452
{
1453
    T0 = (uint32_t)T0 >> T1;
1454
    RETURN();
1455
}
1456

    
1457
#if defined(TARGET_PPC64)
1458
void OPPROTO op_srl_T0_T1_64 (void)
1459
{
1460
    T0 = (uint32_t)T0 >> T1;
1461
    RETURN();
1462
}
1463
#endif
1464

    
1465
void OPPROTO op_srli_T0 (void)
1466
{
1467
    T0 = (uint32_t)T0 >> PARAM1;
1468
    RETURN();
1469
}
1470

    
1471
#if defined(TARGET_PPC64)
1472
void OPPROTO op_srli_T0_64 (void)
1473
{
1474
    T0 = (uint64_t)T0 >> PARAM1;
1475
    RETURN();
1476
}
1477
#endif
1478

    
1479
void OPPROTO op_srli_T1 (void)
1480
{
1481
    T1 = (uint32_t)T1 >> PARAM1;
1482
    RETURN();
1483
}
1484

    
1485
#if defined(TARGET_PPC64)
1486
void OPPROTO op_srli_T1_64 (void)
1487
{
1488
    T1 = (uint64_t)T1 >> PARAM1;
1489
    RETURN();
1490
}
1491
#endif
1492

    
1493
/***                       Floating-Point arithmetic                       ***/
1494
/* fadd - fadd. */
1495
void OPPROTO op_fadd (void)
1496
{
1497
#if USE_PRECISE_EMULATION
1498
    do_fadd();
1499
#else
1500
    FT0 = float64_add(FT0, FT1, &env->fp_status);
1501
#endif
1502
    RETURN();
1503
}
1504

    
1505
/* fsub - fsub. */
1506
void OPPROTO op_fsub (void)
1507
{
1508
#if USE_PRECISE_EMULATION
1509
    do_fsub();
1510
#else
1511
    FT0 = float64_sub(FT0, FT1, &env->fp_status);
1512
#endif
1513
    RETURN();
1514
}
1515

    
1516
/* fmul - fmul. */
1517
void OPPROTO op_fmul (void)
1518
{
1519
#if USE_PRECISE_EMULATION
1520
    do_fmul();
1521
#else
1522
    FT0 = float64_mul(FT0, FT1, &env->fp_status);
1523
#endif
1524
    RETURN();
1525
}
1526

    
1527
/* fdiv - fdiv. */
1528
void OPPROTO op_fdiv (void)
1529
{
1530
#if USE_PRECISE_EMULATION
1531
    do_fdiv();
1532
#else
1533
    FT0 = float64_div(FT0, FT1, &env->fp_status);
1534
#endif
1535
    RETURN();
1536
}
1537

    
1538
/* fsqrt - fsqrt. */
1539
void OPPROTO op_fsqrt (void)
1540
{
1541
    do_fsqrt();
1542
    RETURN();
1543
}
1544

    
1545
/* fre - fre. */
1546
void OPPROTO op_fre (void)
1547
{
1548
    do_fre();
1549
    RETURN();
1550
}
1551

    
1552
/* fres - fres. */
1553
void OPPROTO op_fres (void)
1554
{
1555
    do_fres();
1556
    RETURN();
1557
}
1558

    
1559
/* frsqrte  - frsqrte. */
1560
void OPPROTO op_frsqrte (void)
1561
{
1562
    do_frsqrte();
1563
    RETURN();
1564
}
1565

    
1566
/* fsel - fsel. */
1567
void OPPROTO op_fsel (void)
1568
{
1569
    do_fsel();
1570
    RETURN();
1571
}
1572

    
1573
/***                     Floating-Point multiply-and-add                   ***/
1574
/* fmadd - fmadd. */
1575
void OPPROTO op_fmadd (void)
1576
{
1577
#if USE_PRECISE_EMULATION
1578
    do_fmadd();
1579
#else
1580
    FT0 = float64_mul(FT0, FT1, &env->fp_status);
1581
    FT0 = float64_add(FT0, FT2, &env->fp_status);
1582
#endif
1583
    RETURN();
1584
}
1585

    
1586
/* fmsub - fmsub. */
1587
void OPPROTO op_fmsub (void)
1588
{
1589
#if USE_PRECISE_EMULATION
1590
    do_fmsub();
1591
#else
1592
    FT0 = float64_mul(FT0, FT1, &env->fp_status);
1593
    FT0 = float64_sub(FT0, FT2, &env->fp_status);
1594
#endif
1595
    RETURN();
1596
}
1597

    
1598
/* fnmadd - fnmadd. - fnmadds - fnmadds. */
1599
void OPPROTO op_fnmadd (void)
1600
{
1601
    do_fnmadd();
1602
    RETURN();
1603
}
1604

    
1605
/* fnmsub - fnmsub. */
1606
void OPPROTO op_fnmsub (void)
1607
{
1608
    do_fnmsub();
1609
    RETURN();
1610
}
1611

    
1612
/***                     Floating-Point round & convert                    ***/
1613
/* frsp - frsp. */
1614
void OPPROTO op_frsp (void)
1615
{
1616
#if USE_PRECISE_EMULATION
1617
    do_frsp();
1618
#else
1619
    FT0 = float64_to_float32(FT0, &env->fp_status);
1620
#endif
1621
    RETURN();
1622
}
1623

    
1624
/* fctiw - fctiw. */
1625
void OPPROTO op_fctiw (void)
1626
{
1627
    do_fctiw();
1628
    RETURN();
1629
}
1630

    
1631
/* fctiwz - fctiwz. */
1632
void OPPROTO op_fctiwz (void)
1633
{
1634
    do_fctiwz();
1635
    RETURN();
1636
}
1637

    
1638
#if defined(TARGET_PPC64)
1639
/* fcfid - fcfid. */
1640
void OPPROTO op_fcfid (void)
1641
{
1642
    do_fcfid();
1643
    RETURN();
1644
}
1645

    
1646
/* fctid - fctid. */
1647
void OPPROTO op_fctid (void)
1648
{
1649
    do_fctid();
1650
    RETURN();
1651
}
1652

    
1653
/* fctidz - fctidz. */
1654
void OPPROTO op_fctidz (void)
1655
{
1656
    do_fctidz();
1657
    RETURN();
1658
}
1659
#endif
1660

    
1661
void OPPROTO op_frin (void)
1662
{
1663
    do_frin();
1664
    RETURN();
1665
}
1666

    
1667
void OPPROTO op_friz (void)
1668
{
1669
    do_friz();
1670
    RETURN();
1671
}
1672

    
1673
void OPPROTO op_frip (void)
1674
{
1675
    do_frip();
1676
    RETURN();
1677
}
1678

    
1679
void OPPROTO op_frim (void)
1680
{
1681
    do_frim();
1682
    RETURN();
1683
}
1684

    
1685
/***                         Floating-Point compare                        ***/
1686
/* fcmpu */
1687
void OPPROTO op_fcmpu (void)
1688
{
1689
    do_fcmpu();
1690
    RETURN();
1691
}
1692

    
1693
/* fcmpo */
1694
void OPPROTO op_fcmpo (void)
1695
{
1696
    do_fcmpo();
1697
    RETURN();
1698
}
1699

    
1700
/***                         Floating-point move                           ***/
1701
/* fabs */
1702
void OPPROTO op_fabs (void)
1703
{
1704
    FT0 = float64_abs(FT0);
1705
    RETURN();
1706
}
1707

    
1708
/* fnabs */
1709
void OPPROTO op_fnabs (void)
1710
{
1711
    FT0 = float64_abs(FT0);
1712
    FT0 = float64_chs(FT0);
1713
    RETURN();
1714
}
1715

    
1716
/* fneg */
1717
void OPPROTO op_fneg (void)
1718
{
1719
    FT0 = float64_chs(FT0);
1720
    RETURN();
1721
}
1722

    
1723
/* Load and store */
1724
#define MEMSUFFIX _raw
1725
#include "op_helper.h"
1726
#include "op_mem.h"
1727
#if !defined(CONFIG_USER_ONLY)
1728
#define MEMSUFFIX _user
1729
#include "op_helper.h"
1730
#include "op_mem.h"
1731
#define MEMSUFFIX _kernel
1732
#include "op_helper.h"
1733
#include "op_mem.h"
1734
#define MEMSUFFIX _hypv
1735
#include "op_helper.h"
1736
#include "op_mem.h"
1737
#endif
1738

    
1739
/* Special op to check and maybe clear reservation */
1740
void OPPROTO op_check_reservation (void)
1741
{
1742
    if ((uint32_t)env->reserve == (uint32_t)(T0 & ~0x00000003))
1743
        env->reserve = (target_ulong)-1ULL;
1744
    RETURN();
1745
}
1746

    
1747
#if defined(TARGET_PPC64)
1748
void OPPROTO op_check_reservation_64 (void)
1749
{
1750
    if ((uint64_t)env->reserve == (uint64_t)(T0 & ~0x00000003))
1751
        env->reserve = (target_ulong)-1ULL;
1752
    RETURN();
1753
}
1754
#endif
1755

    
1756
void OPPROTO op_wait (void)
1757
{
1758
    env->halted = 1;
1759
    RETURN();
1760
}
1761

    
1762
/* Return from interrupt */
1763
#if !defined(CONFIG_USER_ONLY)
1764
void OPPROTO op_rfi (void)
1765
{
1766
    do_rfi();
1767
    RETURN();
1768
}
1769

    
1770
#if defined(TARGET_PPC64)
1771
void OPPROTO op_rfid (void)
1772
{
1773
    do_rfid();
1774
    RETURN();
1775
}
1776

    
1777
void OPPROTO op_hrfid (void)
1778
{
1779
    do_hrfid();
1780
    RETURN();
1781
}
1782
#endif
1783

    
1784
/* Exception vectors */
1785
void OPPROTO op_store_excp_prefix (void)
1786
{
1787
    T0 &= env->ivpr_mask;
1788
    env->excp_prefix = T0;
1789
    RETURN();
1790
}
1791

    
1792
void OPPROTO op_store_excp_vector (void)
1793
{
1794
    T0 &= env->ivor_mask;
1795
    env->excp_vectors[PARAM1] = T0;
1796
    RETURN();
1797
}
1798
#endif
1799

    
1800
/* Trap word */
1801
void OPPROTO op_tw (void)
1802
{
1803
    do_tw(PARAM1);
1804
    RETURN();
1805
}
1806

    
1807
#if defined(TARGET_PPC64)
1808
void OPPROTO op_td (void)
1809
{
1810
    do_td(PARAM1);
1811
    RETURN();
1812
}
1813
#endif
1814

    
1815
#if !defined(CONFIG_USER_ONLY)
1816
/* tlbia */
1817
void OPPROTO op_tlbia (void)
1818
{
1819
    ppc_tlb_invalidate_all(env);
1820
    RETURN();
1821
}
1822

    
1823
/* tlbie */
1824
void OPPROTO op_tlbie (void)
1825
{
1826
    ppc_tlb_invalidate_one(env, (uint32_t)T0);
1827
    RETURN();
1828
}
1829

    
1830
#if defined(TARGET_PPC64)
1831
void OPPROTO op_tlbie_64 (void)
1832
{
1833
    ppc_tlb_invalidate_one(env, T0);
1834
    RETURN();
1835
}
1836
#endif
1837

    
1838
#if defined(TARGET_PPC64)
1839
void OPPROTO op_slbia (void)
1840
{
1841
    ppc_slb_invalidate_all(env);
1842
    RETURN();
1843
}
1844

    
1845
void OPPROTO op_slbie (void)
1846
{
1847
    ppc_slb_invalidate_one(env, (uint32_t)T0);
1848
    RETURN();
1849
}
1850

    
1851
void OPPROTO op_slbie_64 (void)
1852
{
1853
    ppc_slb_invalidate_one(env, T0);
1854
    RETURN();
1855
}
1856
#endif
1857
#endif
1858

    
1859
#if !defined(CONFIG_USER_ONLY)
1860
/* PowerPC 602/603/755 software TLB load instructions */
1861
void OPPROTO op_6xx_tlbld (void)
1862
{
1863
    do_load_6xx_tlb(0);
1864
    RETURN();
1865
}
1866

    
1867
void OPPROTO op_6xx_tlbli (void)
1868
{
1869
    do_load_6xx_tlb(1);
1870
    RETURN();
1871
}
1872

    
1873
/* PowerPC 74xx software TLB load instructions */
1874
void OPPROTO op_74xx_tlbld (void)
1875
{
1876
    do_load_74xx_tlb(0);
1877
    RETURN();
1878
}
1879

    
1880
void OPPROTO op_74xx_tlbli (void)
1881
{
1882
    do_load_74xx_tlb(1);
1883
    RETURN();
1884
}
1885
#endif
1886

    
1887
/* 601 specific */
1888
void OPPROTO op_load_601_rtcl (void)
1889
{
1890
    T0 = cpu_ppc601_load_rtcl(env);
1891
    RETURN();
1892
}
1893

    
1894
void OPPROTO op_load_601_rtcu (void)
1895
{
1896
    T0 = cpu_ppc601_load_rtcu(env);
1897
    RETURN();
1898
}
1899

    
1900
#if !defined(CONFIG_USER_ONLY)
1901
void OPPROTO op_store_601_rtcl (void)
1902
{
1903
    cpu_ppc601_store_rtcl(env, T0);
1904
    RETURN();
1905
}
1906

    
1907
void OPPROTO op_store_601_rtcu (void)
1908
{
1909
    cpu_ppc601_store_rtcu(env, T0);
1910
    RETURN();
1911
}
1912

    
1913
void OPPROTO op_store_hid0_601 (void)
1914
{
1915
    do_store_hid0_601();
1916
    RETURN();
1917
}
1918

    
1919
void OPPROTO op_load_601_bat (void)
1920
{
1921
    T0 = env->IBAT[PARAM1][PARAM2];
1922
    RETURN();
1923
}
1924

    
1925
void OPPROTO op_store_601_batl (void)
1926
{
1927
    do_store_ibatl_601(env, PARAM1, T0);
1928
    RETURN();
1929
}
1930

    
1931
void OPPROTO op_store_601_batu (void)
1932
{
1933
    do_store_ibatu_601(env, PARAM1, T0);
1934
    RETURN();
1935
}
1936
#endif /* !defined(CONFIG_USER_ONLY) */
1937

    
1938
/* PowerPC 601 specific instructions (POWER bridge) */
1939
/* XXX: those micro-ops need tests ! */
1940
void OPPROTO op_POWER_abs (void)
1941
{
1942
    if ((int32_t)T0 == INT32_MIN)
1943
        T0 = INT32_MAX;
1944
    else if ((int32_t)T0 < 0)
1945
        T0 = -T0;
1946
    RETURN();
1947
}
1948

    
1949
void OPPROTO op_POWER_abso (void)
1950
{
1951
    do_POWER_abso();
1952
    RETURN();
1953
}
1954

    
1955
void OPPROTO op_POWER_clcs (void)
1956
{
1957
    do_POWER_clcs();
1958
    RETURN();
1959
}
1960

    
1961
void OPPROTO op_POWER_div (void)
1962
{
1963
    do_POWER_div();
1964
    RETURN();
1965
}
1966

    
1967
void OPPROTO op_POWER_divo (void)
1968
{
1969
    do_POWER_divo();
1970
    RETURN();
1971
}
1972

    
1973
void OPPROTO op_POWER_divs (void)
1974
{
1975
    do_POWER_divs();
1976
    RETURN();
1977
}
1978

    
1979
void OPPROTO op_POWER_divso (void)
1980
{
1981
    do_POWER_divso();
1982
    RETURN();
1983
}
1984

    
1985
void OPPROTO op_POWER_doz (void)
1986
{
1987
    if ((int32_t)T1 > (int32_t)T0)
1988
        T0 = T1 - T0;
1989
    else
1990
        T0 = 0;
1991
    RETURN();
1992
}
1993

    
1994
void OPPROTO op_POWER_dozo (void)
1995
{
1996
    do_POWER_dozo();
1997
    RETURN();
1998
}
1999

    
2000
void OPPROTO op_load_xer_cmp (void)
2001
{
2002
    T2 = xer_cmp;
2003
    RETURN();
2004
}
2005

    
2006
void OPPROTO op_POWER_maskg (void)
2007
{
2008
    do_POWER_maskg();
2009
    RETURN();
2010
}
2011

    
2012
void OPPROTO op_POWER_maskir (void)
2013
{
2014
    T0 = (T0 & ~T2) | (T1 & T2);
2015
    RETURN();
2016
}
2017

    
2018
void OPPROTO op_POWER_mul (void)
2019
{
2020
    uint64_t tmp;
2021

    
2022
    tmp = (uint64_t)T0 * (uint64_t)T1;
2023
    env->spr[SPR_MQ] = tmp >> 32;
2024
    T0 = tmp;
2025
    RETURN();
2026
}
2027

    
2028
void OPPROTO op_POWER_mulo (void)
2029
{
2030
    do_POWER_mulo();
2031
    RETURN();
2032
}
2033

    
2034
void OPPROTO op_POWER_nabs (void)
2035
{
2036
    if (T0 > 0)
2037
        T0 = -T0;
2038
    RETURN();
2039
}
2040

    
2041
void OPPROTO op_POWER_nabso (void)
2042
{
2043
    /* nabs never overflows */
2044
    if (T0 > 0)
2045
        T0 = -T0;
2046
    xer_ov = 0;
2047
    RETURN();
2048
}
2049

    
2050
/* XXX: factorise POWER rotates... */
2051
void OPPROTO op_POWER_rlmi (void)
2052
{
2053
    T0 = rotl32(T0, T2) & PARAM1;
2054
    T0 |= T1 & (uint32_t)PARAM2;
2055
    RETURN();
2056
}
2057

    
2058
void OPPROTO op_POWER_rrib (void)
2059
{
2060
    T2 &= 0x1FUL;
2061
    T0 = rotl32(T0 & INT32_MIN, T2);
2062
    T0 |= T1 & ~rotl32(INT32_MIN, T2);
2063
    RETURN();
2064
}
2065

    
2066
void OPPROTO op_POWER_sle (void)
2067
{
2068
    T1 &= 0x1FUL;
2069
    env->spr[SPR_MQ] = rotl32(T0, T1);
2070
    T0 = T0 << T1;
2071
    RETURN();
2072
}
2073

    
2074
void OPPROTO op_POWER_sleq (void)
2075
{
2076
    uint32_t tmp = env->spr[SPR_MQ];
2077

    
2078
    T1 &= 0x1FUL;
2079
    env->spr[SPR_MQ] = rotl32(T0, T1);
2080
    T0 = T0 << T1;
2081
    T0 |= tmp >> (32 - T1);
2082
    RETURN();
2083
}
2084

    
2085
void OPPROTO op_POWER_sllq (void)
2086
{
2087
    uint32_t msk = UINT32_MAX;
2088

    
2089
    msk = msk << (T1 & 0x1FUL);
2090
    if (T1 & 0x20UL)
2091
        msk = ~msk;
2092
    T1 &= 0x1FUL;
2093
    T0 = (T0 << T1) & msk;
2094
    T0 |= env->spr[SPR_MQ] & ~msk;
2095
    RETURN();
2096
}
2097

    
2098
void OPPROTO op_POWER_slq (void)
2099
{
2100
    uint32_t msk = UINT32_MAX, tmp;
2101

    
2102
    msk = msk << (T1 & 0x1FUL);
2103
    if (T1 & 0x20UL)
2104
        msk = ~msk;
2105
    T1 &= 0x1FUL;
2106
    tmp = rotl32(T0, T1);
2107
    T0 = tmp & msk;
2108
    env->spr[SPR_MQ] = tmp;
2109
    RETURN();
2110
}
2111

    
2112
void OPPROTO op_POWER_sraq (void)
2113
{
2114
    env->spr[SPR_MQ] = rotl32(T0, 32 - (T1 & 0x1FUL));
2115
    if (T1 & 0x20UL)
2116
        T0 = UINT32_MAX;
2117
    else
2118
        T0 = (int32_t)T0 >> T1;
2119
    RETURN();
2120
}
2121

    
2122
void OPPROTO op_POWER_sre (void)
2123
{
2124
    T1 &= 0x1FUL;
2125
    env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2126
    T0 = (int32_t)T0 >> T1;
2127
    RETURN();
2128
}
2129

    
2130
void OPPROTO op_POWER_srea (void)
2131
{
2132
    T1 &= 0x1FUL;
2133
    env->spr[SPR_MQ] = T0 >> T1;
2134
    T0 = (int32_t)T0 >> T1;
2135
    RETURN();
2136
}
2137

    
2138
void OPPROTO op_POWER_sreq (void)
2139
{
2140
    uint32_t tmp;
2141
    int32_t msk;
2142

    
2143
    T1 &= 0x1FUL;
2144
    msk = INT32_MIN >> T1;
2145
    tmp = env->spr[SPR_MQ];
2146
    env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2147
    T0 = T0 >> T1;
2148
    T0 |= tmp & msk;
2149
    RETURN();
2150
}
2151

    
2152
void OPPROTO op_POWER_srlq (void)
2153
{
2154
    uint32_t tmp;
2155
    int32_t msk;
2156

    
2157
    msk = INT32_MIN >> (T1 & 0x1FUL);
2158
    if (T1 & 0x20UL)
2159
        msk = ~msk;
2160
    T1 &= 0x1FUL;
2161
    tmp = env->spr[SPR_MQ];
2162
    env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2163
    T0 = T0 >> T1;
2164
    T0 &= msk;
2165
    T0 |= tmp & ~msk;
2166
    RETURN();
2167
}
2168

    
2169
void OPPROTO op_POWER_srq (void)
2170
{
2171
    T1 &= 0x1FUL;
2172
    env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2173
    T0 = T0 >> T1;
2174
    RETURN();
2175
}
2176

    
2177
/* POWER instructions not implemented in PowerPC 601 */
2178
#if !defined(CONFIG_USER_ONLY)
2179
void OPPROTO op_POWER_mfsri (void)
2180
{
2181
    T1 = T0 >> 28;
2182
    T0 = env->sr[T1];
2183
    RETURN();
2184
}
2185

    
2186
void OPPROTO op_POWER_rac (void)
2187
{
2188
    do_POWER_rac();
2189
    RETURN();
2190
}
2191

    
2192
void OPPROTO op_POWER_rfsvc (void)
2193
{
2194
    do_POWER_rfsvc();
2195
    RETURN();
2196
}
2197
#endif
2198

    
2199
/* PowerPC 602 specific instruction */
2200
#if !defined(CONFIG_USER_ONLY)
2201
void OPPROTO op_602_mfrom (void)
2202
{
2203
    do_op_602_mfrom();
2204
    RETURN();
2205
}
2206
#endif
2207

    
2208
/* PowerPC 4xx specific micro-ops */
2209
void OPPROTO op_405_add_T0_T2 (void)
2210
{
2211
    T0 = (int32_t)T0 + (int32_t)T2;
2212
    RETURN();
2213
}
2214

    
2215
void OPPROTO op_405_mulchw (void)
2216
{
2217
    T0 = ((int16_t)T0) * ((int16_t)(T1 >> 16));
2218
    RETURN();
2219
}
2220

    
2221
void OPPROTO op_405_mulchwu (void)
2222
{
2223
    T0 = ((uint16_t)T0) * ((uint16_t)(T1 >> 16));
2224
    RETURN();
2225
}
2226

    
2227
void OPPROTO op_405_mulhhw (void)
2228
{
2229
    T0 = ((int16_t)(T0 >> 16)) * ((int16_t)(T1 >> 16));
2230
    RETURN();
2231
}
2232

    
2233
void OPPROTO op_405_mulhhwu (void)
2234
{
2235
    T0 = ((uint16_t)(T0 >> 16)) * ((uint16_t)(T1 >> 16));
2236
    RETURN();
2237
}
2238

    
2239
void OPPROTO op_405_mullhw (void)
2240
{
2241
    T0 = ((int16_t)T0) * ((int16_t)T1);
2242
    RETURN();
2243
}
2244

    
2245
void OPPROTO op_405_mullhwu (void)
2246
{
2247
    T0 = ((uint16_t)T0) * ((uint16_t)T1);
2248
    RETURN();
2249
}
2250

    
2251
void OPPROTO op_405_check_sat (void)
2252
{
2253
    do_405_check_sat();
2254
    RETURN();
2255
}
2256

    
2257
void OPPROTO op_405_check_ovu (void)
2258
{
2259
    if (likely(T0 >= T2)) {
2260
        xer_ov = 0;
2261
    } else {
2262
        xer_ov = 1;
2263
        xer_so = 1;
2264
    }
2265
    RETURN();
2266
}
2267

    
2268
void OPPROTO op_405_check_satu (void)
2269
{
2270
    if (unlikely(T0 < T2)) {
2271
        /* Saturate result */
2272
        T0 = UINT32_MAX;
2273
    }
2274
    RETURN();
2275
}
2276

    
2277
void OPPROTO op_load_dcr (void)
2278
{
2279
    do_load_dcr();
2280
    RETURN();
2281
}
2282

    
2283
void OPPROTO op_store_dcr (void)
2284
{
2285
    do_store_dcr();
2286
    RETURN();
2287
}
2288

    
2289
#if !defined(CONFIG_USER_ONLY)
2290
/* Return from critical interrupt :
2291
 * same as rfi, except nip & MSR are loaded from SRR2/3 instead of SRR0/1
2292
 */
2293
void OPPROTO op_40x_rfci (void)
2294
{
2295
    do_40x_rfci();
2296
    RETURN();
2297
}
2298

    
2299
void OPPROTO op_rfci (void)
2300
{
2301
    do_rfci();
2302
    RETURN();
2303
}
2304

    
2305
void OPPROTO op_rfdi (void)
2306
{
2307
    do_rfdi();
2308
    RETURN();
2309
}
2310

    
2311
void OPPROTO op_rfmci (void)
2312
{
2313
    do_rfmci();
2314
    RETURN();
2315
}
2316

    
2317
void OPPROTO op_wrte (void)
2318
{
2319
    /* We don't call do_store_msr here as we won't trigger
2320
     * any special case nor change hflags
2321
     */
2322
    T0 &= 1 << MSR_EE;
2323
    env->msr &= ~(1 << MSR_EE);
2324
    env->msr |= T0;
2325
    RETURN();
2326
}
2327

    
2328
void OPPROTO op_440_tlbre (void)
2329
{
2330
    do_440_tlbre(PARAM1);
2331
    RETURN();
2332
}
2333

    
2334
void OPPROTO op_440_tlbsx (void)
2335
{
2336
    T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_440_MMUCR] & 0xFF);
2337
    RETURN();
2338
}
2339

    
2340
void OPPROTO op_4xx_tlbsx_check (void)
2341
{
2342
    int tmp;
2343

    
2344
    tmp = xer_so;
2345
    if ((int)T0 != -1)
2346
        tmp |= 0x02;
2347
    env->crf[0] = tmp;
2348
    RETURN();
2349
}
2350

    
2351
void OPPROTO op_440_tlbwe (void)
2352
{
2353
    do_440_tlbwe(PARAM1);
2354
    RETURN();
2355
}
2356

    
2357
void OPPROTO op_4xx_tlbre_lo (void)
2358
{
2359
    do_4xx_tlbre_lo();
2360
    RETURN();
2361
}
2362

    
2363
void OPPROTO op_4xx_tlbre_hi (void)
2364
{
2365
    do_4xx_tlbre_hi();
2366
    RETURN();
2367
}
2368

    
2369
void OPPROTO op_4xx_tlbsx (void)
2370
{
2371
    T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_40x_PID]);
2372
    RETURN();
2373
}
2374

    
2375
void OPPROTO op_4xx_tlbwe_lo (void)
2376
{
2377
    do_4xx_tlbwe_lo();
2378
    RETURN();
2379
}
2380

    
2381
void OPPROTO op_4xx_tlbwe_hi (void)
2382
{
2383
    do_4xx_tlbwe_hi();
2384
    RETURN();
2385
}
2386
#endif
2387

    
2388
/* SPR micro-ops */
2389
/* 440 specific */
2390
void OPPROTO op_440_dlmzb (void)
2391
{
2392
    do_440_dlmzb();
2393
    RETURN();
2394
}
2395

    
2396
void OPPROTO op_440_dlmzb_update_Rc (void)
2397
{
2398
    if (T0 == 8)
2399
        T0 = 0x2;
2400
    else if (T0 < 4)
2401
        T0 = 0x4;
2402
    else
2403
        T0 = 0x8;
2404
    RETURN();
2405
}
2406

    
2407
#if !defined(CONFIG_USER_ONLY)
2408
void OPPROTO op_store_pir (void)
2409
{
2410
    env->spr[SPR_PIR] = T0 & 0x0000000FUL;
2411
    RETURN();
2412
}
2413

    
2414
void OPPROTO op_load_403_pb (void)
2415
{
2416
    do_load_403_pb(PARAM1);
2417
    RETURN();
2418
}
2419

    
2420
void OPPROTO op_store_403_pb (void)
2421
{
2422
    do_store_403_pb(PARAM1);
2423
    RETURN();
2424
}
2425

    
2426
void OPPROTO op_load_40x_pit (void)
2427
{
2428
    T0 = load_40x_pit(env);
2429
    RETURN();
2430
}
2431

    
2432
void OPPROTO op_store_40x_pit (void)
2433
{
2434
    store_40x_pit(env, T0);
2435
    RETURN();
2436
}
2437

    
2438
void OPPROTO op_store_40x_dbcr0 (void)
2439
{
2440
    store_40x_dbcr0(env, T0);
2441
    RETURN();
2442
}
2443

    
2444
void OPPROTO op_store_40x_sler (void)
2445
{
2446
    store_40x_sler(env, T0);
2447
    RETURN();
2448
}
2449

    
2450
void OPPROTO op_store_booke_tcr (void)
2451
{
2452
    store_booke_tcr(env, T0);
2453
    RETURN();
2454
}
2455

    
2456
void OPPROTO op_store_booke_tsr (void)
2457
{
2458
    store_booke_tsr(env, T0);
2459
    RETURN();
2460
}
2461
#endif /* !defined(CONFIG_USER_ONLY) */
2462

    
2463
/* SPE extension */
2464
void OPPROTO op_splatw_T1_64 (void)
2465
{
2466
    T1_64 = (T1_64 << 32) | (T1_64 & 0x00000000FFFFFFFFULL);
2467
    RETURN();
2468
}
2469

    
2470
void OPPROTO op_splatwi_T0_64 (void)
2471
{
2472
    uint64_t tmp = PARAM1;
2473

    
2474
    T0_64 = (tmp << 32) | tmp;
2475
    RETURN();
2476
}
2477

    
2478
void OPPROTO op_splatwi_T1_64 (void)
2479
{
2480
    uint64_t tmp = PARAM1;
2481

    
2482
    T1_64 = (tmp << 32) | tmp;
2483
    RETURN();
2484
}
2485

    
2486
void OPPROTO op_extsh_T1_64 (void)
2487
{
2488
    T1_64 = (int32_t)((int16_t)T1_64);
2489
    RETURN();
2490
}
2491

    
2492
void OPPROTO op_sli16_T1_64 (void)
2493
{
2494
    T1_64 = T1_64 << 16;
2495
    RETURN();
2496
}
2497

    
2498
void OPPROTO op_sli32_T1_64 (void)
2499
{
2500
    T1_64 = T1_64 << 32;
2501
    RETURN();
2502
}
2503

    
2504
void OPPROTO op_srli32_T1_64 (void)
2505
{
2506
    T1_64 = T1_64 >> 32;
2507
    RETURN();
2508
}
2509

    
2510
void OPPROTO op_evsel (void)
2511
{
2512
    do_evsel();
2513
    RETURN();
2514
}
2515

    
2516
void OPPROTO op_evaddw (void)
2517
{
2518
    do_evaddw();
2519
    RETURN();
2520
}
2521

    
2522
void OPPROTO op_evsubfw (void)
2523
{
2524
    do_evsubfw();
2525
    RETURN();
2526
}
2527

    
2528
void OPPROTO op_evneg (void)
2529
{
2530
    do_evneg();
2531
    RETURN();
2532
}
2533

    
2534
void OPPROTO op_evabs (void)
2535
{
2536
    do_evabs();
2537
    RETURN();
2538
}
2539

    
2540
void OPPROTO op_evextsh (void)
2541
{
2542
    T0_64 = ((uint64_t)((int32_t)(int16_t)(T0_64 >> 32)) << 32) |
2543
        (uint64_t)((int32_t)(int16_t)T0_64);
2544
    RETURN();
2545
}
2546

    
2547
void OPPROTO op_evextsb (void)
2548
{
2549
    T0_64 = ((uint64_t)((int32_t)(int8_t)(T0_64 >> 32)) << 32) |
2550
        (uint64_t)((int32_t)(int8_t)T0_64);
2551
    RETURN();
2552
}
2553

    
2554
void OPPROTO op_evcntlzw (void)
2555
{
2556
    do_evcntlzw();
2557
    RETURN();
2558
}
2559

    
2560
void OPPROTO op_evrndw (void)
2561
{
2562
    do_evrndw();
2563
    RETURN();
2564
}
2565

    
2566
void OPPROTO op_brinc (void)
2567
{
2568
    do_brinc();
2569
    RETURN();
2570
}
2571

    
2572
void OPPROTO op_evcntlsw (void)
2573
{
2574
    do_evcntlsw();
2575
    RETURN();
2576
}
2577

    
2578
void OPPROTO op_evand (void)
2579
{
2580
    T0_64 &= T1_64;
2581
    RETURN();
2582
}
2583

    
2584
void OPPROTO op_evandc (void)
2585
{
2586
    T0_64 &= ~T1_64;
2587
    RETURN();
2588
}
2589

    
2590
void OPPROTO op_evor (void)
2591
{
2592
    T0_64 |= T1_64;
2593
    RETURN();
2594
}
2595

    
2596
void OPPROTO op_evxor (void)
2597
{
2598
    T0_64 ^= T1_64;
2599
    RETURN();
2600
}
2601

    
2602
void OPPROTO op_eveqv (void)
2603
{
2604
    T0_64 = ~(T0_64 ^ T1_64);
2605
    RETURN();
2606
}
2607

    
2608
void OPPROTO op_evnor (void)
2609
{
2610
    T0_64 = ~(T0_64 | T1_64);
2611
    RETURN();
2612
}
2613

    
2614
void OPPROTO op_evorc (void)
2615
{
2616
    T0_64 |= ~T1_64;
2617
    RETURN();
2618
}
2619

    
2620
void OPPROTO op_evnand (void)
2621
{
2622
    T0_64 = ~(T0_64 & T1_64);
2623
    RETURN();
2624
}
2625

    
2626
void OPPROTO op_evsrws (void)
2627
{
2628
    do_evsrws();
2629
    RETURN();
2630
}
2631

    
2632
void OPPROTO op_evsrwu (void)
2633
{
2634
    do_evsrwu();
2635
    RETURN();
2636
}
2637

    
2638
void OPPROTO op_evslw (void)
2639
{
2640
    do_evslw();
2641
    RETURN();
2642
}
2643

    
2644
void OPPROTO op_evrlw (void)
2645
{
2646
    do_evrlw();
2647
    RETURN();
2648
}
2649

    
2650
void OPPROTO op_evmergelo (void)
2651
{
2652
    T0_64 = (T0_64 << 32) | (T1_64 & 0x00000000FFFFFFFFULL);
2653
    RETURN();
2654
}
2655

    
2656
void OPPROTO op_evmergehi (void)
2657
{
2658
    T0_64 = (T0_64 & 0xFFFFFFFF00000000ULL) | (T1_64 >> 32);
2659
    RETURN();
2660
}
2661

    
2662
void OPPROTO op_evmergelohi (void)
2663
{
2664
    T0_64 = (T0_64 << 32) | (T1_64 >> 32);
2665
    RETURN();
2666
}
2667

    
2668
void OPPROTO op_evmergehilo (void)
2669
{
2670
    T0_64 = (T0_64 & 0xFFFFFFFF00000000ULL) | (T1_64 & 0x00000000FFFFFFFFULL);
2671
    RETURN();
2672
}
2673

    
2674
void OPPROTO op_evcmpgts (void)
2675
{
2676
    do_evcmpgts();
2677
    RETURN();
2678
}
2679

    
2680
void OPPROTO op_evcmpgtu (void)
2681
{
2682
    do_evcmpgtu();
2683
    RETURN();
2684
}
2685

    
2686
void OPPROTO op_evcmplts (void)
2687
{
2688
    do_evcmplts();
2689
    RETURN();
2690
}
2691

    
2692
void OPPROTO op_evcmpltu (void)
2693
{
2694
    do_evcmpltu();
2695
    RETURN();
2696
}
2697

    
2698
void OPPROTO op_evcmpeq (void)
2699
{
2700
    do_evcmpeq();
2701
    RETURN();
2702
}
2703

    
2704
void OPPROTO op_evfssub (void)
2705
{
2706
    do_evfssub();
2707
    RETURN();
2708
}
2709

    
2710
void OPPROTO op_evfsadd (void)
2711
{
2712
    do_evfsadd();
2713
    RETURN();
2714
}
2715

    
2716
void OPPROTO op_evfsnabs (void)
2717
{
2718
    do_evfsnabs();
2719
    RETURN();
2720
}
2721

    
2722
void OPPROTO op_evfsabs (void)
2723
{
2724
    do_evfsabs();
2725
    RETURN();
2726
}
2727

    
2728
void OPPROTO op_evfsneg (void)
2729
{
2730
    do_evfsneg();
2731
    RETURN();
2732
}
2733

    
2734
void OPPROTO op_evfsdiv (void)
2735
{
2736
    do_evfsdiv();
2737
    RETURN();
2738
}
2739

    
2740
void OPPROTO op_evfsmul (void)
2741
{
2742
    do_evfsmul();
2743
    RETURN();
2744
}
2745

    
2746
void OPPROTO op_evfscmplt (void)
2747
{
2748
    do_evfscmplt();
2749
    RETURN();
2750
}
2751

    
2752
void OPPROTO op_evfscmpgt (void)
2753
{
2754
    do_evfscmpgt();
2755
    RETURN();
2756
}
2757

    
2758
void OPPROTO op_evfscmpeq (void)
2759
{
2760
    do_evfscmpeq();
2761
    RETURN();
2762
}
2763

    
2764
void OPPROTO op_evfscfsi (void)
2765
{
2766
    do_evfscfsi();
2767
    RETURN();
2768
}
2769

    
2770
void OPPROTO op_evfscfui (void)
2771
{
2772
    do_evfscfui();
2773
    RETURN();
2774
}
2775

    
2776
void OPPROTO op_evfscfsf (void)
2777
{
2778
    do_evfscfsf();
2779
    RETURN();
2780
}
2781

    
2782
void OPPROTO op_evfscfuf (void)
2783
{
2784
    do_evfscfuf();
2785
    RETURN();
2786
}
2787

    
2788
void OPPROTO op_evfsctsi (void)
2789
{
2790
    do_evfsctsi();
2791
    RETURN();
2792
}
2793

    
2794
void OPPROTO op_evfsctui (void)
2795
{
2796
    do_evfsctui();
2797
    RETURN();
2798
}
2799

    
2800
void OPPROTO op_evfsctsf (void)
2801
{
2802
    do_evfsctsf();
2803
    RETURN();
2804
}
2805

    
2806
void OPPROTO op_evfsctuf (void)
2807
{
2808
    do_evfsctuf();
2809
    RETURN();
2810
}
2811

    
2812
void OPPROTO op_evfsctuiz (void)
2813
{
2814
    do_evfsctuiz();
2815
    RETURN();
2816
}
2817

    
2818
void OPPROTO op_evfsctsiz (void)
2819
{
2820
    do_evfsctsiz();
2821
    RETURN();
2822
}
2823

    
2824
void OPPROTO op_evfststlt (void)
2825
{
2826
    do_evfststlt();
2827
    RETURN();
2828
}
2829

    
2830
void OPPROTO op_evfststgt (void)
2831
{
2832
    do_evfststgt();
2833
    RETURN();
2834
}
2835

    
2836
void OPPROTO op_evfststeq (void)
2837
{
2838
    do_evfststeq();
2839
    RETURN();
2840
}
2841

    
2842
void OPPROTO op_efssub (void)
2843
{
2844
    T0_64 = _do_efssub(T0_64, T1_64);
2845
    RETURN();
2846
}
2847

    
2848
void OPPROTO op_efsadd (void)
2849
{
2850
    T0_64 = _do_efsadd(T0_64, T1_64);
2851
    RETURN();
2852
}
2853

    
2854
void OPPROTO op_efsnabs (void)
2855
{
2856
    T0_64 = _do_efsnabs(T0_64);
2857
    RETURN();
2858
}
2859

    
2860
void OPPROTO op_efsabs (void)
2861
{
2862
    T0_64 = _do_efsabs(T0_64);
2863
    RETURN();
2864
}
2865

    
2866
void OPPROTO op_efsneg (void)
2867
{
2868
    T0_64 = _do_efsneg(T0_64);
2869
    RETURN();
2870
}
2871

    
2872
void OPPROTO op_efsdiv (void)
2873
{
2874
    T0_64 = _do_efsdiv(T0_64, T1_64);
2875
    RETURN();
2876
}
2877

    
2878
void OPPROTO op_efsmul (void)
2879
{
2880
    T0_64 = _do_efsmul(T0_64, T1_64);
2881
    RETURN();
2882
}
2883

    
2884
void OPPROTO op_efscmplt (void)
2885
{
2886
    do_efscmplt();
2887
    RETURN();
2888
}
2889

    
2890
void OPPROTO op_efscmpgt (void)
2891
{
2892
    do_efscmpgt();
2893
    RETURN();
2894
}
2895

    
2896
void OPPROTO op_efscfd (void)
2897
{
2898
    do_efscfd();
2899
    RETURN();
2900
}
2901

    
2902
void OPPROTO op_efscmpeq (void)
2903
{
2904
    do_efscmpeq();
2905
    RETURN();
2906
}
2907

    
2908
void OPPROTO op_efscfsi (void)
2909
{
2910
    do_efscfsi();
2911
    RETURN();
2912
}
2913

    
2914
void OPPROTO op_efscfui (void)
2915
{
2916
    do_efscfui();
2917
    RETURN();
2918
}
2919

    
2920
void OPPROTO op_efscfsf (void)
2921
{
2922
    do_efscfsf();
2923
    RETURN();
2924
}
2925

    
2926
void OPPROTO op_efscfuf (void)
2927
{
2928
    do_efscfuf();
2929
    RETURN();
2930
}
2931

    
2932
void OPPROTO op_efsctsi (void)
2933
{
2934
    do_efsctsi();
2935
    RETURN();
2936
}
2937

    
2938
void OPPROTO op_efsctui (void)
2939
{
2940
    do_efsctui();
2941
    RETURN();
2942
}
2943

    
2944
void OPPROTO op_efsctsf (void)
2945
{
2946
    do_efsctsf();
2947
    RETURN();
2948
}
2949

    
2950
void OPPROTO op_efsctuf (void)
2951
{
2952
    do_efsctuf();
2953
    RETURN();
2954
}
2955

    
2956
void OPPROTO op_efsctsiz (void)
2957
{
2958
    do_efsctsiz();
2959
    RETURN();
2960
}
2961

    
2962
void OPPROTO op_efsctuiz (void)
2963
{
2964
    do_efsctuiz();
2965
    RETURN();
2966
}
2967

    
2968
void OPPROTO op_efststlt (void)
2969
{
2970
    T0 = _do_efststlt(T0_64, T1_64);
2971
    RETURN();
2972
}
2973

    
2974
void OPPROTO op_efststgt (void)
2975
{
2976
    T0 = _do_efststgt(T0_64, T1_64);
2977
    RETURN();
2978
}
2979

    
2980
void OPPROTO op_efststeq (void)
2981
{
2982
    T0 = _do_efststeq(T0_64, T1_64);
2983
    RETURN();
2984
}
2985

    
2986
void OPPROTO op_efdsub (void)
2987
{
2988
    CPU_DoubleU u1, u2;
2989
    u1.ll = T0_64;
2990
    u2.ll = T1_64;
2991
    u1.d = float64_sub(u1.d, u2.d, &env->spe_status);
2992
    T0_64 = u1.ll;
2993
    RETURN();
2994
}
2995

    
2996
void OPPROTO op_efdadd (void)
2997
{
2998
    CPU_DoubleU u1, u2;
2999
    u1.ll = T0_64;
3000
    u2.ll = T1_64;
3001
    u1.d = float64_add(u1.d, u2.d, &env->spe_status);
3002
    T0_64 = u1.ll;
3003
    RETURN();
3004
}
3005

    
3006
void OPPROTO op_efdcfsid (void)
3007
{
3008
    do_efdcfsi();
3009
    RETURN();
3010
}
3011

    
3012
void OPPROTO op_efdcfuid (void)
3013
{
3014
    do_efdcfui();
3015
    RETURN();
3016
}
3017

    
3018
void OPPROTO op_efdnabs (void)
3019
{
3020
    T0_64 |= 0x8000000000000000ULL;
3021
    RETURN();
3022
}
3023

    
3024
void OPPROTO op_efdabs (void)
3025
{
3026
    T0_64 &= ~0x8000000000000000ULL;
3027
    RETURN();
3028
}
3029

    
3030
void OPPROTO op_efdneg (void)
3031
{
3032
    T0_64 ^= 0x8000000000000000ULL;
3033
    RETURN();
3034
}
3035

    
3036
void OPPROTO op_efddiv (void)
3037
{
3038
    CPU_DoubleU u1, u2;
3039
    u1.ll = T0_64;
3040
    u2.ll = T1_64;
3041
    u1.d = float64_div(u1.d, u2.d, &env->spe_status);
3042
    T0_64 = u1.ll;
3043
    RETURN();
3044
}
3045

    
3046
void OPPROTO op_efdmul (void)
3047
{
3048
    CPU_DoubleU u1, u2;
3049
    u1.ll = T0_64;
3050
    u2.ll = T1_64;
3051
    u1.d = float64_mul(u1.d, u2.d, &env->spe_status);
3052
    T0_64 = u1.ll;
3053
    RETURN();
3054
}
3055

    
3056
void OPPROTO op_efdctsidz (void)
3057
{
3058
    do_efdctsiz();
3059
    RETURN();
3060
}
3061

    
3062
void OPPROTO op_efdctuidz (void)
3063
{
3064
    do_efdctuiz();
3065
    RETURN();
3066
}
3067

    
3068
void OPPROTO op_efdcmplt (void)
3069
{
3070
    do_efdcmplt();
3071
    RETURN();
3072
}
3073

    
3074
void OPPROTO op_efdcmpgt (void)
3075
{
3076
    do_efdcmpgt();
3077
    RETURN();
3078
}
3079

    
3080
void OPPROTO op_efdcfs (void)
3081
{
3082
    do_efdcfs();
3083
    RETURN();
3084
}
3085

    
3086
void OPPROTO op_efdcmpeq (void)
3087
{
3088
    do_efdcmpeq();
3089
    RETURN();
3090
}
3091

    
3092
void OPPROTO op_efdcfsi (void)
3093
{
3094
    do_efdcfsi();
3095
    RETURN();
3096
}
3097

    
3098
void OPPROTO op_efdcfui (void)
3099
{
3100
    do_efdcfui();
3101
    RETURN();
3102
}
3103

    
3104
void OPPROTO op_efdcfsf (void)
3105
{
3106
    do_efdcfsf();
3107
    RETURN();
3108
}
3109

    
3110
void OPPROTO op_efdcfuf (void)
3111
{
3112
    do_efdcfuf();
3113
    RETURN();
3114
}
3115

    
3116
void OPPROTO op_efdctsi (void)
3117
{
3118
    do_efdctsi();
3119
    RETURN();
3120
}
3121

    
3122
void OPPROTO op_efdctui (void)
3123
{
3124
    do_efdctui();
3125
    RETURN();
3126
}
3127

    
3128
void OPPROTO op_efdctsf (void)
3129
{
3130
    do_efdctsf();
3131
    RETURN();
3132
}
3133

    
3134
void OPPROTO op_efdctuf (void)
3135
{
3136
    do_efdctuf();
3137
    RETURN();
3138
}
3139

    
3140
void OPPROTO op_efdctuiz (void)
3141
{
3142
    do_efdctuiz();
3143
    RETURN();
3144
}
3145

    
3146
void OPPROTO op_efdctsiz (void)
3147
{
3148
    do_efdctsiz();
3149
    RETURN();
3150
}
3151

    
3152
void OPPROTO op_efdtstlt (void)
3153
{
3154
    T0 = _do_efdtstlt(T0_64, T1_64);
3155
    RETURN();
3156
}
3157

    
3158
void OPPROTO op_efdtstgt (void)
3159
{
3160
    T0 = _do_efdtstgt(T0_64, T1_64);
3161
    RETURN();
3162
}
3163

    
3164
void OPPROTO op_efdtsteq (void)
3165
{
3166
    T0 = _do_efdtsteq(T0_64, T1_64);
3167
    RETURN();
3168
}