Display TCGCond name in tcg dumper (original patch by Tristan Gingold)
[qemu/mini2440.git] / target-alpha / op.c
blob8ad210213a5d0529f21e99b07b5258706f1cdd81
1 /*
2 * Alpha emulation cpu micro-operations for qemu.
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"
25 #include "host-utils.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 /* Debug stuff */
126 void OPPROTO op_no_op (void)
128 #if !defined (DEBUG_OP)
129 __asm__ __volatile__("nop" : : : "memory");
130 #endif
131 RETURN();
134 /* Load and stores */
135 #define MEMSUFFIX _raw
136 #include "op_mem.h"
137 #if !defined(CONFIG_USER_ONLY)
138 #define MEMSUFFIX _kernel
139 #include "op_mem.h"
140 #define MEMSUFFIX _executive
141 #include "op_mem.h"
142 #define MEMSUFFIX _supervisor
143 #include "op_mem.h"
144 #define MEMSUFFIX _user
145 #include "op_mem.h"
146 /* This is used for pal modes */
147 #define MEMSUFFIX _data
148 #include "op_mem.h"
149 #endif
151 /* Misc */
152 void OPPROTO op_excp (void)
154 helper_excp(PARAM(1), PARAM(2));
155 RETURN();
158 void OPPROTO op_load_amask (void)
160 helper_amask();
161 RETURN();
164 void OPPROTO op_load_pcc (void)
166 helper_load_pcc();
167 RETURN();
170 void OPPROTO op_load_implver (void)
172 helper_load_implver();
173 RETURN();
176 void OPPROTO op_load_fpcr (void)
178 helper_load_fpcr();
179 RETURN();
182 void OPPROTO op_store_fpcr (void)
184 helper_store_fpcr();
185 RETURN();
188 void OPPROTO op_load_irf (void)
190 helper_load_irf();
191 RETURN();
194 void OPPROTO op_set_irf (void)
196 helper_set_irf();
197 RETURN();
200 void OPPROTO op_clear_irf (void)
202 helper_clear_irf();
203 RETURN();
206 /* Arithmetic */
207 void OPPROTO op_addq (void)
209 T0 += T1;
210 RETURN();
213 void OPPROTO op_addqv (void)
215 helper_addqv();
216 RETURN();
219 void OPPROTO op_addl (void)
221 T0 = (int64_t)((int32_t)(T0 + T1));
222 RETURN();
225 void OPPROTO op_addlv (void)
227 helper_addlv();
228 RETURN();
231 void OPPROTO op_subq (void)
233 T0 -= T1;
234 RETURN();
237 void OPPROTO op_subqv (void)
239 helper_subqv();
240 RETURN();
243 void OPPROTO op_subl (void)
245 T0 = (int64_t)((int32_t)(T0 - T1));
246 RETURN();
249 void OPPROTO op_sublv (void)
251 helper_sublv();
252 RETURN();
255 void OPPROTO op_mull (void)
257 T0 = (int64_t)((int32_t)T0 * (int32_t)T1);
258 RETURN();
261 void OPPROTO op_mullv (void)
263 helper_mullv();
264 RETURN();
267 void OPPROTO op_mulq (void)
269 T0 = (int64_t)T0 * (int64_t)T1;
270 RETURN();
273 void OPPROTO op_mulqv (void)
275 helper_mulqv();
276 RETURN();
279 void OPPROTO op_umulh (void)
281 uint64_t tl, th;
283 mulu64(&tl, &th, T0, T1);
284 T0 = th;
285 RETURN();
288 /* Logical */
289 void OPPROTO op_and (void)
291 T0 &= T1;
292 RETURN();
295 void OPPROTO op_bic (void)
297 T0 &= ~T1;
298 RETURN();
301 void OPPROTO op_bis (void)
303 T0 |= T1;
304 RETURN();
307 void OPPROTO op_eqv (void)
309 T0 ^= ~T1;
310 RETURN();
313 void OPPROTO op_ornot (void)
315 T0 |= ~T1;
316 RETURN();
319 void OPPROTO op_xor (void)
321 T0 ^= T1;
322 RETURN();
325 void OPPROTO op_sll (void)
327 T0 <<= T1;
328 RETURN();
331 void OPPROTO op_srl (void)
333 T0 >>= T1;
334 RETURN();
337 void OPPROTO op_sra (void)
339 T0 = (int64_t)T0 >> T1;
340 RETURN();
343 void OPPROTO op_sextb (void)
345 T0 = (int64_t)((int8_t)T0);
346 RETURN();
349 void OPPROTO op_sextw (void)
351 T0 = (int64_t)((int16_t)T0);
352 RETURN();
356 void OPPROTO op_ctpop (void)
358 helper_ctpop();
359 RETURN();
362 void OPPROTO op_ctlz (void)
364 helper_ctlz();
365 RETURN();
368 void OPPROTO op_cttz (void)
370 helper_cttz();
371 RETURN();
374 void OPPROTO op_mskbl (void)
376 helper_mskbl();
377 RETURN();
380 void OPPROTO op_extbl (void)
382 helper_extbl();
383 RETURN();
386 void OPPROTO op_insbl (void)
388 helper_insbl();
389 RETURN();
392 void OPPROTO op_mskwl (void)
394 helper_mskwl();
395 RETURN();
398 void OPPROTO op_extwl (void)
400 helper_extwl();
401 RETURN();
404 void OPPROTO op_inswl (void)
406 helper_inswl();
407 RETURN();
410 void OPPROTO op_mskll (void)
412 helper_mskll();
413 RETURN();
416 void OPPROTO op_extll (void)
418 helper_extll();
419 RETURN();
422 void OPPROTO op_insll (void)
424 helper_insll();
425 RETURN();
428 void OPPROTO op_zap (void)
430 helper_zap();
431 RETURN();
434 void OPPROTO op_zapnot (void)
436 helper_zapnot();
437 RETURN();
440 void OPPROTO op_mskql (void)
442 helper_mskql();
443 RETURN();
446 void OPPROTO op_extql (void)
448 helper_extql();
449 RETURN();
452 void OPPROTO op_insql (void)
454 helper_insql();
455 RETURN();
458 void OPPROTO op_mskwh (void)
460 helper_mskwh();
461 RETURN();
464 void OPPROTO op_inswh (void)
466 helper_inswh();
467 RETURN();
470 void OPPROTO op_extwh (void)
472 helper_extwh();
473 RETURN();
476 void OPPROTO op_msklh (void)
478 helper_msklh();
479 RETURN();
482 void OPPROTO op_inslh (void)
484 helper_inslh();
485 RETURN();
488 void OPPROTO op_extlh (void)
490 helper_extlh();
491 RETURN();
494 void OPPROTO op_mskqh (void)
496 helper_mskqh();
497 RETURN();
500 void OPPROTO op_insqh (void)
502 helper_insqh();
503 RETURN();
506 void OPPROTO op_extqh (void)
508 helper_extqh();
509 RETURN();
512 /* Tests */
513 void OPPROTO op_cmpult (void)
515 if (T0 < T1)
516 T0 = 1;
517 else
518 T0 = 0;
519 RETURN();
522 void OPPROTO op_cmpule (void)
524 if (T0 <= T1)
525 T0 = 1;
526 else
527 T0 = 0;
528 RETURN();
531 void OPPROTO op_cmpeq (void)
533 if (T0 == T1)
534 T0 = 1;
535 else
536 T0 = 0;
537 RETURN();
540 void OPPROTO op_cmplt (void)
542 if ((int64_t)T0 < (int64_t)T1)
543 T0 = 1;
544 else
545 T0 = 0;
546 RETURN();
549 void OPPROTO op_cmple (void)
551 if ((int64_t)T0 <= (int64_t)T1)
552 T0 = 1;
553 else
554 T0 = 0;
555 RETURN();
558 void OPPROTO op_cmpbge (void)
560 helper_cmpbge();
561 RETURN();
564 void OPPROTO op_cmpeqz (void)
566 if (T0 == 0)
567 T0 = 1;
568 else
569 T0 = 0;
570 RETURN();
573 void OPPROTO op_cmpnez (void)
575 if (T0 != 0)
576 T0 = 1;
577 else
578 T0 = 0;
579 RETURN();
582 void OPPROTO op_cmpltz (void)
584 if ((int64_t)T0 < 0)
585 T0 = 1;
586 else
587 T0 = 0;
588 RETURN();
591 void OPPROTO op_cmplez (void)
593 if ((int64_t)T0 <= 0)
594 T0 = 1;
595 else
596 T0 = 0;
597 RETURN();
600 void OPPROTO op_cmpgtz (void)
602 if ((int64_t)T0 > 0)
603 T0 = 1;
604 else
605 T0 = 0;
606 RETURN();
609 void OPPROTO op_cmpgez (void)
611 if ((int64_t)T0 >= 0)
612 T0 = 1;
613 else
614 T0 = 0;
615 RETURN();
618 void OPPROTO op_cmplbs (void)
620 T0 &= 1;
621 RETURN();
624 void OPPROTO op_cmplbc (void)
626 T0 = (~T0) & 1;
627 RETURN();
630 #if 0 // Qemu does not know how to do this...
631 void OPPROTO op_bcond (void)
633 if (T0)
634 env->pc = T1 & ~3;
635 else
636 env->pc = PARAM(1);
637 RETURN();
639 #else
640 void OPPROTO op_bcond (void)
642 if (T0)
643 env->pc = T1 & ~3;
644 else
645 env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
646 RETURN();
648 #endif
650 /* IEEE floating point arithmetic */
651 /* S floating (single) */
652 void OPPROTO op_adds (void)
654 FT0 = float32_add(FT0, FT1, &FP_STATUS);
655 RETURN();
658 void OPPROTO op_subs (void)
660 FT0 = float32_sub(FT0, FT1, &FP_STATUS);
661 RETURN();
664 void OPPROTO op_muls (void)
666 FT0 = float32_mul(FT0, FT1, &FP_STATUS);
667 RETURN();
670 void OPPROTO op_divs (void)
672 FT0 = float32_div(FT0, FT1, &FP_STATUS);
673 RETURN();
676 void OPPROTO op_sqrts (void)
678 helper_sqrts();
679 RETURN();
682 void OPPROTO op_cpys (void)
684 helper_cpys();
685 RETURN();
688 void OPPROTO op_cpysn (void)
690 helper_cpysn();
691 RETURN();
694 void OPPROTO op_cpyse (void)
696 helper_cpyse();
697 RETURN();
700 void OPPROTO op_itofs (void)
702 helper_itofs();
703 RETURN();
706 void OPPROTO op_ftois (void)
708 helper_ftois();
709 RETURN();
712 /* T floating (double) */
713 void OPPROTO op_addt (void)
715 FT0 = float64_add(FT0, FT1, &FP_STATUS);
716 RETURN();
719 void OPPROTO op_subt (void)
721 FT0 = float64_sub(FT0, FT1, &FP_STATUS);
722 RETURN();
725 void OPPROTO op_mult (void)
727 FT0 = float64_mul(FT0, FT1, &FP_STATUS);
728 RETURN();
731 void OPPROTO op_divt (void)
733 FT0 = float64_div(FT0, FT1, &FP_STATUS);
734 RETURN();
737 void OPPROTO op_sqrtt (void)
739 helper_sqrtt();
740 RETURN();
743 void OPPROTO op_cmptun (void)
745 helper_cmptun();
746 RETURN();
749 void OPPROTO op_cmpteq (void)
751 helper_cmpteq();
752 RETURN();
755 void OPPROTO op_cmptle (void)
757 helper_cmptle();
758 RETURN();
761 void OPPROTO op_cmptlt (void)
763 helper_cmptlt();
764 RETURN();
767 void OPPROTO op_itoft (void)
769 helper_itoft();
770 RETURN();
773 void OPPROTO op_ftoit (void)
775 helper_ftoit();
776 RETURN();
779 /* VAX floating point arithmetic */
780 /* F floating */
781 void OPPROTO op_addf (void)
783 helper_addf();
784 RETURN();
787 void OPPROTO op_subf (void)
789 helper_subf();
790 RETURN();
793 void OPPROTO op_mulf (void)
795 helper_mulf();
796 RETURN();
799 void OPPROTO op_divf (void)
801 helper_divf();
802 RETURN();
805 void OPPROTO op_sqrtf (void)
807 helper_sqrtf();
808 RETURN();
811 void OPPROTO op_cmpfeq (void)
813 helper_cmpfeq();
814 RETURN();
817 void OPPROTO op_cmpfne (void)
819 helper_cmpfne();
820 RETURN();
823 void OPPROTO op_cmpflt (void)
825 helper_cmpflt();
826 RETURN();
829 void OPPROTO op_cmpfle (void)
831 helper_cmpfle();
832 RETURN();
835 void OPPROTO op_cmpfgt (void)
837 helper_cmpfgt();
838 RETURN();
841 void OPPROTO op_cmpfge (void)
843 helper_cmpfge();
844 RETURN();
847 void OPPROTO op_itoff (void)
849 helper_itoff();
850 RETURN();
853 /* G floating */
854 void OPPROTO op_addg (void)
856 helper_addg();
857 RETURN();
860 void OPPROTO op_subg (void)
862 helper_subg();
863 RETURN();
866 void OPPROTO op_mulg (void)
868 helper_mulg();
869 RETURN();
872 void OPPROTO op_divg (void)
874 helper_divg();
875 RETURN();
878 void OPPROTO op_sqrtg (void)
880 helper_sqrtg();
881 RETURN();
884 void OPPROTO op_cmpgeq (void)
886 helper_cmpgeq();
887 RETURN();
890 void OPPROTO op_cmpglt (void)
892 helper_cmpglt();
893 RETURN();
896 void OPPROTO op_cmpgle (void)
898 helper_cmpgle();
899 RETURN();
902 /* Floating point format conversion */
903 void OPPROTO op_cvtst (void)
905 FT0 = (float)FT0;
906 RETURN();
909 void OPPROTO op_cvtqs (void)
911 helper_cvtqs();
912 RETURN();
915 void OPPROTO op_cvtts (void)
917 FT0 = (float)FT0;
918 RETURN();
921 void OPPROTO op_cvttq (void)
923 helper_cvttq();
924 RETURN();
927 void OPPROTO op_cvtqt (void)
929 helper_cvtqt();
930 RETURN();
933 void OPPROTO op_cvtqf (void)
935 helper_cvtqf();
936 RETURN();
939 void OPPROTO op_cvtgf (void)
941 helper_cvtgf();
942 RETURN();
945 void OPPROTO op_cvtgd (void)
947 helper_cvtgd();
948 RETURN();
951 void OPPROTO op_cvtgq (void)
953 helper_cvtgq();
954 RETURN();
957 void OPPROTO op_cvtqg (void)
959 helper_cvtqg();
960 RETURN();
963 void OPPROTO op_cvtdg (void)
965 helper_cvtdg();
966 RETURN();
969 void OPPROTO op_cvtlq (void)
971 helper_cvtlq();
972 RETURN();
975 void OPPROTO op_cvtql (void)
977 helper_cvtql();
978 RETURN();
981 void OPPROTO op_cvtqlv (void)
983 helper_cvtqlv();
984 RETURN();
987 void OPPROTO op_cvtqlsv (void)
989 helper_cvtqlsv();
990 RETURN();
993 /* PALcode support special instructions */
994 #if !defined (CONFIG_USER_ONLY)
995 void OPPROTO op_hw_rei (void)
997 env->pc = env->ipr[IPR_EXC_ADDR] & ~3;
998 env->ipr[IPR_EXC_ADDR] = env->ipr[IPR_EXC_ADDR] & 1;
999 /* XXX: re-enable interrupts and memory mapping */
1000 RETURN();
1003 void OPPROTO op_hw_ret (void)
1005 env->pc = T0 & ~3;
1006 env->ipr[IPR_EXC_ADDR] = T0 & 1;
1007 /* XXX: re-enable interrupts and memory mapping */
1008 RETURN();
1011 void OPPROTO op_mfpr (void)
1013 helper_mfpr(PARAM(1));
1014 RETURN();
1017 void OPPROTO op_mtpr (void)
1019 helper_mtpr(PARAM(1));
1020 RETURN();
1023 void OPPROTO op_set_alt_mode (void)
1025 env->saved_mode = env->ps & 0xC;
1026 env->ps = (env->ps & ~0xC) | (env->ipr[IPR_ALT_MODE] & 0xC);
1027 RETURN();
1030 void OPPROTO op_restore_mode (void)
1032 env->ps = (env->ps & ~0xC) | env->saved_mode;
1033 RETURN();
1036 void OPPROTO op_ld_phys_to_virt (void)
1038 helper_ld_phys_to_virt();
1039 RETURN();
1042 void OPPROTO op_st_phys_to_virt (void)
1044 helper_st_phys_to_virt();
1045 RETURN();
1047 #endif /* !defined (CONFIG_USER_ONLY) */