Constification
[qemu/qemu_0_9_1_stable.git] / target-alpha / op.c
blob8a22c5c087ad29c43713eff4dc0149edcefa6f60
1 /*
2 * Alpha emulation cpu micro-operations for qemu.
3 *
4 * Copyright (c) 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"
26 #include "op_helper.h"
28 #define REG 0
29 #include "op_template.h"
31 #define REG 1
32 #include "op_template.h"
34 #define REG 2
35 #include "op_template.h"
37 #define REG 3
38 #include "op_template.h"
40 #define REG 4
41 #include "op_template.h"
43 #define REG 5
44 #include "op_template.h"
46 #define REG 6
47 #include "op_template.h"
49 #define REG 7
50 #include "op_template.h"
52 #define REG 8
53 #include "op_template.h"
55 #define REG 9
56 #include "op_template.h"
58 #define REG 10
59 #include "op_template.h"
61 #define REG 11
62 #include "op_template.h"
64 #define REG 12
65 #include "op_template.h"
67 #define REG 13
68 #include "op_template.h"
70 #define REG 14
71 #include "op_template.h"
73 #define REG 15
74 #include "op_template.h"
76 #define REG 16
77 #include "op_template.h"
79 #define REG 17
80 #include "op_template.h"
82 #define REG 18
83 #include "op_template.h"
85 #define REG 19
86 #include "op_template.h"
88 #define REG 20
89 #include "op_template.h"
91 #define REG 21
92 #include "op_template.h"
94 #define REG 22
95 #include "op_template.h"
97 #define REG 23
98 #include "op_template.h"
100 #define REG 24
101 #include "op_template.h"
103 #define REG 25
104 #include "op_template.h"
106 #define REG 26
107 #include "op_template.h"
109 #define REG 27
110 #include "op_template.h"
112 #define REG 28
113 #include "op_template.h"
115 #define REG 29
116 #include "op_template.h"
118 #define REG 30
119 #include "op_template.h"
121 #define REG 31
122 #include "op_template.h"
124 /* Debug stuff */
125 void OPPROTO op_no_op (void)
127 #if !defined (DEBUG_OP)
128 __asm__ __volatile__("nop" : : : "memory");
129 #endif
130 RETURN();
133 void OPPROTO op_tb_flush (void)
135 helper_tb_flush();
136 RETURN();
139 /* Load and stores */
140 #define MEMSUFFIX _raw
141 #include "op_mem.h"
142 #if !defined(CONFIG_USER_ONLY)
143 #define MEMSUFFIX _user
144 #include "op_mem.h"
145 #define MEMSUFFIX _kernel
146 #include "op_mem.h"
147 /* Those are used for supervisor, executive and pal modes */
148 #define MEMSUFFIX _data
149 #include "op_mem.h"
150 #endif
152 /* Special operation for load and store */
153 void OPPROTO op_n7 (void)
155 T0 &= ~(uint64_t)0x7;
156 RETURN();
159 /* Misc */
160 void OPPROTO op_excp (void)
162 helper_excp(PARAM(1), PARAM(2));
163 RETURN();
166 void OPPROTO op_load_amask (void)
168 helper_amask();
169 RETURN();
172 void OPPROTO op_load_pcc (void)
174 helper_load_pcc();
175 RETURN();
178 void OPPROTO op_load_implver (void)
180 helper_load_implver();
181 RETURN();
184 void OPPROTO op_load_fpcr (void)
186 helper_load_fpcr();
187 RETURN();
190 void OPPROTO op_store_fpcr (void)
192 helper_store_fpcr();
193 RETURN();
196 void OPPROTO op_load_irf (void)
198 helper_load_irf();
199 RETURN();
202 void OPPROTO op_set_irf (void)
204 helper_set_irf();
205 RETURN();
208 void OPPROTO op_clear_irf (void)
210 helper_clear_irf();
211 RETURN();
214 void OPPROTO op_exit_tb (void)
216 EXIT_TB();
219 /* Arithmetic */
220 void OPPROTO op_addq (void)
222 T0 += T1;
223 RETURN();
226 void OPPROTO op_addqv (void)
228 helper_addqv();
229 RETURN();
232 void OPPROTO op_addl (void)
234 T0 = (int64_t)((int32_t)(T0 + T1));
235 RETURN();
238 void OPPROTO op_addlv (void)
240 helper_addlv();
241 RETURN();
244 void OPPROTO op_subq (void)
246 T0 -= T1;
247 RETURN();
250 void OPPROTO op_subqv (void)
252 helper_subqv();
253 RETURN();
256 void OPPROTO op_subl (void)
258 T0 = (int64_t)((int32_t)(T0 - T1));
259 RETURN();
262 void OPPROTO op_sublv (void)
264 helper_sublv();
265 RETURN();
268 void OPPROTO op_s4 (void)
270 T0 <<= 2;
271 RETURN();
274 void OPPROTO op_s8 (void)
276 T0 <<= 3;
277 RETURN();
280 void OPPROTO op_mull (void)
282 T0 = (int64_t)((int32_t)T0 * (int32_t)T1);
283 RETURN();
286 void OPPROTO op_mullv (void)
288 helper_mullv();
289 RETURN();
292 void OPPROTO op_mulq (void)
294 T0 *= T1;
295 RETURN();
298 void OPPROTO op_mulqv (void)
300 helper_mulqv();
301 RETURN();
304 void OPPROTO op_umulh (void)
306 helper_umulh();
307 RETURN();
310 /* Logical */
311 void OPPROTO op_and (void)
313 T0 &= T1;
314 RETURN();
317 void OPPROTO op_bic (void)
319 T0 &= ~T1;
320 RETURN();
323 void OPPROTO op_bis (void)
325 T0 |= T1;
326 RETURN();
329 void OPPROTO op_eqv (void)
331 T0 ^= ~T1;
332 RETURN();
335 void OPPROTO op_ornot (void)
337 T0 |= ~T1;
338 RETURN();
341 void OPPROTO op_xor (void)
343 T0 ^= T1;
344 RETURN();
347 void OPPROTO op_sll (void)
349 T0 <<= T1;
350 RETURN();
353 void OPPROTO op_srl (void)
355 T0 >>= T1;
356 RETURN();
359 void OPPROTO op_sra (void)
361 T0 = (int64_t)T0 >> T1;
362 RETURN();
365 void OPPROTO op_sextb (void)
367 T0 = (int64_t)((int8_t)T0);
368 RETURN();
371 void OPPROTO op_sextw (void)
373 T0 = (int64_t)((int16_t)T0);
374 RETURN();
378 void OPPROTO op_ctpop (void)
380 helper_ctpop();
381 RETURN();
384 void OPPROTO op_ctlz (void)
386 helper_ctlz();
387 RETURN();
390 void OPPROTO op_cttz (void)
392 helper_cttz();
393 RETURN();
396 void OPPROTO op_mskbl (void)
398 helper_mskbl();
399 RETURN();
402 void OPPROTO op_extbl (void)
404 helper_extbl();
405 RETURN();
408 void OPPROTO op_insbl (void)
410 helper_insbl();
411 RETURN();
414 void OPPROTO op_mskwl (void)
416 helper_mskwl();
417 RETURN();
420 void OPPROTO op_extwl (void)
422 helper_extwl();
423 RETURN();
426 void OPPROTO op_inswl (void)
428 helper_inswl();
429 RETURN();
432 void OPPROTO op_mskll (void)
434 helper_mskll();
435 RETURN();
438 void OPPROTO op_extll (void)
440 helper_extll();
441 RETURN();
444 void OPPROTO op_insll (void)
446 helper_insll();
447 RETURN();
450 void OPPROTO op_zap (void)
452 helper_zap();
453 RETURN();
456 void OPPROTO op_zapnot (void)
458 helper_zapnot();
459 RETURN();
462 void OPPROTO op_mskql (void)
464 helper_mskql();
465 RETURN();
468 void OPPROTO op_extql (void)
470 helper_extql();
471 RETURN();
474 void OPPROTO op_insql (void)
476 helper_insql();
477 RETURN();
480 void OPPROTO op_mskwh (void)
482 helper_mskwh();
483 RETURN();
486 void OPPROTO op_inswh (void)
488 helper_inswh();
489 RETURN();
492 void OPPROTO op_extwh (void)
494 helper_extwh();
495 RETURN();
498 void OPPROTO op_msklh (void)
500 helper_msklh();
501 RETURN();
504 void OPPROTO op_inslh (void)
506 helper_inslh();
507 RETURN();
510 void OPPROTO op_extlh (void)
512 helper_extlh();
513 RETURN();
516 void OPPROTO op_mskqh (void)
518 helper_mskqh();
519 RETURN();
522 void OPPROTO op_insqh (void)
524 helper_insqh();
525 RETURN();
528 void OPPROTO op_extqh (void)
530 helper_extqh();
531 RETURN();
534 /* Tests */
535 void OPPROTO op_cmpult (void)
537 if (T0 < T1)
538 T0 = 1;
539 else
540 T0 = 0;
541 RETURN();
544 void OPPROTO op_cmpule (void)
546 if (T0 <= T1)
547 T0 = 1;
548 else
549 T0 = 0;
550 RETURN();
553 void OPPROTO op_cmpeq (void)
555 if (T0 == T1)
556 T0 = 1;
557 else
558 T0 = 0;
559 RETURN();
562 void OPPROTO op_cmplt (void)
564 if ((int64_t)T0 < (int64_t)T1)
565 T0 = 1;
566 else
567 T0 = 0;
568 RETURN();
571 void OPPROTO op_cmple (void)
573 if ((int64_t)T0 <= (int64_t)T1)
574 T0 = 1;
575 else
576 T0 = 0;
577 RETURN();
580 void OPPROTO op_cmpbge (void)
582 helper_cmpbge();
583 RETURN();
586 void OPPROTO op_cmpeqz (void)
588 if (T0 == 0)
589 T0 = 1;
590 else
591 T0 = 0;
592 RETURN();
595 void OPPROTO op_cmpnez (void)
597 if (T0 != 0)
598 T0 = 1;
599 else
600 T0 = 0;
601 RETURN();
604 void OPPROTO op_cmpltz (void)
606 if ((int64_t)T0 < 0)
607 T0 = 1;
608 else
609 T0 = 0;
610 RETURN();
613 void OPPROTO op_cmplez (void)
615 if ((int64_t)T0 <= 0)
616 T0 = 1;
617 else
618 T0 = 0;
619 RETURN();
622 void OPPROTO op_cmpgtz (void)
624 if ((int64_t)T0 > 0)
625 T0 = 1;
626 else
627 T0 = 0;
628 RETURN();
631 void OPPROTO op_cmpgez (void)
633 if ((int64_t)T0 >= 0)
634 T0 = 1;
635 else
636 T0 = 0;
637 RETURN();
640 void OPPROTO op_cmplbs (void)
642 T0 &= 1;
643 RETURN();
646 void OPPROTO op_cmplbc (void)
648 T0 = (~T0) & 1;
649 RETURN();
652 /* Branches */
653 void OPPROTO op_branch (void)
655 env->pc = T0 & ~3;
656 RETURN();
659 void OPPROTO op_addq1 (void)
661 T1 += T0;
662 RETURN();
665 #if 0 // Qemu does not know how to do this...
666 void OPPROTO op_bcond (void)
668 if (T0)
669 env->pc = T1 & ~3;
670 else
671 env->pc = PARAM(1);
672 RETURN();
674 #else
675 void OPPROTO op_bcond (void)
677 if (T0)
678 env->pc = T1 & ~3;
679 else
680 env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
681 RETURN();
683 #endif
685 #if 0 // Qemu does not know how to do this...
686 void OPPROTO op_update_pc (void)
688 env->pc = PARAM(1);
689 RETURN();
691 #else
692 void OPPROTO op_update_pc (void)
694 env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
695 RETURN();
697 #endif
699 /* Optimization for 32 bits hosts architectures */
700 void OPPROTO op_update_pc32 (void)
702 env->pc = (uint64_t)PARAM(1);
703 RETURN();
706 /* IEEE floating point arithmetic */
707 /* S floating (single) */
708 void OPPROTO op_adds (void)
710 FT0 = float32_add(FT0, FT1, &FP_STATUS);
711 RETURN();
714 void OPPROTO op_subs (void)
716 FT0 = float32_sub(FT0, FT1, &FP_STATUS);
717 RETURN();
720 void OPPROTO op_muls (void)
722 FT0 = float32_mul(FT0, FT1, &FP_STATUS);
723 RETURN();
726 void OPPROTO op_divs (void)
728 FT0 = float32_div(FT0, FT1, &FP_STATUS);
729 RETURN();
732 void OPPROTO op_sqrts (void)
734 helper_sqrts();
735 RETURN();
738 void OPPROTO op_cpys (void)
740 helper_cpys();
741 RETURN();
744 void OPPROTO op_cpysn (void)
746 helper_cpysn();
747 RETURN();
750 void OPPROTO op_cpyse (void)
752 helper_cpyse();
753 RETURN();
756 void OPPROTO op_itofs (void)
758 helper_itofs();
759 RETURN();
762 void OPPROTO op_ftois (void)
764 helper_ftois();
765 RETURN();
768 /* T floating (double) */
769 void OPPROTO op_addt (void)
771 FT0 = float64_add(FT0, FT1, &FP_STATUS);
772 RETURN();
775 void OPPROTO op_subt (void)
777 FT0 = float64_sub(FT0, FT1, &FP_STATUS);
778 RETURN();
781 void OPPROTO op_mult (void)
783 FT0 = float64_mul(FT0, FT1, &FP_STATUS);
784 RETURN();
787 void OPPROTO op_divt (void)
789 FT0 = float64_div(FT0, FT1, &FP_STATUS);
790 RETURN();
793 void OPPROTO op_sqrtt (void)
795 helper_sqrtt();
796 RETURN();
799 void OPPROTO op_cmptun (void)
801 helper_cmptun();
802 RETURN();
805 void OPPROTO op_cmpteq (void)
807 helper_cmpteq();
808 RETURN();
811 void OPPROTO op_cmptle (void)
813 helper_cmptle();
814 RETURN();
817 void OPPROTO op_cmptlt (void)
819 helper_cmptlt();
820 RETURN();
823 void OPPROTO op_itoft (void)
825 helper_itoft();
826 RETURN();
829 void OPPROTO op_ftoit (void)
831 helper_ftoit();
832 RETURN();
835 /* VAX floating point arithmetic */
836 /* F floating */
837 void OPPROTO op_addf (void)
839 helper_addf();
840 RETURN();
843 void OPPROTO op_subf (void)
845 helper_subf();
846 RETURN();
849 void OPPROTO op_mulf (void)
851 helper_mulf();
852 RETURN();
855 void OPPROTO op_divf (void)
857 helper_divf();
858 RETURN();
861 void OPPROTO op_sqrtf (void)
863 helper_sqrtf();
864 RETURN();
867 void OPPROTO op_cmpfeq (void)
869 helper_cmpfeq();
870 RETURN();
873 void OPPROTO op_cmpfne (void)
875 helper_cmpfne();
876 RETURN();
879 void OPPROTO op_cmpflt (void)
881 helper_cmpflt();
882 RETURN();
885 void OPPROTO op_cmpfle (void)
887 helper_cmpfle();
888 RETURN();
891 void OPPROTO op_cmpfgt (void)
893 helper_cmpfgt();
894 RETURN();
897 void OPPROTO op_cmpfge (void)
899 helper_cmpfge();
900 RETURN();
903 void OPPROTO op_itoff (void)
905 helper_itoff();
906 RETURN();
909 /* G floating */
910 void OPPROTO op_addg (void)
912 helper_addg();
913 RETURN();
916 void OPPROTO op_subg (void)
918 helper_subg();
919 RETURN();
922 void OPPROTO op_mulg (void)
924 helper_mulg();
925 RETURN();
928 void OPPROTO op_divg (void)
930 helper_divg();
931 RETURN();
934 void OPPROTO op_sqrtg (void)
936 helper_sqrtg();
937 RETURN();
940 void OPPROTO op_cmpgeq (void)
942 helper_cmpgeq();
943 RETURN();
946 void OPPROTO op_cmpglt (void)
948 helper_cmpglt();
949 RETURN();
952 void OPPROTO op_cmpgle (void)
954 helper_cmpgle();
955 RETURN();
958 /* Floating point format conversion */
959 void OPPROTO op_cvtst (void)
961 FT0 = (float)FT0;
962 RETURN();
965 void OPPROTO op_cvtqs (void)
967 helper_cvtqs();
968 RETURN();
971 void OPPROTO op_cvtts (void)
973 FT0 = (float)FT0;
974 RETURN();
977 void OPPROTO op_cvttq (void)
979 helper_cvttq();
980 RETURN();
983 void OPPROTO op_cvtqt (void)
985 helper_cvtqt();
986 RETURN();
989 void OPPROTO op_cvtqf (void)
991 helper_cvtqf();
992 RETURN();
995 void OPPROTO op_cvtgf (void)
997 helper_cvtgf();
998 RETURN();
1001 void OPPROTO op_cvtgd (void)
1003 helper_cvtgd();
1004 RETURN();
1007 void OPPROTO op_cvtgq (void)
1009 helper_cvtgq();
1010 RETURN();
1013 void OPPROTO op_cvtqg (void)
1015 helper_cvtqg();
1016 RETURN();
1019 void OPPROTO op_cvtdg (void)
1021 helper_cvtdg();
1022 RETURN();
1025 void OPPROTO op_cvtlq (void)
1027 helper_cvtlq();
1028 RETURN();
1031 void OPPROTO op_cvtql (void)
1033 helper_cvtql();
1034 RETURN();
1037 void OPPROTO op_cvtqlv (void)
1039 helper_cvtqlv();
1040 RETURN();
1043 void OPPROTO op_cvtqlsv (void)
1045 helper_cvtqlsv();
1046 RETURN();
1049 /* PALcode support special instructions */
1050 #if !defined (CONFIG_USER_ONLY)
1051 void OPPROTO op_hw_rei (void)
1053 env->pc = env->ipr[IPR_EXC_ADDR] & ~3;
1054 env->ipr[IPR_EXC_ADDR] = env->ipr[IPR_EXC_ADDR] & 1;
1055 /* XXX: re-enable interrupts and memory mapping */
1056 RETURN();
1059 void OPPROTO op_hw_ret (void)
1061 env->pc = T0 & ~3;
1062 env->ipr[IPR_EXC_ADDR] = T0 & 1;
1063 /* XXX: re-enable interrupts and memory mapping */
1064 RETURN();
1067 void OPPROTO op_mfpr (void)
1069 helper_mfpr(PARAM(1));
1070 RETURN();
1073 void OPPROTO op_mtpr (void)
1075 helper_mtpr(PARAM(1));
1076 RETURN();
1079 void OPPROTO op_set_alt_mode (void)
1081 env->saved_mode = env->ps & 0xC;
1082 env->ps = (env->ps & ~0xC) | (env->ipr[IPR_ALT_MODE] & 0xC);
1083 RETURN();
1086 void OPPROTO op_restore_mode (void)
1088 env->ps = (env->ps & ~0xC) | env->saved_mode;
1089 RETURN();
1092 void OPPROTO op_ld_phys_to_virt (void)
1094 helper_ld_phys_to_virt();
1095 RETURN();
1098 void OPPROTO op_st_phys_to_virt (void)
1100 helper_st_phys_to_virt();
1101 RETURN();
1103 #endif /* !defined (CONFIG_USER_ONLY) */