Implement missing MIPS supervisor mode bits.
[qemu/qemu_0_9_1_stable.git] / target-ppc / op.c
blob4c170d84b6f46505cf14699e57ef0bbf1a8d4da5
1 /*
2 * PowerPC emulation micro-operations for qemu.
4 * Copyright (c) 2003-2007 Jocelyn Mayer
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.
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.
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
21 //#define DEBUG_OP
23 #include "config.h"
24 #include "exec.h"
25 #include "host-utils.h"
26 #include "helper_regs.h"
27 #include "op_helper.h"
29 #define REG 0
30 #include "op_template.h"
32 #define REG 1
33 #include "op_template.h"
35 #define REG 2
36 #include "op_template.h"
38 #define REG 3
39 #include "op_template.h"
41 #define REG 4
42 #include "op_template.h"
44 #define REG 5
45 #include "op_template.h"
47 #define REG 6
48 #include "op_template.h"
50 #define REG 7
51 #include "op_template.h"
53 #define REG 8
54 #include "op_template.h"
56 #define REG 9
57 #include "op_template.h"
59 #define REG 10
60 #include "op_template.h"
62 #define REG 11
63 #include "op_template.h"
65 #define REG 12
66 #include "op_template.h"
68 #define REG 13
69 #include "op_template.h"
71 #define REG 14
72 #include "op_template.h"
74 #define REG 15
75 #include "op_template.h"
77 #define REG 16
78 #include "op_template.h"
80 #define REG 17
81 #include "op_template.h"
83 #define REG 18
84 #include "op_template.h"
86 #define REG 19
87 #include "op_template.h"
89 #define REG 20
90 #include "op_template.h"
92 #define REG 21
93 #include "op_template.h"
95 #define REG 22
96 #include "op_template.h"
98 #define REG 23
99 #include "op_template.h"
101 #define REG 24
102 #include "op_template.h"
104 #define REG 25
105 #include "op_template.h"
107 #define REG 26
108 #include "op_template.h"
110 #define REG 27
111 #include "op_template.h"
113 #define REG 28
114 #include "op_template.h"
116 #define REG 29
117 #include "op_template.h"
119 #define REG 30
120 #include "op_template.h"
122 #define REG 31
123 #include "op_template.h"
125 void OPPROTO op_print_mem_EA (void)
127 do_print_mem_EA(T0);
128 RETURN();
131 /* PowerPC state maintenance operations */
132 /* set_Rc0 */
133 void OPPROTO op_set_Rc0 (void)
135 env->crf[0] = T0 | xer_so;
136 RETURN();
139 /* Constants load */
140 void OPPROTO op_reset_T0 (void)
142 T0 = 0;
143 RETURN();
146 void OPPROTO op_set_T0 (void)
148 T0 = (uint32_t)PARAM1;
149 RETURN();
152 #if defined(TARGET_PPC64)
153 void OPPROTO op_set_T0_64 (void)
155 T0 = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
156 RETURN();
158 #endif
160 void OPPROTO op_set_T1 (void)
162 T1 = (uint32_t)PARAM1;
163 RETURN();
166 #if defined(TARGET_PPC64)
167 void OPPROTO op_set_T1_64 (void)
169 T1 = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
170 RETURN();
172 #endif
174 #if 0 // unused
175 void OPPROTO op_set_T2 (void)
177 T2 = (uint32_t)PARAM1;
178 RETURN();
180 #endif
182 void OPPROTO op_move_T1_T0 (void)
184 T1 = T0;
185 RETURN();
188 void OPPROTO op_move_T2_T0 (void)
190 T2 = T0;
191 RETURN();
194 /* Generate exceptions */
195 void OPPROTO op_raise_exception_err (void)
197 do_raise_exception_err(PARAM1, PARAM2);
200 void OPPROTO op_update_nip (void)
202 env->nip = (uint32_t)PARAM1;
203 RETURN();
206 #if defined(TARGET_PPC64)
207 void OPPROTO op_update_nip_64 (void)
209 env->nip = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
210 RETURN();
212 #endif
214 void OPPROTO op_debug (void)
216 do_raise_exception(EXCP_DEBUG);
219 void OPPROTO op_exit_tb (void)
221 EXIT_TB();
224 /* Load/store special registers */
225 void OPPROTO op_load_cr (void)
227 do_load_cr();
228 RETURN();
231 void OPPROTO op_store_cr (void)
233 do_store_cr(PARAM1);
234 RETURN();
237 void OPPROTO op_load_cro (void)
239 T0 = env->crf[PARAM1];
240 RETURN();
243 void OPPROTO op_store_cro (void)
245 env->crf[PARAM1] = T0;
246 RETURN();
249 void OPPROTO op_load_xer_cr (void)
251 T0 = (xer_so << 3) | (xer_ov << 2) | (xer_ca << 1);
252 RETURN();
255 void OPPROTO op_clear_xer_ov (void)
257 xer_so = 0;
258 xer_ov = 0;
259 RETURN();
262 void OPPROTO op_clear_xer_ca (void)
264 xer_ca = 0;
265 RETURN();
268 void OPPROTO op_load_xer_bc (void)
270 T1 = xer_bc;
271 RETURN();
274 void OPPROTO op_store_xer_bc (void)
276 xer_bc = T0;
277 RETURN();
280 void OPPROTO op_load_xer (void)
282 T0 = hreg_load_xer(env);
283 RETURN();
286 void OPPROTO op_store_xer (void)
288 hreg_store_xer(env, T0);
289 RETURN();
292 #if defined(TARGET_PPC64)
293 void OPPROTO op_store_pri (void)
295 do_store_pri(PARAM1);
296 RETURN();
298 #endif
300 #if !defined(CONFIG_USER_ONLY)
301 /* Segment registers load and store */
302 void OPPROTO op_load_sr (void)
304 T0 = env->sr[T1];
305 RETURN();
308 void OPPROTO op_store_sr (void)
310 do_store_sr(env, T1, T0);
311 RETURN();
314 #if defined(TARGET_PPC64)
315 void OPPROTO op_load_slb (void)
317 T0 = ppc_load_slb(env, T1);
318 RETURN();
321 void OPPROTO op_store_slb (void)
323 ppc_store_slb(env, T1, T0);
324 RETURN();
326 #endif /* defined(TARGET_PPC64) */
328 void OPPROTO op_load_sdr1 (void)
330 T0 = env->sdr1;
331 RETURN();
334 void OPPROTO op_store_sdr1 (void)
336 do_store_sdr1(env, T0);
337 RETURN();
340 #if defined (TARGET_PPC64)
341 void OPPROTO op_load_asr (void)
343 T0 = env->asr;
344 RETURN();
347 void OPPROTO op_store_asr (void)
349 ppc_store_asr(env, T0);
350 RETURN();
352 #endif
354 void OPPROTO op_load_msr (void)
356 T0 = env->msr;
357 RETURN();
360 void OPPROTO op_store_msr (void)
362 do_store_msr();
363 RETURN();
366 #if defined (TARGET_PPC64)
367 void OPPROTO op_store_msr_32 (void)
369 T0 = (env->msr & ~0xFFFFFFFFULL) | (T0 & 0xFFFFFFFF);
370 do_store_msr();
371 RETURN();
373 #endif
375 void OPPROTO op_update_riee (void)
377 /* We don't call do_store_msr here as we won't trigger
378 * any special case nor change hflags
380 T0 &= (1 << MSR_RI) | (1 << MSR_EE);
381 env->msr &= ~(1 << MSR_RI) | (1 << MSR_EE);
382 env->msr |= T0;
383 RETURN();
385 #endif
387 /* SPR */
388 void OPPROTO op_load_spr (void)
390 T0 = env->spr[PARAM1];
391 RETURN();
394 void OPPROTO op_store_spr (void)
396 env->spr[PARAM1] = T0;
397 RETURN();
400 void OPPROTO op_load_dump_spr (void)
402 T0 = ppc_load_dump_spr(PARAM1);
403 RETURN();
406 void OPPROTO op_store_dump_spr (void)
408 ppc_store_dump_spr(PARAM1, T0);
409 RETURN();
412 void OPPROTO op_mask_spr (void)
414 env->spr[PARAM1] &= ~T0;
415 RETURN();
418 void OPPROTO op_load_lr (void)
420 T0 = env->lr;
421 RETURN();
424 void OPPROTO op_store_lr (void)
426 env->lr = T0;
427 RETURN();
430 void OPPROTO op_load_ctr (void)
432 T0 = env->ctr;
433 RETURN();
436 void OPPROTO op_store_ctr (void)
438 env->ctr = T0;
439 RETURN();
442 void OPPROTO op_load_tbl (void)
444 T0 = cpu_ppc_load_tbl(env);
445 RETURN();
448 void OPPROTO op_load_tbu (void)
450 T0 = cpu_ppc_load_tbu(env);
451 RETURN();
454 void OPPROTO op_load_atbl (void)
456 T0 = cpu_ppc_load_atbl(env);
457 RETURN();
460 void OPPROTO op_load_atbu (void)
462 T0 = cpu_ppc_load_atbu(env);
463 RETURN();
466 #if !defined(CONFIG_USER_ONLY)
467 void OPPROTO op_store_tbl (void)
469 cpu_ppc_store_tbl(env, T0);
470 RETURN();
473 void OPPROTO op_store_tbu (void)
475 cpu_ppc_store_tbu(env, T0);
476 RETURN();
479 void OPPROTO op_store_atbl (void)
481 cpu_ppc_store_atbl(env, T0);
482 RETURN();
485 void OPPROTO op_store_atbu (void)
487 cpu_ppc_store_atbu(env, T0);
488 RETURN();
491 void OPPROTO op_load_decr (void)
493 T0 = cpu_ppc_load_decr(env);
494 RETURN();
497 void OPPROTO op_store_decr (void)
499 cpu_ppc_store_decr(env, T0);
500 RETURN();
503 void OPPROTO op_load_ibat (void)
505 T0 = env->IBAT[PARAM1][PARAM2];
506 RETURN();
509 void OPPROTO op_store_ibatu (void)
511 do_store_ibatu(env, PARAM1, T0);
512 RETURN();
515 void OPPROTO op_store_ibatl (void)
517 #if 1
518 env->IBAT[1][PARAM1] = T0;
519 #else
520 do_store_ibatl(env, PARAM1, T0);
521 #endif
522 RETURN();
525 void OPPROTO op_load_dbat (void)
527 T0 = env->DBAT[PARAM1][PARAM2];
528 RETURN();
531 void OPPROTO op_store_dbatu (void)
533 do_store_dbatu(env, PARAM1, T0);
534 RETURN();
537 void OPPROTO op_store_dbatl (void)
539 #if 1
540 env->DBAT[1][PARAM1] = T0;
541 #else
542 do_store_dbatl(env, PARAM1, T0);
543 #endif
544 RETURN();
546 #endif /* !defined(CONFIG_USER_ONLY) */
548 /* FPSCR */
549 #ifdef CONFIG_SOFTFLOAT
550 void OPPROTO op_reset_fpstatus (void)
552 env->fp_status.float_exception_flags = 0;
553 RETURN();
555 #endif
557 void OPPROTO op_compute_fprf (void)
559 do_compute_fprf(PARAM1);
560 RETURN();
563 #ifdef CONFIG_SOFTFLOAT
564 void OPPROTO op_float_check_status (void)
566 do_float_check_status();
567 RETURN();
569 #else
570 void OPPROTO op_float_check_status (void)
572 if (env->exception_index == POWERPC_EXCP_PROGRAM &&
573 (env->error_code & POWERPC_EXCP_FP)) {
574 /* Differred floating-point exception after target FPR update */
575 if (msr_fe0 != 0 || msr_fe1 != 0)
576 do_raise_exception_err(env->exception_index, env->error_code);
578 RETURN();
580 #endif
582 #if defined(WORDS_BIGENDIAN)
583 #define WORD0 0
584 #define WORD1 1
585 #else
586 #define WORD0 1
587 #define WORD1 0
588 #endif
589 void OPPROTO op_load_fpscr_FT0 (void)
591 /* The 32 MSB of the target fpr are undefined.
592 * They'll be zero...
594 union {
595 float64 d;
596 struct {
597 uint32_t u[2];
598 } s;
599 } u;
601 u.s.u[WORD0] = 0;
602 u.s.u[WORD1] = env->fpscr;
603 FT0 = u.d;
604 RETURN();
607 void OPPROTO op_set_FT0 (void)
609 union {
610 float64 d;
611 struct {
612 uint32_t u[2];
613 } s;
614 } u;
616 u.s.u[WORD0] = 0;
617 u.s.u[WORD1] = PARAM1;
618 FT0 = u.d;
619 RETURN();
621 #undef WORD0
622 #undef WORD1
624 void OPPROTO op_load_fpscr_T0 (void)
626 T0 = (env->fpscr >> PARAM1) & 0xF;
627 RETURN();
630 void OPPROTO op_load_fpcc (void)
632 T0 = fpscr_fpcc;
633 RETURN();
636 void OPPROTO op_fpscr_resetbit (void)
638 env->fpscr &= PARAM1;
639 RETURN();
642 void OPPROTO op_fpscr_setbit (void)
644 do_fpscr_setbit(PARAM1);
645 RETURN();
648 void OPPROTO op_store_fpscr (void)
650 do_store_fpscr(PARAM1);
651 RETURN();
654 /* crf operations */
655 void OPPROTO op_getbit_T0 (void)
657 T0 = (T0 >> PARAM1) & 1;
658 RETURN();
661 void OPPROTO op_getbit_T1 (void)
663 T1 = (T1 >> PARAM1) & 1;
664 RETURN();
667 void OPPROTO op_setcrfbit (void)
669 T1 = (T1 & (uint32_t)PARAM1) | (T0 << PARAM2);
670 RETURN();
673 /* Branch */
674 #define EIP env->nip
676 void OPPROTO op_setlr (void)
678 env->lr = (uint32_t)PARAM1;
679 RETURN();
682 #if defined (TARGET_PPC64)
683 void OPPROTO op_setlr_64 (void)
685 env->lr = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
686 RETURN();
688 #endif
690 void OPPROTO op_goto_tb0 (void)
692 GOTO_TB(op_goto_tb0, PARAM1, 0);
695 void OPPROTO op_goto_tb1 (void)
697 GOTO_TB(op_goto_tb1, PARAM1, 1);
700 void OPPROTO op_b_T1 (void)
702 env->nip = (uint32_t)(T1 & ~3);
703 RETURN();
706 #if defined (TARGET_PPC64)
707 void OPPROTO op_b_T1_64 (void)
709 env->nip = (uint64_t)(T1 & ~3);
710 RETURN();
712 #endif
714 void OPPROTO op_jz_T0 (void)
716 if (!T0)
717 GOTO_LABEL_PARAM(1);
718 RETURN();
721 void OPPROTO op_btest_T1 (void)
723 if (T0) {
724 env->nip = (uint32_t)(T1 & ~3);
725 } else {
726 env->nip = (uint32_t)PARAM1;
728 RETURN();
731 #if defined (TARGET_PPC64)
732 void OPPROTO op_btest_T1_64 (void)
734 if (T0) {
735 env->nip = (uint64_t)(T1 & ~3);
736 } else {
737 env->nip = ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
739 RETURN();
741 #endif
743 void OPPROTO op_movl_T1_ctr (void)
745 T1 = env->ctr;
746 RETURN();
749 void OPPROTO op_movl_T1_lr (void)
751 T1 = env->lr;
752 RETURN();
755 /* tests with result in T0 */
756 void OPPROTO op_test_ctr (void)
758 T0 = (uint32_t)env->ctr;
759 RETURN();
762 #if defined(TARGET_PPC64)
763 void OPPROTO op_test_ctr_64 (void)
765 T0 = (uint64_t)env->ctr;
766 RETURN();
768 #endif
770 void OPPROTO op_test_ctr_true (void)
772 T0 = ((uint32_t)env->ctr != 0 && (T0 & PARAM1) != 0);
773 RETURN();
776 #if defined(TARGET_PPC64)
777 void OPPROTO op_test_ctr_true_64 (void)
779 T0 = ((uint64_t)env->ctr != 0 && (T0 & PARAM1) != 0);
780 RETURN();
782 #endif
784 void OPPROTO op_test_ctr_false (void)
786 T0 = ((uint32_t)env->ctr != 0 && (T0 & PARAM1) == 0);
787 RETURN();
790 #if defined(TARGET_PPC64)
791 void OPPROTO op_test_ctr_false_64 (void)
793 T0 = ((uint64_t)env->ctr != 0 && (T0 & PARAM1) == 0);
794 RETURN();
796 #endif
798 void OPPROTO op_test_ctrz (void)
800 T0 = ((uint32_t)env->ctr == 0);
801 RETURN();
804 #if defined(TARGET_PPC64)
805 void OPPROTO op_test_ctrz_64 (void)
807 T0 = ((uint64_t)env->ctr == 0);
808 RETURN();
810 #endif
812 void OPPROTO op_test_ctrz_true (void)
814 T0 = ((uint32_t)env->ctr == 0 && (T0 & PARAM1) != 0);
815 RETURN();
818 #if defined(TARGET_PPC64)
819 void OPPROTO op_test_ctrz_true_64 (void)
821 T0 = ((uint64_t)env->ctr == 0 && (T0 & PARAM1) != 0);
822 RETURN();
824 #endif
826 void OPPROTO op_test_ctrz_false (void)
828 T0 = ((uint32_t)env->ctr == 0 && (T0 & PARAM1) == 0);
829 RETURN();
832 #if defined(TARGET_PPC64)
833 void OPPROTO op_test_ctrz_false_64 (void)
835 T0 = ((uint64_t)env->ctr == 0 && (T0 & PARAM1) == 0);
836 RETURN();
838 #endif
840 void OPPROTO op_test_true (void)
842 T0 = (T0 & PARAM1);
843 RETURN();
846 void OPPROTO op_test_false (void)
848 T0 = ((T0 & PARAM1) == 0);
849 RETURN();
852 /* CTR maintenance */
853 void OPPROTO op_dec_ctr (void)
855 env->ctr--;
856 RETURN();
859 /*** Integer arithmetic ***/
860 /* add */
861 void OPPROTO op_add (void)
863 T0 += T1;
864 RETURN();
867 void OPPROTO op_check_addo (void)
869 if (likely(!(((uint32_t)T2 ^ (uint32_t)T1 ^ UINT32_MAX) &
870 ((uint32_t)T2 ^ (uint32_t)T0) & (1UL << 31)))) {
871 xer_ov = 0;
872 } else {
873 xer_ov = 1;
874 xer_so = 1;
876 RETURN();
879 #if defined(TARGET_PPC64)
880 void OPPROTO op_check_addo_64 (void)
882 if (likely(!(((uint64_t)T2 ^ (uint64_t)T1 ^ UINT64_MAX) &
883 ((uint64_t)T2 ^ (uint64_t)T0) & (1ULL << 63)))) {
884 xer_ov = 0;
885 } else {
886 xer_ov = 1;
887 xer_so = 1;
889 RETURN();
891 #endif
893 /* add carrying */
894 void OPPROTO op_check_addc (void)
896 if (likely((uint32_t)T0 >= (uint32_t)T2)) {
897 xer_ca = 0;
898 } else {
899 xer_ca = 1;
901 RETURN();
904 #if defined(TARGET_PPC64)
905 void OPPROTO op_check_addc_64 (void)
907 if (likely((uint64_t)T0 >= (uint64_t)T2)) {
908 xer_ca = 0;
909 } else {
910 xer_ca = 1;
912 RETURN();
914 #endif
916 /* add extended */
917 void OPPROTO op_adde (void)
919 do_adde();
920 RETURN();
923 #if defined(TARGET_PPC64)
924 void OPPROTO op_adde_64 (void)
926 do_adde_64();
927 RETURN();
929 #endif
931 /* add immediate */
932 void OPPROTO op_addi (void)
934 T0 += (int32_t)PARAM1;
935 RETURN();
938 /* add to minus one extended */
939 void OPPROTO op_add_me (void)
941 T0 += xer_ca + (-1);
942 if (likely((uint32_t)T1 != 0))
943 xer_ca = 1;
944 RETURN();
947 #if defined(TARGET_PPC64)
948 void OPPROTO op_add_me_64 (void)
950 T0 += xer_ca + (-1);
951 if (likely((uint64_t)T1 != 0))
952 xer_ca = 1;
953 RETURN();
955 #endif
957 void OPPROTO op_addmeo (void)
959 do_addmeo();
960 RETURN();
963 void OPPROTO op_addmeo_64 (void)
965 do_addmeo();
966 RETURN();
969 /* add to zero extended */
970 void OPPROTO op_add_ze (void)
972 T0 += xer_ca;
973 RETURN();
976 /* divide word */
977 void OPPROTO op_divw (void)
979 if (unlikely(((int32_t)T0 == INT32_MIN && (int32_t)T1 == -1) ||
980 (int32_t)T1 == 0)) {
981 T0 = (int32_t)((-1) * ((uint32_t)T0 >> 31));
982 } else {
983 T0 = (int32_t)T0 / (int32_t)T1;
985 RETURN();
988 #if defined(TARGET_PPC64)
989 void OPPROTO op_divd (void)
991 if (unlikely(((int64_t)T0 == INT64_MIN && (int64_t)T1 == -1) ||
992 (int64_t)T1 == 0)) {
993 T0 = (int64_t)((-1ULL) * ((uint64_t)T0 >> 63));
994 } else {
995 T0 = (int64_t)T0 / (int64_t)T1;
997 RETURN();
999 #endif
1001 void OPPROTO op_divwo (void)
1003 do_divwo();
1004 RETURN();
1007 #if defined(TARGET_PPC64)
1008 void OPPROTO op_divdo (void)
1010 do_divdo();
1011 RETURN();
1013 #endif
1015 /* divide word unsigned */
1016 void OPPROTO op_divwu (void)
1018 if (unlikely(T1 == 0)) {
1019 T0 = 0;
1020 } else {
1021 T0 = (uint32_t)T0 / (uint32_t)T1;
1023 RETURN();
1026 #if defined(TARGET_PPC64)
1027 void OPPROTO op_divdu (void)
1029 if (unlikely(T1 == 0)) {
1030 T0 = 0;
1031 } else {
1032 T0 /= T1;
1034 RETURN();
1036 #endif
1038 void OPPROTO op_divwuo (void)
1040 do_divwuo();
1041 RETURN();
1044 #if defined(TARGET_PPC64)
1045 void OPPROTO op_divduo (void)
1047 do_divduo();
1048 RETURN();
1050 #endif
1052 /* multiply high word */
1053 void OPPROTO op_mulhw (void)
1055 T0 = ((int64_t)((int32_t)T0) * (int64_t)((int32_t)T1)) >> 32;
1056 RETURN();
1059 #if defined(TARGET_PPC64)
1060 void OPPROTO op_mulhd (void)
1062 uint64_t tl, th;
1064 muls64(&tl, &th, T0, T1);
1065 T0 = th;
1066 RETURN();
1068 #endif
1070 /* multiply high word unsigned */
1071 void OPPROTO op_mulhwu (void)
1073 T0 = ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1) >> 32;
1074 RETURN();
1077 #if defined(TARGET_PPC64)
1078 void OPPROTO op_mulhdu (void)
1080 uint64_t tl, th;
1082 mulu64(&tl, &th, T0, T1);
1083 T0 = th;
1084 RETURN();
1086 #endif
1088 /* multiply low immediate */
1089 void OPPROTO op_mulli (void)
1091 T0 = ((int32_t)T0 * (int32_t)PARAM1);
1092 RETURN();
1095 /* multiply low word */
1096 void OPPROTO op_mullw (void)
1098 T0 = (int32_t)(T0 * T1);
1099 RETURN();
1102 #if defined(TARGET_PPC64)
1103 void OPPROTO op_mulld (void)
1105 T0 *= T1;
1106 RETURN();
1108 #endif
1110 void OPPROTO op_mullwo (void)
1112 do_mullwo();
1113 RETURN();
1116 #if defined(TARGET_PPC64)
1117 void OPPROTO op_mulldo (void)
1119 do_mulldo();
1120 RETURN();
1122 #endif
1124 /* negate */
1125 void OPPROTO op_neg (void)
1127 if (likely(T0 != INT32_MIN)) {
1128 T0 = -(int32_t)T0;
1130 RETURN();
1133 #if defined(TARGET_PPC64)
1134 void OPPROTO op_neg_64 (void)
1136 if (likely(T0 != INT64_MIN)) {
1137 T0 = -(int64_t)T0;
1139 RETURN();
1141 #endif
1143 void OPPROTO op_nego (void)
1145 do_nego();
1146 RETURN();
1149 #if defined(TARGET_PPC64)
1150 void OPPROTO op_nego_64 (void)
1152 do_nego_64();
1153 RETURN();
1155 #endif
1157 /* subtract from */
1158 void OPPROTO op_subf (void)
1160 T0 = T1 - T0;
1161 RETURN();
1164 void OPPROTO op_check_subfo (void)
1166 if (likely(!(((uint32_t)(~T2) ^ (uint32_t)T1 ^ UINT32_MAX) &
1167 ((uint32_t)(~T2) ^ (uint32_t)T0) & (1UL << 31)))) {
1168 xer_ov = 0;
1169 } else {
1170 xer_ov = 1;
1171 xer_so = 1;
1173 RETURN();
1176 #if defined(TARGET_PPC64)
1177 void OPPROTO op_check_subfo_64 (void)
1179 if (likely(!(((uint64_t)(~T2) ^ (uint64_t)T1 ^ UINT64_MAX) &
1180 ((uint64_t)(~T2) ^ (uint64_t)T0) & (1ULL << 63)))) {
1181 xer_ov = 0;
1182 } else {
1183 xer_ov = 1;
1184 xer_so = 1;
1186 RETURN();
1188 #endif
1190 /* subtract from carrying */
1191 void OPPROTO op_check_subfc (void)
1193 if (likely((uint32_t)T0 > (uint32_t)T1)) {
1194 xer_ca = 0;
1195 } else {
1196 xer_ca = 1;
1198 RETURN();
1201 #if defined(TARGET_PPC64)
1202 void OPPROTO op_check_subfc_64 (void)
1204 if (likely((uint64_t)T0 > (uint64_t)T1)) {
1205 xer_ca = 0;
1206 } else {
1207 xer_ca = 1;
1209 RETURN();
1211 #endif
1213 /* subtract from extended */
1214 void OPPROTO op_subfe (void)
1216 do_subfe();
1217 RETURN();
1220 #if defined(TARGET_PPC64)
1221 void OPPROTO op_subfe_64 (void)
1223 do_subfe_64();
1224 RETURN();
1226 #endif
1228 /* subtract from immediate carrying */
1229 void OPPROTO op_subfic (void)
1231 T0 = (int32_t)PARAM1 + ~T0 + 1;
1232 if ((uint32_t)T0 <= (uint32_t)PARAM1) {
1233 xer_ca = 1;
1234 } else {
1235 xer_ca = 0;
1237 RETURN();
1240 #if defined(TARGET_PPC64)
1241 void OPPROTO op_subfic_64 (void)
1243 T0 = (int64_t)PARAM1 + ~T0 + 1;
1244 if ((uint64_t)T0 <= (uint64_t)PARAM1) {
1245 xer_ca = 1;
1246 } else {
1247 xer_ca = 0;
1249 RETURN();
1251 #endif
1253 /* subtract from minus one extended */
1254 void OPPROTO op_subfme (void)
1256 T0 = ~T0 + xer_ca - 1;
1257 if (likely((uint32_t)T0 != (uint32_t)-1))
1258 xer_ca = 1;
1259 RETURN();
1262 #if defined(TARGET_PPC64)
1263 void OPPROTO op_subfme_64 (void)
1265 T0 = ~T0 + xer_ca - 1;
1266 if (likely((uint64_t)T0 != (uint64_t)-1))
1267 xer_ca = 1;
1268 RETURN();
1270 #endif
1272 void OPPROTO op_subfmeo (void)
1274 do_subfmeo();
1275 RETURN();
1278 #if defined(TARGET_PPC64)
1279 void OPPROTO op_subfmeo_64 (void)
1281 do_subfmeo_64();
1282 RETURN();
1284 #endif
1286 /* subtract from zero extended */
1287 void OPPROTO op_subfze (void)
1289 T1 = ~T0;
1290 T0 = T1 + xer_ca;
1291 if ((uint32_t)T0 < (uint32_t)T1) {
1292 xer_ca = 1;
1293 } else {
1294 xer_ca = 0;
1296 RETURN();
1299 #if defined(TARGET_PPC64)
1300 void OPPROTO op_subfze_64 (void)
1302 T1 = ~T0;
1303 T0 = T1 + xer_ca;
1304 if ((uint64_t)T0 < (uint64_t)T1) {
1305 xer_ca = 1;
1306 } else {
1307 xer_ca = 0;
1309 RETURN();
1311 #endif
1313 void OPPROTO op_subfzeo (void)
1315 do_subfzeo();
1316 RETURN();
1319 #if defined(TARGET_PPC64)
1320 void OPPROTO op_subfzeo_64 (void)
1322 do_subfzeo_64();
1323 RETURN();
1325 #endif
1327 /*** Integer comparison ***/
1328 /* compare */
1329 void OPPROTO op_cmp (void)
1331 if ((int32_t)T0 < (int32_t)T1) {
1332 T0 = 0x08;
1333 } else if ((int32_t)T0 > (int32_t)T1) {
1334 T0 = 0x04;
1335 } else {
1336 T0 = 0x02;
1338 T0 |= xer_so;
1339 RETURN();
1342 #if defined(TARGET_PPC64)
1343 void OPPROTO op_cmp_64 (void)
1345 if ((int64_t)T0 < (int64_t)T1) {
1346 T0 = 0x08;
1347 } else if ((int64_t)T0 > (int64_t)T1) {
1348 T0 = 0x04;
1349 } else {
1350 T0 = 0x02;
1352 T0 |= xer_so;
1353 RETURN();
1355 #endif
1357 /* compare immediate */
1358 void OPPROTO op_cmpi (void)
1360 if ((int32_t)T0 < (int32_t)PARAM1) {
1361 T0 = 0x08;
1362 } else if ((int32_t)T0 > (int32_t)PARAM1) {
1363 T0 = 0x04;
1364 } else {
1365 T0 = 0x02;
1367 T0 |= xer_so;
1368 RETURN();
1371 #if defined(TARGET_PPC64)
1372 void OPPROTO op_cmpi_64 (void)
1374 if ((int64_t)T0 < (int64_t)((int32_t)PARAM1)) {
1375 T0 = 0x08;
1376 } else if ((int64_t)T0 > (int64_t)((int32_t)PARAM1)) {
1377 T0 = 0x04;
1378 } else {
1379 T0 = 0x02;
1381 T0 |= xer_so;
1382 RETURN();
1384 #endif
1386 /* compare logical */
1387 void OPPROTO op_cmpl (void)
1389 if ((uint32_t)T0 < (uint32_t)T1) {
1390 T0 = 0x08;
1391 } else if ((uint32_t)T0 > (uint32_t)T1) {
1392 T0 = 0x04;
1393 } else {
1394 T0 = 0x02;
1396 T0 |= xer_so;
1397 RETURN();
1400 #if defined(TARGET_PPC64)
1401 void OPPROTO op_cmpl_64 (void)
1403 if ((uint64_t)T0 < (uint64_t)T1) {
1404 T0 = 0x08;
1405 } else if ((uint64_t)T0 > (uint64_t)T1) {
1406 T0 = 0x04;
1407 } else {
1408 T0 = 0x02;
1410 T0 |= xer_so;
1411 RETURN();
1413 #endif
1415 /* compare logical immediate */
1416 void OPPROTO op_cmpli (void)
1418 if ((uint32_t)T0 < (uint32_t)PARAM1) {
1419 T0 = 0x08;
1420 } else if ((uint32_t)T0 > (uint32_t)PARAM1) {
1421 T0 = 0x04;
1422 } else {
1423 T0 = 0x02;
1425 T0 |= xer_so;
1426 RETURN();
1429 #if defined(TARGET_PPC64)
1430 void OPPROTO op_cmpli_64 (void)
1432 if ((uint64_t)T0 < (uint64_t)PARAM1) {
1433 T0 = 0x08;
1434 } else if ((uint64_t)T0 > (uint64_t)PARAM1) {
1435 T0 = 0x04;
1436 } else {
1437 T0 = 0x02;
1439 T0 |= xer_so;
1440 RETURN();
1442 #endif
1444 void OPPROTO op_isel (void)
1446 if (T0)
1447 T0 = T1;
1448 else
1449 T0 = T2;
1450 RETURN();
1453 void OPPROTO op_popcntb (void)
1455 do_popcntb();
1456 RETURN();
1459 #if defined(TARGET_PPC64)
1460 void OPPROTO op_popcntb_64 (void)
1462 do_popcntb_64();
1463 RETURN();
1465 #endif
1467 /*** Integer logical ***/
1468 /* and */
1469 void OPPROTO op_and (void)
1471 T0 &= T1;
1472 RETURN();
1475 /* andc */
1476 void OPPROTO op_andc (void)
1478 T0 &= ~T1;
1479 RETURN();
1482 /* andi. */
1483 void OPPROTO op_andi_T0 (void)
1485 T0 &= (uint32_t)PARAM1;
1486 RETURN();
1489 void OPPROTO op_andi_T1 (void)
1491 T1 &= (uint32_t)PARAM1;
1492 RETURN();
1495 #if defined(TARGET_PPC64)
1496 void OPPROTO op_andi_T0_64 (void)
1498 T0 &= ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
1499 RETURN();
1502 void OPPROTO op_andi_T1_64 (void)
1504 T1 &= ((uint64_t)PARAM1 << 32) | (uint64_t)PARAM2;
1505 RETURN();
1507 #endif
1509 /* count leading zero */
1510 void OPPROTO op_cntlzw (void)
1512 do_cntlzw();
1513 RETURN();
1516 #if defined(TARGET_PPC64)
1517 void OPPROTO op_cntlzd (void)
1519 do_cntlzd();
1520 RETURN();
1522 #endif
1524 /* eqv */
1525 void OPPROTO op_eqv (void)
1527 T0 = ~(T0 ^ T1);
1528 RETURN();
1531 /* extend sign byte */
1532 void OPPROTO op_extsb (void)
1534 #if defined (TARGET_PPC64)
1535 T0 = (int64_t)((int8_t)T0);
1536 #else
1537 T0 = (int32_t)((int8_t)T0);
1538 #endif
1539 RETURN();
1542 /* extend sign half word */
1543 void OPPROTO op_extsh (void)
1545 #if defined (TARGET_PPC64)
1546 T0 = (int64_t)((int16_t)T0);
1547 #else
1548 T0 = (int32_t)((int16_t)T0);
1549 #endif
1550 RETURN();
1553 #if defined (TARGET_PPC64)
1554 void OPPROTO op_extsw (void)
1556 T0 = (int64_t)((int32_t)T0);
1557 RETURN();
1559 #endif
1561 /* nand */
1562 void OPPROTO op_nand (void)
1564 T0 = ~(T0 & T1);
1565 RETURN();
1568 /* nor */
1569 void OPPROTO op_nor (void)
1571 T0 = ~(T0 | T1);
1572 RETURN();
1575 /* or */
1576 void OPPROTO op_or (void)
1578 T0 |= T1;
1579 RETURN();
1582 /* orc */
1583 void OPPROTO op_orc (void)
1585 T0 |= ~T1;
1586 RETURN();
1589 /* ori */
1590 void OPPROTO op_ori (void)
1592 T0 |= (uint32_t)PARAM1;
1593 RETURN();
1596 /* xor */
1597 void OPPROTO op_xor (void)
1599 T0 ^= T1;
1600 RETURN();
1603 /* xori */
1604 void OPPROTO op_xori (void)
1606 T0 ^= (uint32_t)PARAM1;
1607 RETURN();
1610 /*** Integer rotate ***/
1611 void OPPROTO op_rotl32_T0_T1 (void)
1613 T0 = rotl32(T0, T1 & 0x1F);
1614 RETURN();
1617 void OPPROTO op_rotli32_T0 (void)
1619 T0 = rotl32(T0, PARAM1);
1620 RETURN();
1623 #if defined(TARGET_PPC64)
1624 void OPPROTO op_rotl64_T0_T1 (void)
1626 T0 = rotl64(T0, T1 & 0x3F);
1627 RETURN();
1630 void OPPROTO op_rotli64_T0 (void)
1632 T0 = rotl64(T0, PARAM1);
1633 RETURN();
1635 #endif
1637 /*** Integer shift ***/
1638 /* shift left word */
1639 void OPPROTO op_slw (void)
1641 if (T1 & 0x20) {
1642 T0 = 0;
1643 } else {
1644 T0 = (uint32_t)(T0 << T1);
1646 RETURN();
1649 #if defined(TARGET_PPC64)
1650 void OPPROTO op_sld (void)
1652 if (T1 & 0x40) {
1653 T0 = 0;
1654 } else {
1655 T0 = T0 << T1;
1657 RETURN();
1659 #endif
1661 /* shift right algebraic word */
1662 void OPPROTO op_sraw (void)
1664 do_sraw();
1665 RETURN();
1668 #if defined(TARGET_PPC64)
1669 void OPPROTO op_srad (void)
1671 do_srad();
1672 RETURN();
1674 #endif
1676 /* shift right algebraic word immediate */
1677 void OPPROTO op_srawi (void)
1679 uint32_t mask = (uint32_t)PARAM2;
1681 T0 = (int32_t)T0 >> PARAM1;
1682 if ((int32_t)T1 < 0 && (T1 & mask) != 0) {
1683 xer_ca = 1;
1684 } else {
1685 xer_ca = 0;
1687 RETURN();
1690 #if defined(TARGET_PPC64)
1691 void OPPROTO op_sradi (void)
1693 uint64_t mask = ((uint64_t)PARAM2 << 32) | (uint64_t)PARAM3;
1695 T0 = (int64_t)T0 >> PARAM1;
1696 if ((int64_t)T1 < 0 && ((uint64_t)T1 & mask) != 0) {
1697 xer_ca = 1;
1698 } else {
1699 xer_ca = 0;
1701 RETURN();
1703 #endif
1705 /* shift right word */
1706 void OPPROTO op_srw (void)
1708 if (T1 & 0x20) {
1709 T0 = 0;
1710 } else {
1711 T0 = (uint32_t)T0 >> T1;
1713 RETURN();
1716 #if defined(TARGET_PPC64)
1717 void OPPROTO op_srd (void)
1719 if (T1 & 0x40) {
1720 T0 = 0;
1721 } else {
1722 T0 = (uint64_t)T0 >> T1;
1724 RETURN();
1726 #endif
1728 void OPPROTO op_sl_T0_T1 (void)
1730 T0 = T0 << T1;
1731 RETURN();
1734 void OPPROTO op_sli_T0 (void)
1736 T0 = T0 << PARAM1;
1737 RETURN();
1740 void OPPROTO op_srl_T0_T1 (void)
1742 T0 = (uint32_t)T0 >> T1;
1743 RETURN();
1746 #if defined(TARGET_PPC64)
1747 void OPPROTO op_srl_T0_T1_64 (void)
1749 T0 = (uint32_t)T0 >> T1;
1750 RETURN();
1752 #endif
1754 void OPPROTO op_srli_T0 (void)
1756 T0 = (uint32_t)T0 >> PARAM1;
1757 RETURN();
1760 #if defined(TARGET_PPC64)
1761 void OPPROTO op_srli_T0_64 (void)
1763 T0 = (uint64_t)T0 >> PARAM1;
1764 RETURN();
1766 #endif
1768 void OPPROTO op_srli_T1 (void)
1770 T1 = (uint32_t)T1 >> PARAM1;
1771 RETURN();
1774 #if defined(TARGET_PPC64)
1775 void OPPROTO op_srli_T1_64 (void)
1777 T1 = (uint64_t)T1 >> PARAM1;
1778 RETURN();
1780 #endif
1782 /*** Floating-Point arithmetic ***/
1783 /* fadd - fadd. */
1784 void OPPROTO op_fadd (void)
1786 #if USE_PRECISE_EMULATION
1787 do_fadd();
1788 #else
1789 FT0 = float64_add(FT0, FT1, &env->fp_status);
1790 #endif
1791 RETURN();
1794 /* fsub - fsub. */
1795 void OPPROTO op_fsub (void)
1797 #if USE_PRECISE_EMULATION
1798 do_fsub();
1799 #else
1800 FT0 = float64_sub(FT0, FT1, &env->fp_status);
1801 #endif
1802 RETURN();
1805 /* fmul - fmul. */
1806 void OPPROTO op_fmul (void)
1808 #if USE_PRECISE_EMULATION
1809 do_fmul();
1810 #else
1811 FT0 = float64_mul(FT0, FT1, &env->fp_status);
1812 #endif
1813 RETURN();
1816 /* fdiv - fdiv. */
1817 void OPPROTO op_fdiv (void)
1819 #if USE_PRECISE_EMULATION
1820 do_fdiv();
1821 #else
1822 FT0 = float64_div(FT0, FT1, &env->fp_status);
1823 #endif
1824 RETURN();
1827 /* fsqrt - fsqrt. */
1828 void OPPROTO op_fsqrt (void)
1830 do_fsqrt();
1831 RETURN();
1834 /* fre - fre. */
1835 void OPPROTO op_fre (void)
1837 do_fre();
1838 RETURN();
1841 /* fres - fres. */
1842 void OPPROTO op_fres (void)
1844 do_fres();
1845 RETURN();
1848 /* frsqrte - frsqrte. */
1849 void OPPROTO op_frsqrte (void)
1851 do_frsqrte();
1852 RETURN();
1855 /* fsel - fsel. */
1856 void OPPROTO op_fsel (void)
1858 do_fsel();
1859 RETURN();
1862 /*** Floating-Point multiply-and-add ***/
1863 /* fmadd - fmadd. */
1864 void OPPROTO op_fmadd (void)
1866 #if USE_PRECISE_EMULATION
1867 do_fmadd();
1868 #else
1869 FT0 = float64_mul(FT0, FT1, &env->fp_status);
1870 FT0 = float64_add(FT0, FT2, &env->fp_status);
1871 #endif
1872 RETURN();
1875 /* fmsub - fmsub. */
1876 void OPPROTO op_fmsub (void)
1878 #if USE_PRECISE_EMULATION
1879 do_fmsub();
1880 #else
1881 FT0 = float64_mul(FT0, FT1, &env->fp_status);
1882 FT0 = float64_sub(FT0, FT2, &env->fp_status);
1883 #endif
1884 RETURN();
1887 /* fnmadd - fnmadd. - fnmadds - fnmadds. */
1888 void OPPROTO op_fnmadd (void)
1890 do_fnmadd();
1891 RETURN();
1894 /* fnmsub - fnmsub. */
1895 void OPPROTO op_fnmsub (void)
1897 do_fnmsub();
1898 RETURN();
1901 /*** Floating-Point round & convert ***/
1902 /* frsp - frsp. */
1903 void OPPROTO op_frsp (void)
1905 #if USE_PRECISE_EMULATION
1906 do_frsp();
1907 #else
1908 FT0 = float64_to_float32(FT0, &env->fp_status);
1909 #endif
1910 RETURN();
1913 /* fctiw - fctiw. */
1914 void OPPROTO op_fctiw (void)
1916 do_fctiw();
1917 RETURN();
1920 /* fctiwz - fctiwz. */
1921 void OPPROTO op_fctiwz (void)
1923 do_fctiwz();
1924 RETURN();
1927 #if defined(TARGET_PPC64)
1928 /* fcfid - fcfid. */
1929 void OPPROTO op_fcfid (void)
1931 do_fcfid();
1932 RETURN();
1935 /* fctid - fctid. */
1936 void OPPROTO op_fctid (void)
1938 do_fctid();
1939 RETURN();
1942 /* fctidz - fctidz. */
1943 void OPPROTO op_fctidz (void)
1945 do_fctidz();
1946 RETURN();
1948 #endif
1950 void OPPROTO op_frin (void)
1952 do_frin();
1953 RETURN();
1956 void OPPROTO op_friz (void)
1958 do_friz();
1959 RETURN();
1962 void OPPROTO op_frip (void)
1964 do_frip();
1965 RETURN();
1968 void OPPROTO op_frim (void)
1970 do_frim();
1971 RETURN();
1974 /*** Floating-Point compare ***/
1975 /* fcmpu */
1976 void OPPROTO op_fcmpu (void)
1978 do_fcmpu();
1979 RETURN();
1982 /* fcmpo */
1983 void OPPROTO op_fcmpo (void)
1985 do_fcmpo();
1986 RETURN();
1989 /*** Floating-point move ***/
1990 /* fabs */
1991 void OPPROTO op_fabs (void)
1993 FT0 = float64_abs(FT0);
1994 RETURN();
1997 /* fnabs */
1998 void OPPROTO op_fnabs (void)
2000 FT0 = float64_abs(FT0);
2001 FT0 = float64_chs(FT0);
2002 RETURN();
2005 /* fneg */
2006 void OPPROTO op_fneg (void)
2008 FT0 = float64_chs(FT0);
2009 RETURN();
2012 /* Load and store */
2013 #define MEMSUFFIX _raw
2014 #include "op_helper.h"
2015 #include "op_mem.h"
2016 #if !defined(CONFIG_USER_ONLY)
2017 #define MEMSUFFIX _user
2018 #include "op_helper.h"
2019 #include "op_mem.h"
2020 #define MEMSUFFIX _kernel
2021 #include "op_helper.h"
2022 #include "op_mem.h"
2023 #if defined(TARGET_PPC64H)
2024 #define MEMSUFFIX _hypv
2025 #include "op_helper.h"
2026 #include "op_mem.h"
2027 #endif
2028 #endif
2030 /* Special op to check and maybe clear reservation */
2031 void OPPROTO op_check_reservation (void)
2033 if ((uint32_t)env->reserve == (uint32_t)(T0 & ~0x00000003))
2034 env->reserve = -1;
2035 RETURN();
2038 #if defined(TARGET_PPC64)
2039 void OPPROTO op_check_reservation_64 (void)
2041 if ((uint64_t)env->reserve == (uint64_t)(T0 & ~0x00000003))
2042 env->reserve = -1;
2043 RETURN();
2045 #endif
2047 void OPPROTO op_wait (void)
2049 env->halted = 1;
2050 RETURN();
2053 /* Return from interrupt */
2054 #if !defined(CONFIG_USER_ONLY)
2055 void OPPROTO op_rfi (void)
2057 do_rfi();
2058 RETURN();
2061 #if defined(TARGET_PPC64)
2062 void OPPROTO op_rfid (void)
2064 do_rfid();
2065 RETURN();
2067 #endif
2069 #if defined(TARGET_PPC64H)
2070 void OPPROTO op_hrfid (void)
2072 do_hrfid();
2073 RETURN();
2075 #endif
2077 /* Exception vectors */
2078 void OPPROTO op_store_excp_prefix (void)
2080 T0 &= env->ivpr_mask;
2081 env->excp_prefix = T0;
2082 RETURN();
2085 void OPPROTO op_store_excp_vector (void)
2087 T0 &= env->ivor_mask;
2088 env->excp_vectors[PARAM1] = T0;
2089 RETURN();
2091 #endif
2093 /* Trap word */
2094 void OPPROTO op_tw (void)
2096 do_tw(PARAM1);
2097 RETURN();
2100 #if defined(TARGET_PPC64)
2101 void OPPROTO op_td (void)
2103 do_td(PARAM1);
2104 RETURN();
2106 #endif
2108 #if !defined(CONFIG_USER_ONLY)
2109 /* tlbia */
2110 void OPPROTO op_tlbia (void)
2112 ppc_tlb_invalidate_all(env);
2113 RETURN();
2116 /* tlbie */
2117 void OPPROTO op_tlbie (void)
2119 ppc_tlb_invalidate_one(env, (uint32_t)T0);
2120 RETURN();
2123 #if defined(TARGET_PPC64)
2124 void OPPROTO op_tlbie_64 (void)
2126 ppc_tlb_invalidate_one(env, T0);
2127 RETURN();
2129 #endif
2131 #if defined(TARGET_PPC64)
2132 void OPPROTO op_slbia (void)
2134 ppc_slb_invalidate_all(env);
2135 RETURN();
2138 void OPPROTO op_slbie (void)
2140 ppc_slb_invalidate_one(env, (uint32_t)T0);
2141 RETURN();
2144 void OPPROTO op_slbie_64 (void)
2146 ppc_slb_invalidate_one(env, T0);
2147 RETURN();
2149 #endif
2150 #endif
2152 #if !defined(CONFIG_USER_ONLY)
2153 /* PowerPC 602/603/755 software TLB load instructions */
2154 void OPPROTO op_6xx_tlbld (void)
2156 do_load_6xx_tlb(0);
2157 RETURN();
2160 void OPPROTO op_6xx_tlbli (void)
2162 do_load_6xx_tlb(1);
2163 RETURN();
2166 /* PowerPC 74xx software TLB load instructions */
2167 void OPPROTO op_74xx_tlbld (void)
2169 do_load_74xx_tlb(0);
2170 RETURN();
2173 void OPPROTO op_74xx_tlbli (void)
2175 do_load_74xx_tlb(1);
2176 RETURN();
2178 #endif
2180 /* 601 specific */
2181 void OPPROTO op_load_601_rtcl (void)
2183 T0 = cpu_ppc601_load_rtcl(env);
2184 RETURN();
2187 void OPPROTO op_load_601_rtcu (void)
2189 T0 = cpu_ppc601_load_rtcu(env);
2190 RETURN();
2193 #if !defined(CONFIG_USER_ONLY)
2194 void OPPROTO op_store_601_rtcl (void)
2196 cpu_ppc601_store_rtcl(env, T0);
2197 RETURN();
2200 void OPPROTO op_store_601_rtcu (void)
2202 cpu_ppc601_store_rtcu(env, T0);
2203 RETURN();
2206 void OPPROTO op_load_601_bat (void)
2208 T0 = env->IBAT[PARAM1][PARAM2];
2209 RETURN();
2211 #endif /* !defined(CONFIG_USER_ONLY) */
2213 /* 601 unified BATs store.
2214 * To avoid using specific MMU code for 601, we store BATs in
2215 * IBAT and DBAT simultaneously, then emulate unified BATs.
2217 #if !defined(CONFIG_USER_ONLY)
2218 void OPPROTO op_store_601_batl (void)
2220 int nr = PARAM1;
2222 env->IBAT[1][nr] = T0;
2223 env->DBAT[1][nr] = T0;
2224 RETURN();
2227 void OPPROTO op_store_601_batu (void)
2229 do_store_601_batu(PARAM1);
2230 RETURN();
2232 #endif /* !defined(CONFIG_USER_ONLY) */
2234 /* PowerPC 601 specific instructions (POWER bridge) */
2235 /* XXX: those micro-ops need tests ! */
2236 void OPPROTO op_POWER_abs (void)
2238 if (T0 == INT32_MIN)
2239 T0 = INT32_MAX;
2240 else if (T0 < 0)
2241 T0 = -T0;
2242 RETURN();
2245 void OPPROTO op_POWER_abso (void)
2247 do_POWER_abso();
2248 RETURN();
2251 void OPPROTO op_POWER_clcs (void)
2253 do_POWER_clcs();
2254 RETURN();
2257 void OPPROTO op_POWER_div (void)
2259 do_POWER_div();
2260 RETURN();
2263 void OPPROTO op_POWER_divo (void)
2265 do_POWER_divo();
2266 RETURN();
2269 void OPPROTO op_POWER_divs (void)
2271 do_POWER_divs();
2272 RETURN();
2275 void OPPROTO op_POWER_divso (void)
2277 do_POWER_divso();
2278 RETURN();
2281 void OPPROTO op_POWER_doz (void)
2283 if ((int32_t)T1 > (int32_t)T0)
2284 T0 = T1 - T0;
2285 else
2286 T0 = 0;
2287 RETURN();
2290 void OPPROTO op_POWER_dozo (void)
2292 do_POWER_dozo();
2293 RETURN();
2296 void OPPROTO op_load_xer_cmp (void)
2298 T2 = xer_cmp;
2299 RETURN();
2302 void OPPROTO op_POWER_maskg (void)
2304 do_POWER_maskg();
2305 RETURN();
2308 void OPPROTO op_POWER_maskir (void)
2310 T0 = (T0 & ~T2) | (T1 & T2);
2311 RETURN();
2314 void OPPROTO op_POWER_mul (void)
2316 uint64_t tmp;
2318 tmp = (uint64_t)T0 * (uint64_t)T1;
2319 env->spr[SPR_MQ] = tmp >> 32;
2320 T0 = tmp;
2321 RETURN();
2324 void OPPROTO op_POWER_mulo (void)
2326 do_POWER_mulo();
2327 RETURN();
2330 void OPPROTO op_POWER_nabs (void)
2332 if (T0 > 0)
2333 T0 = -T0;
2334 RETURN();
2337 void OPPROTO op_POWER_nabso (void)
2339 /* nabs never overflows */
2340 if (T0 > 0)
2341 T0 = -T0;
2342 xer_ov = 0;
2343 RETURN();
2346 /* XXX: factorise POWER rotates... */
2347 void OPPROTO op_POWER_rlmi (void)
2349 T0 = rotl32(T0, T2) & PARAM1;
2350 T0 |= T1 & (uint32_t)PARAM2;
2351 RETURN();
2354 void OPPROTO op_POWER_rrib (void)
2356 T2 &= 0x1FUL;
2357 T0 = rotl32(T0 & INT32_MIN, T2);
2358 T0 |= T1 & ~rotl32(INT32_MIN, T2);
2359 RETURN();
2362 void OPPROTO op_POWER_sle (void)
2364 T1 &= 0x1FUL;
2365 env->spr[SPR_MQ] = rotl32(T0, T1);
2366 T0 = T0 << T1;
2367 RETURN();
2370 void OPPROTO op_POWER_sleq (void)
2372 uint32_t tmp = env->spr[SPR_MQ];
2374 T1 &= 0x1FUL;
2375 env->spr[SPR_MQ] = rotl32(T0, T1);
2376 T0 = T0 << T1;
2377 T0 |= tmp >> (32 - T1);
2378 RETURN();
2381 void OPPROTO op_POWER_sllq (void)
2383 uint32_t msk = -1;
2385 msk = msk << (T1 & 0x1FUL);
2386 if (T1 & 0x20UL)
2387 msk = ~msk;
2388 T1 &= 0x1FUL;
2389 T0 = (T0 << T1) & msk;
2390 T0 |= env->spr[SPR_MQ] & ~msk;
2391 RETURN();
2394 void OPPROTO op_POWER_slq (void)
2396 uint32_t msk = -1, tmp;
2398 msk = msk << (T1 & 0x1FUL);
2399 if (T1 & 0x20UL)
2400 msk = ~msk;
2401 T1 &= 0x1FUL;
2402 tmp = rotl32(T0, T1);
2403 T0 = tmp & msk;
2404 env->spr[SPR_MQ] = tmp;
2405 RETURN();
2408 void OPPROTO op_POWER_sraq (void)
2410 env->spr[SPR_MQ] = rotl32(T0, 32 - (T1 & 0x1FUL));
2411 if (T1 & 0x20UL)
2412 T0 = -1L;
2413 else
2414 T0 = (int32_t)T0 >> T1;
2415 RETURN();
2418 void OPPROTO op_POWER_sre (void)
2420 T1 &= 0x1FUL;
2421 env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2422 T0 = (int32_t)T0 >> T1;
2423 RETURN();
2426 void OPPROTO op_POWER_srea (void)
2428 T1 &= 0x1FUL;
2429 env->spr[SPR_MQ] = T0 >> T1;
2430 T0 = (int32_t)T0 >> T1;
2431 RETURN();
2434 void OPPROTO op_POWER_sreq (void)
2436 uint32_t tmp;
2437 int32_t msk;
2439 T1 &= 0x1FUL;
2440 msk = INT32_MIN >> T1;
2441 tmp = env->spr[SPR_MQ];
2442 env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2443 T0 = T0 >> T1;
2444 T0 |= tmp & msk;
2445 RETURN();
2448 void OPPROTO op_POWER_srlq (void)
2450 uint32_t tmp;
2451 int32_t msk;
2453 msk = INT32_MIN >> (T1 & 0x1FUL);
2454 if (T1 & 0x20UL)
2455 msk = ~msk;
2456 T1 &= 0x1FUL;
2457 tmp = env->spr[SPR_MQ];
2458 env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2459 T0 = T0 >> T1;
2460 T0 &= msk;
2461 T0 |= tmp & ~msk;
2462 RETURN();
2465 void OPPROTO op_POWER_srq (void)
2467 T1 &= 0x1FUL;
2468 env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
2469 T0 = T0 >> T1;
2470 RETURN();
2473 /* POWER instructions not implemented in PowerPC 601 */
2474 #if !defined(CONFIG_USER_ONLY)
2475 void OPPROTO op_POWER_mfsri (void)
2477 T1 = T0 >> 28;
2478 T0 = env->sr[T1];
2479 RETURN();
2482 void OPPROTO op_POWER_rac (void)
2484 do_POWER_rac();
2485 RETURN();
2488 void OPPROTO op_POWER_rfsvc (void)
2490 do_POWER_rfsvc();
2491 RETURN();
2493 #endif
2495 /* PowerPC 602 specific instruction */
2496 #if !defined(CONFIG_USER_ONLY)
2497 void OPPROTO op_602_mfrom (void)
2499 do_op_602_mfrom();
2500 RETURN();
2502 #endif
2504 /* PowerPC 4xx specific micro-ops */
2505 void OPPROTO op_405_add_T0_T2 (void)
2507 T0 = (int32_t)T0 + (int32_t)T2;
2508 RETURN();
2511 void OPPROTO op_405_mulchw (void)
2513 T0 = ((int16_t)T0) * ((int16_t)(T1 >> 16));
2514 RETURN();
2517 void OPPROTO op_405_mulchwu (void)
2519 T0 = ((uint16_t)T0) * ((uint16_t)(T1 >> 16));
2520 RETURN();
2523 void OPPROTO op_405_mulhhw (void)
2525 T0 = ((int16_t)(T0 >> 16)) * ((int16_t)(T1 >> 16));
2526 RETURN();
2529 void OPPROTO op_405_mulhhwu (void)
2531 T0 = ((uint16_t)(T0 >> 16)) * ((uint16_t)(T1 >> 16));
2532 RETURN();
2535 void OPPROTO op_405_mullhw (void)
2537 T0 = ((int16_t)T0) * ((int16_t)T1);
2538 RETURN();
2541 void OPPROTO op_405_mullhwu (void)
2543 T0 = ((uint16_t)T0) * ((uint16_t)T1);
2544 RETURN();
2547 void OPPROTO op_405_check_ov (void)
2549 do_405_check_ov();
2550 RETURN();
2553 void OPPROTO op_405_check_sat (void)
2555 do_405_check_sat();
2556 RETURN();
2559 void OPPROTO op_405_check_ovu (void)
2561 if (likely(T0 >= T2)) {
2562 xer_ov = 0;
2563 } else {
2564 xer_ov = 1;
2565 xer_so = 1;
2567 RETURN();
2570 void OPPROTO op_405_check_satu (void)
2572 if (unlikely(T0 < T2)) {
2573 /* Saturate result */
2574 T0 = -1;
2576 RETURN();
2579 void OPPROTO op_load_dcr (void)
2581 do_load_dcr();
2582 RETURN();
2585 void OPPROTO op_store_dcr (void)
2587 do_store_dcr();
2588 RETURN();
2591 #if !defined(CONFIG_USER_ONLY)
2592 /* Return from critical interrupt :
2593 * same as rfi, except nip & MSR are loaded from SRR2/3 instead of SRR0/1
2595 void OPPROTO op_40x_rfci (void)
2597 do_40x_rfci();
2598 RETURN();
2601 void OPPROTO op_rfci (void)
2603 do_rfci();
2604 RETURN();
2607 void OPPROTO op_rfdi (void)
2609 do_rfdi();
2610 RETURN();
2613 void OPPROTO op_rfmci (void)
2615 do_rfmci();
2616 RETURN();
2619 void OPPROTO op_wrte (void)
2621 /* We don't call do_store_msr here as we won't trigger
2622 * any special case nor change hflags
2624 T0 &= 1 << MSR_EE;
2625 env->msr &= ~(1 << MSR_EE);
2626 env->msr |= T0;
2627 RETURN();
2630 void OPPROTO op_440_tlbre (void)
2632 do_440_tlbre(PARAM1);
2633 RETURN();
2636 void OPPROTO op_440_tlbsx (void)
2638 T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_440_MMUCR] & 0xFF);
2639 RETURN();
2642 void OPPROTO op_4xx_tlbsx_check (void)
2644 int tmp;
2646 tmp = xer_so;
2647 if (T0 != -1)
2648 tmp |= 0x02;
2649 env->crf[0] = tmp;
2650 RETURN();
2653 void OPPROTO op_440_tlbwe (void)
2655 do_440_tlbwe(PARAM1);
2656 RETURN();
2659 void OPPROTO op_4xx_tlbre_lo (void)
2661 do_4xx_tlbre_lo();
2662 RETURN();
2665 void OPPROTO op_4xx_tlbre_hi (void)
2667 do_4xx_tlbre_hi();
2668 RETURN();
2671 void OPPROTO op_4xx_tlbsx (void)
2673 T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_40x_PID]);
2674 RETURN();
2677 void OPPROTO op_4xx_tlbwe_lo (void)
2679 do_4xx_tlbwe_lo();
2680 RETURN();
2683 void OPPROTO op_4xx_tlbwe_hi (void)
2685 do_4xx_tlbwe_hi();
2686 RETURN();
2688 #endif
2690 /* SPR micro-ops */
2691 /* 440 specific */
2692 void OPPROTO op_440_dlmzb (void)
2694 do_440_dlmzb();
2695 RETURN();
2698 void OPPROTO op_440_dlmzb_update_Rc (void)
2700 if (T0 == 8)
2701 T0 = 0x2;
2702 else if (T0 < 4)
2703 T0 = 0x4;
2704 else
2705 T0 = 0x8;
2706 RETURN();
2709 #if !defined(CONFIG_USER_ONLY)
2710 void OPPROTO op_store_pir (void)
2712 env->spr[SPR_PIR] = T0 & 0x0000000FUL;
2713 RETURN();
2716 void OPPROTO op_load_403_pb (void)
2718 do_load_403_pb(PARAM1);
2719 RETURN();
2722 void OPPROTO op_store_403_pb (void)
2724 do_store_403_pb(PARAM1);
2725 RETURN();
2728 void OPPROTO op_load_40x_pit (void)
2730 T0 = load_40x_pit(env);
2731 RETURN();
2734 void OPPROTO op_store_40x_pit (void)
2736 store_40x_pit(env, T0);
2737 RETURN();
2740 void OPPROTO op_store_40x_dbcr0 (void)
2742 store_40x_dbcr0(env, T0);
2743 RETURN();
2746 void OPPROTO op_store_40x_sler (void)
2748 store_40x_sler(env, T0);
2749 RETURN();
2752 void OPPROTO op_store_booke_tcr (void)
2754 store_booke_tcr(env, T0);
2755 RETURN();
2758 void OPPROTO op_store_booke_tsr (void)
2760 store_booke_tsr(env, T0);
2761 RETURN();
2763 #endif /* !defined(CONFIG_USER_ONLY) */
2765 #if defined(TARGET_PPCEMB)
2766 /* SPE extension */
2767 void OPPROTO op_splatw_T1_64 (void)
2769 T1_64 = (T1_64 << 32) | (T1_64 & 0x00000000FFFFFFFFULL);
2770 RETURN();
2773 void OPPROTO op_splatwi_T0_64 (void)
2775 uint64_t tmp = PARAM1;
2777 T0_64 = (tmp << 32) | tmp;
2778 RETURN();
2781 void OPPROTO op_splatwi_T1_64 (void)
2783 uint64_t tmp = PARAM1;
2785 T1_64 = (tmp << 32) | tmp;
2786 RETURN();
2789 void OPPROTO op_extsh_T1_64 (void)
2791 T1_64 = (int32_t)((int16_t)T1_64);
2792 RETURN();
2795 void OPPROTO op_sli16_T1_64 (void)
2797 T1_64 = T1_64 << 16;
2798 RETURN();
2801 void OPPROTO op_sli32_T1_64 (void)
2803 T1_64 = T1_64 << 32;
2804 RETURN();
2807 void OPPROTO op_srli32_T1_64 (void)
2809 T1_64 = T1_64 >> 32;
2810 RETURN();
2813 void OPPROTO op_evsel (void)
2815 do_evsel();
2816 RETURN();
2819 void OPPROTO op_evaddw (void)
2821 do_evaddw();
2822 RETURN();
2825 void OPPROTO op_evsubfw (void)
2827 do_evsubfw();
2828 RETURN();
2831 void OPPROTO op_evneg (void)
2833 do_evneg();
2834 RETURN();
2837 void OPPROTO op_evabs (void)
2839 do_evabs();
2840 RETURN();
2843 void OPPROTO op_evextsh (void)
2845 T0_64 = ((uint64_t)((int32_t)(int16_t)(T0_64 >> 32)) << 32) |
2846 (uint64_t)((int32_t)(int16_t)T0_64);
2847 RETURN();
2850 void OPPROTO op_evextsb (void)
2852 T0_64 = ((uint64_t)((int32_t)(int8_t)(T0_64 >> 32)) << 32) |
2853 (uint64_t)((int32_t)(int8_t)T0_64);
2854 RETURN();
2857 void OPPROTO op_evcntlzw (void)
2859 do_evcntlzw();
2860 RETURN();
2863 void OPPROTO op_evrndw (void)
2865 do_evrndw();
2866 RETURN();
2869 void OPPROTO op_brinc (void)
2871 do_brinc();
2872 RETURN();
2875 void OPPROTO op_evcntlsw (void)
2877 do_evcntlsw();
2878 RETURN();
2881 void OPPROTO op_evand (void)
2883 T0_64 &= T1_64;
2884 RETURN();
2887 void OPPROTO op_evandc (void)
2889 T0_64 &= ~T1_64;
2890 RETURN();
2893 void OPPROTO op_evor (void)
2895 T0_64 |= T1_64;
2896 RETURN();
2899 void OPPROTO op_evxor (void)
2901 T0_64 ^= T1_64;
2902 RETURN();
2905 void OPPROTO op_eveqv (void)
2907 T0_64 = ~(T0_64 ^ T1_64);
2908 RETURN();
2911 void OPPROTO op_evnor (void)
2913 T0_64 = ~(T0_64 | T1_64);
2914 RETURN();
2917 void OPPROTO op_evorc (void)
2919 T0_64 |= ~T1_64;
2920 RETURN();
2923 void OPPROTO op_evnand (void)
2925 T0_64 = ~(T0_64 & T1_64);
2926 RETURN();
2929 void OPPROTO op_evsrws (void)
2931 do_evsrws();
2932 RETURN();
2935 void OPPROTO op_evsrwu (void)
2937 do_evsrwu();
2938 RETURN();
2941 void OPPROTO op_evslw (void)
2943 do_evslw();
2944 RETURN();
2947 void OPPROTO op_evrlw (void)
2949 do_evrlw();
2950 RETURN();
2953 void OPPROTO op_evmergelo (void)
2955 T0_64 = (T0_64 << 32) | (T1_64 & 0x00000000FFFFFFFFULL);
2956 RETURN();
2959 void OPPROTO op_evmergehi (void)
2961 T0_64 = (T0_64 & 0xFFFFFFFF00000000ULL) | (T1_64 >> 32);
2962 RETURN();
2965 void OPPROTO op_evmergelohi (void)
2967 T0_64 = (T0_64 << 32) | (T1_64 >> 32);
2968 RETURN();
2971 void OPPROTO op_evmergehilo (void)
2973 T0_64 = (T0_64 & 0xFFFFFFFF00000000ULL) | (T1_64 & 0x00000000FFFFFFFFULL);
2974 RETURN();
2977 void OPPROTO op_evcmpgts (void)
2979 do_evcmpgts();
2980 RETURN();
2983 void OPPROTO op_evcmpgtu (void)
2985 do_evcmpgtu();
2986 RETURN();
2989 void OPPROTO op_evcmplts (void)
2991 do_evcmplts();
2992 RETURN();
2995 void OPPROTO op_evcmpltu (void)
2997 do_evcmpltu();
2998 RETURN();
3001 void OPPROTO op_evcmpeq (void)
3003 do_evcmpeq();
3004 RETURN();
3007 void OPPROTO op_evfssub (void)
3009 do_evfssub();
3010 RETURN();
3013 void OPPROTO op_evfsadd (void)
3015 do_evfsadd();
3016 RETURN();
3019 void OPPROTO op_evfsnabs (void)
3021 do_evfsnabs();
3022 RETURN();
3025 void OPPROTO op_evfsabs (void)
3027 do_evfsabs();
3028 RETURN();
3031 void OPPROTO op_evfsneg (void)
3033 do_evfsneg();
3034 RETURN();
3037 void OPPROTO op_evfsdiv (void)
3039 do_evfsdiv();
3040 RETURN();
3043 void OPPROTO op_evfsmul (void)
3045 do_evfsmul();
3046 RETURN();
3049 void OPPROTO op_evfscmplt (void)
3051 do_evfscmplt();
3052 RETURN();
3055 void OPPROTO op_evfscmpgt (void)
3057 do_evfscmpgt();
3058 RETURN();
3061 void OPPROTO op_evfscmpeq (void)
3063 do_evfscmpeq();
3064 RETURN();
3067 void OPPROTO op_evfscfsi (void)
3069 do_evfscfsi();
3070 RETURN();
3073 void OPPROTO op_evfscfui (void)
3075 do_evfscfui();
3076 RETURN();
3079 void OPPROTO op_evfscfsf (void)
3081 do_evfscfsf();
3082 RETURN();
3085 void OPPROTO op_evfscfuf (void)
3087 do_evfscfuf();
3088 RETURN();
3091 void OPPROTO op_evfsctsi (void)
3093 do_evfsctsi();
3094 RETURN();
3097 void OPPROTO op_evfsctui (void)
3099 do_evfsctui();
3100 RETURN();
3103 void OPPROTO op_evfsctsf (void)
3105 do_evfsctsf();
3106 RETURN();
3109 void OPPROTO op_evfsctuf (void)
3111 do_evfsctuf();
3112 RETURN();
3115 void OPPROTO op_evfsctuiz (void)
3117 do_evfsctuiz();
3118 RETURN();
3121 void OPPROTO op_evfsctsiz (void)
3123 do_evfsctsiz();
3124 RETURN();
3127 void OPPROTO op_evfststlt (void)
3129 do_evfststlt();
3130 RETURN();
3133 void OPPROTO op_evfststgt (void)
3135 do_evfststgt();
3136 RETURN();
3139 void OPPROTO op_evfststeq (void)
3141 do_evfststeq();
3142 RETURN();
3145 void OPPROTO op_efssub (void)
3147 T0_64 = _do_efssub(T0_64, T1_64);
3148 RETURN();
3151 void OPPROTO op_efsadd (void)
3153 T0_64 = _do_efsadd(T0_64, T1_64);
3154 RETURN();
3157 void OPPROTO op_efsnabs (void)
3159 T0_64 = _do_efsnabs(T0_64);
3160 RETURN();
3163 void OPPROTO op_efsabs (void)
3165 T0_64 = _do_efsabs(T0_64);
3166 RETURN();
3169 void OPPROTO op_efsneg (void)
3171 T0_64 = _do_efsneg(T0_64);
3172 RETURN();
3175 void OPPROTO op_efsdiv (void)
3177 T0_64 = _do_efsdiv(T0_64, T1_64);
3178 RETURN();
3181 void OPPROTO op_efsmul (void)
3183 T0_64 = _do_efsmul(T0_64, T1_64);
3184 RETURN();
3187 void OPPROTO op_efscmplt (void)
3189 do_efscmplt();
3190 RETURN();
3193 void OPPROTO op_efscmpgt (void)
3195 do_efscmpgt();
3196 RETURN();
3199 void OPPROTO op_efscfd (void)
3201 do_efscfd();
3202 RETURN();
3205 void OPPROTO op_efscmpeq (void)
3207 do_efscmpeq();
3208 RETURN();
3211 void OPPROTO op_efscfsi (void)
3213 do_efscfsi();
3214 RETURN();
3217 void OPPROTO op_efscfui (void)
3219 do_efscfui();
3220 RETURN();
3223 void OPPROTO op_efscfsf (void)
3225 do_efscfsf();
3226 RETURN();
3229 void OPPROTO op_efscfuf (void)
3231 do_efscfuf();
3232 RETURN();
3235 void OPPROTO op_efsctsi (void)
3237 do_efsctsi();
3238 RETURN();
3241 void OPPROTO op_efsctui (void)
3243 do_efsctui();
3244 RETURN();
3247 void OPPROTO op_efsctsf (void)
3249 do_efsctsf();
3250 RETURN();
3253 void OPPROTO op_efsctuf (void)
3255 do_efsctuf();
3256 RETURN();
3259 void OPPROTO op_efsctsiz (void)
3261 do_efsctsiz();
3262 RETURN();
3265 void OPPROTO op_efsctuiz (void)
3267 do_efsctuiz();
3268 RETURN();
3271 void OPPROTO op_efststlt (void)
3273 T0 = _do_efststlt(T0_64, T1_64);
3274 RETURN();
3277 void OPPROTO op_efststgt (void)
3279 T0 = _do_efststgt(T0_64, T1_64);
3280 RETURN();
3283 void OPPROTO op_efststeq (void)
3285 T0 = _do_efststeq(T0_64, T1_64);
3286 RETURN();
3289 void OPPROTO op_efdsub (void)
3291 union {
3292 uint64_t u;
3293 float64 f;
3294 } u1, u2;
3295 u1.u = T0_64;
3296 u2.u = T1_64;
3297 u1.f = float64_sub(u1.f, u2.f, &env->spe_status);
3298 T0_64 = u1.u;
3299 RETURN();
3302 void OPPROTO op_efdadd (void)
3304 union {
3305 uint64_t u;
3306 float64 f;
3307 } u1, u2;
3308 u1.u = T0_64;
3309 u2.u = T1_64;
3310 u1.f = float64_add(u1.f, u2.f, &env->spe_status);
3311 T0_64 = u1.u;
3312 RETURN();
3315 void OPPROTO op_efdcfsid (void)
3317 do_efdcfsi();
3318 RETURN();
3321 void OPPROTO op_efdcfuid (void)
3323 do_efdcfui();
3324 RETURN();
3327 void OPPROTO op_efdnabs (void)
3329 T0_64 |= 0x8000000000000000ULL;
3330 RETURN();
3333 void OPPROTO op_efdabs (void)
3335 T0_64 &= ~0x8000000000000000ULL;
3336 RETURN();
3339 void OPPROTO op_efdneg (void)
3341 T0_64 ^= 0x8000000000000000ULL;
3342 RETURN();
3345 void OPPROTO op_efddiv (void)
3347 union {
3348 uint64_t u;
3349 float64 f;
3350 } u1, u2;
3351 u1.u = T0_64;
3352 u2.u = T1_64;
3353 u1.f = float64_div(u1.f, u2.f, &env->spe_status);
3354 T0_64 = u1.u;
3355 RETURN();
3358 void OPPROTO op_efdmul (void)
3360 union {
3361 uint64_t u;
3362 float64 f;
3363 } u1, u2;
3364 u1.u = T0_64;
3365 u2.u = T1_64;
3366 u1.f = float64_mul(u1.f, u2.f, &env->spe_status);
3367 T0_64 = u1.u;
3368 RETURN();
3371 void OPPROTO op_efdctsidz (void)
3373 do_efdctsiz();
3374 RETURN();
3377 void OPPROTO op_efdctuidz (void)
3379 do_efdctuiz();
3380 RETURN();
3383 void OPPROTO op_efdcmplt (void)
3385 do_efdcmplt();
3386 RETURN();
3389 void OPPROTO op_efdcmpgt (void)
3391 do_efdcmpgt();
3392 RETURN();
3395 void OPPROTO op_efdcfs (void)
3397 do_efdcfs();
3398 RETURN();
3401 void OPPROTO op_efdcmpeq (void)
3403 do_efdcmpeq();
3404 RETURN();
3407 void OPPROTO op_efdcfsi (void)
3409 do_efdcfsi();
3410 RETURN();
3413 void OPPROTO op_efdcfui (void)
3415 do_efdcfui();
3416 RETURN();
3419 void OPPROTO op_efdcfsf (void)
3421 do_efdcfsf();
3422 RETURN();
3425 void OPPROTO op_efdcfuf (void)
3427 do_efdcfuf();
3428 RETURN();
3431 void OPPROTO op_efdctsi (void)
3433 do_efdctsi();
3434 RETURN();
3437 void OPPROTO op_efdctui (void)
3439 do_efdctui();
3440 RETURN();
3443 void OPPROTO op_efdctsf (void)
3445 do_efdctsf();
3446 RETURN();
3449 void OPPROTO op_efdctuf (void)
3451 do_efdctuf();
3452 RETURN();
3455 void OPPROTO op_efdctuiz (void)
3457 do_efdctuiz();
3458 RETURN();
3461 void OPPROTO op_efdctsiz (void)
3463 do_efdctsiz();
3464 RETURN();
3467 void OPPROTO op_efdtstlt (void)
3469 T0 = _do_efdtstlt(T0_64, T1_64);
3470 RETURN();
3473 void OPPROTO op_efdtstgt (void)
3475 T0 = _do_efdtstgt(T0_64, T1_64);
3476 RETURN();
3479 void OPPROTO op_efdtsteq (void)
3481 T0 = _do_efdtsteq(T0_64, T1_64);
3482 RETURN();
3484 #endif /* defined(TARGET_PPCEMB) */