Statistics
| Branch: | Revision:

root / target-ppc / op.c @ 47e4661c

History | View | Annotate | Download (47.7 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_update_nip (void)
50
{
51
    env->nip = (uint32_t)PARAM1;
52
    RETURN();
53
}
54

    
55
#if defined(TARGET_PPC64)
56
void OPPROTO op_update_nip_64 (void)
57
{
58
    env->nip = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
59
    RETURN();
60
}
61
#endif
62

    
63
void OPPROTO op_debug (void)
64
{
65
    do_raise_exception(EXCP_DEBUG);
66
}
67

    
68
/* Load/store special registers */
69
void OPPROTO op_load_cr (void)
70
{
71
    do_load_cr();
72
    RETURN();
73
}
74

    
75
void OPPROTO op_store_cr (void)
76
{
77
    do_store_cr(PARAM1);
78
    RETURN();
79
}
80

    
81
void OPPROTO op_load_xer_cr (void)
82
{
83
    T0 = (xer_so << 3) | (xer_ov << 2) | (xer_ca << 1);
84
    RETURN();
85
}
86

    
87
void OPPROTO op_clear_xer_ov (void)
88
{
89
    xer_so = 0;
90
    xer_ov = 0;
91
    RETURN();
92
}
93

    
94
void OPPROTO op_clear_xer_ca (void)
95
{
96
    xer_ca = 0;
97
    RETURN();
98
}
99

    
100
void OPPROTO op_load_xer_bc (void)
101
{
102
    T1 = xer_bc;
103
    RETURN();
104
}
105

    
106
void OPPROTO op_store_xer_bc (void)
107
{
108
    xer_bc = T0;
109
    RETURN();
110
}
111

    
112
void OPPROTO op_load_xer (void)
113
{
114
    T0 = hreg_load_xer(env);
115
    RETURN();
116
}
117

    
118
void OPPROTO op_store_xer (void)
119
{
120
    hreg_store_xer(env, T0);
121
    RETURN();
122
}
123

    
124
#if defined(TARGET_PPC64)
125
void OPPROTO op_store_pri (void)
126
{
127
    do_store_pri(PARAM1);
128
    RETURN();
129
}
130
#endif
131

    
132
#if !defined(CONFIG_USER_ONLY)
133
/* Segment registers load and store */
134
void OPPROTO op_load_sr (void)
135
{
136
    T0 = env->sr[T1];
137
    RETURN();
138
}
139

    
140
void OPPROTO op_store_sr (void)
141
{
142
    do_store_sr(env, T1, T0);
143
    RETURN();
144
}
145

    
146
#if defined(TARGET_PPC64)
147
void OPPROTO op_load_slb (void)
148
{
149
    T0 = ppc_load_slb(env, T1);
150
    RETURN();
151
}
152

    
153
void OPPROTO op_store_slb (void)
154
{
155
    ppc_store_slb(env, T1, T0);
156
    RETURN();
157
}
158
#endif /* defined(TARGET_PPC64) */
159

    
160
void OPPROTO op_load_sdr1 (void)
161
{
162
    T0 = env->sdr1;
163
    RETURN();
164
}
165

    
166
void OPPROTO op_store_sdr1 (void)
167
{
168
    do_store_sdr1(env, T0);
169
    RETURN();
170
}
171

    
172
#if defined (TARGET_PPC64)
173
void OPPROTO op_load_asr (void)
174
{
175
    T0 = env->asr;
176
    RETURN();
177
}
178

    
179
void OPPROTO op_store_asr (void)
180
{
181
    ppc_store_asr(env, T0);
182
    RETURN();
183
}
184
#endif
185

    
186
void OPPROTO op_load_msr (void)
187
{
188
    T0 = env->msr;
189
    RETURN();
190
}
191

    
192
void OPPROTO op_store_msr (void)
193
{
194
    do_store_msr();
195
    RETURN();
196
}
197

    
198
#if defined (TARGET_PPC64)
199
void OPPROTO op_store_msr_32 (void)
200
{
201
    T0 = (env->msr & ~0xFFFFFFFFULL) | (T0 & 0xFFFFFFFF);
202
    do_store_msr();
203
    RETURN();
204
}
205
#endif
206

    
207
void OPPROTO op_update_riee (void)
208
{
209
    /* We don't call do_store_msr here as we won't trigger
210
     * any special case nor change hflags
211
     */
212
    T0 &= (1 << MSR_RI) | (1 << MSR_EE);
213
    env->msr &= ~(1 << MSR_RI) | (1 << MSR_EE);
214
    env->msr |= T0;
215
    RETURN();
216
}
217
#endif
218

    
219
/* SPR */
220
void OPPROTO op_load_spr (void)
221
{
222
    T0 = env->spr[PARAM1];
223
    RETURN();
224
}
225

    
226
void OPPROTO op_store_spr (void)
227
{
228
    env->spr[PARAM1] = T0;
229
    RETURN();
230
}
231

    
232
void OPPROTO op_load_dump_spr (void)
233
{
234
    T0 = ppc_load_dump_spr(PARAM1);
235
    RETURN();
236
}
237

    
238
void OPPROTO op_store_dump_spr (void)
239
{
240
    ppc_store_dump_spr(PARAM1, T0);
241
    RETURN();
242
}
243

    
244
void OPPROTO op_mask_spr (void)
245
{
246
    env->spr[PARAM1] &= ~T0;
247
    RETURN();
248
}
249

    
250
void OPPROTO op_load_lr (void)
251
{
252
    T0 = env->lr;
253
    RETURN();
254
}
255

    
256
void OPPROTO op_store_lr (void)
257
{
258
    env->lr = T0;
259
    RETURN();
260
}
261

    
262
void OPPROTO op_load_ctr (void)
263
{
264
    T0 = env->ctr;
265
    RETURN();
266
}
267

    
268
void OPPROTO op_store_ctr (void)
269
{
270
    env->ctr = T0;
271
    RETURN();
272
}
273

    
274
void OPPROTO op_load_tbl (void)
275
{
276
    T0 = cpu_ppc_load_tbl(env);
277
    RETURN();
278
}
279

    
280
void OPPROTO op_load_tbu (void)
281
{
282
    T0 = cpu_ppc_load_tbu(env);
283
    RETURN();
284
}
285

    
286
void OPPROTO op_load_atbl (void)
287
{
288
    T0 = cpu_ppc_load_atbl(env);
289
    RETURN();
290
}
291

    
292
void OPPROTO op_load_atbu (void)
293
{
294
    T0 = cpu_ppc_load_atbu(env);
295
    RETURN();
296
}
297

    
298
#if !defined(CONFIG_USER_ONLY)
299
void OPPROTO op_store_tbl (void)
300
{
301
    cpu_ppc_store_tbl(env, T0);
302
    RETURN();
303
}
304

    
305
void OPPROTO op_store_tbu (void)
306
{
307
    cpu_ppc_store_tbu(env, T0);
308
    RETURN();
309
}
310

    
311
void OPPROTO op_store_atbl (void)
312
{
313
    cpu_ppc_store_atbl(env, T0);
314
    RETURN();
315
}
316

    
317
void OPPROTO op_store_atbu (void)
318
{
319
    cpu_ppc_store_atbu(env, T0);
320
    RETURN();
321
}
322

    
323
void OPPROTO op_load_decr (void)
324
{
325
    T0 = cpu_ppc_load_decr(env);
326
    RETURN();
327
}
328

    
329
void OPPROTO op_store_decr (void)
330
{
331
    cpu_ppc_store_decr(env, T0);
332
    RETURN();
333
}
334

    
335
void OPPROTO op_load_ibat (void)
336
{
337
    T0 = env->IBAT[PARAM1][PARAM2];
338
    RETURN();
339
}
340

    
341
void OPPROTO op_store_ibatu (void)
342
{
343
    do_store_ibatu(env, PARAM1, T0);
344
    RETURN();
345
}
346

    
347
void OPPROTO op_store_ibatl (void)
348
{
349
#if 1
350
    env->IBAT[1][PARAM1] = T0;
351
#else
352
    do_store_ibatl(env, PARAM1, T0);
353
#endif
354
    RETURN();
355
}
356

    
357
void OPPROTO op_load_dbat (void)
358
{
359
    T0 = env->DBAT[PARAM1][PARAM2];
360
    RETURN();
361
}
362

    
363
void OPPROTO op_store_dbatu (void)
364
{
365
    do_store_dbatu(env, PARAM1, T0);
366
    RETURN();
367
}
368

    
369
void OPPROTO op_store_dbatl (void)
370
{
371
#if 1
372
    env->DBAT[1][PARAM1] = T0;
373
#else
374
    do_store_dbatl(env, PARAM1, T0);
375
#endif
376
    RETURN();
377
}
378
#endif /* !defined(CONFIG_USER_ONLY) */
379

    
380
/* FPSCR */
381
#ifdef CONFIG_SOFTFLOAT
382
void OPPROTO op_reset_fpstatus (void)
383
{
384
    env->fp_status.float_exception_flags = 0;
385
    RETURN();
386
}
387
#endif
388

    
389
void OPPROTO op_compute_fprf (void)
390
{
391
    do_compute_fprf(PARAM1);
392
    RETURN();
393
}
394

    
395
#ifdef CONFIG_SOFTFLOAT
396
void OPPROTO op_float_check_status (void)
397
{
398
    do_float_check_status();
399
    RETURN();
400
}
401
#else
402
void OPPROTO op_float_check_status (void)
403
{
404
    if (env->exception_index == POWERPC_EXCP_PROGRAM &&
405
        (env->error_code & POWERPC_EXCP_FP)) {
406
        /* Differred floating-point exception after target FPR update */
407
        if (msr_fe0 != 0 || msr_fe1 != 0)
408
            do_raise_exception_err(env->exception_index, env->error_code);
409
    }
410
    RETURN();
411
}
412
#endif
413

    
414
void OPPROTO op_load_fpscr_FT0 (void)
415
{
416
    /* The 32 MSB of the target fpr are undefined.
417
     * They'll be zero...
418
     */
419
    CPU_DoubleU u;
420

    
421
    u.l.upper = 0;
422
    u.l.lower = env->fpscr;
423
    FT0 = u.d;
424
    RETURN();
425
}
426

    
427
void OPPROTO op_set_FT0 (void)
428
{
429
    CPU_DoubleU u;
430

    
431
    u.l.upper = 0;
432
    u.l.lower = PARAM1;
433
    FT0 = u.d;
434
    RETURN();
435
}
436

    
437
void OPPROTO op_load_fpscr_T0 (void)
438
{
439
    T0 = (env->fpscr >> PARAM1) & 0xF;
440
    RETURN();
441
}
442

    
443
void OPPROTO op_load_fpcc (void)
444
{
445
    T0 = fpscr_fpcc;
446
    RETURN();
447
}
448

    
449
void OPPROTO op_fpscr_resetbit (void)
450
{
451
    env->fpscr &= PARAM1;
452
    RETURN();
453
}
454

    
455
void OPPROTO op_fpscr_setbit (void)
456
{
457
    do_fpscr_setbit(PARAM1);
458
    RETURN();
459
}
460

    
461
void OPPROTO op_store_fpscr (void)
462
{
463
    do_store_fpscr(PARAM1);
464
    RETURN();
465
}
466

    
467
/* Branch */
468
#define EIP env->nip
469

    
470
void OPPROTO op_setlr (void)
471
{
472
    env->lr = (uint32_t)PARAM1;
473
    RETURN();
474
}
475

    
476
#if defined (TARGET_PPC64)
477
void OPPROTO op_setlr_64 (void)
478
{
479
    env->lr = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
480
    RETURN();
481
}
482
#endif
483

    
484
void OPPROTO op_b_T1 (void)
485
{
486
    env->nip = (uint32_t)(T1 & ~3);
487
    RETURN();
488
}
489

    
490
#if defined (TARGET_PPC64)
491
void OPPROTO op_b_T1_64 (void)
492
{
493
    env->nip = (uint64_t)(T1 & ~3);
494
    RETURN();
495
}
496
#endif
497

    
498
void OPPROTO op_jz_T0 (void)
499
{
500
    if (!T0)
501
        GOTO_LABEL_PARAM(1);
502
    RETURN();
503
}
504

    
505
void OPPROTO op_btest_T1 (void)
506
{
507
    if (T0) {
508
        env->nip = (uint32_t)(T1 & ~3);
509
    } else {
510
        env->nip = (uint32_t)PARAM1;
511
    }
512
    RETURN();
513
}
514

    
515
#if defined (TARGET_PPC64)
516
void OPPROTO op_btest_T1_64 (void)
517
{
518
    if (T0) {
519
        env->nip = (uint64_t)(T1 & ~3);
520
    } else {
521
        env->nip = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
522
    }
523
    RETURN();
524
}
525
#endif
526

    
527
void OPPROTO op_movl_T1_ctr (void)
528
{
529
    T1 = env->ctr;
530
    RETURN();
531
}
532

    
533
void OPPROTO op_movl_T1_lr (void)
534
{
535
    T1 = env->lr;
536
    RETURN();
537
}
538

    
539
/* tests with result in T0 */
540
void OPPROTO op_test_ctr (void)
541
{
542
    T0 = (uint32_t)env->ctr;
543
    RETURN();
544
}
545

    
546
#if defined(TARGET_PPC64)
547
void OPPROTO op_test_ctr_64 (void)
548
{
549
    T0 = (uint64_t)env->ctr;
550
    RETURN();
551
}
552
#endif
553

    
554
void OPPROTO op_test_ctr_true (void)
555
{
556
    T0 = ((uint32_t)env->ctr != 0 && (T0 & PARAM1) != 0);
557
    RETURN();
558
}
559

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

    
568
void OPPROTO op_test_ctr_false (void)
569
{
570
    T0 = ((uint32_t)env->ctr != 0 && (T0 & PARAM1) == 0);
571
    RETURN();
572
}
573

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

    
582
void OPPROTO op_test_ctrz (void)
583
{
584
    T0 = ((uint32_t)env->ctr == 0);
585
    RETURN();
586
}
587

    
588
#if defined(TARGET_PPC64)
589
void OPPROTO op_test_ctrz_64 (void)
590
{
591
    T0 = ((uint64_t)env->ctr == 0);
592
    RETURN();
593
}
594
#endif
595

    
596
void OPPROTO op_test_ctrz_true (void)
597
{
598
    T0 = ((uint32_t)env->ctr == 0 && (T0 & PARAM1) != 0);
599
    RETURN();
600
}
601

    
602
#if defined(TARGET_PPC64)
603
void OPPROTO op_test_ctrz_true_64 (void)
604
{
605
    T0 = ((uint64_t)env->ctr == 0 && (T0 & PARAM1) != 0);
606
    RETURN();
607
}
608
#endif
609

    
610
void OPPROTO op_test_ctrz_false (void)
611
{
612
    T0 = ((uint32_t)env->ctr == 0 && (T0 & PARAM1) == 0);
613
    RETURN();
614
}
615

    
616
#if defined(TARGET_PPC64)
617
void OPPROTO op_test_ctrz_false_64 (void)
618
{
619
    T0 = ((uint64_t)env->ctr == 0 && (T0 & PARAM1) == 0);
620
    RETURN();
621
}
622
#endif
623

    
624
void OPPROTO op_test_true (void)
625
{
626
    T0 = (T0 & PARAM1);
627
    RETURN();
628
}
629

    
630
void OPPROTO op_test_false (void)
631
{
632
    T0 = ((T0 & PARAM1) == 0);
633
    RETURN();
634
}
635

    
636
/* CTR maintenance */
637
void OPPROTO op_dec_ctr (void)
638
{
639
    env->ctr--;
640
    RETURN();
641
}
642

    
643
/***                           Integer arithmetic                          ***/
644
/* add */
645
void OPPROTO op_add (void)
646
{
647
    T0 += T1;
648
    RETURN();
649
}
650

    
651
void OPPROTO op_check_addo (void)
652
{
653
    xer_ov = (((uint32_t)T2 ^ (uint32_t)T1 ^ UINT32_MAX) &
654
              ((uint32_t)T2 ^ (uint32_t)T0)) >> 31;
655
    xer_so |= xer_ov;
656
    RETURN();
657
}
658

    
659
#if defined(TARGET_PPC64)
660
void OPPROTO op_check_addo_64 (void)
661
{
662
    xer_ov = (((uint64_t)T2 ^ (uint64_t)T1 ^ UINT64_MAX) &
663
              ((uint64_t)T2 ^ (uint64_t)T0)) >> 63;
664
    xer_so |= xer_ov;
665
    RETURN();
666
}
667
#endif
668

    
669
/* add carrying */
670
void OPPROTO op_check_addc (void)
671
{
672
    if (likely((uint32_t)T0 >= (uint32_t)T2)) {
673
        xer_ca = 0;
674
    } else {
675
        xer_ca = 1;
676
    }
677
    RETURN();
678
}
679

    
680
#if defined(TARGET_PPC64)
681
void OPPROTO op_check_addc_64 (void)
682
{
683
    if (likely((uint64_t)T0 >= (uint64_t)T2)) {
684
        xer_ca = 0;
685
    } else {
686
        xer_ca = 1;
687
    }
688
    RETURN();
689
}
690
#endif
691

    
692
/* add extended */
693
void OPPROTO op_adde (void)
694
{
695
    do_adde();
696
    RETURN();
697
}
698

    
699
#if defined(TARGET_PPC64)
700
void OPPROTO op_adde_64 (void)
701
{
702
    do_adde_64();
703
    RETURN();
704
}
705
#endif
706

    
707
/* add immediate */
708
void OPPROTO op_addi (void)
709
{
710
    T0 += (int32_t)PARAM1;
711
    RETURN();
712
}
713

    
714
/* add to minus one extended */
715
void OPPROTO op_add_me (void)
716
{
717
    T0 += xer_ca + (-1);
718
    if (likely((uint32_t)T1 != 0))
719
        xer_ca = 1;
720
    else
721
        xer_ca = 0;
722
    RETURN();
723
}
724

    
725
#if defined(TARGET_PPC64)
726
void OPPROTO op_add_me_64 (void)
727
{
728
    T0 += xer_ca + (-1);
729
    if (likely((uint64_t)T1 != 0))
730
        xer_ca = 1;
731
    else
732
        xer_ca = 0;
733
    RETURN();
734
}
735
#endif
736

    
737
void OPPROTO op_addmeo (void)
738
{
739
    do_addmeo();
740
    RETURN();
741
}
742

    
743
void OPPROTO op_addmeo_64 (void)
744
{
745
    do_addmeo();
746
    RETURN();
747
}
748

    
749
/* add to zero extended */
750
void OPPROTO op_add_ze (void)
751
{
752
    T0 += xer_ca;
753
    RETURN();
754
}
755

    
756
/* divide word */
757
void OPPROTO op_divw (void)
758
{
759
    if (unlikely(((int32_t)T0 == INT32_MIN && (int32_t)T1 == (int32_t)-1) ||
760
                 (int32_t)T1 == 0)) {
761
        T0 = (int32_t)(UINT32_MAX * ((uint32_t)T0 >> 31));
762
    } else {
763
        T0 = (int32_t)T0 / (int32_t)T1;
764
    }
765
    RETURN();
766
}
767

    
768
#if defined(TARGET_PPC64)
769
void OPPROTO op_divd (void)
770
{
771
    if (unlikely(((int64_t)T0 == INT64_MIN && (int64_t)T1 == (int64_t)-1LL) ||
772
                 (int64_t)T1 == 0)) {
773
        T0 = (int64_t)(UINT64_MAX * ((uint64_t)T0 >> 63));
774
    } else {
775
        T0 = (int64_t)T0 / (int64_t)T1;
776
    }
777
    RETURN();
778
}
779
#endif
780

    
781
void OPPROTO op_divwo (void)
782
{
783
    do_divwo();
784
    RETURN();
785
}
786

    
787
#if defined(TARGET_PPC64)
788
void OPPROTO op_divdo (void)
789
{
790
    do_divdo();
791
    RETURN();
792
}
793
#endif
794

    
795
/* divide word unsigned */
796
void OPPROTO op_divwu (void)
797
{
798
    if (unlikely(T1 == 0)) {
799
        T0 = 0;
800
    } else {
801
        T0 = (uint32_t)T0 / (uint32_t)T1;
802
    }
803
    RETURN();
804
}
805

    
806
#if defined(TARGET_PPC64)
807
void OPPROTO op_divdu (void)
808
{
809
    if (unlikely(T1 == 0)) {
810
        T0 = 0;
811
    } else {
812
        T0 /= T1;
813
    }
814
    RETURN();
815
}
816
#endif
817

    
818
void OPPROTO op_divwuo (void)
819
{
820
    do_divwuo();
821
    RETURN();
822
}
823

    
824
#if defined(TARGET_PPC64)
825
void OPPROTO op_divduo (void)
826
{
827
    do_divduo();
828
    RETURN();
829
}
830
#endif
831

    
832
/* multiply high word */
833
void OPPROTO op_mulhw (void)
834
{
835
    T0 = ((int64_t)((int32_t)T0) * (int64_t)((int32_t)T1)) >> 32;
836
    RETURN();
837
}
838

    
839
#if defined(TARGET_PPC64)
840
void OPPROTO op_mulhd (void)
841
{
842
    uint64_t tl, th;
843

    
844
    muls64(&tl, &th, T0, T1);
845
    T0 = th;
846
    RETURN();
847
}
848
#endif
849

    
850
/* multiply high word unsigned */
851
void OPPROTO op_mulhwu (void)
852
{
853
    T0 = ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1) >> 32;
854
    RETURN();
855
}
856

    
857
#if defined(TARGET_PPC64)
858
void OPPROTO op_mulhdu (void)
859
{
860
    uint64_t tl, th;
861

    
862
    mulu64(&tl, &th, T0, T1);
863
    T0 = th;
864
    RETURN();
865
}
866
#endif
867

    
868
/* multiply low immediate */
869
void OPPROTO op_mulli (void)
870
{
871
    T0 = ((int32_t)T0 * (int32_t)PARAM1);
872
    RETURN();
873
}
874

    
875
/* multiply low word */
876
void OPPROTO op_mullw (void)
877
{
878
    T0 = (int32_t)(T0 * T1);
879
    RETURN();
880
}
881

    
882
#if defined(TARGET_PPC64)
883
void OPPROTO op_mulld (void)
884
{
885
    T0 *= T1;
886
    RETURN();
887
}
888
#endif
889

    
890
void OPPROTO op_mullwo (void)
891
{
892
    do_mullwo();
893
    RETURN();
894
}
895

    
896
#if defined(TARGET_PPC64)
897
void OPPROTO op_mulldo (void)
898
{
899
    do_mulldo();
900
    RETURN();
901
}
902
#endif
903

    
904
/* negate */
905
void OPPROTO op_neg (void)
906
{
907
    if (likely(T0 != INT32_MIN)) {
908
        T0 = -(int32_t)T0;
909
    }
910
    RETURN();
911
}
912

    
913
#if defined(TARGET_PPC64)
914
void OPPROTO op_neg_64 (void)
915
{
916
    if (likely(T0 != INT64_MIN)) {
917
        T0 = -(int64_t)T0;
918
    }
919
    RETURN();
920
}
921
#endif
922

    
923
void OPPROTO op_nego (void)
924
{
925
    do_nego();
926
    RETURN();
927
}
928

    
929
#if defined(TARGET_PPC64)
930
void OPPROTO op_nego_64 (void)
931
{
932
    do_nego_64();
933
    RETURN();
934
}
935
#endif
936

    
937
/* subtract from */
938
void OPPROTO op_subf (void)
939
{
940
    T0 = T1 - T0;
941
    RETURN();
942
}
943

    
944
/* subtract from carrying */
945
void OPPROTO op_check_subfc (void)
946
{
947
    if (likely((uint32_t)T0 > (uint32_t)T1)) {
948
        xer_ca = 0;
949
    } else {
950
        xer_ca = 1;
951
    }
952
    RETURN();
953
}
954

    
955
#if defined(TARGET_PPC64)
956
void OPPROTO op_check_subfc_64 (void)
957
{
958
    if (likely((uint64_t)T0 > (uint64_t)T1)) {
959
        xer_ca = 0;
960
    } else {
961
        xer_ca = 1;
962
    }
963
    RETURN();
964
}
965
#endif
966

    
967
/* subtract from extended */
968
void OPPROTO op_subfe (void)
969
{
970
    do_subfe();
971
    RETURN();
972
}
973

    
974
#if defined(TARGET_PPC64)
975
void OPPROTO op_subfe_64 (void)
976
{
977
    do_subfe_64();
978
    RETURN();
979
}
980
#endif
981

    
982
/* subtract from immediate carrying */
983
void OPPROTO op_subfic (void)
984
{
985
    T0 = (int32_t)PARAM1 + ~T0 + 1;
986
    if ((uint32_t)T0 <= (uint32_t)PARAM1) {
987
        xer_ca = 1;
988
    } else {
989
        xer_ca = 0;
990
    }
991
    RETURN();
992
}
993

    
994
#if defined(TARGET_PPC64)
995
void OPPROTO op_subfic_64 (void)
996
{
997
    T0 = (int64_t)PARAM1 + ~T0 + 1;
998
    if ((uint64_t)T0 <= (uint64_t)PARAM1) {
999
        xer_ca = 1;
1000
    } else {
1001
        xer_ca = 0;
1002
    }
1003
    RETURN();
1004
}
1005
#endif
1006

    
1007
/* subtract from minus one extended */
1008
void OPPROTO op_subfme (void)
1009
{
1010
    T0 = ~T0 + xer_ca - 1;
1011
    if (likely((uint32_t)T0 != UINT32_MAX))
1012
        xer_ca = 1;
1013
    else
1014
        xer_ca = 0;
1015
    RETURN();
1016
}
1017

    
1018
#if defined(TARGET_PPC64)
1019
void OPPROTO op_subfme_64 (void)
1020
{
1021
    T0 = ~T0 + xer_ca - 1;
1022
    if (likely((uint64_t)T0 != UINT64_MAX))
1023
        xer_ca = 1;
1024
    else
1025
        xer_ca = 0;
1026
    RETURN();
1027
}
1028
#endif
1029

    
1030
void OPPROTO op_subfmeo (void)
1031
{
1032
    do_subfmeo();
1033
    RETURN();
1034
}
1035

    
1036
#if defined(TARGET_PPC64)
1037
void OPPROTO op_subfmeo_64 (void)
1038
{
1039
    do_subfmeo_64();
1040
    RETURN();
1041
}
1042
#endif
1043

    
1044
/* subtract from zero extended */
1045
void OPPROTO op_subfze (void)
1046
{
1047
    T1 = ~T0;
1048
    T0 = T1 + xer_ca;
1049
    if ((uint32_t)T0 < (uint32_t)T1) {
1050
        xer_ca = 1;
1051
    } else {
1052
        xer_ca = 0;
1053
    }
1054
    RETURN();
1055
}
1056

    
1057
#if defined(TARGET_PPC64)
1058
void OPPROTO op_subfze_64 (void)
1059
{
1060
    T1 = ~T0;
1061
    T0 = T1 + xer_ca;
1062
    if ((uint64_t)T0 < (uint64_t)T1) {
1063
        xer_ca = 1;
1064
    } else {
1065
        xer_ca = 0;
1066
    }
1067
    RETURN();
1068
}
1069
#endif
1070

    
1071
void OPPROTO op_subfzeo (void)
1072
{
1073
    do_subfzeo();
1074
    RETURN();
1075
}
1076

    
1077
#if defined(TARGET_PPC64)
1078
void OPPROTO op_subfzeo_64 (void)
1079
{
1080
    do_subfzeo_64();
1081
    RETURN();
1082
}
1083
#endif
1084

    
1085
/***                           Integer comparison                          ***/
1086
/* compare */
1087
void OPPROTO op_cmp (void)
1088
{
1089
    if ((int32_t)T0 < (int32_t)T1) {
1090
        T0 = 0x08;
1091
    } else if ((int32_t)T0 > (int32_t)T1) {
1092
        T0 = 0x04;
1093
    } else {
1094
        T0 = 0x02;
1095
    }
1096
    T0 |= xer_so;
1097
    RETURN();
1098
}
1099

    
1100
#if defined(TARGET_PPC64)
1101
void OPPROTO op_cmp_64 (void)
1102
{
1103
    if ((int64_t)T0 < (int64_t)T1) {
1104
        T0 = 0x08;
1105
    } else if ((int64_t)T0 > (int64_t)T1) {
1106
        T0 = 0x04;
1107
    } else {
1108
        T0 = 0x02;
1109
    }
1110
    T0 |= xer_so;
1111
    RETURN();
1112
}
1113
#endif
1114

    
1115
/* compare immediate */
1116
void OPPROTO op_cmpi (void)
1117
{
1118
    if ((int32_t)T0 < (int32_t)PARAM1) {
1119
        T0 = 0x08;
1120
    } else if ((int32_t)T0 > (int32_t)PARAM1) {
1121
        T0 = 0x04;
1122
    } else {
1123
        T0 = 0x02;
1124
    }
1125
    T0 |= xer_so;
1126
    RETURN();
1127
}
1128

    
1129
#if defined(TARGET_PPC64)
1130
void OPPROTO op_cmpi_64 (void)
1131
{
1132
    if ((int64_t)T0 < (int64_t)((int32_t)PARAM1)) {
1133
        T0 = 0x08;
1134
    } else if ((int64_t)T0 > (int64_t)((int32_t)PARAM1)) {
1135
        T0 = 0x04;
1136
    } else {
1137
        T0 = 0x02;
1138
    }
1139
    T0 |= xer_so;
1140
    RETURN();
1141
}
1142
#endif
1143

    
1144
/* compare logical */
1145
void OPPROTO op_cmpl (void)
1146
{
1147
    if ((uint32_t)T0 < (uint32_t)T1) {
1148
        T0 = 0x08;
1149
    } else if ((uint32_t)T0 > (uint32_t)T1) {
1150
        T0 = 0x04;
1151
    } else {
1152
        T0 = 0x02;
1153
    }
1154
    T0 |= xer_so;
1155
    RETURN();
1156
}
1157

    
1158
#if defined(TARGET_PPC64)
1159
void OPPROTO op_cmpl_64 (void)
1160
{
1161
    if ((uint64_t)T0 < (uint64_t)T1) {
1162
        T0 = 0x08;
1163
    } else if ((uint64_t)T0 > (uint64_t)T1) {
1164
        T0 = 0x04;
1165
    } else {
1166
        T0 = 0x02;
1167
    }
1168
    T0 |= xer_so;
1169
    RETURN();
1170
}
1171
#endif
1172

    
1173
/* compare logical immediate */
1174
void OPPROTO op_cmpli (void)
1175
{
1176
    if ((uint32_t)T0 < (uint32_t)PARAM1) {
1177
        T0 = 0x08;
1178
    } else if ((uint32_t)T0 > (uint32_t)PARAM1) {
1179
        T0 = 0x04;
1180
    } else {
1181
        T0 = 0x02;
1182
    }
1183
    T0 |= xer_so;
1184
    RETURN();
1185
}
1186

    
1187
#if defined(TARGET_PPC64)
1188
void OPPROTO op_cmpli_64 (void)
1189
{
1190
    if ((uint64_t)T0 < (uint64_t)PARAM1) {
1191
        T0 = 0x08;
1192
    } else if ((uint64_t)T0 > (uint64_t)PARAM1) {
1193
        T0 = 0x04;
1194
    } else {
1195
        T0 = 0x02;
1196
    }
1197
    T0 |= xer_so;
1198
    RETURN();
1199
}
1200
#endif
1201

    
1202
void OPPROTO op_isel (void)
1203
{
1204
    if (T0)
1205
        T0 = T1;
1206
    else
1207
        T0 = T2;
1208
    RETURN();
1209
}
1210

    
1211
void OPPROTO op_popcntb (void)
1212
{
1213
    do_popcntb();
1214
    RETURN();
1215
}
1216

    
1217
#if defined(TARGET_PPC64)
1218
void OPPROTO op_popcntb_64 (void)
1219
{
1220
    do_popcntb_64();
1221
    RETURN();
1222
}
1223
#endif
1224

    
1225
/***                            Integer logical                            ***/
1226
/* and */
1227
void OPPROTO op_and (void)
1228
{
1229
    T0 &= T1;
1230
    RETURN();
1231
}
1232

    
1233
/* andc */
1234
void OPPROTO op_andc (void)
1235
{
1236
    T0 &= ~T1;
1237
    RETURN();
1238
}
1239

    
1240
/* andi. */
1241
void OPPROTO op_andi_T0 (void)
1242
{
1243
    T0 &= (uint32_t)PARAM1;
1244
    RETURN();
1245
}
1246

    
1247
void OPPROTO op_andi_T1 (void)
1248
{
1249
    T1 &= (uint32_t)PARAM1;
1250
    RETURN();
1251
}
1252

    
1253
#if defined(TARGET_PPC64)
1254
void OPPROTO op_andi_T0_64 (void)
1255
{
1256
    T0 &= ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
1257
    RETURN();
1258
}
1259

    
1260
void OPPROTO op_andi_T1_64 (void)
1261
{
1262
    T1 &= ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
1263
    RETURN();
1264
}
1265
#endif
1266

    
1267
/* count leading zero */
1268
void OPPROTO op_cntlzw (void)
1269
{
1270
    do_cntlzw();
1271
    RETURN();
1272
}
1273

    
1274
#if defined(TARGET_PPC64)
1275
void OPPROTO op_cntlzd (void)
1276
{
1277
    do_cntlzd();
1278
    RETURN();
1279
}
1280
#endif
1281

    
1282
/* eqv */
1283
void OPPROTO op_eqv (void)
1284
{
1285
    T0 = ~(T0 ^ T1);
1286
    RETURN();
1287
}
1288

    
1289
/* extend sign byte */
1290
void OPPROTO op_extsb (void)
1291
{
1292
#if defined (TARGET_PPC64)
1293
    T0 = (int64_t)((int8_t)T0);
1294
#else
1295
    T0 = (int32_t)((int8_t)T0);
1296
#endif
1297
    RETURN();
1298
}
1299

    
1300
/* extend sign half word */
1301
void OPPROTO op_extsh (void)
1302
{
1303
#if defined (TARGET_PPC64)
1304
    T0 = (int64_t)((int16_t)T0);
1305
#else
1306
    T0 = (int32_t)((int16_t)T0);
1307
#endif
1308
    RETURN();
1309
}
1310

    
1311
#if defined (TARGET_PPC64)
1312
void OPPROTO op_extsw (void)
1313
{
1314
    T0 = (int64_t)((int32_t)T0);
1315
    RETURN();
1316
}
1317
#endif
1318

    
1319
/* nand */
1320
void OPPROTO op_nand (void)
1321
{
1322
    T0 = ~(T0 & T1);
1323
    RETURN();
1324
}
1325

    
1326
/* nor */
1327
void OPPROTO op_nor (void)
1328
{
1329
    T0 = ~(T0 | T1);
1330
    RETURN();
1331
}
1332

    
1333
/* or */
1334
void OPPROTO op_or (void)
1335
{
1336
    T0 |= T1;
1337
    RETURN();
1338
}
1339

    
1340
/* orc */
1341
void OPPROTO op_orc (void)
1342
{
1343
    T0 |= ~T1;
1344
    RETURN();
1345
}
1346

    
1347
/* ori */
1348
void OPPROTO op_ori (void)
1349
{
1350
    T0 |= (uint32_t)PARAM1;
1351
    RETURN();
1352
}
1353

    
1354
/* xor */
1355
void OPPROTO op_xor (void)
1356
{
1357
    T0 ^= T1;
1358
    RETURN();
1359
}
1360

    
1361
/* xori */
1362
void OPPROTO op_xori (void)
1363
{
1364
    T0 ^= (uint32_t)PARAM1;
1365
    RETURN();
1366
}
1367

    
1368
/***                             Integer rotate                            ***/
1369
void OPPROTO op_rotl32_T0_T1 (void)
1370
{
1371
    T0 = rotl32(T0, T1 & 0x1F);
1372
    RETURN();
1373
}
1374

    
1375
void OPPROTO op_rotli32_T0 (void)
1376
{
1377
    T0 = rotl32(T0, PARAM1);
1378
    RETURN();
1379
}
1380

    
1381
#if defined(TARGET_PPC64)
1382
void OPPROTO op_rotl64_T0_T1 (void)
1383
{
1384
    T0 = rotl64(T0, T1 & 0x3F);
1385
    RETURN();
1386
}
1387

    
1388
void OPPROTO op_rotli64_T0 (void)
1389
{
1390
    T0 = rotl64(T0, PARAM1);
1391
    RETURN();
1392
}
1393
#endif
1394

    
1395
/***                             Integer shift                             ***/
1396
/* shift left word */
1397
void OPPROTO op_slw (void)
1398
{
1399
    if (T1 & 0x20) {
1400
        T0 = 0;
1401
    } else {
1402
        T0 = (uint32_t)(T0 << T1);
1403
    }
1404
    RETURN();
1405
}
1406

    
1407
#if defined(TARGET_PPC64)
1408
void OPPROTO op_sld (void)
1409
{
1410
    if (T1 & 0x40) {
1411
        T0 = 0;
1412
    } else {
1413
        T0 = T0 << T1;
1414
    }
1415
    RETURN();
1416
}
1417
#endif
1418

    
1419
/* shift right algebraic word */
1420
void OPPROTO op_sraw (void)
1421
{
1422
    do_sraw();
1423
    RETURN();
1424
}
1425

    
1426
#if defined(TARGET_PPC64)
1427
void OPPROTO op_srad (void)
1428
{
1429
    do_srad();
1430
    RETURN();
1431
}
1432
#endif
1433

    
1434
/* shift right algebraic word immediate */
1435
void OPPROTO op_srawi (void)
1436
{
1437
    uint32_t mask = (uint32_t)PARAM2;
1438

    
1439
    T0 = (int32_t)T0 >> PARAM1;
1440
    if ((int32_t)T1 < 0 && (T1 & mask) != 0) {
1441
        xer_ca = 1;
1442
    } else {
1443
        xer_ca = 0;
1444
    }
1445
    RETURN();
1446
}
1447

    
1448
#if defined(TARGET_PPC64)
1449
void OPPROTO op_sradi (void)
1450
{
1451
    uint64_t mask = ((uint64_t)PARAM2 << 32) | (uint64_t)PARAM3;
1452

    
1453
    T0 = (int64_t)T0 >> PARAM1;
1454
    if ((int64_t)T1 < 0 && ((uint64_t)T1 & mask) != 0) {
1455
        xer_ca = 1;
1456
    } else {
1457
        xer_ca = 0;
1458
    }
1459
    RETURN();
1460
}
1461
#endif
1462

    
1463
/* shift right word */
1464
void OPPROTO op_srw (void)
1465
{
1466
    if (T1 & 0x20) {
1467
        T0 = 0;
1468
    } else {
1469
        T0 = (uint32_t)T0 >> T1;
1470
    }
1471
    RETURN();
1472
}
1473

    
1474
#if defined(TARGET_PPC64)
1475
void OPPROTO op_srd (void)
1476
{
1477
    if (T1 & 0x40) {
1478
        T0 = 0;
1479
    } else {
1480
        T0 = (uint64_t)T0 >> T1;
1481
    }
1482
    RETURN();
1483
}
1484
#endif
1485

    
1486
void OPPROTO op_sl_T0_T1 (void)
1487
{
1488
    T0 = T0 << T1;
1489
    RETURN();
1490
}
1491

    
1492
void OPPROTO op_sli_T0 (void)
1493
{
1494
    T0 = T0 << PARAM1;
1495
    RETURN();
1496
}
1497

    
1498
void OPPROTO op_sli_T1 (void)
1499
{
1500
    T1 = T1 << PARAM1;
1501
    RETURN();
1502
}
1503

    
1504
void OPPROTO op_srl_T0_T1 (void)
1505
{
1506
    T0 = (uint32_t)T0 >> T1;
1507
    RETURN();
1508
}
1509

    
1510
#if defined(TARGET_PPC64)
1511
void OPPROTO op_srl_T0_T1_64 (void)
1512
{
1513
    T0 = (uint32_t)T0 >> T1;
1514
    RETURN();
1515
}
1516
#endif
1517

    
1518
void OPPROTO op_srli_T0 (void)
1519
{
1520
    T0 = (uint32_t)T0 >> PARAM1;
1521
    RETURN();
1522
}
1523

    
1524
#if defined(TARGET_PPC64)
1525
void OPPROTO op_srli_T0_64 (void)
1526
{
1527
    T0 = (uint64_t)T0 >> PARAM1;
1528
    RETURN();
1529
}
1530
#endif
1531

    
1532
void OPPROTO op_srli_T1 (void)
1533
{
1534
    T1 = (uint32_t)T1 >> PARAM1;
1535
    RETURN();
1536
}
1537

    
1538
#if defined(TARGET_PPC64)
1539
void OPPROTO op_srli_T1_64 (void)
1540
{
1541
    T1 = (uint64_t)T1 >> PARAM1;
1542
    RETURN();
1543
}
1544
#endif
1545

    
1546
/***                       Floating-Point arithmetic                       ***/
1547
/* fadd - fadd. */
1548
void OPPROTO op_fadd (void)
1549
{
1550
#if USE_PRECISE_EMULATION
1551
    do_fadd();
1552
#else
1553
    FT0 = float64_add(FT0, FT1, &env->fp_status);
1554
#endif
1555
    RETURN();
1556
}
1557

    
1558
/* fsub - fsub. */
1559
void OPPROTO op_fsub (void)
1560
{
1561
#if USE_PRECISE_EMULATION
1562
    do_fsub();
1563
#else
1564
    FT0 = float64_sub(FT0, FT1, &env->fp_status);
1565
#endif
1566
    RETURN();
1567
}
1568

    
1569
/* fmul - fmul. */
1570
void OPPROTO op_fmul (void)
1571
{
1572
#if USE_PRECISE_EMULATION
1573
    do_fmul();
1574
#else
1575
    FT0 = float64_mul(FT0, FT1, &env->fp_status);
1576
#endif
1577
    RETURN();
1578
}
1579

    
1580
/* fdiv - fdiv. */
1581
void OPPROTO op_fdiv (void)
1582
{
1583
#if USE_PRECISE_EMULATION
1584
    do_fdiv();
1585
#else
1586
    FT0 = float64_div(FT0, FT1, &env->fp_status);
1587
#endif
1588
    RETURN();
1589
}
1590

    
1591
/* fsqrt - fsqrt. */
1592
void OPPROTO op_fsqrt (void)
1593
{
1594
    do_fsqrt();
1595
    RETURN();
1596
}
1597

    
1598
/* fre - fre. */
1599
void OPPROTO op_fre (void)
1600
{
1601
    do_fre();
1602
    RETURN();
1603
}
1604

    
1605
/* fres - fres. */
1606
void OPPROTO op_fres (void)
1607
{
1608
    do_fres();
1609
    RETURN();
1610
}
1611

    
1612
/* frsqrte  - frsqrte. */
1613
void OPPROTO op_frsqrte (void)
1614
{
1615
    do_frsqrte();
1616
    RETURN();
1617
}
1618

    
1619
/* fsel - fsel. */
1620
void OPPROTO op_fsel (void)
1621
{
1622
    do_fsel();
1623
    RETURN();
1624
}
1625

    
1626
/***                     Floating-Point multiply-and-add                   ***/
1627
/* fmadd - fmadd. */
1628
void OPPROTO op_fmadd (void)
1629
{
1630
#if USE_PRECISE_EMULATION
1631
    do_fmadd();
1632
#else
1633
    FT0 = float64_mul(FT0, FT1, &env->fp_status);
1634
    FT0 = float64_add(FT0, FT2, &env->fp_status);
1635
#endif
1636
    RETURN();
1637
}
1638

    
1639
/* fmsub - fmsub. */
1640
void OPPROTO op_fmsub (void)
1641
{
1642
#if USE_PRECISE_EMULATION
1643
    do_fmsub();
1644
#else
1645
    FT0 = float64_mul(FT0, FT1, &env->fp_status);
1646
    FT0 = float64_sub(FT0, FT2, &env->fp_status);
1647
#endif
1648
    RETURN();
1649
}
1650

    
1651
/* fnmadd - fnmadd. - fnmadds - fnmadds. */
1652
void OPPROTO op_fnmadd (void)
1653
{
1654
    do_fnmadd();
1655
    RETURN();
1656
}
1657

    
1658
/* fnmsub - fnmsub. */
1659
void OPPROTO op_fnmsub (void)
1660
{
1661
    do_fnmsub();
1662
    RETURN();
1663
}
1664

    
1665
/***                     Floating-Point round & convert                    ***/
1666
/* frsp - frsp. */
1667
void OPPROTO op_frsp (void)
1668
{
1669
#if USE_PRECISE_EMULATION
1670
    do_frsp();
1671
#else
1672
    FT0 = float64_to_float32(FT0, &env->fp_status);
1673
#endif
1674
    RETURN();
1675
}
1676

    
1677
/* fctiw - fctiw. */
1678
void OPPROTO op_fctiw (void)
1679
{
1680
    do_fctiw();
1681
    RETURN();
1682
}
1683

    
1684
/* fctiwz - fctiwz. */
1685
void OPPROTO op_fctiwz (void)
1686
{
1687
    do_fctiwz();
1688
    RETURN();
1689
}
1690

    
1691
#if defined(TARGET_PPC64)
1692
/* fcfid - fcfid. */
1693
void OPPROTO op_fcfid (void)
1694
{
1695
    do_fcfid();
1696
    RETURN();
1697
}
1698

    
1699
/* fctid - fctid. */
1700
void OPPROTO op_fctid (void)
1701
{
1702
    do_fctid();
1703
    RETURN();
1704
}
1705

    
1706
/* fctidz - fctidz. */
1707
void OPPROTO op_fctidz (void)
1708
{
1709
    do_fctidz();
1710
    RETURN();
1711
}
1712
#endif
1713

    
1714
void OPPROTO op_frin (void)
1715
{
1716
    do_frin();
1717
    RETURN();
1718
}
1719

    
1720
void OPPROTO op_friz (void)
1721
{
1722
    do_friz();
1723
    RETURN();
1724
}
1725

    
1726
void OPPROTO op_frip (void)
1727
{
1728
    do_frip();
1729
    RETURN();
1730
}
1731

    
1732
void OPPROTO op_frim (void)
1733
{
1734
    do_frim();
1735
    RETURN();
1736
}
1737

    
1738
/***                         Floating-Point compare                        ***/
1739
/* fcmpu */
1740
void OPPROTO op_fcmpu (void)
1741
{
1742
    do_fcmpu();
1743
    RETURN();
1744
}
1745

    
1746
/* fcmpo */
1747
void OPPROTO op_fcmpo (void)
1748
{
1749
    do_fcmpo();
1750
    RETURN();
1751
}
1752

    
1753
/***                         Floating-point move                           ***/
1754
/* fabs */
1755
void OPPROTO op_fabs (void)
1756
{
1757
    FT0 = float64_abs(FT0);
1758
    RETURN();
1759
}
1760

    
1761
/* fnabs */
1762
void OPPROTO op_fnabs (void)
1763
{
1764
    FT0 = float64_abs(FT0);
1765
    FT0 = float64_chs(FT0);
1766
    RETURN();
1767
}
1768

    
1769
/* fneg */
1770
void OPPROTO op_fneg (void)
1771
{
1772
    FT0 = float64_chs(FT0);
1773
    RETURN();
1774
}
1775

    
1776
/* Load and store */
1777
#define MEMSUFFIX _raw
1778
#include "op_helper.h"
1779
#include "op_mem.h"
1780
#if !defined(CONFIG_USER_ONLY)
1781
#define MEMSUFFIX _user
1782
#include "op_helper.h"
1783
#include "op_mem.h"
1784
#define MEMSUFFIX _kernel
1785
#include "op_helper.h"
1786
#include "op_mem.h"
1787
#define MEMSUFFIX _hypv
1788
#include "op_helper.h"
1789
#include "op_mem.h"
1790
#endif
1791

    
1792
/* Special op to check and maybe clear reservation */
1793
void OPPROTO op_check_reservation (void)
1794
{
1795
    if ((uint32_t)env->reserve == (uint32_t)(T0 & ~0x00000003))
1796
        env->reserve = (target_ulong)-1ULL;
1797
    RETURN();
1798
}
1799

    
1800
#if defined(TARGET_PPC64)
1801
void OPPROTO op_check_reservation_64 (void)
1802
{
1803
    if ((uint64_t)env->reserve == (uint64_t)(T0 & ~0x00000003))
1804
        env->reserve = (target_ulong)-1ULL;
1805
    RETURN();
1806
}
1807
#endif
1808

    
1809
void OPPROTO op_wait (void)
1810
{
1811
    env->halted = 1;
1812
    RETURN();
1813
}
1814

    
1815
/* Return from interrupt */
1816
#if !defined(CONFIG_USER_ONLY)
1817
void OPPROTO op_rfi (void)
1818
{
1819
    do_rfi();
1820
    RETURN();
1821
}
1822

    
1823
#if defined(TARGET_PPC64)
1824
void OPPROTO op_rfid (void)
1825
{
1826
    do_rfid();
1827
    RETURN();
1828
}
1829

    
1830
void OPPROTO op_hrfid (void)
1831
{
1832
    do_hrfid();
1833
    RETURN();
1834
}
1835
#endif
1836

    
1837
/* Exception vectors */
1838
void OPPROTO op_store_excp_prefix (void)
1839
{
1840
    T0 &= env->ivpr_mask;
1841
    env->excp_prefix = T0;
1842
    RETURN();
1843
}
1844

    
1845
void OPPROTO op_store_excp_vector (void)
1846
{
1847
    T0 &= env->ivor_mask;
1848
    env->excp_vectors[PARAM1] = T0;
1849
    RETURN();
1850
}
1851
#endif
1852

    
1853
/* Trap word */
1854
void OPPROTO op_tw (void)
1855
{
1856
    do_tw(PARAM1);
1857
    RETURN();
1858
}
1859

    
1860
#if defined(TARGET_PPC64)
1861
void OPPROTO op_td (void)
1862
{
1863
    do_td(PARAM1);
1864
    RETURN();
1865
}
1866
#endif
1867

    
1868
#if !defined(CONFIG_USER_ONLY)
1869
/* tlbia */
1870
void OPPROTO op_tlbia (void)
1871
{
1872
    ppc_tlb_invalidate_all(env);
1873
    RETURN();
1874
}
1875

    
1876
/* tlbie */
1877
void OPPROTO op_tlbie (void)
1878
{
1879
    ppc_tlb_invalidate_one(env, (uint32_t)T0);
1880
    RETURN();
1881
}
1882

    
1883
#if defined(TARGET_PPC64)
1884
void OPPROTO op_tlbie_64 (void)
1885
{
1886
    ppc_tlb_invalidate_one(env, T0);
1887
    RETURN();
1888
}
1889
#endif
1890

    
1891
#if defined(TARGET_PPC64)
1892
void OPPROTO op_slbia (void)
1893
{
1894
    ppc_slb_invalidate_all(env);
1895
    RETURN();
1896
}
1897

    
1898
void OPPROTO op_slbie (void)
1899
{
1900
    ppc_slb_invalidate_one(env, (uint32_t)T0);
1901
    RETURN();
1902
}
1903

    
1904
void OPPROTO op_slbie_64 (void)
1905
{
1906
    ppc_slb_invalidate_one(env, T0);
1907
    RETURN();
1908
}
1909
#endif
1910
#endif
1911

    
1912
#if !defined(CONFIG_USER_ONLY)
1913
/* PowerPC 602/603/755 software TLB load instructions */
1914
void OPPROTO op_6xx_tlbld (void)
1915
{
1916
    do_load_6xx_tlb(0);
1917
    RETURN();
1918
}
1919

    
1920
void OPPROTO op_6xx_tlbli (void)
1921
{
1922
    do_load_6xx_tlb(1);
1923
    RETURN();
1924
}
1925

    
1926
/* PowerPC 74xx software TLB load instructions */
1927
void OPPROTO op_74xx_tlbld (void)
1928
{
1929
    do_load_74xx_tlb(0);
1930
    RETURN();
1931
}
1932

    
1933
void OPPROTO op_74xx_tlbli (void)
1934
{
1935
    do_load_74xx_tlb(1);
1936
    RETURN();
1937
}
1938
#endif
1939

    
1940
/* 601 specific */
1941
void OPPROTO op_load_601_rtcl (void)
1942
{
1943
    T0 = cpu_ppc601_load_rtcl(env);
1944
    RETURN();
1945
}
1946

    
1947
void OPPROTO op_load_601_rtcu (void)
1948
{
1949
    T0 = cpu_ppc601_load_rtcu(env);
1950
    RETURN();
1951
}
1952

    
1953
#if !defined(CONFIG_USER_ONLY)
1954
void OPPROTO op_store_601_rtcl (void)
1955
{
1956
    cpu_ppc601_store_rtcl(env, T0);
1957
    RETURN();
1958
}
1959

    
1960
void OPPROTO op_store_601_rtcu (void)
1961
{
1962
    cpu_ppc601_store_rtcu(env, T0);
1963
    RETURN();
1964
}
1965

    
1966
void OPPROTO op_store_hid0_601 (void)
1967
{
1968
    do_store_hid0_601();
1969
    RETURN();
1970
}
1971

    
1972
void OPPROTO op_load_601_bat (void)
1973
{
1974
    T0 = env->IBAT[PARAM1][PARAM2];
1975
    RETURN();
1976
}
1977

    
1978
void OPPROTO op_store_601_batl (void)
1979
{
1980
    do_store_ibatl_601(env, PARAM1, T0);
1981
    RETURN();
1982
}
1983

    
1984
void OPPROTO op_store_601_batu (void)
1985
{
1986
    do_store_ibatu_601(env, PARAM1, T0);
1987
    RETURN();
1988
}
1989
#endif /* !defined(CONFIG_USER_ONLY) */
1990

    
1991
/* PowerPC 601 specific instructions (POWER bridge) */
1992
/* XXX: those micro-ops need tests ! */
1993
void OPPROTO op_POWER_abs (void)
1994
{
1995
    if ((int32_t)T0 == INT32_MIN)
1996
        T0 = INT32_MAX;
1997
    else if ((int32_t)T0 < 0)
1998
        T0 = -T0;
1999
    RETURN();
2000
}
2001

    
2002
void OPPROTO op_POWER_abso (void)
2003
{
2004
    do_POWER_abso();
2005
    RETURN();
2006
}
2007

    
2008
void OPPROTO op_POWER_clcs (void)
2009
{
2010
    do_POWER_clcs();
2011
    RETURN();
2012
}
2013

    
2014
void OPPROTO op_POWER_div (void)
2015
{
2016
    do_POWER_div();
2017
    RETURN();
2018
}
2019

    
2020
void OPPROTO op_POWER_divo (void)
2021
{
2022
    do_POWER_divo();
2023
    RETURN();
2024
}
2025

    
2026
void OPPROTO op_POWER_divs (void)
2027
{
2028
    do_POWER_divs();
2029
    RETURN();
2030
}
2031

    
2032
void OPPROTO op_POWER_divso (void)
2033
{
2034
    do_POWER_divso();
2035
    RETURN();
2036
}
2037

    
2038
void OPPROTO op_POWER_doz (void)
2039
{
2040
    if ((int32_t)T1 > (int32_t)T0)
2041
        T0 = T1 - T0;
2042
    else
2043
        T0 = 0;
2044
    RETURN();
2045
}
2046

    
2047
void OPPROTO op_POWER_dozo (void)
2048
{
2049
    do_POWER_dozo();
2050
    RETURN();
2051
}
2052

    
2053
void OPPROTO op_load_xer_cmp (void)
2054
{
2055
    T2 = xer_cmp;
2056
    RETURN();
2057
}
2058

    
2059
void OPPROTO op_POWER_maskg (void)
2060
{
2061
    do_POWER_maskg();
2062
    RETURN();
2063
}
2064

    
2065
void OPPROTO op_POWER_maskir (void)
2066
{
2067
    T0 = (T0 & ~T2) | (T1 & T2);
2068
    RETURN();
2069
}
2070

    
2071
void OPPROTO op_POWER_mul (void)
2072
{
2073
    uint64_t tmp;
2074

    
2075
    tmp = (uint64_t)T0 * (uint64_t)T1;
2076
    env->spr[SPR_MQ] = tmp >> 32;
2077
    T0 = tmp;
2078
    RETURN();
2079
}
2080

    
2081
void OPPROTO op_POWER_mulo (void)
2082
{
2083
    do_POWER_mulo();
2084
    RETURN();
2085
}
2086

    
2087
void OPPROTO op_POWER_nabs (void)
2088
{
2089
    if (T0 > 0)
2090
        T0 = -T0;
2091
    RETURN();
2092
}
2093

    
2094
void OPPROTO op_POWER_nabso (void)
2095
{
2096
    /* nabs never overflows */
2097
    if (T0 > 0)
2098
        T0 = -T0;
2099
    xer_ov = 0;
2100
    RETURN();
2101
}
2102

    
2103
/* XXX: factorise POWER rotates... */
2104
void OPPROTO op_POWER_rlmi (void)
2105
{
2106
    T0 = rotl32(T0, T2) & PARAM1;
2107
    T0 |= T1 & (uint32_t)PARAM2;
2108
    RETURN();
2109
}
2110

    
2111
void OPPROTO op_POWER_rrib (void)
2112
{
2113
    T2 &= 0x1FUL;
2114
    T0 = rotl32(T0 & INT32_MIN, T2);
2115
    T0 |= T1 & ~rotl32(INT32_MIN, T2);
2116
    RETURN();
2117
}
2118

    
2119
void OPPROTO op_POWER_sle (void)
2120
{
2121
    T1 &= 0x1FUL;
2122
    env->spr[SPR_MQ] = rotl32(T0, T1);
2123
    T0 = T0 << T1;
2124
    RETURN();
2125
}
2126

    
2127
void OPPROTO op_POWER_sleq (void)
2128
{
2129
    uint32_t tmp = env->spr[SPR_MQ];
2130

    
2131
    T1 &= 0x1FUL;
2132
    env->spr[SPR_MQ] = rotl32(T0, T1);
2133
    T0 = T0 << T1;
2134
    T0 |= tmp >> (32 - T1);
2135
    RETURN();
2136
}
2137

    
2138
void OPPROTO op_POWER_sllq (void)
2139
{
2140
    uint32_t msk = UINT32_MAX;
2141

    
2142
    msk = msk << (T1 & 0x1FUL);
2143
    if (T1 & 0x20UL)
2144
        msk = ~msk;
2145
    T1 &= 0x1FUL;
2146
    T0 = (T0 << T1) & msk;
2147
    T0 |= env->spr[SPR_MQ] & ~msk;
2148
    RETURN();
2149
}
2150

    
2151
void OPPROTO op_POWER_slq (void)
2152
{
2153
    uint32_t msk = UINT32_MAX, tmp;
2154

    
2155
    msk = msk << (T1 & 0x1FUL);
2156
    if (T1 & 0x20UL)
2157
        msk = ~msk;
2158
    T1 &= 0x1FUL;
2159
    tmp = rotl32(T0, T1);
2160
    T0 = tmp & msk;
2161
    env->spr[SPR_MQ] = tmp;
2162
    RETURN();
2163
}
2164

    
2165
void OPPROTO op_POWER_sraq (void)
2166
{
2167
    env->spr[SPR_MQ] = rotl32(T0, 32 - (T1 & 0x1FUL));
2168
    if (T1 & 0x20UL)
2169
        T0 = UINT32_MAX;
2170
    else
2171
        T0 = (int32_t)T0 >> T1;
2172
    RETURN();
2173
}
2174

    
2175
void OPPROTO op_POWER_sre (void)
2176
{
2177
    T1 &= 0x1FUL;
2178
    env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2179
    T0 = (int32_t)T0 >> T1;
2180
    RETURN();
2181
}
2182

    
2183
void OPPROTO op_POWER_srea (void)
2184
{
2185
    T1 &= 0x1FUL;
2186
    env->spr[SPR_MQ] = T0 >> T1;
2187
    T0 = (int32_t)T0 >> T1;
2188
    RETURN();
2189
}
2190

    
2191
void OPPROTO op_POWER_sreq (void)
2192
{
2193
    uint32_t tmp;
2194
    int32_t msk;
2195

    
2196
    T1 &= 0x1FUL;
2197
    msk = INT32_MIN >> T1;
2198
    tmp = env->spr[SPR_MQ];
2199
    env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2200
    T0 = T0 >> T1;
2201
    T0 |= tmp & msk;
2202
    RETURN();
2203
}
2204

    
2205
void OPPROTO op_POWER_srlq (void)
2206
{
2207
    uint32_t tmp;
2208
    int32_t msk;
2209

    
2210
    msk = INT32_MIN >> (T1 & 0x1FUL);
2211
    if (T1 & 0x20UL)
2212
        msk = ~msk;
2213
    T1 &= 0x1FUL;
2214
    tmp = env->spr[SPR_MQ];
2215
    env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2216
    T0 = T0 >> T1;
2217
    T0 &= msk;
2218
    T0 |= tmp & ~msk;
2219
    RETURN();
2220
}
2221

    
2222
void OPPROTO op_POWER_srq (void)
2223
{
2224
    T1 &= 0x1FUL;
2225
    env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2226
    T0 = T0 >> T1;
2227
    RETURN();
2228
}
2229

    
2230
/* POWER instructions not implemented in PowerPC 601 */
2231
#if !defined(CONFIG_USER_ONLY)
2232
void OPPROTO op_POWER_mfsri (void)
2233
{
2234
    T1 = T0 >> 28;
2235
    T0 = env->sr[T1];
2236
    RETURN();
2237
}
2238

    
2239
void OPPROTO op_POWER_rac (void)
2240
{
2241
    do_POWER_rac();
2242
    RETURN();
2243
}
2244

    
2245
void OPPROTO op_POWER_rfsvc (void)
2246
{
2247
    do_POWER_rfsvc();
2248
    RETURN();
2249
}
2250
#endif
2251

    
2252
/* PowerPC 602 specific instruction */
2253
#if !defined(CONFIG_USER_ONLY)
2254
void OPPROTO op_602_mfrom (void)
2255
{
2256
    do_op_602_mfrom();
2257
    RETURN();
2258
}
2259
#endif
2260

    
2261
/* PowerPC 4xx specific micro-ops */
2262
void OPPROTO op_405_add_T0_T2 (void)
2263
{
2264
    T0 = (int32_t)T0 + (int32_t)T2;
2265
    RETURN();
2266
}
2267

    
2268
void OPPROTO op_405_mulchw (void)
2269
{
2270
    T0 = ((int16_t)T0) * ((int16_t)(T1 >> 16));
2271
    RETURN();
2272
}
2273

    
2274
void OPPROTO op_405_mulchwu (void)
2275
{
2276
    T0 = ((uint16_t)T0) * ((uint16_t)(T1 >> 16));
2277
    RETURN();
2278
}
2279

    
2280
void OPPROTO op_405_mulhhw (void)
2281
{
2282
    T0 = ((int16_t)(T0 >> 16)) * ((int16_t)(T1 >> 16));
2283
    RETURN();
2284
}
2285

    
2286
void OPPROTO op_405_mulhhwu (void)
2287
{
2288
    T0 = ((uint16_t)(T0 >> 16)) * ((uint16_t)(T1 >> 16));
2289
    RETURN();
2290
}
2291

    
2292
void OPPROTO op_405_mullhw (void)
2293
{
2294
    T0 = ((int16_t)T0) * ((int16_t)T1);
2295
    RETURN();
2296
}
2297

    
2298
void OPPROTO op_405_mullhwu (void)
2299
{
2300
    T0 = ((uint16_t)T0) * ((uint16_t)T1);
2301
    RETURN();
2302
}
2303

    
2304
void OPPROTO op_405_check_sat (void)
2305
{
2306
    do_405_check_sat();
2307
    RETURN();
2308
}
2309

    
2310
void OPPROTO op_405_check_ovu (void)
2311
{
2312
    if (likely(T0 >= T2)) {
2313
        xer_ov = 0;
2314
    } else {
2315
        xer_ov = 1;
2316
        xer_so = 1;
2317
    }
2318
    RETURN();
2319
}
2320

    
2321
void OPPROTO op_405_check_satu (void)
2322
{
2323
    if (unlikely(T0 < T2)) {
2324
        /* Saturate result */
2325
        T0 = UINT32_MAX;
2326
    }
2327
    RETURN();
2328
}
2329

    
2330
void OPPROTO op_load_dcr (void)
2331
{
2332
    do_load_dcr();
2333
    RETURN();
2334
}
2335

    
2336
void OPPROTO op_store_dcr (void)
2337
{
2338
    do_store_dcr();
2339
    RETURN();
2340
}
2341

    
2342
#if !defined(CONFIG_USER_ONLY)
2343
/* Return from critical interrupt :
2344
 * same as rfi, except nip & MSR are loaded from SRR2/3 instead of SRR0/1
2345
 */
