target-ppc: convert rotation instructions to TCG
[qemu/qemu-JZ.git] / target-ppc / op.c
blobbcdb11d0038f4de27c4eedabcaa1d8051906ddea
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 /* Generate exceptions */
30 void OPPROTO op_raise_exception_err (void)
32 do_raise_exception_err(PARAM1, PARAM2);
35 void OPPROTO op_debug (void)
37 do_raise_exception(EXCP_DEBUG);
40 #if !defined(CONFIG_USER_ONLY)
41 /* Segment registers load and store */
42 void OPPROTO op_load_sr (void)
44 T0 = env->sr[T1];
45 RETURN();
48 void OPPROTO op_store_sr (void)
50 do_store_sr(env, T1, T0);
51 RETURN();
54 #if defined(TARGET_PPC64)
55 void OPPROTO op_load_slb (void)
57 T0 = ppc_load_slb(env, T1);
58 RETURN();
61 void OPPROTO op_store_slb (void)
63 ppc_store_slb(env, T1, T0);
64 RETURN();
66 #endif /* defined(TARGET_PPC64) */
68 void OPPROTO op_load_sdr1 (void)
70 T0 = env->sdr1;
71 RETURN();
74 void OPPROTO op_store_sdr1 (void)
76 do_store_sdr1(env, T0);
77 RETURN();
80 #if defined (TARGET_PPC64)
81 void OPPROTO op_load_asr (void)
83 T0 = env->asr;
84 RETURN();
87 void OPPROTO op_store_asr (void)
89 ppc_store_asr(env, T0);
90 RETURN();
92 #endif
94 void OPPROTO op_load_msr (void)
96 T0 = env->msr;
97 RETURN();
100 void OPPROTO op_store_msr (void)
102 do_store_msr();
103 RETURN();
106 #if defined (TARGET_PPC64)
107 void OPPROTO op_store_msr_32 (void)
109 T0 = (env->msr & ~0xFFFFFFFFULL) | (T0 & 0xFFFFFFFF);
110 do_store_msr();
111 RETURN();
113 #endif
115 void OPPROTO op_update_riee (void)
117 /* We don't call do_store_msr here as we won't trigger
118 * any special case nor change hflags
120 T0 &= (1 << MSR_RI) | (1 << MSR_EE);
121 env->msr &= ~(1 << MSR_RI) | (1 << MSR_EE);
122 env->msr |= T0;
123 RETURN();
125 #endif
127 /* SPR */
128 void OPPROTO op_load_spr (void)
130 T0 = env->spr[PARAM1];
131 RETURN();
134 void OPPROTO op_store_spr (void)
136 env->spr[PARAM1] = T0;
137 RETURN();
140 void OPPROTO op_load_dump_spr (void)
142 T0 = ppc_load_dump_spr(PARAM1);
143 RETURN();
146 void OPPROTO op_store_dump_spr (void)
148 ppc_store_dump_spr(PARAM1, T0);
149 RETURN();
152 void OPPROTO op_mask_spr (void)
154 env->spr[PARAM1] &= ~T0;
155 RETURN();
158 void OPPROTO op_load_tbl (void)
160 T0 = cpu_ppc_load_tbl(env);
161 RETURN();
164 void OPPROTO op_load_tbu (void)
166 T0 = cpu_ppc_load_tbu(env);
167 RETURN();
170 void OPPROTO op_load_atbl (void)
172 T0 = cpu_ppc_load_atbl(env);
173 RETURN();
176 void OPPROTO op_load_atbu (void)
178 T0 = cpu_ppc_load_atbu(env);
179 RETURN();
182 #if !defined(CONFIG_USER_ONLY)
183 void OPPROTO op_store_tbl (void)
185 cpu_ppc_store_tbl(env, T0);
186 RETURN();
189 void OPPROTO op_store_tbu (void)
191 cpu_ppc_store_tbu(env, T0);
192 RETURN();
195 void OPPROTO op_store_atbl (void)
197 cpu_ppc_store_atbl(env, T0);
198 RETURN();
201 void OPPROTO op_store_atbu (void)
203 cpu_ppc_store_atbu(env, T0);
204 RETURN();
207 void OPPROTO op_load_decr (void)
209 T0 = cpu_ppc_load_decr(env);
210 RETURN();
213 void OPPROTO op_store_decr (void)
215 cpu_ppc_store_decr(env, T0);
216 RETURN();
219 void OPPROTO op_load_ibat (void)
221 T0 = env->IBAT[PARAM1][PARAM2];
222 RETURN();
225 void OPPROTO op_store_ibatu (void)
227 do_store_ibatu(env, PARAM1, T0);
228 RETURN();
231 void OPPROTO op_store_ibatl (void)
233 #if 1
234 env->IBAT[1][PARAM1] = T0;
235 #else
236 do_store_ibatl(env, PARAM1, T0);
237 #endif
238 RETURN();
241 void OPPROTO op_load_dbat (void)
243 T0 = env->DBAT[PARAM1][PARAM2];
244 RETURN();
247 void OPPROTO op_store_dbatu (void)
249 do_store_dbatu(env, PARAM1, T0);
250 RETURN();
253 void OPPROTO op_store_dbatl (void)
255 #if 1
256 env->DBAT[1][PARAM1] = T0;
257 #else
258 do_store_dbatl(env, PARAM1, T0);
259 #endif
260 RETURN();
262 #endif /* !defined(CONFIG_USER_ONLY) */
264 /* FPSCR */
265 #ifdef CONFIG_SOFTFLOAT
266 void OPPROTO op_reset_fpstatus (void)
268 env->fp_status.float_exception_flags = 0;
269 RETURN();
271 #endif
273 void OPPROTO op_compute_fprf (void)
275 do_compute_fprf(PARAM1);
276 RETURN();
279 #ifdef CONFIG_SOFTFLOAT
280 void OPPROTO op_float_check_status (void)
282 do_float_check_status();
283 RETURN();
285 #else
286 void OPPROTO op_float_check_status (void)
288 if (env->exception_index == POWERPC_EXCP_PROGRAM &&
289 (env->error_code & POWERPC_EXCP_FP)) {
290 /* Differred floating-point exception after target FPR update */
291 if (msr_fe0 != 0 || msr_fe1 != 0)
292 do_raise_exception_err(env->exception_index, env->error_code);
294 RETURN();
296 #endif
298 void OPPROTO op_load_fpscr_FT0 (void)
300 /* The 32 MSB of the target fpr are undefined.
301 * They'll be zero...
303 CPU_DoubleU u;
305 u.l.upper = 0;
306 u.l.lower = env->fpscr;
307 FT0 = u.d;
308 RETURN();
311 void OPPROTO op_fpscr_resetbit (void)
313 env->fpscr &= PARAM1;
314 RETURN();
317 void OPPROTO op_fpscr_setbit (void)
319 do_fpscr_setbit(PARAM1);
320 RETURN();
323 void OPPROTO op_store_fpscr (void)
325 do_store_fpscr(PARAM1);
326 RETURN();
329 /*** Integer arithmetic ***/
330 /* add */
331 void OPPROTO op_check_addo (void)
333 int ov = (((uint32_t)T2 ^ (uint32_t)T1 ^ UINT32_MAX) &
334 ((uint32_t)T2 ^ (uint32_t)T0)) >> 31;
335 if (ov) {
336 env->xer |= (1 << XER_OV) | (1 << XER_SO);
337 } else {
338 env->xer &= ~(1 << XER_OV);
340 RETURN();
343 #if defined(TARGET_PPC64)
344 void OPPROTO op_check_addo_64 (void)
346 int ov = (((uint64_t)T2 ^ (uint64_t)T1 ^ UINT64_MAX) &
347 ((uint64_t)T2 ^ (uint64_t)T0)) >> 63;
348 if (ov) {
349 env->xer |= (1 << XER_OV) | (1 << XER_SO);
350 } else {
351 env->xer &= ~(1 << XER_OV);
353 RETURN();
355 #endif
357 /* add carrying */
358 void OPPROTO op_check_addc (void)
360 if (likely((uint32_t)T0 >= (uint32_t)T2)) {
361 env->xer &= ~(1 << XER_CA);
362 } else {
363 env->xer |= (1 << XER_CA);
365 RETURN();
368 #if defined(TARGET_PPC64)
369 void OPPROTO op_check_addc_64 (void)
371 if (likely((uint64_t)T0 >= (uint64_t)T2)) {
372 env->xer &= ~(1 << XER_CA);
373 } else {
374 env->xer |= (1 << XER_CA);
376 RETURN();
378 #endif
380 /* add extended */
381 void OPPROTO op_adde (void)
383 do_adde();
384 RETURN();
387 #if defined(TARGET_PPC64)
388 void OPPROTO op_adde_64 (void)
390 do_adde_64();
391 RETURN();
393 #endif
395 /* add to minus one extended */
396 void OPPROTO op_add_me (void)
398 T0 += xer_ca + (-1);
399 if (likely((uint32_t)T1 != 0))
400 env->xer |= (1 << XER_CA);
401 RETURN();
404 #if defined(TARGET_PPC64)
405 void OPPROTO op_add_me_64 (void)
407 T0 += xer_ca + (-1);
408 if (likely((uint64_t)T1 != 0))
409 env->xer |= (1 << XER_CA);
410 RETURN();
412 #endif
414 void OPPROTO op_addmeo (void)
416 do_addmeo();
417 RETURN();
420 void OPPROTO op_addmeo_64 (void)
422 do_addmeo();
423 RETURN();
426 /* add to zero extended */
427 void OPPROTO op_add_ze (void)
429 T0 += xer_ca;
430 RETURN();
433 /* divide word */
434 void OPPROTO op_divw (void)
436 if (unlikely(((int32_t)T0 == INT32_MIN && (int32_t)T1 == (int32_t)-1) ||
437 (int32_t)T1 == 0)) {
438 T0 = (int32_t)(UINT32_MAX * ((uint32_t)T0 >> 31));
439 } else {
440 T0 = (int32_t)T0 / (int32_t)T1;
442 RETURN();
445 #if defined(TARGET_PPC64)
446 void OPPROTO op_divd (void)
448 if (unlikely(((int64_t)T0 == INT64_MIN && (int64_t)T1 == (int64_t)-1LL) ||
449 (int64_t)T1 == 0)) {
450 T0 = (int64_t)(UINT64_MAX * ((uint64_t)T0 >> 63));
451 } else {
452 T0 = (int64_t)T0 / (int64_t)T1;
454 RETURN();
456 #endif
458 void OPPROTO op_divwo (void)
460 do_divwo();
461 RETURN();
464 #if defined(TARGET_PPC64)
465 void OPPROTO op_divdo (void)
467 do_divdo();
468 RETURN();
470 #endif
472 /* divide word unsigned */
473 void OPPROTO op_divwu (void)
475 if (unlikely(T1 == 0)) {
476 T0 = 0;
477 } else {
478 T0 = (uint32_t)T0 / (uint32_t)T1;
480 RETURN();
483 #if defined(TARGET_PPC64)
484 void OPPROTO op_divdu (void)
486 if (unlikely(T1 == 0)) {
487 T0 = 0;
488 } else {
489 T0 /= T1;
491 RETURN();
493 #endif
495 void OPPROTO op_divwuo (void)
497 do_divwuo();
498 RETURN();
501 #if defined(TARGET_PPC64)
502 void OPPROTO op_divduo (void)
504 do_divduo();
505 RETURN();
507 #endif
509 /* multiply high word */
510 void OPPROTO op_mulhw (void)
512 T0 = ((int64_t)((int32_t)T0) * (int64_t)((int32_t)T1)) >> 32;
513 RETURN();
516 #if defined(TARGET_PPC64)
517 void OPPROTO op_mulhd (void)
519 uint64_t tl, th;
521 muls64(&tl, &th, T0, T1);
522 T0 = th;
523 RETURN();
525 #endif
527 /* multiply high word unsigned */
528 void OPPROTO op_mulhwu (void)
530 T0 = ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1) >> 32;
531 RETURN();
534 #if defined(TARGET_PPC64)
535 void OPPROTO op_mulhdu (void)
537 uint64_t tl, th;
539 mulu64(&tl, &th, T0, T1);
540 T0 = th;
541 RETURN();
543 #endif
545 /* multiply low immediate */
546 void OPPROTO op_mulli (void)
548 T0 = ((int32_t)T0 * (int32_t)PARAM1);
549 RETURN();
552 /* multiply low word */
553 void OPPROTO op_mullw (void)
555 #if defined(TARGET_PPC64)
556 T0 = (int64_t)(int32_t)T0 * (int64_t)(int32_t)T1;
557 #else
558 T0 = (int32_t)(T0 * T1);
559 #endif
560 RETURN();
563 #if defined(TARGET_PPC64)
564 void OPPROTO op_mulld (void)
566 T0 *= T1;
567 RETURN();
569 #endif
571 void OPPROTO op_mullwo (void)
573 do_mullwo();
574 RETURN();
577 #if defined(TARGET_PPC64)
578 void OPPROTO op_mulldo (void)
580 do_mulldo();
581 RETURN();
583 #endif
585 /* negate */
586 void OPPROTO op_neg (void)
588 if (likely(T0 != INT32_MIN)) {
589 T0 = -(int32_t)T0;
591 RETURN();
594 #if defined(TARGET_PPC64)
595 void OPPROTO op_neg_64 (void)
597 if (likely(T0 != INT64_MIN)) {
598 T0 = -(int64_t)T0;
600 RETURN();
602 #endif
604 void OPPROTO op_nego (void)
606 do_nego();
607 RETURN();
610 #if defined(TARGET_PPC64)
611 void OPPROTO op_nego_64 (void)
613 do_nego_64();
614 RETURN();
616 #endif
618 /* subtract from carrying */
619 void OPPROTO op_check_subfc (void)
621 if (likely((uint32_t)T0 > (uint32_t)T1)) {
622 env->xer &= ~(1 << XER_CA);
623 } else {
624 env->xer |= (1 << XER_CA);
626 RETURN();
629 #if defined(TARGET_PPC64)
630 void OPPROTO op_check_subfc_64 (void)
632 if (likely((uint64_t)T0 > (uint64_t)T1)) {
633 env->xer &= ~(1 << XER_CA);
634 } else {
635 env->xer |= (1 << XER_CA);
637 RETURN();
639 #endif
641 /* subtract from extended */
642 void OPPROTO op_subfe (void)
644 do_subfe();
645 RETURN();
648 #if defined(TARGET_PPC64)
649 void OPPROTO op_subfe_64 (void)
651 do_subfe_64();
652 RETURN();
654 #endif
656 /* subtract from immediate carrying */
657 void OPPROTO op_subfic (void)
659 T0 = (int32_t)PARAM1 + ~T0 + 1;
660 if ((uint32_t)T0 <= (uint32_t)PARAM1) {
661 env->xer |= (1 << XER_CA);
662 } else {
663 env->xer &= ~(1 << XER_CA);
665 RETURN();
668 #if defined(TARGET_PPC64)
669 void OPPROTO op_subfic_64 (void)
671 T0 = (int64_t)PARAM1 + ~T0 + 1;
672 if ((uint64_t)T0 <= (uint64_t)PARAM1) {
673 env->xer |= (1 << XER_CA);
674 } else {
675 env->xer &= ~(1 << XER_CA);
677 RETURN();
679 #endif
681 /* subtract from minus one extended */
682 void OPPROTO op_subfme (void)
684 T0 = ~T0 + xer_ca - 1;
685 if (likely((uint32_t)T0 != UINT32_MAX))
686 env->xer |= (1 << XER_CA);
687 RETURN();
690 #if defined(TARGET_PPC64)
691 void OPPROTO op_subfme_64 (void)
693 T0 = ~T0 + xer_ca - 1;
694 if (likely((uint64_t)T0 != UINT64_MAX))
695 env->xer |= (1 << XER_CA);
696 RETURN();
698 #endif
700 void OPPROTO op_subfmeo (void)
702 do_subfmeo();
703 RETURN();
706 #if defined(TARGET_PPC64)
707 void OPPROTO op_subfmeo_64 (void)
709 do_subfmeo_64();
710 RETURN();
712 #endif
714 /* subtract from zero extended */
715 void OPPROTO op_subfze (void)
717 T1 = ~T0;
718 T0 = T1 + xer_ca;
719 if ((uint32_t)T0 < (uint32_t)T1) {
720 env->xer |= (1 << XER_CA);
721 } else {
722 env->xer &= ~(1 << XER_CA);
724 RETURN();
727 #if defined(TARGET_PPC64)
728 void OPPROTO op_subfze_64 (void)
730 T1 = ~T0;
731 T0 = T1 + xer_ca;
732 if ((uint64_t)T0 < (uint64_t)T1) {
733 env->xer |= (1 << XER_CA);
734 } else {
735 env->xer &= ~(1 << XER_CA);
737 RETURN();
739 #endif
741 void OPPROTO op_subfzeo (void)
743 do_subfzeo();
744 RETURN();
747 #if defined(TARGET_PPC64)
748 void OPPROTO op_subfzeo_64 (void)
750 do_subfzeo_64();
751 RETURN();
753 #endif
755 /*** Integer shift ***/
756 void OPPROTO op_srli_T1 (void)
758 T1 = (uint32_t)T1 >> PARAM1;
759 RETURN();
762 /*** Floating-Point arithmetic ***/
763 /* fadd - fadd. */
764 void OPPROTO op_fadd (void)
766 #if USE_PRECISE_EMULATION
767 do_fadd();
768 #else
769 FT0 = float64_add(FT0, FT1, &env->fp_status);
770 #endif
771 RETURN();
774 /* fsub - fsub. */
775 void OPPROTO op_fsub (void)
777 #if USE_PRECISE_EMULATION
778 do_fsub();
779 #else
780 FT0 = float64_sub(FT0, FT1, &env->fp_status);
781 #endif
782 RETURN();
785 /* fmul - fmul. */
786 void OPPROTO op_fmul (void)
788 #if USE_PRECISE_EMULATION
789 do_fmul();
790 #else
791 FT0 = float64_mul(FT0, FT1, &env->fp_status);
792 #endif
793 RETURN();
796 /* fdiv - fdiv. */
797 void OPPROTO op_fdiv (void)
799 #if USE_PRECISE_EMULATION
800 do_fdiv();
801 #else
802 FT0 = float64_div(FT0, FT1, &env->fp_status);
803 #endif
804 RETURN();
807 /* fsqrt - fsqrt. */
808 void OPPROTO op_fsqrt (void)
810 do_fsqrt();
811 RETURN();
814 /* fre - fre. */
815 void OPPROTO op_fre (void)
817 do_fre();
818 RETURN();
821 /* fres - fres. */
822 void OPPROTO op_fres (void)
824 do_fres();
825 RETURN();
828 /* frsqrte - frsqrte. */
829 void OPPROTO op_frsqrte (void)
831 do_frsqrte();
832 RETURN();
835 /* fsel - fsel. */
836 void OPPROTO op_fsel (void)
838 do_fsel();
839 RETURN();
842 /*** Floating-Point multiply-and-add ***/
843 /* fmadd - fmadd. */
844 void OPPROTO op_fmadd (void)
846 #if USE_PRECISE_EMULATION
847 do_fmadd();
848 #else
849 FT0 = float64_mul(FT0, FT1, &env->fp_status);
850 FT0 = float64_add(FT0, FT2, &env->fp_status);
851 #endif
852 RETURN();
855 /* fmsub - fmsub. */
856 void OPPROTO op_fmsub (void)
858 #if USE_PRECISE_EMULATION
859 do_fmsub();
860 #else
861 FT0 = float64_mul(FT0, FT1, &env->fp_status);
862 FT0 = float64_sub(FT0, FT2, &env->fp_status);
863 #endif
864 RETURN();
867 /* fnmadd - fnmadd. - fnmadds - fnmadds. */
868 void OPPROTO op_fnmadd (void)
870 do_fnmadd();
871 RETURN();
874 /* fnmsub - fnmsub. */
875 void OPPROTO op_fnmsub (void)
877 do_fnmsub();
878 RETURN();
881 /*** Floating-Point round & convert ***/
882 /* frsp - frsp. */
883 void OPPROTO op_frsp (void)
885 #if USE_PRECISE_EMULATION
886 do_frsp();
887 #else
888 FT0 = float64_to_float32(FT0, &env->fp_status);
889 #endif
890 RETURN();
893 /* fctiw - fctiw. */
894 void OPPROTO op_fctiw (void)
896 do_fctiw();
897 RETURN();
900 /* fctiwz - fctiwz. */
901 void OPPROTO op_fctiwz (void)
903 do_fctiwz();
904 RETURN();
907 #if defined(TARGET_PPC64)
908 /* fcfid - fcfid. */
909 void OPPROTO op_fcfid (void)
911 do_fcfid();
912 RETURN();
915 /* fctid - fctid. */
916 void OPPROTO op_fctid (void)
918 do_fctid();
919 RETURN();
922 /* fctidz - fctidz. */
923 void OPPROTO op_fctidz (void)
925 do_fctidz();
926 RETURN();
928 #endif
930 void OPPROTO op_frin (void)
932 do_frin();
933 RETURN();
936 void OPPROTO op_friz (void)
938 do_friz();
939 RETURN();
942 void OPPROTO op_frip (void)
944 do_frip();
945 RETURN();
948 void OPPROTO op_frim (void)
950 do_frim();
951 RETURN();
954 /*** Floating-point move ***/
955 /* fabs */
956 void OPPROTO op_fabs (void)
958 FT0 = float64_abs(FT0);
959 RETURN();
962 /* fnabs */
963 void OPPROTO op_fnabs (void)
965 FT0 = float64_abs(FT0);
966 FT0 = float64_chs(FT0);
967 RETURN();
970 /* fneg */
971 void OPPROTO op_fneg (void)
973 FT0 = float64_chs(FT0);
974 RETURN();
977 /* Load and store */
978 #define MEMSUFFIX _raw
979 #include "op_helper.h"
980 #include "op_mem.h"
981 #if !defined(CONFIG_USER_ONLY)
982 #define MEMSUFFIX _user
983 #include "op_helper.h"
984 #include "op_mem.h"
985 #define MEMSUFFIX _kernel
986 #include "op_helper.h"
987 #include "op_mem.h"
988 #define MEMSUFFIX _hypv
989 #include "op_helper.h"
990 #include "op_mem.h"
991 #endif
993 /* Special op to check and maybe clear reservation */
994 void OPPROTO op_check_reservation (void)
996 if ((uint32_t)env->reserve == (uint32_t)(T0 & ~0x00000003))
997 env->reserve = (target_ulong)-1ULL;
998 RETURN();
1001 #if defined(TARGET_PPC64)
1002 void OPPROTO op_check_reservation_64 (void)
1004 if ((uint64_t)env->reserve == (uint64_t)(T0 & ~0x00000003))
1005 env->reserve = (target_ulong)-1ULL;
1006 RETURN();
1008 #endif
1010 void OPPROTO op_wait (void)
1012 env->halted = 1;
1013 RETURN();
1016 /* Return from interrupt */
1017 #if !defined(CONFIG_USER_ONLY)
1018 void OPPROTO op_rfi (void)
1020 do_rfi();
1021 RETURN();
1024 #if defined(TARGET_PPC64)
1025 void OPPROTO op_rfid (void)
1027 do_rfid();
1028 RETURN();
1031 void OPPROTO op_hrfid (void)
1033 do_hrfid();
1034 RETURN();
1036 #endif
1038 /* Exception vectors */
1039 void OPPROTO op_store_excp_prefix (void)
1041 T0 &= env->ivpr_mask;
1042 env->excp_prefix = T0;
1043 RETURN();
1046 void OPPROTO op_store_excp_vector (void)
1048 T0 &= env->ivor_mask;
1049 env->excp_vectors[PARAM1] = T0;
1050 RETURN();
1052 #endif
1054 /* Trap word */
1055 void OPPROTO op_tw (void)
1057 do_tw(PARAM1);
1058 RETURN();
1061 #if defined(TARGET_PPC64)
1062 void OPPROTO op_td (void)
1064 do_td(PARAM1);
1065 RETURN();
1067 #endif
1069 #if !defined(CONFIG_USER_ONLY)
1070 /* tlbia */
1071 void OPPROTO op_tlbia (void)
1073 ppc_tlb_invalidate_all(env);
1074 RETURN();
1077 /* tlbie */
1078 void OPPROTO op_tlbie (void)
1080 ppc_tlb_invalidate_one(env, (uint32_t)T0);
1081 RETURN();
1084 #if defined(TARGET_PPC64)
1085 void OPPROTO op_tlbie_64 (void)
1087 ppc_tlb_invalidate_one(env, T0);
1088 RETURN();
1090 #endif
1092 #if defined(TARGET_PPC64)
1093 void OPPROTO op_slbia (void)
1095 ppc_slb_invalidate_all(env);
1096 RETURN();
1099 void OPPROTO op_slbie (void)
1101 ppc_slb_invalidate_one(env, (uint32_t)T0);
1102 RETURN();
1105 void OPPROTO op_slbie_64 (void)
1107 ppc_slb_invalidate_one(env, T0);
1108 RETURN();
1110 #endif
1111 #endif
1113 #if !defined(CONFIG_USER_ONLY)
1114 /* PowerPC 602/603/755 software TLB load instructions */
1115 void OPPROTO op_6xx_tlbld (void)
1117 do_load_6xx_tlb(0);
1118 RETURN();
1121 void OPPROTO op_6xx_tlbli (void)
1123 do_load_6xx_tlb(1);
1124 RETURN();
1127 /* PowerPC 74xx software TLB load instructions */
1128 void OPPROTO op_74xx_tlbld (void)
1130 do_load_74xx_tlb(0);
1131 RETURN();
1134 void OPPROTO op_74xx_tlbli (void)
1136 do_load_74xx_tlb(1);
1137 RETURN();
1139 #endif
1141 /* 601 specific */
1142 void OPPROTO op_load_601_rtcl (void)
1144 T0 = cpu_ppc601_load_rtcl(env);
1145 RETURN();
1148 void OPPROTO op_load_601_rtcu (void)
1150 T0 = cpu_ppc601_load_rtcu(env);
1151 RETURN();
1154 #if !defined(CONFIG_USER_ONLY)
1155 void OPPROTO op_store_601_rtcl (void)
1157 cpu_ppc601_store_rtcl(env, T0);
1158 RETURN();
1161 void OPPROTO op_store_601_rtcu (void)
1163 cpu_ppc601_store_rtcu(env, T0);
1164 RETURN();
1167 void OPPROTO op_store_hid0_601 (void)
1169 do_store_hid0_601();
1170 RETURN();
1173 void OPPROTO op_load_601_bat (void)
1175 T0 = env->IBAT[PARAM1][PARAM2];
1176 RETURN();
1179 void OPPROTO op_store_601_batl (void)
1181 do_store_ibatl_601(env, PARAM1, T0);
1182 RETURN();
1185 void OPPROTO op_store_601_batu (void)
1187 do_store_ibatu_601(env, PARAM1, T0);
1188 RETURN();
1190 #endif /* !defined(CONFIG_USER_ONLY) */
1192 /* PowerPC 601 specific instructions (POWER bridge) */
1193 /* XXX: those micro-ops need tests ! */
1194 void OPPROTO op_POWER_abs (void)
1196 if ((int32_t)T0 == INT32_MIN)
1197 T0 = INT32_MAX;
1198 else if ((int32_t)T0 < 0)
1199 T0 = -T0;
1200 RETURN();
1203 void OPPROTO op_POWER_abso (void)
1205 do_POWER_abso();
1206 RETURN();
1209 void OPPROTO op_POWER_clcs (void)
1211 do_POWER_clcs();
1212 RETURN();
1215 void OPPROTO op_POWER_div (void)
1217 do_POWER_div();
1218 RETURN();
1221 void OPPROTO op_POWER_divo (void)
1223 do_POWER_divo();
1224 RETURN();
1227 void OPPROTO op_POWER_divs (void)
1229 do_POWER_divs();
1230 RETURN();
1233 void OPPROTO op_POWER_divso (void)
1235 do_POWER_divso();
1236 RETURN();
1239 void OPPROTO op_POWER_doz (void)
1241 if ((int32_t)T1 > (int32_t)T0)
1242 T0 = T1 - T0;
1243 else
1244 T0 = 0;
1245 RETURN();
1248 void OPPROTO op_POWER_dozo (void)
1250 do_POWER_dozo();
1251 RETURN();
1254 void OPPROTO op_load_xer_cmp (void)
1256 T2 = xer_cmp;
1257 RETURN();
1260 void OPPROTO op_POWER_maskg (void)
1262 do_POWER_maskg();
1263 RETURN();
1266 void OPPROTO op_POWER_maskir (void)
1268 T0 = (T0 & ~T2) | (T1 & T2);
1269 RETURN();
1272 void OPPROTO op_POWER_mul (void)
1274 uint64_t tmp;
1276 tmp = (uint64_t)T0 * (uint64_t)T1;
1277 env->spr[SPR_MQ] = tmp >> 32;
1278 T0 = tmp;
1279 RETURN();
1282 void OPPROTO op_POWER_mulo (void)
1284 do_POWER_mulo();
1285 RETURN();
1288 void OPPROTO op_POWER_nabs (void)
1290 if (T0 > 0)
1291 T0 = -T0;
1292 RETURN();
1295 void OPPROTO op_POWER_nabso (void)
1297 /* nabs never overflows */
1298 if (T0 > 0)
1299 T0 = -T0;
1300 env->xer &= ~(1 << XER_OV);
1301 RETURN();
1304 /* XXX: factorise POWER rotates... */
1305 void OPPROTO op_POWER_rlmi (void)
1307 T0 = rotl32(T0, T2) & PARAM1;
1308 T0 |= T1 & (uint32_t)PARAM2;
1309 RETURN();
1312 void OPPROTO op_POWER_rrib (void)
1314 T2 &= 0x1FUL;
1315 T0 = rotl32(T0 & INT32_MIN, T2);
1316 T0 |= T1 & ~rotl32(INT32_MIN, T2);
1317 RETURN();
1320 void OPPROTO op_POWER_sle (void)
1322 T1 &= 0x1FUL;
1323 env->spr[SPR_MQ] = rotl32(T0, T1);
1324 T0 = T0 << T1;
1325 RETURN();
1328 void OPPROTO op_POWER_sleq (void)
1330 uint32_t tmp = env->spr[SPR_MQ];
1332 T1 &= 0x1FUL;
1333 env->spr[SPR_MQ] = rotl32(T0, T1);
1334 T0 = T0 << T1;
1335 T0 |= tmp >> (32 - T1);
1336 RETURN();
1339 void OPPROTO op_POWER_sllq (void)
1341 uint32_t msk = UINT32_MAX;
1343 msk = msk << (T1 & 0x1FUL);
1344 if (T1 & 0x20UL)
1345 msk = ~msk;
1346 T1 &= 0x1FUL;
1347 T0 = (T0 << T1) & msk;
1348 T0 |= env->spr[SPR_MQ] & ~msk;
1349 RETURN();
1352 void OPPROTO op_POWER_slq (void)
1354 uint32_t msk = UINT32_MAX, tmp;
1356 msk = msk << (T1 & 0x1FUL);
1357 if (T1 & 0x20UL)
1358 msk = ~msk;
1359 T1 &= 0x1FUL;
1360 tmp = rotl32(T0, T1);
1361 T0 = tmp & msk;
1362 env->spr[SPR_MQ] = tmp;
1363 RETURN();
1366 void OPPROTO op_POWER_sraq (void)
1368 env->spr[SPR_MQ] = rotl32(T0, 32 - (T1 & 0x1FUL));
1369 if (T1 & 0x20UL)
1370 T0 = UINT32_MAX;
1371 else
1372 T0 = (int32_t)T0 >> T1;
1373 RETURN();
1376 void OPPROTO op_POWER_sre (void)
1378 T1 &= 0x1FUL;
1379 env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
1380 T0 = (int32_t)T0 >> T1;
1381 RETURN();
1384 void OPPROTO op_POWER_srea (void)
1386 T1 &= 0x1FUL;
1387 env->spr[SPR_MQ] = T0 >> T1;
1388 T0 = (int32_t)T0 >> T1;
1389 RETURN();
1392 void OPPROTO op_POWER_sreq (void)
1394 uint32_t tmp;
1395 int32_t msk;
1397 T1 &= 0x1FUL;
1398 msk = INT32_MIN >> T1;
1399 tmp = env->spr[SPR_MQ];
1400 env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
1401 T0 = T0 >> T1;
1402 T0 |= tmp & msk;
1403 RETURN();
1406 void OPPROTO op_POWER_srlq (void)
1408 uint32_t tmp;
1409 int32_t msk;
1411 msk = INT32_MIN >> (T1 & 0x1FUL);
1412 if (T1 & 0x20UL)
1413 msk = ~msk;
1414 T1 &= 0x1FUL;
1415 tmp = env->spr[SPR_MQ];
1416 env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
1417 T0 = T0 >> T1;
1418 T0 &= msk;
1419 T0 |= tmp & ~msk;
1420 RETURN();
1423 void OPPROTO op_POWER_srq (void)
1425 T1 &= 0x1FUL;
1426 env->spr[SPR_MQ] = rotl32(T0, 32 - T1);
1427 T0 = T0 >> T1;
1428 RETURN();
1431 /* POWER instructions not implemented in PowerPC 601 */
1432 #if !defined(CONFIG_USER_ONLY)
1433 void OPPROTO op_POWER_mfsri (void)
1435 T1 = T0 >> 28;
1436 T0 = env->sr[T1];
1437 RETURN();
1440 void OPPROTO op_POWER_rac (void)
1442 do_POWER_rac();
1443 RETURN();
1446 void OPPROTO op_POWER_rfsvc (void)
1448 do_POWER_rfsvc();
1449 RETURN();
1451 #endif
1453 /* PowerPC 602 specific instruction */
1454 #if !defined(CONFIG_USER_ONLY)
1455 void OPPROTO op_602_mfrom (void)
1457 do_op_602_mfrom();
1458 RETURN();
1460 #endif
1462 /* PowerPC 4xx specific micro-ops */
1463 void OPPROTO op_405_add_T0_T2 (void)
1465 T0 = (int32_t)T0 + (int32_t)T2;
1466 RETURN();
1469 void OPPROTO op_405_mulchw (void)
1471 T0 = ((int16_t)T0) * ((int16_t)(T1 >> 16));
1472 RETURN();
1475 void OPPROTO op_405_mulchwu (void)
1477 T0 = ((uint16_t)T0) * ((uint16_t)(T1 >> 16));
1478 RETURN();
1481 void OPPROTO op_405_mulhhw (void)
1483 T0 = ((int16_t)(T0 >> 16)) * ((int16_t)(T1 >> 16));
1484 RETURN();
1487 void OPPROTO op_405_mulhhwu (void)
1489 T0 = ((uint16_t)(T0 >> 16)) * ((uint16_t)(T1 >> 16));
1490 RETURN();
1493 void OPPROTO op_405_mullhw (void)
1495 T0 = ((int16_t)T0) * ((int16_t)T1);
1496 RETURN();
1499 void OPPROTO op_405_mullhwu (void)
1501 T0 = ((uint16_t)T0) * ((uint16_t)T1);
1502 RETURN();
1505 void OPPROTO op_405_check_sat (void)
1507 do_405_check_sat();
1508 RETURN();
1511 void OPPROTO op_405_check_ovu (void)
1513 if (likely(T0 >= T2)) {
1514 env->xer &= ~(1 << XER_OV);
1515 } else {
1516 env->xer |= (1 << XER_OV) | (1 << XER_SO);
1518 RETURN();
1521 void OPPROTO op_405_check_satu (void)
1523 if (unlikely(T0 < T2)) {
1524 /* Saturate result */
1525 T0 = UINT32_MAX;
1527 RETURN();
1530 void OPPROTO op_load_dcr (void)
1532 do_load_dcr();
1533 RETURN();
1536 void OPPROTO op_store_dcr (void)
1538 do_store_dcr();
1539 RETURN();
1542 #if !defined(CONFIG_USER_ONLY)
1543 /* Return from critical interrupt :
1544 * same as rfi, except nip & MSR are loaded from SRR2/3 instead of SRR0/1
1546 void OPPROTO op_40x_rfci (void)
1548 do_40x_rfci();
1549 RETURN();
1552 void OPPROTO op_rfci (void)
1554 do_rfci();
1555 RETURN();
1558 void OPPROTO op_rfdi (void)
1560 do_rfdi();
1561 RETURN();
1564 void OPPROTO op_rfmci (void)
1566 do_rfmci();
1567 RETURN();
1570 void OPPROTO op_wrte (void)
1572 /* We don't call do_store_msr here as we won't trigger
1573 * any special case nor change hflags
1575 T0 &= 1 << MSR_EE;
1576 env->msr &= ~(1 << MSR_EE);
1577 env->msr |= T0;
1578 RETURN();
1581 void OPPROTO op_440_tlbre (void)
1583 do_440_tlbre(PARAM1);
1584 RETURN();
1587 void OPPROTO op_440_tlbsx (void)
1589 T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_440_MMUCR] & 0xFF);
1590 RETURN();
1593 void OPPROTO op_4xx_tlbsx_check (void)
1595 int tmp;
1597 tmp = xer_so;
1598 if ((int)T0 != -1)
1599 tmp |= 0x02;
1600 env->crf[0] = tmp;
1601 RETURN();
1604 void OPPROTO op_440_tlbwe (void)
1606 do_440_tlbwe(PARAM1);
1607 RETURN();
1610 void OPPROTO op_4xx_tlbre_lo (void)
1612 do_4xx_tlbre_lo();
1613 RETURN();
1616 void OPPROTO op_4xx_tlbre_hi (void)
1618 do_4xx_tlbre_hi();
1619 RETURN();
1622 void OPPROTO op_4xx_tlbsx (void)
1624 T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_40x_PID]);
1625 RETURN();
1628 void OPPROTO op_4xx_tlbwe_lo (void)
1630 do_4xx_tlbwe_lo();
1631 RETURN();
1634 void OPPROTO op_4xx_tlbwe_hi (void)
1636 do_4xx_tlbwe_hi();
1637 RETURN();
1639 #endif
1641 /* SPR micro-ops */
1642 /* 440 specific */
1643 void OPPROTO op_440_dlmzb (void)
1645 do_440_dlmzb();
1646 RETURN();
1649 void OPPROTO op_440_dlmzb_update_Rc (void)
1651 if (T0 == 8)
1652 T0 = 0x2;
1653 else if (T0 < 4)
1654 T0 = 0x4;
1655 else
1656 T0 = 0x8;
1657 RETURN();
1660 #if !defined(CONFIG_USER_ONLY)
1661 void OPPROTO op_store_pir (void)
1663 env->spr[SPR_PIR] = T0 & 0x0000000FUL;
1664 RETURN();
1667 void OPPROTO op_load_403_pb (void)
1669 do_load_403_pb(PARAM1);
1670 RETURN();
1673 void OPPROTO op_store_403_pb (void)
1675 do_store_403_pb(PARAM1);
1676 RETURN();
1679 void OPPROTO op_load_40x_pit (void)
1681 T0 = load_40x_pit(env);
1682 RETURN();
1685 void OPPROTO op_store_40x_pit (void)
1687 store_40x_pit(env, T0);
1688 RETURN();
1691 void OPPROTO op_store_40x_dbcr0 (void)
1693 store_40x_dbcr0(env, T0);
1694 RETURN();
1697 void OPPROTO op_store_40x_sler (void)
1699 store_40x_sler(env, T0);
1700 RETURN();
1703 void OPPROTO op_store_booke_tcr (void)
1705 store_booke_tcr(env, T0);
1706 RETURN();
1709 void OPPROTO op_store_booke_tsr (void)
1711 store_booke_tsr(env, T0);
1712 RETURN();
1714 #endif /* !defined(CONFIG_USER_ONLY) */
1716 /* SPE extension */
1717 void OPPROTO op_splatw_T1_64 (void)
1719 T1_64 = (T1_64 << 32) | (T1_64 & 0x00000000FFFFFFFFULL);
1720 RETURN();
1723 void OPPROTO op_splatwi_T0_64 (void)
1725 uint64_t tmp = PARAM1;
1727 T0_64 = (tmp << 32) | tmp;
1728 RETURN();
1731 void OPPROTO op_splatwi_T1_64 (void)
1733 uint64_t tmp = PARAM1;
1735 T1_64 = (tmp << 32) | tmp;
1736 RETURN();
1739 void OPPROTO op_extsh_T1_64 (void)
1741 T1_64 = (int32_t)((int16_t)T1_64);
1742 RETURN();
1745 void OPPROTO op_sli16_T1_64 (void)
1747 T1_64 = T1_64 << 16;
1748 RETURN();
1751 void OPPROTO op_sli32_T1_64 (void)
1753 T1_64 = T1_64 << 32;
1754 RETURN();
1757 void OPPROTO op_srli32_T1_64 (void)
1759 T1_64 = T1_64 >> 32;
1760 RETURN();
1763 void OPPROTO op_evsel (void)
1765 do_evsel();
1766 RETURN();
1769 void OPPROTO op_evaddw (void)
1771 do_evaddw();
1772 RETURN();
1775 void OPPROTO op_evsubfw (void)
1777 do_evsubfw();
1778 RETURN();
1781 void OPPROTO op_evneg (void)
1783 do_evneg();
1784 RETURN();
1787 void OPPROTO op_evabs (void)
1789 do_evabs();
1790 RETURN();
1793 void OPPROTO op_evextsh (void)
1795 T0_64 = ((uint64_t)((int32_t)(int16_t)(T0_64 >> 32)) << 32) |
1796 (uint64_t)((int32_t)(int16_t)T0_64);
1797 RETURN();
1800 void OPPROTO op_evextsb (void)
1802 T0_64 = ((uint64_t)((int32_t)(int8_t)(T0_64 >> 32)) << 32) |
1803 (uint64_t)((int32_t)(int8_t)T0_64);
1804 RETURN();
1807 void OPPROTO op_evcntlzw (void)
1809 do_evcntlzw();
1810 RETURN();
1813 void OPPROTO op_evrndw (void)
1815 do_evrndw();
1816 RETURN();
1819 void OPPROTO op_brinc (void)
1821 do_brinc();
1822 RETURN();
1825 void OPPROTO op_evcntlsw (void)
1827 do_evcntlsw();
1828 RETURN();
1831 void OPPROTO op_evsrws (void)
1833 do_evsrws();
1834 RETURN();
1837 void OPPROTO op_evsrwu (void)
1839 do_evsrwu();
1840 RETURN();
1843 void OPPROTO op_evslw (void)
1845 do_evslw();
1846 RETURN();
1849 void OPPROTO op_evrlw (void)
1851 do_evrlw();
1852 RETURN();
1855 void OPPROTO op_evmergelo (void)
1857 T0_64 = (T0_64 << 32) | (T1_64 & 0x00000000FFFFFFFFULL);
1858 RETURN();
1861 void OPPROTO op_evmergehi (void)
1863 T0_64 = (T0_64 & 0xFFFFFFFF00000000ULL) | (T1_64 >> 32);
1864 RETURN();
1867 void OPPROTO op_evmergelohi (void)
1869 T0_64 = (T0_64 << 32) | (T1_64 >> 32);
1870 RETURN();
1873 void OPPROTO op_evmergehilo (void)
1875 T0_64 = (T0_64 & 0xFFFFFFFF00000000ULL) | (T1_64 & 0x00000000FFFFFFFFULL);
1876 RETURN();
1879 void OPPROTO op_evcmpgts (void)
1881 do_evcmpgts();
1882 RETURN();
1885 void OPPROTO op_evcmpgtu (void)
1887 do_evcmpgtu();
1888 RETURN();
1891 void OPPROTO op_evcmplts (void)
1893 do_evcmplts();
1894 RETURN();
1897 void OPPROTO op_evcmpltu (void)
1899 do_evcmpltu();
1900 RETURN();
1903 void OPPROTO op_evcmpeq (void)
1905 do_evcmpeq();
1906 RETURN();
1909 void OPPROTO op_evfssub (void)
1911 do_evfssub();
1912 RETURN();
1915 void OPPROTO op_evfsadd (void)
1917 do_evfsadd();
1918 RETURN();
1921 void OPPROTO op_evfsnabs (void)
1923 do_evfsnabs();
1924 RETURN();
1927 void OPPROTO op_evfsabs (void)
1929 do_evfsabs();
1930 RETURN();
1933 void OPPROTO op_evfsneg (void)
1935 do_evfsneg();
1936 RETURN();
1939 void OPPROTO op_evfsdiv (void)
1941 do_evfsdiv();
1942 RETURN();
1945 void OPPROTO op_evfsmul (void)
1947 do_evfsmul();
1948 RETURN();
1951 void OPPROTO op_evfscmplt (void)
1953 do_evfscmplt();
1954 RETURN();
1957 void OPPROTO op_evfscmpgt (void)
1959 do_evfscmpgt();
1960 RETURN();
1963 void OPPROTO op_evfscmpeq (void)
1965 do_evfscmpeq();
1966 RETURN();
1969 void OPPROTO op_evfscfsi (void)
1971 do_evfscfsi();
1972 RETURN();
1975 void OPPROTO op_evfscfui (void)
1977 do_evfscfui();
1978 RETURN();
1981 void OPPROTO op_evfscfsf (void)
1983 do_evfscfsf();
1984 RETURN();
1987 void OPPROTO op_evfscfuf (void)
1989 do_evfscfuf();
1990 RETURN();
1993 void OPPROTO op_evfsctsi (void)
1995 do_evfsctsi();
1996 RETURN();
1999 void OPPROTO op_evfsctui (void)
2001 do_evfsctui();
2002 RETURN();
2005 void OPPROTO op_evfsctsf (void)
2007 do_evfsctsf();
2008 RETURN();
2011 void OPPROTO op_evfsctuf (void)
2013 do_evfsctuf();
2014 RETURN();
2017 void OPPROTO op_evfsctuiz (void)
2019 do_evfsctuiz();
2020 RETURN();
2023 void OPPROTO op_evfsctsiz (void)
2025 do_evfsctsiz();
2026 RETURN();
2029 void OPPROTO op_evfststlt (void)
2031 do_evfststlt();
2032 RETURN();
2035 void OPPROTO op_evfststgt (void)
2037 do_evfststgt();
2038 RETURN();
2041 void OPPROTO op_evfststeq (void)
2043 do_evfststeq();
2044 RETURN();
2047 void OPPROTO op_efssub (void)
2049 T0_64 = _do_efssub(T0_64, T1_64);
2050 RETURN();
2053 void OPPROTO op_efsadd (void)
2055 T0_64 = _do_efsadd(T0_64, T1_64);
2056 RETURN();
2059 void OPPROTO op_efsnabs (void)
2061 T0_64 = _do_efsnabs(T0_64);
2062 RETURN();
2065 void OPPROTO op_efsabs (void)
2067 T0_64 = _do_efsabs(T0_64);
2068 RETURN();
2071 void OPPROTO op_efsneg (void)
2073 T0_64 = _do_efsneg(T0_64);
2074 RETURN();
2077 void OPPROTO op_efsdiv (void)
2079 T0_64 = _do_efsdiv(T0_64, T1_64);
2080 RETURN();
2083 void OPPROTO op_efsmul (void)
2085 T0_64 = _do_efsmul(T0_64, T1_64);
2086 RETURN();
2089 void OPPROTO op_efscmplt (void)
2091 do_efscmplt();
2092 RETURN();
2095 void OPPROTO op_efscmpgt (void)
2097 do_efscmpgt();
2098 RETURN();
2101 void OPPROTO op_efscfd (void)
2103 do_efscfd();
2104 RETURN();
2107 void OPPROTO op_efscmpeq (void)
2109 do_efscmpeq();
2110 RETURN();
2113 void OPPROTO op_efscfsi (void)
2115 do_efscfsi();
2116 RETURN();
2119 void OPPROTO op_efscfui (void)
2121 do_efscfui();
2122 RETURN();
2125 void OPPROTO op_efscfsf (void)
2127 do_efscfsf();
2128 RETURN();
2131 void OPPROTO op_efscfuf (void)
2133 do_efscfuf();
2134 RETURN();
2137 void OPPROTO op_efsctsi (void)
2139 do_efsctsi();
2140 RETURN();
2143 void OPPROTO op_efsctui (void)
2145 do_efsctui();
2146 RETURN();
2149 void OPPROTO op_efsctsf (void)
2151 do_efsctsf();
2152 RETURN();
2155 void OPPROTO op_efsctuf (void)
2157 do_efsctuf();
2158 RETURN();
2161 void OPPROTO op_efsctsiz (void)
2163 do_efsctsiz();
2164 RETURN();
2167 void OPPROTO op_efsctuiz (void)
2169 do_efsctuiz();
2170 RETURN();
2173 void OPPROTO op_efststlt (void)
2175 T0 = _do_efststlt(T0_64, T1_64);
2176 RETURN();
2179 void OPPROTO op_efststgt (void)
2181 T0 = _do_efststgt(T0_64, T1_64);
2182 RETURN();
2185 void OPPROTO op_efststeq (void)
2187 T0 = _do_efststeq(T0_64, T1_64);
2188 RETURN();
2191 void OPPROTO op_efdsub (void)
2193 CPU_DoubleU u1, u2;
2194 u1.ll = T0_64;
2195 u2.ll = T1_64;
2196 u1.d = float64_sub(u1.d, u2.d, &env->spe_status);
2197 T0_64 = u1.ll;
2198 RETURN();
2201 void OPPROTO op_efdadd (void)
2203 CPU_DoubleU u1, u2;
2204 u1.ll = T0_64;
2205 u2.ll = T1_64;
2206 u1.d = float64_add(u1.d, u2.d, &env->spe_status);
2207 T0_64 = u1.ll;
2208 RETURN();
2211 void OPPROTO op_efdcfsid (void)
2213 do_efdcfsi();
2214 RETURN();
2217 void OPPROTO op_efdcfuid (void)
2219 do_efdcfui();
2220 RETURN();
2223 void OPPROTO op_efdnabs (void)
2225 T0_64 |= 0x8000000000000000ULL;
2226 RETURN();
2229 void OPPROTO op_efdabs (void)
2231 T0_64 &= ~0x8000000000000000ULL;
2232 RETURN();
2235 void OPPROTO op_efdneg (void)
2237 T0_64 ^= 0x8000000000000000ULL;
2238 RETURN();
2241 void OPPROTO op_efddiv (void)
2243 CPU_DoubleU u1, u2;
2244 u1.ll = T0_64;
2245 u2.ll = T1_64;
2246 u1.d = float64_div(u1.d, u2.d, &env->spe_status);
2247 T0_64 = u1.ll;
2248 RETURN();
2251 void OPPROTO op_efdmul (void)
2253 CPU_DoubleU u1, u2;
2254 u1.ll = T0_64;
2255 u2.ll = T1_64;
2256 u1.d = float64_mul(u1.d, u2.d, &env->spe_status);
2257 T0_64 = u1.ll;
2258 RETURN();
2261 void OPPROTO op_efdctsidz (void)
2263 do_efdctsiz();
2264 RETURN();
2267 void OPPROTO op_efdctuidz (void)
2269 do_efdctuiz();
2270 RETURN();
2273 void OPPROTO op_efdcmplt (void)
2275 do_efdcmplt();
2276 RETURN();
2279 void OPPROTO op_efdcmpgt (void)
2281 do_efdcmpgt();
2282 RETURN();
2285 void OPPROTO op_efdcfs (void)
2287 do_efdcfs();
2288 RETURN();
2291 void OPPROTO op_efdcmpeq (void)
2293 do_efdcmpeq();
2294 RETURN();
2297 void OPPROTO op_efdcfsi (void)
2299 do_efdcfsi();
2300 RETURN();
2303 void OPPROTO op_efdcfui (void)
2305 do_efdcfui();
2306 RETURN();
2309 void OPPROTO op_efdcfsf (void)
2311 do_efdcfsf();
2312 RETURN();
2315 void OPPROTO op_efdcfuf (void)
2317 do_efdcfuf();
2318 RETURN();
2321 void OPPROTO op_efdctsi (void)
2323 do_efdctsi();
2324 RETURN();
2327 void OPPROTO op_efdctui (void)
2329 do_efdctui();
2330 RETURN();
2333 void OPPROTO op_efdctsf (void)
2335 do_efdctsf();
2336 RETURN();
2339 void OPPROTO op_efdctuf (void)
2341 do_efdctuf();
2342 RETURN();
2345 void OPPROTO op_efdctuiz (void)
2347 do_efdctuiz();
2348 RETURN();
2351 void OPPROTO op_efdctsiz (void)
2353 do_efdctsiz();
2354 RETURN();
2357 void OPPROTO op_efdtstlt (void)
2359 T0 = _do_efdtstlt(T0_64, T1_64);
2360 RETURN();
2363 void OPPROTO op_efdtstgt (void)
2365 T0 = _do_efdtstgt(T0_64, T1_64);
2366 RETURN();
2369 void OPPROTO op_efdtsteq (void)
2371 T0 = _do_efdtsteq(T0_64, T1_64);
2372 RETURN();