Statistics
| Branch: | Revision:

root / target-alpha / op.c @ e14fe0a9

History | View | Annotate | Download (14.6 kB)

1
/*
2
 *  Alpha emulation cpu micro-operations for qemu.
3
 *
4
 *  Copyright (c) 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

    
26
#include "op_helper.h"
27

    
28
#define REG 0
29
#include "op_template.h"
30

    
31
#define REG 1
32
#include "op_template.h"
33

    
34
#define REG 2
35
#include "op_template.h"
36

    
37
#define REG 3
38
#include "op_template.h"
39

    
40
#define REG 4
41
#include "op_template.h"
42

    
43
#define REG 5
44
#include "op_template.h"
45

    
46
#define REG 6
47
#include "op_template.h"
48

    
49
#define REG 7
50
#include "op_template.h"
51

    
52
#define REG 8
53
#include "op_template.h"
54

    
55
#define REG 9
56
#include "op_template.h"
57

    
58
#define REG 10
59
#include "op_template.h"
60

    
61
#define REG 11
62
#include "op_template.h"
63

    
64
#define REG 12
65
#include "op_template.h"
66

    
67
#define REG 13
68
#include "op_template.h"
69

    
70
#define REG 14
71
#include "op_template.h"
72

    
73
#define REG 15
74
#include "op_template.h"
75

    
76
#define REG 16
77
#include "op_template.h"
78

    
79
#define REG 17
80
#include "op_template.h"
81

    
82
#define REG 18
83
#include "op_template.h"
84

    
85
#define REG 19
86
#include "op_template.h"
87

    
88
#define REG 20
89
#include "op_template.h"
90

    
91
#define REG 21
92
#include "op_template.h"
93

    
94
#define REG 22
95
#include "op_template.h"
96

    
97
#define REG 23
98
#include "op_template.h"
99

    
100
#define REG 24
101
#include "op_template.h"
102

    
103
#define REG 25
104
#include "op_template.h"
105

    
106
#define REG 26
107
#include "op_template.h"
108

    
109
#define REG 27
110
#include "op_template.h"
111

    
112
#define REG 28
113
#include "op_template.h"
114

    
115
#define REG 29
116
#include "op_template.h"
117

    
118
#define REG 30
119
#include "op_template.h"
120

    
121
#define REG 31
122
#include "op_template.h"
123

    
124
/* Debug stuff */
125
void OPPROTO op_no_op (void)
126
{
127
#if !defined (DEBUG_OP)
128
    __asm__ __volatile__("nop" : : : "memory");
129
#endif
130
    RETURN();
131
}
132

    
133
void OPPROTO op_tb_flush (void)
134
{
135
    helper_tb_flush();
136
    RETURN();
137
}
138

    
139
/* Load and stores */
140
#define MEMSUFFIX _raw
141
#include "op_mem.h"
142
#if !defined(CONFIG_USER_ONLY)
143
#define MEMSUFFIX _kernel
144
#include "op_mem.h"
145
#define MEMSUFFIX _executive
146
#include "op_mem.h"
147
#define MEMSUFFIX _supervisor
148
#include "op_mem.h"
149
#define MEMSUFFIX _user
150
#include "op_mem.h"
151
/* This is used for pal modes */
152
#define MEMSUFFIX _data
153
#include "op_mem.h"
154
#endif
155

    
156
/* Special operation for load and store */
157
void OPPROTO op_n7 (void)
158
{
159
    T0 &= ~(uint64_t)0x7;
160
    RETURN();
161
}
162

    
163
/* Misc */
164
void OPPROTO op_excp (void)
165
{
166
    helper_excp(PARAM(1), PARAM(2));
167
    RETURN();
168
}
169

    
170
void OPPROTO op_load_amask (void)
171
{
172
    helper_amask();
173
    RETURN();
174
}
175

    
176
void OPPROTO op_load_pcc (void)
177
{
178
    helper_load_pcc();
179
    RETURN();
180
}
181

    
182
void OPPROTO op_load_implver (void)
183
{
184
    helper_load_implver();
185
    RETURN();
186
}
187

    
188
void OPPROTO op_load_fpcr (void)
189
{
190
    helper_load_fpcr();
191
    RETURN();
192
}
193

    
194
void OPPROTO op_store_fpcr (void)
195
{
196
    helper_store_fpcr();
197
    RETURN();
198
}
199

    
200
void OPPROTO op_load_irf (void)
201
{
202
    helper_load_irf();
203
    RETURN();
204
}
205

    
206
void OPPROTO op_set_irf (void)
207
{
208
    helper_set_irf();
209
    RETURN();
210
}
211

    
212
void OPPROTO op_clear_irf (void)
213
{
214
    helper_clear_irf();
215
    RETURN();
216
}
217

    
218
void OPPROTO op_exit_tb (void)
219
{
220
    EXIT_TB();
221
}
222

    
223
/* Arithmetic */
224
void OPPROTO op_addq (void)
225
{
226
    T0 += T1;
227
    RETURN();
228
}
229

    
230
void OPPROTO op_addqv (void)
231
{
232
    helper_addqv();
233
    RETURN();
234
}
235

    
236
void OPPROTO op_addl (void)
237
{
238
    T0 = (int64_t)((int32_t)(T0 + T1));
239
    RETURN();
240
}
241

    
242
void OPPROTO op_addlv (void)
243
{
244
    helper_addlv();
245
    RETURN();
246
}
247

    
248
void OPPROTO op_subq (void)
249
{
250
    T0 -= T1;
251
    RETURN();
252
}
253

    
254
void OPPROTO op_subqv (void)
255
{
256
    helper_subqv();
257
    RETURN();
258
}
259

    
260
void OPPROTO op_subl (void)
261
{
262
    T0 = (int64_t)((int32_t)(T0 - T1));
263
    RETURN();
264
}
265

    
266
void OPPROTO op_sublv (void)
267
{
268
    helper_sublv();
269
    RETURN();
270
}
271

    
272
void OPPROTO op_s4 (void)
273
{
274
    T0 <<= 2;
275
    RETURN();
276
}
277

    
278
void OPPROTO op_s8 (void)
279
{
280
    T0 <<= 3;
281
    RETURN();
282
}
283

    
284
void OPPROTO op_mull (void)
285
{
286
    T0 = (int64_t)((int32_t)T0 * (int32_t)T1);
287
    RETURN();
288
}
289

    
290
void OPPROTO op_mullv (void)
291
{
292
    helper_mullv();
293
    RETURN();
294
}
295

    
296
void OPPROTO op_mulq (void)
297
{
298
    T0 = (int64_t)T0 * (int64_t)T1;
299
    RETURN();
300
}
301

    
302
void OPPROTO op_mulqv (void)
303
{
304
    helper_mulqv();
305
    RETURN();
306
}
307

    
308
void OPPROTO op_umulh (void)
309
{
310
    uint64_t tl, th;
311

    
312
    mulu64(&tl, &th, T0, T1);
313
    T0 = th;
314
    RETURN();
315
}
316

    
317
/* Logical */
318
void OPPROTO op_and (void)
319
{
320
    T0 &= T1;
321
    RETURN();
322
}
323

    
324
void OPPROTO op_bic (void)
325
{
326
    T0 &= ~T1;
327
    RETURN();
328
}
329

    
330
void OPPROTO op_bis (void)
331
{
332
    T0 |= T1;
333
    RETURN();
334
}
335

    
336
void OPPROTO op_eqv (void)
337
{
338
    T0 ^= ~T1;
339
    RETURN();
340
}
341

    
342
void OPPROTO op_ornot (void)
343
{
344
    T0 |= ~T1;
345
    RETURN();
346
}
347

    
348
void OPPROTO op_xor (void)
349
{
350
    T0 ^= T1;
351
    RETURN();
352
}
353

    
354
void OPPROTO op_sll (void)
355
{
356
    T0 <<= T1;
357
    RETURN();
358
}
359

    
360
void OPPROTO op_srl (void)
361
{
362
    T0 >>= T1;
363
    RETURN();
364
}
365

    
366
void OPPROTO op_sra (void)
367
{
368
    T0 = (int64_t)T0 >> T1;
369
    RETURN();
370
}
371

    
372
void OPPROTO op_sextb (void)
373
{
374
    T0 = (int64_t)((int8_t)T0);
375
    RETURN();
376
}
377

    
378
void OPPROTO op_sextw (void)
379
{
380
    T0 = (int64_t)((int16_t)T0);
381
    RETURN();
382

    
383
}
384

    
385
void OPPROTO op_ctpop (void)
386
{
387
    helper_ctpop();
388
    RETURN();
389
}
390

    
391
void OPPROTO op_ctlz (void)
392
{
393
    helper_ctlz();
394
    RETURN();
395
}
396

    
397
void OPPROTO op_cttz (void)
398
{
399
    helper_cttz();
400
    RETURN();
401
}
402

    
403
void OPPROTO op_mskbl (void)
404
{
405
    helper_mskbl();
406
    RETURN();
407
}
408

    
409
void OPPROTO op_extbl (void)
410
{
411
    helper_extbl();
412
    RETURN();
413
}
414

    
415
void OPPROTO op_insbl (void)
416
{
417
    helper_insbl();
418
    RETURN();
419
}
420

    
421
void OPPROTO op_mskwl (void)
422
{
423
    helper_mskwl();
424
    RETURN();
425
}
426

    
427
void OPPROTO op_extwl (void)
428
{
429
    helper_extwl();
430
    RETURN();
431
}
432

    
433
void OPPROTO op_inswl (void)
434
{
435
    helper_inswl();
436
    RETURN();
437
}
438

    
439
void OPPROTO op_mskll (void)
440
{
441
    helper_mskll();
442
    RETURN();
443
}
444

    
445
void OPPROTO op_extll (void)
446
{
447
    helper_extll();
448
    RETURN();
449
}
450

    
451
void OPPROTO op_insll (void)
452
{
453
    helper_insll();
454
    RETURN();
455
}
456

    
457
void OPPROTO op_zap (void)
458
{
459
    helper_zap();
460
    RETURN();
461
}
462

    
463
void OPPROTO op_zapnot (void)
464
{
465
    helper_zapnot();
466
    RETURN();
467
}
468

    
469
void OPPROTO op_mskql (void)
470
{
471
    helper_mskql();
472
    RETURN();
473
}
474

    
475
void OPPROTO op_extql (void)
476
{
477
    helper_extql();
478
    RETURN();
479
}
480

    
481
void OPPROTO op_insql (void)
482
{
483
    helper_insql();
484
    RETURN();
485
}
486

    
487
void OPPROTO op_mskwh (void)
488
{
489
    helper_mskwh();
490
    RETURN();
491
}
492

    
493
void OPPROTO op_inswh (void)
494
{
495
    helper_inswh();
496
    RETURN();
497
}
498

    
499
void OPPROTO op_extwh (void)
500
{
501
    helper_extwh();
502
    RETURN();
503
}
504

    
505
void OPPROTO op_msklh (void)
506
{
507
    helper_msklh();
508
    RETURN();
509
}
510

    
511
void OPPROTO op_inslh (void)
512
{
513
    helper_inslh();
514
    RETURN();
515
}
516

    
517
void OPPROTO op_extlh (void)
518
{
519
    helper_extlh();
520
    RETURN();
521
}
522

    
523
void OPPROTO op_mskqh (void)
524
{
525
    helper_mskqh();
526
    RETURN();
527
}
528

    
529
void OPPROTO op_insqh (void)
530
{
531
    helper_insqh();
532
    RETURN();
533
}
534

    
535
void OPPROTO op_extqh (void)
536
{
537
    helper_extqh();
538
    RETURN();
539
}
540

    
541
/* Tests */
542
void OPPROTO op_cmpult (void)
543
{
544
    if (T0 < T1)
545
        T0 = 1;
546
    else
547
        T0 = 0;
548
    RETURN();
549
}
550

    
551
void OPPROTO op_cmpule (void)
552
{
553
    if (T0 <= T1)
554
        T0 = 1;
555
    else
556
        T0 = 0;
557
    RETURN();
558
}
559

    
560
void OPPROTO op_cmpeq (void)
561
{
562
    if (T0 == T1)
563
        T0 = 1;
564
    else
565
        T0 = 0;
566
    RETURN();
567
}
568

    
569
void OPPROTO op_cmplt (void)
570
{
571
    if ((int64_t)T0 < (int64_t)T1)
572
        T0 = 1;
573
    else
574
        T0 = 0;
575
    RETURN();
576
}
577

    
578
void OPPROTO op_cmple (void)
579
{
580
    if ((int64_t)T0 <= (int64_t)T1)
581
        T0 = 1;
582
    else
583
        T0 = 0;
584
    RETURN();
585
}
586

    
587
void OPPROTO op_cmpbge (void)
588
{
589
    helper_cmpbge();
590
    RETURN();
591
}
592

    
593
void OPPROTO op_cmpeqz (void)
594
{
595
    if (T0 == 0)
596
        T0 = 1;
597
    else
598
        T0 = 0;
599
    RETURN();
600
}
601

    
602
void OPPROTO op_cmpnez (void)
603
{
604
    if (T0 != 0)
605
        T0 = 1;
606
    else
607
        T0 = 0;
608
    RETURN();
609
}
610

    
611
void OPPROTO op_cmpltz (void)
612
{
613
    if ((int64_t)T0 < 0)
614
        T0 = 1;
615
    else
616
        T0 = 0;
617
    RETURN();
618
}
619

    
620
void OPPROTO op_cmplez (void)
621
{
622
    if ((int64_t)T0 <= 0)
623
        T0 = 1;
624
    else
625
        T0 = 0;
626
    RETURN();
627
}
628

    
629
void OPPROTO op_cmpgtz (void)
630
{
631
    if ((int64_t)T0 > 0)
632
        T0 = 1;
633
    else
634
        T0 = 0;
635
    RETURN();
636
}
637

    
638
void OPPROTO op_cmpgez (void)
639
{
640
    if ((int64_t)T0 >= 0)
641
        T0 = 1;
642
    else
643
        T0 = 0;
644
    RETURN();
645
}
646

    
647
void OPPROTO op_cmplbs (void)
648
{
649
    T0 &= 1;
650
    RETURN();
651
}
652

    
653
void OPPROTO op_cmplbc (void)
654
{
655
    T0 = (~T0) & 1;
656
    RETURN();
657
}
658

    
659
/* Branches */
660
void OPPROTO op_branch (void)
661
{
662
    env->pc = T0 & ~3;
663
    RETURN();
664
}
665

    
666
void OPPROTO op_addq1 (void)
667
{
668
    T1 += T0;
669
    RETURN();
670
}
671

    
672
#if 0 // Qemu does not know how to do this...
673
void OPPROTO op_bcond (void)
674
{
675
    if (T0)
676
        env->pc = T1 & ~3;
677
    else
678
        env->pc = PARAM(1);
679
    RETURN();
680
}
681
#else
682
void OPPROTO op_bcond (void)
683
{
684
    if (T0)
685
        env->pc = T1 & ~3;
686
    else
687
        env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
688
    RETURN();
689
}
690
#endif
691

    
692
#if 0 // Qemu does not know how to do this...
693
void OPPROTO op_update_pc (void)
694
{
695
    env->pc = PARAM(1);
696
    RETURN();
697
}
698
#else
699
void OPPROTO op_update_pc (void)
700
{
701
    env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
702
    RETURN();
703
}
704
#endif
705

    
706
/* Optimization for 32 bits hosts architectures */
707
void OPPROTO op_update_pc32 (void)
708
{
709
    env->pc = (uint64_t)PARAM(1);
710
    RETURN();
711
}
712

    
713
/* IEEE floating point arithmetic */
714
/* S floating (single) */
715
void OPPROTO op_adds (void)
716
{
717
    FT0 = float32_add(FT0, FT1, &FP_STATUS);
718
    RETURN();
719
}
720

    
721
void OPPROTO op_subs (void)
722
{
723
    FT0 = float32_sub(FT0, FT1, &FP_STATUS);
724
    RETURN();
725
}
726

    
727
void OPPROTO op_muls (void)
728
{
729
    FT0 = float32_mul(FT0, FT1, &FP_STATUS);
730
    RETURN();
731
}
732

    
733
void OPPROTO op_divs (void)
734
{
735
    FT0 = float32_div(FT0, FT1, &FP_STATUS);
736
    RETURN();
737
}
738

    
739
void OPPROTO op_sqrts (void)
740
{
741
    helper_sqrts();
742
    RETURN();
743
}
744

    
745
void OPPROTO op_cpys (void)
746
{
747
    helper_cpys();
748
    RETURN();
749
}
750

    
751
void OPPROTO op_cpysn (void)
752
{
753
    helper_cpysn();
754
    RETURN();
755
}
756

    
757
void OPPROTO op_cpyse (void)
758
{
759
    helper_cpyse();
760
    RETURN();
761
}
762

    
763
void OPPROTO op_itofs (void)
764
{
765
    helper_itofs();
766
    RETURN();
767
}
768

    
769
void OPPROTO op_ftois (void)
770
{
771
    helper_ftois();
772
    RETURN();
773
}
774

    
775
/* T floating (double) */
776
void OPPROTO op_addt (void)
777
{
778
    FT0 = float64_add(FT0, FT1, &FP_STATUS);
779
    RETURN();
780
}
781

    
782
void OPPROTO op_subt (void)
783
{
784
    FT0 = float64_sub(FT0, FT1, &FP_STATUS);
785
    RETURN();
786
}
787

    
788
void OPPROTO op_mult (void)
789
{
790
    FT0 = float64_mul(FT0, FT1, &FP_STATUS);
791
    RETURN();
792
}
793

    
794
void OPPROTO op_divt (void)
795
{
796
    FT0 = float64_div(FT0, FT1, &FP_STATUS);
797
    RETURN();
798
}
799

    
800
void OPPROTO op_sqrtt (void)
801
{
802
    helper_sqrtt();
803
    RETURN();
804
}
805

    
806
void OPPROTO op_cmptun (void)
807
{
808
    helper_cmptun();
809
    RETURN();
810
}
811

    
812
void OPPROTO op_cmpteq (void)
813
{
814
    helper_cmpteq();
815
    RETURN();
816
}
817

    
818
void OPPROTO op_cmptle (void)
819
{
820
    helper_cmptle();
821
    RETURN();
822
}
823

    
824
void OPPROTO op_cmptlt (void)
825
{
826
    helper_cmptlt();
827
    RETURN();
828
}
829

    
830
void OPPROTO op_itoft (void)
831
{
832
    helper_itoft();
833
    RETURN();
834
}
835

    
836
void OPPROTO op_ftoit (void)
837
{
838
    helper_ftoit();
839
    RETURN();
840
}
841

    
842
/* VAX floating point arithmetic */
843
/* F floating */
844
void OPPROTO op_addf (void)
845
{
846
    helper_addf();
847
    RETURN();
848
}
849

    
850
void OPPROTO op_subf (void)
851
{
852
    helper_subf();
853
    RETURN();
854
}
855

    
856
void OPPROTO op_mulf (void)
857
{
858
    helper_mulf();
859
    RETURN();
860
}
861

    
862
void OPPROTO op_divf (void)
863
{
864
    helper_divf();
865
    RETURN();
866
}
867

    
868
void OPPROTO op_sqrtf (void)
869
{
870
    helper_sqrtf();
871
    RETURN();
872
}
873

    
874
void OPPROTO op_cmpfeq (void)
875
{
876
    helper_cmpfeq();
877
    RETURN();
878
}
879

    
880
void OPPROTO op_cmpfne (void)
881
{
882
    helper_cmpfne();
883
    RETURN();
884
}
885

    
886
void OPPROTO op_cmpflt (void)
887
{
888
    helper_cmpflt();
889
    RETURN();
890
}
891

    
892
void OPPROTO op_cmpfle (void)
893
{
894
    helper_cmpfle();
895
    RETURN();
896
}
897

    
898
void OPPROTO op_cmpfgt (void)
899
{
900
    helper_cmpfgt();
901
    RETURN();
902
}
903

    
904
void OPPROTO op_cmpfge (void)
905
{
906
    helper_cmpfge();
907
    RETURN();
908
}
909

    
910
void OPPROTO op_itoff (void)
911
{
912
    helper_itoff();
913
    RETURN();
914
}
915

    
916
/* G floating */
917
void OPPROTO op_addg (void)
918
{
919
    helper_addg();
920
    RETURN();
921
}
922

    
923
void OPPROTO op_subg (void)
924
{
925
    helper_subg();
926
    RETURN();
927
}
928

    
929
void OPPROTO op_mulg (void)
930
{
931
    helper_mulg();
932
    RETURN();
933
}
934

    
935
void OPPROTO op_divg (void)
936
{
937
    helper_divg();
938
    RETURN();
939
}
940

    
941
void OPPROTO op_sqrtg (void)
942
{
943
    helper_sqrtg();
944
    RETURN();
945
}
946

    
947
void OPPROTO op_cmpgeq (void)
948
{
949
    helper_cmpgeq();
950
    RETURN();
951
}
952

    
953
void OPPROTO op_cmpglt (void)
954
{
955
    helper_cmpglt();
956
    RETURN();
957
}
958

    
959
void OPPROTO op_cmpgle (void)
960
{
961
    helper_cmpgle();
962
    RETURN();
963
}
964

    
965
/* Floating point format conversion */
966
void OPPROTO op_cvtst (void)
967
{
968
    FT0 = (float)FT0;
969
    RETURN();
970
}
971

    
972
void OPPROTO op_cvtqs (void)
973
{
974
    helper_cvtqs();
975
    RETURN();
976
}
977

    
978
void OPPROTO op_cvtts (void)
979
{
980
    FT0 = (float)FT0;
981
    RETURN();
982
}
983

    
984
void OPPROTO op_cvttq (void)
985
{
986
    helper_cvttq();
987
    RETURN();
988
}
989

    
990
void OPPROTO op_cvtqt (void)
991
{
992
    helper_cvtqt();
993
    RETURN();
994
}
995

    
996
void OPPROTO op_cvtqf (void)
997
{
998
    helper_cvtqf();
999
    RETURN();
1000
}
1001

    
1002
void OPPROTO op_cvtgf (void)
1003
{
1004
    helper_cvtgf();
1005
    RETURN();
1006
}
1007

    
1008
void OPPROTO op_cvtgd (void)
1009
{
1010
    helper_cvtgd();
1011
    RETURN();
1012
}
1013

    
1014
void OPPROTO op_cvtgq (void)
1015
{
1016
    helper_cvtgq();
1017
    RETURN();
1018
}
1019

    
1020
void OPPROTO op_cvtqg (void)
1021
{
1022
    helper_cvtqg();
1023
    RETURN();
1024
}
1025

    
1026
void OPPROTO op_cvtdg (void)
1027
{
1028
    helper_cvtdg();
1029
    RETURN();
1030
}
1031

    
1032
void OPPROTO op_cvtlq (void)
1033
{
1034
    helper_cvtlq();
1035
    RETURN();
1036
}
1037

    
1038
void OPPROTO op_cvtql (void)
1039
{
1040
    helper_cvtql();
1041
    RETURN();
1042
}
1043

    
1044
void OPPROTO op_cvtqlv (void)
1045
{
1046
    helper_cvtqlv();
1047
    RETURN();
1048
}
1049

    
1050
void OPPROTO op_cvtqlsv (void)
1051
{
1052
    helper_cvtqlsv();
1053
    RETURN();
1054
}
1055

    
1056
/* PALcode support special instructions */
1057
#if !defined (CONFIG_USER_ONLY)
1058
void OPPROTO op_hw_rei (void)
1059
{
1060
    env->pc = env->ipr[IPR_EXC_ADDR] & ~3;
1061
    env->ipr[IPR_EXC_ADDR] = env->ipr[IPR_EXC_ADDR] & 1;
1062
    /* XXX: re-enable interrupts and memory mapping */
1063
    RETURN();
1064
}
1065

    
1066
void OPPROTO op_hw_ret (void)
1067
{
1068
    env->pc = T0 & ~3;
1069
    env->ipr[IPR_EXC_ADDR] = T0 & 1;
1070
    /* XXX: re-enable interrupts and memory mapping */
1071
    RETURN();
1072
}
1073

    
1074
void OPPROTO op_mfpr (void)
1075
{
1076
    helper_mfpr(PARAM(1));
1077
    RETURN();
1078
}
1079

    
1080
void OPPROTO op_mtpr (void)
1081
{
1082
    helper_mtpr(PARAM(1));
1083
    RETURN();
1084
}
1085

    
1086
void OPPROTO op_set_alt_mode (void)
1087
{
1088
    env->saved_mode = env->ps & 0xC;
1089
    env->ps = (env->ps & ~0xC) | (env->ipr[IPR_ALT_MODE] & 0xC);
1090
    RETURN();
1091
}
1092

    
1093
void OPPROTO op_restore_mode (void)
1094
{
1095
    env->ps = (env->ps & ~0xC) | env->saved_mode;
1096
    RETURN();
1097
}
1098

    
1099
void OPPROTO op_ld_phys_to_virt (void)
1100
{
1101
    helper_ld_phys_to_virt();
1102
    RETURN();
1103
}
1104

    
1105
void OPPROTO op_st_phys_to_virt (void)
1106
{
1107
    helper_st_phys_to_virt();
1108
    RETURN();
1109
}
1110
#endif /* !defined (CONFIG_USER_ONLY) */