2346
void OPPROTO op_40x_rfci (void)
2347
{
2348
    do_40x_rfci();
2349
    RETURN();
2350
}
2351

    
2352
void OPPROTO op_rfci (void)
2353
{
2354
    do_rfci();
2355
    RETURN();
2356
}
2357

    
2358
void OPPROTO op_rfdi (void)
2359
{
2360
    do_rfdi();
2361
    RETURN();
2362
}
2363

    
2364
void OPPROTO op_rfmci (void)
2365
{
2366
    do_rfmci();
2367
    RETURN();
2368
}
2369

    
2370
void OPPROTO op_wrte (void)
2371
{
2372
    /* We don't call do_store_msr here as we won't trigger
2373
     * any special case nor change hflags
2374
     */
2375
    T0 &= 1 << MSR_EE;
2376
    env->msr &= ~(1 << MSR_EE);
2377
    env->msr |= T0;
2378
    RETURN();
2379
}
2380

    
2381
void OPPROTO op_440_tlbre (void)
2382
{
2383
    do_440_tlbre(PARAM1);
2384
    RETURN();
2385
}
2386

    
2387
void OPPROTO op_440_tlbsx (void)
2388
{
2389
    T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_440_MMUCR] & 0xFF);
2390
    RETURN();
2391
}
2392

    
2393
void OPPROTO op_4xx_tlbsx_check (void)
2394
{
2395
    int tmp;
2396

    
2397
    tmp = xer_so;
2398
    if ((int)T0 != -1)
2399
        tmp |= 0x02;
2400
    env->crf[0] = tmp;
2401
    RETURN();
2402
}
2403

    
2404
void OPPROTO op_440_tlbwe (void)
2405
{
2406
    do_440_tlbwe(PARAM1);
2407
    RETURN();
2408
}
2409

    
2410
void OPPROTO op_4xx_tlbre_lo (void)
2411
{
2412
    do_4xx_tlbre_lo();
2413
    RETURN();
2414
}
2415

    
2416
void OPPROTO op_4xx_tlbre_hi (void)
2417
{
2418
    do_4xx_tlbre_hi();
2419
    RETURN();
2420
}
2421

    
2422
void OPPROTO op_4xx_tlbsx (void)
2423
{
2424
    T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_40x_PID]);
