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
26 #include "op_helper.h"
29 #include "op_template.h"
32 #include "op_template.h"
35 #include "op_template.h"
38 #include "op_template.h"
41 #include "op_template.h"
44 #include "op_template.h"
47 #include "op_template.h"
50 #include "op_template.h"
53 #include "op_template.h"
56 #include "op_template.h"
59 #include "op_template.h"
62 #include "op_template.h"
65 #include "op_template.h"
68 #include "op_template.h"
71 #include "op_template.h"
74 #include "op_template.h"
77 #include "op_template.h"
80 #include "op_template.h"
83 #include "op_template.h"
86 #include "op_template.h"
89 #include "op_template.h"
92 #include "op_template.h"
95 #include "op_template.h"
98 #include "op_template.h"
101 #include "op_template.h"
104 #include "op_template.h"
107 #include "op_template.h"
110 #include "op_template.h"
113 #include "op_template.h"
116 #include "op_template.h"
119 #include "op_template.h"
122 #include "op_template.h"
125 void OPPROTO
op_no_op (void)
127 #if !defined (DEBUG_OP)
128 __asm__
__volatile__("nop" : : : "memory");
133 void OPPROTO
op_tb_flush (void)
139 /* Load and stores */
140 #define MEMSUFFIX _raw
142 #if !defined(CONFIG_USER_ONLY)
143 #define MEMSUFFIX _user
145 #define MEMSUFFIX _kernel
147 /* Those are used for supervisor, executive and pal modes */
148 #define MEMSUFFIX _data
152 /* Special operation for load and store */
153 void OPPROTO
op_n7 (void)
155 T0
&= ~(uint64_t)0x7;
160 void OPPROTO
op_excp (void)
162 helper_excp(PARAM(1), PARAM(2));
166 void OPPROTO
op_load_amask (void)
172 void OPPROTO
op_load_pcc (void)
178 void OPPROTO
op_load_implver (void)
180 helper_load_implver();
184 void OPPROTO
op_load_fpcr (void)
190 void OPPROTO
op_store_fpcr (void)
196 void OPPROTO
op_load_irf (void)
202 void OPPROTO
op_set_irf (void)
208 void OPPROTO
op_clear_irf (void)
214 void OPPROTO
op_exit_tb (void)
220 void OPPROTO
op_addq (void)
226 void OPPROTO
op_addqv (void)
232 void OPPROTO
op_addl (void)
234 T0
= (int64_t)((int32_t)(T0
+ T1
));
238 void OPPROTO
op_addlv (void)
244 void OPPROTO
op_subq (void)
250 void OPPROTO
op_subqv (void)
256 void OPPROTO
op_subl (void)
258 T0
= (int64_t)((int32_t)(T0
- T1
));
262 void OPPROTO
op_sublv (void)
268 void OPPROTO
op_s4 (void)
274 void OPPROTO
op_s8 (void)
280 void OPPROTO
op_mull (void)
282 T0
= (int64_t)((int32_t)T0
* (int32_t)T1
);
286 void OPPROTO
op_mullv (void)
292 void OPPROTO
op_mulq (void)
298 void OPPROTO
op_mulqv (void)
304 void OPPROTO
op_umulh (void)
311 void OPPROTO
op_and (void)
317 void OPPROTO
op_bic (void)
323 void OPPROTO
op_bis (void)
329 void OPPROTO
op_eqv (void)
335 void OPPROTO
op_ornot (void)
341 void OPPROTO
op_xor (void)
347 void OPPROTO
op_sll (void)
353 void OPPROTO
op_srl (void)
359 void OPPROTO
op_sra (void)
361 T0
= (int64_t)T0
>> T1
;
365 void OPPROTO
op_sextb (void)
367 T0
= (int64_t)((int8_t)T0
);
371 void OPPROTO
op_sextw (void)
373 T0
= (int64_t)((int16_t)T0
);
378 void OPPROTO
op_ctpop (void)
384 void OPPROTO
op_ctlz (void)
390 void OPPROTO
op_cttz (void)
396 void OPPROTO
op_mskbl (void)
402 void OPPROTO
op_extbl (void)
408 void OPPROTO
op_insbl (void)
414 void OPPROTO
op_mskwl (void)
420 void OPPROTO
op_extwl (void)
426 void OPPROTO
op_inswl (void)
432 void OPPROTO
op_mskll (void)
438 void OPPROTO
op_extll (void)
444 void OPPROTO
op_insll (void)
450 void OPPROTO
op_zap (void)
456 void OPPROTO
op_zapnot (void)
462 void OPPROTO
op_mskql (void)
468 void OPPROTO
op_extql (void)
474 void OPPROTO
op_insql (void)
480 void OPPROTO
op_mskwh (void)
486 void OPPROTO
op_inswh (void)
492 void OPPROTO
op_extwh (void)
498 void OPPROTO
op_msklh (void)
504 void OPPROTO
op_inslh (void)
510 void OPPROTO
op_extlh (void)
516 void OPPROTO
op_mskqh (void)
522 void OPPROTO
op_insqh (void)
528 void OPPROTO
op_extqh (void)
535 void OPPROTO
op_cmpult (void)
544 void OPPROTO
op_cmpule (void)
553 void OPPROTO
op_cmpeq (void)
562 void OPPROTO
op_cmplt (void)
564 if ((int64_t)T0
< (int64_t)T1
)
571 void OPPROTO
op_cmple (void)
573 if ((int64_t)T0
<= (int64_t)T1
)
580 void OPPROTO
op_cmpbge (void)
586 void OPPROTO
op_cmpeqz (void)
595 void OPPROTO
op_cmpnez (void)
604 void OPPROTO
op_cmpltz (void)
613 void OPPROTO
op_cmplez (void)
615 if ((int64_t)T0
<= 0)
622 void OPPROTO
op_cmpgtz (void)
631 void OPPROTO
op_cmpgez (void)
633 if ((int64_t)T0
>= 0)
640 void OPPROTO
op_cmplbs (void)
646 void OPPROTO
op_cmplbc (void)
653 void OPPROTO
op_branch (void)
659 void OPPROTO
op_addq1 (void)
665 #if 0 // Qemu does not know how to do this...
666 void OPPROTO
op_bcond (void)
675 void OPPROTO
op_bcond (void)
680 env
->pc
= ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
685 #if 0 // Qemu does not know how to do this...
686 void OPPROTO
op_update_pc (void)
692 void OPPROTO
op_update_pc (void)
694 env
->pc
= ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
699 /* Optimization for 32 bits hosts architectures */
700 void OPPROTO
op_update_pc32 (void)
702 env
->pc
= (uint64_t)PARAM(1);
706 /* IEEE floating point arithmetic */
707 /* S floating (single) */
708 void OPPROTO
op_adds (void)
710 FT0
= float32_add(FT0
, FT1
, &FP_STATUS
);
714 void OPPROTO
op_subs (void)
716 FT0
= float32_sub(FT0
, FT1
, &FP_STATUS
);
720 void OPPROTO
op_muls (void)
722 FT0
= float32_mul(FT0
, FT1
, &FP_STATUS
);
726 void OPPROTO
op_divs (void)
728 FT0
= float32_div(FT0
, FT1
, &FP_STATUS
);
732 void OPPROTO
op_sqrts (void)
738 void OPPROTO
op_cpys (void)
744 void OPPROTO
op_cpysn (void)
750 void OPPROTO
op_cpyse (void)
756 void OPPROTO
op_itofs (void)
762 void OPPROTO
op_ftois (void)
768 /* T floating (double) */
769 void OPPROTO
op_addt (void)
771 FT0
= float64_add(FT0
, FT1
, &FP_STATUS
);
775 void OPPROTO
op_subt (void)
777 FT0
= float64_sub(FT0
, FT1
, &FP_STATUS
);
781 void OPPROTO
op_mult (void)
783 FT0
= float64_mul(FT0
, FT1
, &FP_STATUS
);
787 void OPPROTO
op_divt (void)
789 FT0
= float64_div(FT0
, FT1
, &FP_STATUS
);
793 void OPPROTO
op_sqrtt (void)
799 void OPPROTO
op_cmptun (void)
805 void OPPROTO
op_cmpteq (void)
811 void OPPROTO
op_cmptle (void)
817 void OPPROTO
op_cmptlt (void)
823 void OPPROTO
op_itoft (void)
829 void OPPROTO
op_ftoit (void)
835 /* VAX floating point arithmetic */
837 void OPPROTO
op_addf (void)
843 void OPPROTO
op_subf (void)
849 void OPPROTO
op_mulf (void)
855 void OPPROTO
op_divf (void)
861 void OPPROTO
op_sqrtf (void)
867 void OPPROTO
op_cmpfeq (void)
873 void OPPROTO
op_cmpfne (void)
879 void OPPROTO
op_cmpflt (void)
885 void OPPROTO
op_cmpfle (void)
891 void OPPROTO
op_cmpfgt (void)
897 void OPPROTO
op_cmpfge (void)
903 void OPPROTO
op_itoff (void)
910 void OPPROTO
op_addg (void)
916 void OPPROTO
op_subg (void)
922 void OPPROTO
op_mulg (void)
928 void OPPROTO
op_divg (void)
934 void OPPROTO
op_sqrtg (void)
940 void OPPROTO
op_cmpgeq (void)
946 void OPPROTO
op_cmpglt (void)
952 void OPPROTO
op_cmpgle (void)
958 /* Floating point format conversion */
959 void OPPROTO
op_cvtst (void)
965 void OPPROTO
op_cvtqs (void)
971 void OPPROTO
op_cvtts (void)
977 void OPPROTO
op_cvttq (void)
983 void OPPROTO
op_cvtqt (void)
989 void OPPROTO
op_cvtqf (void)
995 void OPPROTO
op_cvtgf (void)
1001 void OPPROTO
op_cvtgd (void)
1007 void OPPROTO
op_cvtgq (void)
1013 void OPPROTO
op_cvtqg (void)
1019 void OPPROTO
op_cvtdg (void)
1025 void OPPROTO
op_cvtlq (void)
1031 void OPPROTO
op_cvtql (void)
1037 void OPPROTO
op_cvtqlv (void)
1043 void OPPROTO
op_cvtqlsv (void)
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 */
1059 void OPPROTO
op_hw_ret (void)
1062 env
->ipr
[IPR_EXC_ADDR
] = T0
& 1;
1063 /* XXX: re-enable interrupts and memory mapping */
1067 void OPPROTO
op_mfpr (void)
1069 helper_mfpr(PARAM(1));
1073 void OPPROTO
op_mtpr (void)
1075 helper_mtpr(PARAM(1));
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);
1086 void OPPROTO
op_restore_mode (void)
1088 env
->ps
= (env
->ps
& ~0xC) | env
->saved_mode
;
1092 void OPPROTO
op_ld_phys_to_virt (void)
1094 helper_ld_phys_to_virt();
1098 void OPPROTO
op_st_phys_to_virt (void)
1100 helper_st_phys_to_virt();
1103 #endif /* !defined (CONFIG_USER_ONLY) */