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 _kernel
145 #define MEMSUFFIX _executive
147 #define MEMSUFFIX _supervisor
149 #define MEMSUFFIX _user
151 /* This is used for pal modes */
152 #define MEMSUFFIX _data
156 /* Special operation for load and store */
157 void OPPROTO op_n7 (void)
159 T0 &= ~(uint64_t)0x7;
164 void OPPROTO op_excp (void)
166 helper_excp(PARAM(1), PARAM(2));
170 void OPPROTO op_load_amask (void)
176 void OPPROTO op_load_pcc (void)
182 void OPPROTO op_load_implver (void)
184 helper_load_implver();
188 void OPPROTO op_load_fpcr (void)
194 void OPPROTO op_store_fpcr (void)
200 void OPPROTO op_load_irf (void)
206 void OPPROTO op_set_irf (void)
212 void OPPROTO op_clear_irf (void)
218 void OPPROTO op_exit_tb (void)
224 void OPPROTO op_addq (void)
230 void OPPROTO op_addqv (void)
236 void OPPROTO op_addl (void)
238 T0 = (int64_t)((int32_t)(T0 + T1));
242 void OPPROTO op_addlv (void)
248 void OPPROTO op_subq (void)
254 void OPPROTO op_subqv (void)
260 void OPPROTO op_subl (void)
262 T0 = (int64_t)((int32_t)(T0 - T1));
266 void OPPROTO op_sublv (void)
272 void OPPROTO op_s4 (void)
278 void OPPROTO op_s8 (void)
284 void OPPROTO op_mull (void)
286 T0 = (int64_t)((int32_t)T0 * (int32_t)T1);
290 void OPPROTO op_mullv (void)
296 void OPPROTO op_mulq (void)
302 void OPPROTO op_mulqv (void)
308 void OPPROTO op_umulh (void)
315 void OPPROTO op_and (void)
321 void OPPROTO op_bic (void)
327 void OPPROTO op_bis (void)
333 void OPPROTO op_eqv (void)
339 void OPPROTO op_ornot (void)
345 void OPPROTO op_xor (void)
351 void OPPROTO op_sll (void)
357 void OPPROTO op_srl (void)
363 void OPPROTO op_sra (void)
365 T0 = (int64_t)T0 >> T1;
369 void OPPROTO op_sextb (void)
371 T0 = (int64_t)((int8_t)T0);
375 void OPPROTO op_sextw (void)
377 T0 = (int64_t)((int16_t)T0);
382 void OPPROTO op_ctpop (void)
388 void OPPROTO op_ctlz (void)
394 void OPPROTO op_cttz (void)
400 void OPPROTO op_mskbl (void)
406 void OPPROTO op_extbl (void)
412 void OPPROTO op_insbl (void)
418 void OPPROTO op_mskwl (void)
424 void OPPROTO op_extwl (void)
430 void OPPROTO op_inswl (void)
436 void OPPROTO op_mskll (void)
442 void OPPROTO op_extll (void)
448 void OPPROTO op_insll (void)
454 void OPPROTO op_zap (void)
460 void OPPROTO op_zapnot (void)
466 void OPPROTO op_mskql (void)
472 void OPPROTO op_extql (void)
478 void OPPROTO op_insql (void)
484 void OPPROTO op_mskwh (void)
490 void OPPROTO op_inswh (void)
496 void OPPROTO op_extwh (void)
502 void OPPROTO op_msklh (void)
508 void OPPROTO op_inslh (void)
514 void OPPROTO op_extlh (void)
520 void OPPROTO op_mskqh (void)
526 void OPPROTO op_insqh (void)
532 void OPPROTO op_extqh (void)
539 void OPPROTO op_cmpult (void)
548 void OPPROTO op_cmpule (void)
557 void OPPROTO op_cmpeq (void)
566 void OPPROTO op_cmplt (void)
568 if ((int64_t)T0 < (int64_t)T1)
575 void OPPROTO op_cmple (void)
577 if ((int64_t)T0 <= (int64_t)T1)
584 void OPPROTO op_cmpbge (void)
590 void OPPROTO op_cmpeqz (void)
599 void OPPROTO op_cmpnez (void)
608 void OPPROTO op_cmpltz (void)
617 void OPPROTO op_cmplez (void)
619 if ((int64_t)T0 <= 0)
626 void OPPROTO op_cmpgtz (void)
635 void OPPROTO op_cmpgez (void)
637 if ((int64_t)T0 >= 0)
644 void OPPROTO op_cmplbs (void)
650 void OPPROTO op_cmplbc (void)
657 void OPPROTO op_branch (void)
663 void OPPROTO op_addq1 (void)
669 #if 0 // Qemu does not know how to do this...
670 void OPPROTO op_bcond (void)
679 void OPPROTO op_bcond (void)
684 env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
689 #if 0 // Qemu does not know how to do this...
690 void OPPROTO op_update_pc (void)
696 void OPPROTO op_update_pc (void)
698 env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
703 /* Optimization for 32 bits hosts architectures */
704 void OPPROTO op_update_pc32 (void)
706 env->pc = (uint64_t)PARAM(1);
710 /* IEEE floating point arithmetic */
711 /* S floating (single) */
712 void OPPROTO op_adds (void)
714 FT0 = float32_add(FT0, FT1, &FP_STATUS);
718 void OPPROTO op_subs (void)
720 FT0 = float32_sub(FT0, FT1, &FP_STATUS);
724 void OPPROTO op_muls (void)
726 FT0 = float32_mul(FT0, FT1, &FP_STATUS);
730 void OPPROTO op_divs (void)
732 FT0 = float32_div(FT0, FT1, &FP_STATUS);
736 void OPPROTO op_sqrts (void)
742 void OPPROTO op_cpys (void)
748 void OPPROTO op_cpysn (void)
754 void OPPROTO op_cpyse (void)
760 void OPPROTO op_itofs (void)
766 void OPPROTO op_ftois (void)
772 /* T floating (double) */
773 void OPPROTO op_addt (void)
775 FT0 = float64_add(FT0, FT1, &FP_STATUS);
779 void OPPROTO op_subt (void)
781 FT0 = float64_sub(FT0, FT1, &FP_STATUS);
785 void OPPROTO op_mult (void)
787 FT0 = float64_mul(FT0, FT1, &FP_STATUS);
791 void OPPROTO op_divt (void)
793 FT0 = float64_div(FT0, FT1, &FP_STATUS);
797 void OPPROTO op_sqrtt (void)
803 void OPPROTO op_cmptun (void)
809 void OPPROTO op_cmpteq (void)
815 void OPPROTO op_cmptle (void)
821 void OPPROTO op_cmptlt (void)
827 void OPPROTO op_itoft (void)
833 void OPPROTO op_ftoit (void)
839 /* VAX floating point arithmetic */
841 void OPPROTO op_addf (void)
847 void OPPROTO op_subf (void)
853 void OPPROTO op_mulf (void)
859 void OPPROTO op_divf (void)
865 void OPPROTO op_sqrtf (void)
871 void OPPROTO op_cmpfeq (void)
877 void OPPROTO op_cmpfne (void)
883 void OPPROTO op_cmpflt (void)
889 void OPPROTO op_cmpfle (void)
895 void OPPROTO op_cmpfgt (void)
901 void OPPROTO op_cmpfge (void)
907 void OPPROTO op_itoff (void)
914 void OPPROTO op_addg (void)
920 void OPPROTO op_subg (void)
926 void OPPROTO op_mulg (void)
932 void OPPROTO op_divg (void)
938 void OPPROTO op_sqrtg (void)
944 void OPPROTO op_cmpgeq (void)
950 void OPPROTO op_cmpglt (void)
956 void OPPROTO op_cmpgle (void)
962 /* Floating point format conversion */
963 void OPPROTO op_cvtst (void)
969 void OPPROTO op_cvtqs (void)
975 void OPPROTO op_cvtts (void)
981 void OPPROTO op_cvttq (void)
987 void OPPROTO op_cvtqt (void)
993 void OPPROTO op_cvtqf (void)
999 void OPPROTO op_cvtgf (void)
1005 void OPPROTO op_cvtgd (void)
1011 void OPPROTO op_cvtgq (void)
1017 void OPPROTO op_cvtqg (void)
1023 void OPPROTO op_cvtdg (void)
1029 void OPPROTO op_cvtlq (void)
1035 void OPPROTO op_cvtql (void)
1041 void OPPROTO op_cvtqlv (void)
1047 void OPPROTO op_cvtqlsv (void)
1053 /* PALcode support special instructions */
1054 #if !defined (CONFIG_USER_ONLY)
1055 void OPPROTO op_hw_rei (void)
1057 env->pc = env->ipr[IPR_EXC_ADDR] & ~3;
1058 env->ipr[IPR_EXC_ADDR] = env->ipr[IPR_EXC_ADDR] & 1;
1059 /* XXX: re-enable interrupts and memory mapping */
1063 void OPPROTO op_hw_ret (void)
1066 env->ipr[IPR_EXC_ADDR] = T0 & 1;
1067 /* XXX: re-enable interrupts and memory mapping */
1071 void OPPROTO op_mfpr (void)
1073 helper_mfpr(PARAM(1));
1077 void OPPROTO op_mtpr (void)
1079 helper_mtpr(PARAM(1));
1083 void OPPROTO op_set_alt_mode (void)
1085 env->saved_mode = env->ps & 0xC;
1086 env->ps = (env->ps & ~0xC) | (env->ipr[IPR_ALT_MODE] & 0xC);
1090 void OPPROTO op_restore_mode (void)
1092 env->ps = (env->ps & ~0xC) | env->saved_mode;
1096 void OPPROTO op_ld_phys_to_virt (void)
1098 helper_ld_phys_to_virt();
1102 void OPPROTO op_st_phys_to_virt (void)
1104 helper_st_phys_to_virt();
1107 #endif /* !defined (CONFIG_USER_ONLY) */