2425
    RETURN();
2426
}
2427

    
2428
void OPPROTO op_4xx_tlbwe_lo (void)
2429
{
2430
    do_4xx_tlbwe_lo();
2431
    RETURN();
2432
}
2433

    
2434
void OPPROTO op_4xx_tlbwe_hi (void)
2435
{
2436
    do_4xx_tlbwe_hi();
2437
    RETURN();
2438
}
2439
#endif
2440

    
2441
/* SPR micro-ops */
2442
/* 440 specific */
2443
void OPPROTO op_440_dlmzb (void)
2444
{
2445
    do_440_dlmzb();
2446
    RETURN();
2447
}
2448

    
2449
void OPPROTO op_440_dlmzb_update_Rc (void)
2450
{
2451
    if (T0 == 8)
2452
        T0 = 0x2;
2453
    else if (T0 < 4)
2454
        T0 = 0x4;
2455
    else
2456
        T0 = 0x8;
2457
    RETURN();
2458
}
2459

    
2460
#if !defined(CONFIG_USER_ONLY)
2461
void OPPROTO op_store_pir (void)
2462
{
2463
    env->spr[SPR_PIR] = T0 & 0x0000000FUL;
2464
    RETURN();
2465
}
2466

    
2467
void OPPROTO op_load_403_pb (void)
2468
{
2469
    do_load_403_pb(PARAM1);
2470
    RETURN();
2471
}
2472

    
2473
void OPPROTO op_store_403_pb (void)
2474
{
2475
    do_store_403_pb(PARAM1);
2476
    RETURN();
2477
}
2478

    
2479
void OPPROTO op_load_40x_pit (void)
2480
{
2481
    T0 = load_40x_pit(env);
2482
    RETURN();
2483
}
2484

    
2485
void OPPROTO op_store_40x_pit (void)
2486
{
2487
    store_40x_pit(env, T0);
2488
    RETURN();
2489
}
2490

    
2491
void OPPROTO op_store_40x_dbcr0 (void)
2492
{
2493
    store_40x_dbcr0(env, T0);
2494
    RETURN();
2495
}
2496

    
2497
void OPPROTO op_store_40x_sler (void)
2498
{
2499
    store_40x_sler(env, T0);
2500
    RETURN();
2501
}
2502

    
2503
void OPPROTO op_store_booke_tcr (void)
2504
{
2505
    store_booke_tcr(env, T0);
2506
    RETURN();
2507
}
2508

    
2509
void OPPROTO op_store_booke_tsr (void)
2510
{
2511
    store_booke_tsr(env, T0);
2512
    RETURN();
2513
}
2514
#endif /* !defined(CONFIG_USER_ONLY) */
2515

    
2516
/* SPE extension */
2517
void OPPROTO op_splatw_T1_64 (void)
2518
{
2519
    T1_64 = (T1_64 << 32) | (T1_64 & 0x00000000FFFFFFFFULL);
2520
    RETURN();
2521
}
2522

    
2523
void OPPROTO op_splatwi_T0_64 (void)
2524
{
2525
    uint64_t tmp = PARAM1;
2526

    
2527
    T0_64 = (tmp << 32) | tmp;
2528
    RETURN();
2529
}
2530

    
2531
void OPPROTO op_splatwi_T1_64 (void)
2532
{
2533
    uint64_t tmp = PARAM1;
2534

    
2535
    T1_64 = (tmp << 32) | tmp;
2536
    RETURN();
2537
}
2538

    
2539
void OPPROTO op_extsh_T1_64 (void)
2540
{
2541
    T1_64 = (int32_t)((int16_t)T1_64);
2542
    RETURN();
2543
}
2544

    
2545
void OPPROTO op_sli16_T1_64 (void)
2546
{
2547
    T1_64 = T1_64 << 16;
2548
    RETURN();
2549
}
2550

    
2551
void OPPROTO op_sli32_T1_64 (void)
2552
{
2553
    T1_64 = T1_64 << 32;
2554
    RETURN();
2555
}
2556

    
2557
void OPPROTO op_srli32_T1_64 (void)
2558
{
2559
    T1_64 = T1_64 >> 32;
2560
    RETURN();
2561
}
2562

    
2563
void OPPROTO op_evsel (void)
2564
{
2565
    do_evsel();
2566
    RETURN();
2567
}
2568

    
2569
void OPPROTO op_evaddw (void)
2570
{
2571
    do_evaddw();
2572
    RETURN();
2573
}
2574

    
2575
void OPPROTO op_evsubfw (void)
2576
{
2577
    do_evsubfw();
2578
    RETURN();
2579
}
2580

    
2581
void OPPROTO op_evneg (void)
2582
{
2583
    do_evneg();
2584
    RETURN();
2585
}
2586

    
2587
void OPPROTO op_evabs (void)
2588
{
2589
    do_evabs();
2590
    RETURN();
2591
}
2592

    
2593
void OPPROTO op_evextsh (void)
2594
{
2595
    T0_64 = ((uint64_t)((int32_t)(int16_t)(T0_64 >> 32)) << 32) |
2596
        (uint64_t)((int32_t)(int16_t)T0_64);
2597
    RETURN();
2598
}
2599

    
2600
void OPPROTO op_evextsb (void)
2601
{
2602
    T0_64 = ((uint64_t)((int32_t)(int8_t)(T0_64 >> 32)) << 32) |
2603
        (uint64_t)((int32_t)(int8_t)T0_64);
2604
    RETURN();
2605
}
2606

    
2607
void OPPROTO op_evcntlzw (void)
2608
{
2609
    do_evcntlzw();
2610
    RETURN();
2611
}
2612

    
2613
void OPPROTO op_evrndw (void)
2614
{
2615
    do_evrndw();
2616
    RETURN();
2617
}
2618

    
2619
void OPPROTO op_brinc (void)
2620
{
2621
    do_brinc();
2622
    RETURN();
2623
}
2624

    
2625
void OPPROTO op_evcntlsw (void)
2626
{
2627
    do_evcntlsw();
2628
    RETURN();
2629
}
2630

    
2631
void OPPROTO op_evand (void)
2632
{
2633
    T0_64 &= T1_64;
2634
    RETURN();
2635
}
2636

    
2637
void OPPROTO op_evandc (void)
2638
{
2639
    T0_64 &= ~T1_64;
2640
    RETURN();
2641
}
2642

    
2643
void OPPROTO op_evor (void)
2644
{
2645
    T0_64 |= T1_64;
2646
    RETURN();
2647
}
2648

    
2649
void OPPROTO op_evxor (void)
2650
{
2651
    T0_64 ^= T1_64;
2652
    RETURN();
2653
}
2654

    
2655
void OPPROTO op_eveqv (void)
2656
{
2657
    T0_64 = ~(T0_64 ^ T1_64);
2658
    RETURN();
2659
}
2660

    
2661
void OPPROTO op_evnor (void)
2662
{
2663
    T0_64 = ~(T0_64 | T1_64);
2664
    RETURN();
2665
}
2666

    
2667
void OPPROTO op_evorc (void)
2668
{
2669
    T0_64 |= ~T1_64;
2670
    RETURN();
2671
}
2672

    
2673
void OPPROTO op_evnand (void)
2674
{
2675
    T0_64 = ~(T0_64 & T1_64);
2676
    RETURN();
2677
}
2678

    
2679
void OPPROTO op_evsrws (void)
2680
{
2681
    do_evsrws();
2682
    RETURN();
2683
}
2684

    
2685
void OPPROTO op_evsrwu (void)
2686
{
2687
    do_evsrwu();
2688
    RETURN();
2689
}
2690

    
2691
void OPPROTO op_evslw (void)
2692
{
2693
    do_evslw();
2694
    RETURN();
2695
}
2696

    
2697
void OPPROTO op_evrlw (void)
2698
{
2699
    do_evrlw();
2700
    RETURN();
2701
}
2702

    
2703
void OPPROTO op_evmergelo (void)
2704
{
2705
    T0_64 = (T0_64 << 32) | (T1_64 & 0x00000000FFFFFFFFULL);
2706
    RETURN();
2707
}
2708

    
2709
void OPPROTO op_evmergehi (void)
2710
{
2711
    T0_64 = (T0_64 & 0xFFFFFFFF00000000ULL) | (T1_64 >> 32);
2712
    RETURN();
2713
}
2714

    
2715
void OPPROTO op_evmergelohi (void)
2716
{
2717
    T0_64 = (T0_64 << 32) | (T1_64 >> 32);
2718
    RETURN();
2719
}
2720

    
2721
void OPPROTO op_evmergehilo (void)
2722
{
2723
    T0_64 = (T0_64 & 0xFFFFFFFF00000000ULL) | (T1_64 & 0x00000000FFFFFFFFULL);
2724
    RETURN();
2725
}
2726

    
2727
void OPPROTO op_evcmpgts (void)
2728
{
2729
    do_evcmpgts();
2730
    RETURN();
2731
}
2732

    
2733
void OPPROTO op_evcmpgtu (void)
2734
{
2735
    do_evcmpgtu();
2736
    RETURN();
2737
}
2738

    
2739
void OPPROTO op_evcmplts (void)
2740
{
2741
    do_evcmplts();
2742
    RETURN();
2743
}
2744

    
2745
void OPPROTO op_evcmpltu (void)
2746
{
2747
    do_evcmpltu();
2748
    RETURN();
2749
}
2750

    
2751
void OPPROTO op_evcmpeq (void)
2752
{
2753
    do_evcmpeq();
2754
    RETURN();
2755
}
2756

    
2757
void OPPROTO op_evfssub (void)
2758
{
2759
    do_evfssub();
2760
    RETURN();
2761
}
2762

    
2763
void OPPROTO op_evfsadd (void)
2764
{
2765
    do_evfsadd();
2766
    RETURN();
2767
}
2768

    
2769
void OPPROTO op_evfsnabs (void)
2770
{
2771
    do_evfsnabs();
2772
    RETURN();
2773
}
2774

    
2775
void OPPROTO op_evfsabs (void)
2776
{
2777
    do_evfsabs();
2778
    RETURN();
2779
}
2780

    
2781
void OPPROTO op_evfsneg (void)
2782
{
2783
    do_evfsneg();
2784
    RETURN();
2785
}
2786

    
2787
void OPPROTO op_evfsdiv (void)
2788
{
2789
    do_evfsdiv();
2790
    RETURN();
2791
}
2792

    
2793
void OPPROTO op_evfsmul (void)
2794
{
2795
    do_evfsmul();
2796
    RETURN();
2797
}
2798

    
2799
void OPPROTO op_evfscmplt (void)
2800
{
2801
    do_evfscmplt();
2802
    RETURN();
2803
}
2804

    
2805
void OPPROTO op_evfscmpgt (void)
2806
{
2807
    do_evfscmpgt();
2808
    RETURN();
2809
}
2810

    
2811
void OPPROTO op_evfscmpeq (void)
2812
{
2813
    do_evfscmpeq();
2814
    RETURN();
2815
}
2816

    
2817
void OPPROTO op_evfscfsi (void)
2818
{
2819
    do_evfscfsi();
2820
    RETURN();
2821
}
2822

    
2823
void OPPROTO op_evfscfui (void)
2824
{
2825
    do_evfscfui();
2826
    RETURN();
2827
}
2828

    
2829
void OPPROTO op_evfscfsf (void)
2830
{
2831
    do_evfscfsf();
2832
    RETURN();
2833
}
2834

    
2835
void OPPROTO op_evfscfuf (void)
2836
{
2837
    do_evfscfuf();
2838
    RETURN();
2839
}
2840

    
2841
void OPPROTO op_evfsctsi (void)
2842
{
2843
    do_evfsctsi();
2844
    RETURN();
2845
}
2846

    
2847
void OPPROTO op_evfsctui (void)
2848
{
2849
    do_evfsctui();
2850
    RETURN();
2851
}
2852

    
2853
void OPPROTO op_evfsctsf (void)
2854
{
2855
    do_evfsctsf();
2856
    RETURN();
2857
}
2858

    
2859
void OPPROTO op_evfsctuf (void)
2860
{
2861
    do_evfsctuf();
2862
    RETURN();
2863
}
2864

    
2865
void OPPROTO op_evfsctuiz (void)
2866
{
2867
    do_evfsctuiz();
2868
    RETURN();
2869
}
2870

    
2871
void OPPROTO op_evfsctsiz (void)
2872
{
2873
    do_evfsctsiz();
2874
    RETURN();
2875
}
2876

    
2877
void OPPROTO op_evfststlt (void)
2878
{
2879
    do_evfststlt();
2880
    RETURN();
2881
}
2882

    
2883
void OPPROTO op_evfststgt (void)
2884
{
2885
    do_evfststgt();
2886
    RETURN();
2887
}
2888

    
2889
void OPPROTO op_evfststeq (void)
2890
{
2891
    do_evfststeq();
2892
    RETURN();
2893
}
2894

    
2895
void OPPROTO op_efssub (void)
2896
{
2897
    T0_64 = _do_efssub(T0_64, T1_64);
2898
    RETURN();
2899
}
2900

    
2901
void OPPROTO op_efsadd (void)
2902
{
2903
    T0_64 = _do_efsadd(T0_64, T1_64);
2904
    RETURN();
2905
}
2906

    
2907
void OPPROTO op_efsnabs (void)
2908
{
2909
    T0_64 = _do_efsnabs(T0_64);
2910
    RETURN();
2911
}
2912

    
2913
void OPPROTO op_efsabs (void)
2914
{
2915
    T0_64 = _do_efsabs(T0_64);
2916
    RETURN();
2917
}
2918

    
2919
void OPPROTO op_efsneg (void)
2920
{
2921
    T0_64 = _do_efsneg(T0_64);
2922
    RETURN();
2923
}
2924

    
2925
void OPPROTO op_efsdiv (void)
2926
{
2927
    T0_64 = _do_efsdiv(T0_64, T1_64);
2928
    RETURN();
2929
}
2930

    
2931
void OPPROTO op_efsmul (void)
2932
{
2933
    T0_64 = _do_efsmul(T0_64, T1_64);
2934
    RETURN();
2935
}
2936

    
2937
void OPPROTO op_efscmplt (void)
2938
{
2939
    do_efscmplt();
2940
    RETURN();
2941
}
2942

    
2943
void OPPROTO op_efscmpgt (void)
2944
{
2945
    do_efscmpgt();
2946
    RETURN();
2947
}
2948

    
2949
void OPPROTO op_efscfd (void)
2950
{
2951
    do_efscfd();
2952
    RETURN();
2953
}
2954

    
2955
void OPPROTO op_efscmpeq (void)
2956
{
2957
    do_efscmpeq();
2958
    RETURN();
2959
}
2960

    
2961
void OPPROTO op_efscfsi (void)
2962
{
2963
    do_efscfsi();
2964
    RETURN();
2965
}
2966

    
2967
void OPPROTO op_efscfui (void)
2968
{
2969
    do_efscfui();
2970
    RETURN();
2971
}
2972

    
2973
void OPPROTO op_efscfsf (void)
2974
{
2975
    do_efscfsf();
2976
    RETURN();
2977
}
2978

    
2979
void OPPROTO op_efscfuf (void)
2980
{
2981
    do_efscfuf();
2982
    RETURN();
2983
}
2984

    
2985
void OPPROTO op_efsctsi (void)
2986
{
2987
    do_efsctsi();
2988
    RETURN();
2989
}
2990

    
2991
void OPPROTO op_efsctui (void)
2992
{
2993
    do_efsctui();
2994
    RETURN();
2995
}
2996

    
2997
void OPPROTO op_efsctsf (void)
2998
{
2999
    do_efsctsf();
3000
    RETURN();
3001
}
3002

    
3003
void OPPROTO op_efsctuf (void)
3004
{
3005
    do_efsctuf();
3006
    RETURN();
3007
}
3008

    
3009
void OPPROTO op_efsctsiz (void)
3010
{
3011
    do_efsctsiz();
3012
    RETURN();
3013
}
3014

    
3015
void OPPROTO op_efsctuiz (void)
3016
{
3017
    do_efsctuiz();
3018
    RETURN();
3019
}
3020

    
3021
void OPPROTO op_efststlt (void)
3022
{
3023
    T0 = _do_efststlt(T0_64, T1_64);
3024
    RETURN();
3025
}
3026

    
3027
void OPPROTO op_efststgt (void)
3028
{
3029
    T0 = _do_efststgt(T0_64, T1_64);
3030
    RETURN();
3031
}
3032

    
3033
void OPPROTO op_efststeq (void)
3034
{
3035
    T0 = _do_efststeq(T0_64, T1_64);
3036
    RETURN();
3037
}
3038

    
3039
void OPPROTO op_efdsub (void)
3040
{
3041
    CPU_DoubleU u1, u2;
3042
    u1.ll = T0_64;
3043
    u2.ll = T1_64;
3044
    u1.d = float64_sub(u1.d, u2.d, &env->spe_status);
3045
    T0_64 = u1.ll;
3046
    RETURN();
3047
}
3048

    
3049
void OPPROTO op_efdadd (void)
3050
{
3051
    CPU_DoubleU u1, u2;
3052
    u1.ll = T0_64;
3053
    u2.ll = T1_64;
3054
    u1.d = float64_add(u1.d, u2.d, &env->spe_status);
3055
    T0_64 = u1.ll;
3056
    RETURN();
3057
}
3058

    
3059
void OPPROTO op_efdcfsid (void)
3060
{
3061
    do_efdcfsi();
3062
    RETURN();
3063
}
3064

    
3065
void OPPROTO op_efdcfuid (void)
3066
{
3067
    do_efdcfui();
3068
    RETURN();
3069
}
3070

    
3071
void OPPROTO op_efdnabs (void)
3072
{
3073
    T0_64 |= 0x8000000000000000ULL;
3074
    RETURN();
3075
}
3076

    
3077
void OPPROTO op_efdabs (void)
3078
{
3079
    T0_64 &= ~0x8000000000000000ULL;
3080
    RETURN();
3081
}
3082

    
3083
void OPPROTO op_efdneg (void)
3084
{
3085
    T0_64 ^= 0x8000000000000000ULL;
3086
    RETURN();
3087
}
3088

    
3089
void OPPROTO op_efddiv (void)
3090
{
3091
    CPU_DoubleU u1, u2;
3092
    u1.ll = T0_64;
3093
    u2.ll = T1_64;
3094
    u1.d = float64_div(u1.d, u2.d, &env->spe_status);
3095
    T0_64 = u1.ll;
3096
    RETURN();
3097
}
3098

    
3099
void OPPROTO op_efdmul (void)
3100
{
3101
    CPU_DoubleU u1, u2;
3102
    u1.ll = T0_64;
3103
    u2.ll = T1_64;
3104
    u1.d = float64_mul(u1.d, u2.d, &env->spe_status);
3105
    T0_64 = u1.ll;
3106
    RETURN();
3107
}
3108

    
3109
void OPPROTO op_efdctsidz (void)
3110
{
3111
    do_efdctsiz();
3112
    RETURN();
3113
}
3114

    
3115
void OPPROTO op_efdctuidz (void)
3116
{
3117
    do_efdctuiz();
3118
    RETURN();
3119
}
3120

    
3121
void OPPROTO op_efdcmplt (void)
3122
{
3123
    do_efdcmplt();
3124
    RETURN();
3125
}
3126

    
3127
void OPPROTO op_efdcmpgt (void)
3128
{
3129
    do_efdcmpgt();
3130
    RETURN();
3131
}
3132

    
3133
void OPPROTO op_efdcfs (void)
3134
{
3135
    do_efdcfs();
3136
    RETURN();
3137
}
3138

    
3139
void OPPROTO op_efdcmpeq (void)
3140
{
3141
    do_efdcmpeq();
3142
    RETURN();
3143
}
3144

    
3145
void OPPROTO op_efdcfsi (void)
3146
{
3147
    do_efdcfsi();
3148
    RETURN();
3149
}
3150

    
3151
void OPPROTO op_efdcfui (void)
3152
{
3153
    do_efdcfui();
3154
    RETURN();
3155
}
3156

    
3157
void OPPROTO op_efdcfsf (void)
3158
{
3159
    do_efdcfsf();
3160
    RETURN();
3161
}
3162

    
3163
void OPPROTO op_efdcfuf (void)
3164
{
3165
    do_efdcfuf();
3166
    RETURN();
3167
}
3168

    
3169
void OPPROTO op_efdctsi (void)
3170
{
3171
    do_efdctsi();
3172
    RETURN();
3173
}
3174

    
3175
void OPPROTO op_efdctui (void)
3176
{
3177
    do_efdctui();
3178
    RETURN();
3179
}
3180

    
3181
void OPPROTO op_efdctsf (void)
3182
{
3183
    do_efdctsf();
3184
    RETURN();
3185
}
3186

    
3187
void OPPROTO op_efdctuf (void)
3188
{
3189
    do_efdctuf();
3190
    RETURN();
3191
}
3192

    
3193
void OPPROTO op_efdctuiz (void)
3194
{
3195
    do_efdctuiz();
3196
    RETURN();
3197
}
3198

    
3199
void OPPROTO op_efdctsiz (void)
3200
{
3201
    do_efdctsiz();
3202
    RETURN();
3203
}
3204

    
3205
void OPPROTO op_efdtstlt (void)
3206
{
3207
    T0 = _do_efdtstlt(T0_64, T1_64);
3208
    RETURN();
3209
}
3210

    
3211
void OPPROTO op_efdtstgt (void)
3212
{
3213
    T0 = _do_efdtstgt(T0_64, T1_64);
3214
    RETURN();
3215
}
3216

    
3217
void OPPROTO op_efdtsteq (void)
3218
{
3219
    T0 = _do_efdtsteq(T0_64, T1_64);
3220
    RETURN();
3221
}