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
25 #include "host-utils.h"
27 #include "op_helper.h"
30 #include "op_template.h"
33 #include "op_template.h"
36 #include "op_template.h"
39 #include "op_template.h"
42 #include "op_template.h"
45 #include "op_template.h"
48 #include "op_template.h"
51 #include "op_template.h"
54 #include "op_template.h"
57 #include "op_template.h"
60 #include "op_template.h"
63 #include "op_template.h"
66 #include "op_template.h"
69 #include "op_template.h"
72 #include "op_template.h"
75 #include "op_template.h"
78 #include "op_template.h"
81 #include "op_template.h"
84 #include "op_template.h"
87 #include "op_template.h"
90 #include "op_template.h"
93 #include "op_template.h"
96 #include "op_template.h"
99 #include "op_template.h"
102 #include "op_template.h"
105 #include "op_template.h"
108 #include "op_template.h"
111 #include "op_template.h"
114 #include "op_template.h"
117 #include "op_template.h"
120 #include "op_template.h"
123 #include "op_template.h"
126 void OPPROTO op_no_op (void)
128 #if !defined (DEBUG_OP)
129 __asm__ __volatile__("nop" : : : "memory");
134 /* Load and stores */
135 #define MEMSUFFIX _raw
137 #if !defined(CONFIG_USER_ONLY)
138 #define MEMSUFFIX _kernel
140 #define MEMSUFFIX _executive
142 #define MEMSUFFIX _supervisor
144 #define MEMSUFFIX _user
146 /* This is used for pal modes */
147 #define MEMSUFFIX _data
152 void OPPROTO op_excp (void)
154 helper_excp(PARAM(1), PARAM(2));
158 void OPPROTO op_load_pcc (void)
164 void OPPROTO op_load_implver (void)
166 helper_load_implver();
170 void OPPROTO op_load_fpcr (void)
176 void OPPROTO op_store_fpcr (void)
182 void OPPROTO op_load_irf (void)
188 void OPPROTO op_set_irf (void)
194 void OPPROTO op_clear_irf (void)
201 void OPPROTO op_addq (void)
207 void OPPROTO op_addqv (void)
213 void OPPROTO op_addl (void)
215 T0 = (int64_t)((int32_t)(T0 + T1));
219 void OPPROTO op_addlv (void)
225 void OPPROTO op_subq (void)
231 void OPPROTO op_subqv (void)
237 void OPPROTO op_subl (void)
239 T0 = (int64_t)((int32_t)(T0 - T1));
243 void OPPROTO op_sublv (void)
249 void OPPROTO op_mull (void)
251 T0 = (int64_t)((int32_t)T0 * (int32_t)T1);
255 void OPPROTO op_mullv (void)
261 void OPPROTO op_mulq (void)
263 T0 = (int64_t)T0 * (int64_t)T1;
267 void OPPROTO op_mulqv (void)
273 void OPPROTO op_umulh (void)
277 mulu64(&tl, &th, T0, T1);
283 void OPPROTO op_and (void)
289 void OPPROTO op_bic (void)
295 void OPPROTO op_bis (void)
301 void OPPROTO op_eqv (void)
307 void OPPROTO op_ornot (void)
313 void OPPROTO op_xor (void)
319 void OPPROTO op_sll (void)
325 void OPPROTO op_srl (void)
331 void OPPROTO op_sra (void)
333 T0 = (int64_t)T0 >> T1;
337 void OPPROTO op_mskbl (void)
343 void OPPROTO op_extbl (void)
349 void OPPROTO op_insbl (void)
355 void OPPROTO op_mskwl (void)
361 void OPPROTO op_extwl (void)
367 void OPPROTO op_inswl (void)
373 void OPPROTO op_mskll (void)
379 void OPPROTO op_extll (void)
385 void OPPROTO op_insll (void)
391 void OPPROTO op_zap (void)
397 void OPPROTO op_zapnot (void)
403 void OPPROTO op_mskql (void)
409 void OPPROTO op_extql (void)
415 void OPPROTO op_insql (void)
421 void OPPROTO op_mskwh (void)
427 void OPPROTO op_inswh (void)
433 void OPPROTO op_extwh (void)
439 void OPPROTO op_msklh (void)
445 void OPPROTO op_inslh (void)
451 void OPPROTO op_extlh (void)
457 void OPPROTO op_mskqh (void)
463 void OPPROTO op_insqh (void)
469 void OPPROTO op_extqh (void)
476 void OPPROTO op_cmpult (void)
485 void OPPROTO op_cmpule (void)
494 void OPPROTO op_cmpeq (void)
503 void OPPROTO op_cmplt (void)
505 if ((int64_t)T0 < (int64_t)T1)
512 void OPPROTO op_cmple (void)
514 if ((int64_t)T0 <= (int64_t)T1)
521 void OPPROTO op_cmpbge (void)
527 void OPPROTO op_cmpeqz (void)
536 void OPPROTO op_cmpnez (void)
545 void OPPROTO op_cmpltz (void)
554 void OPPROTO op_cmplez (void)
556 if ((int64_t)T0 <= 0)
563 void OPPROTO op_cmpgtz (void)
572 void OPPROTO op_cmpgez (void)
574 if ((int64_t)T0 >= 0)
581 void OPPROTO op_cmplbs (void)
587 void OPPROTO op_cmplbc (void)
593 #if 0 // Qemu does not know how to do this...
594 void OPPROTO op_bcond (void)
603 void OPPROTO op_bcond (void)
608 env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
613 /* IEEE floating point arithmetic */
614 /* S floating (single) */
615 void OPPROTO op_adds (void)
617 FT0 = float32_add(FT0, FT1, &FP_STATUS);
621 void OPPROTO op_subs (void)
623 FT0 = float32_sub(FT0, FT1, &FP_STATUS);
627 void OPPROTO op_muls (void)
629 FT0 = float32_mul(FT0, FT1, &FP_STATUS);
633 void OPPROTO op_divs (void)
635 FT0 = float32_div(FT0, FT1, &FP_STATUS);
639 void OPPROTO op_sqrts (void)
645 void OPPROTO op_cpys (void)
651 void OPPROTO op_cpysn (void)
657 void OPPROTO op_cpyse (void)
663 void OPPROTO op_itofs (void)
669 void OPPROTO op_ftois (void)
675 /* T floating (double) */
676 void OPPROTO op_addt (void)
678 FT0 = float64_add(FT0, FT1, &FP_STATUS);
682 void OPPROTO op_subt (void)
684 FT0 = float64_sub(FT0, FT1, &FP_STATUS);
688 void OPPROTO op_mult (void)
690 FT0 = float64_mul(FT0, FT1, &FP_STATUS);
694 void OPPROTO op_divt (void)
696 FT0 = float64_div(FT0, FT1, &FP_STATUS);
700 void OPPROTO op_sqrtt (void)
706 void OPPROTO op_cmptun (void)
712 void OPPROTO op_cmpteq (void)
718 void OPPROTO op_cmptle (void)
724 void OPPROTO op_cmptlt (void)
730 void OPPROTO op_itoft (void)
736 void OPPROTO op_ftoit (void)
742 /* VAX floating point arithmetic */
744 void OPPROTO op_addf (void)
750 void OPPROTO op_subf (void)
756 void OPPROTO op_mulf (void)
762 void OPPROTO op_divf (void)
768 void OPPROTO op_sqrtf (void)
774 void OPPROTO op_cmpfeq (void)
780 void OPPROTO op_cmpfne (void)
786 void OPPROTO op_cmpflt (void)
792 void OPPROTO op_cmpfle (void)
798 void OPPROTO op_cmpfgt (void)
804 void OPPROTO op_cmpfge (void)
810 void OPPROTO op_itoff (void)
817 void OPPROTO op_addg (void)
823 void OPPROTO op_subg (void)
829 void OPPROTO op_mulg (void)
835 void OPPROTO op_divg (void)
841 void OPPROTO op_sqrtg (void)
847 void OPPROTO op_cmpgeq (void)
853 void OPPROTO op_cmpglt (void)
859 void OPPROTO op_cmpgle (void)
865 /* Floating point format conversion */
866 void OPPROTO op_cvtst (void)
872 void OPPROTO op_cvtqs (void)
878 void OPPROTO op_cvtts (void)
884 void OPPROTO op_cvttq (void)
890 void OPPROTO op_cvtqt (void)
896 void OPPROTO op_cvtqf (void)
902 void OPPROTO op_cvtgf (void)
908 void OPPROTO op_cvtgd (void)
914 void OPPROTO op_cvtgq (void)
920 void OPPROTO op_cvtqg (void)
926 void OPPROTO op_cvtdg (void)
932 void OPPROTO op_cvtlq (void)
938 void OPPROTO op_cvtql (void)
944 void OPPROTO op_cvtqlv (void)
950 void OPPROTO op_cvtqlsv (void)
956 /* PALcode support special instructions */
957 #if !defined (CONFIG_USER_ONLY)
958 void OPPROTO op_hw_rei (void)
960 env->pc = env->ipr[IPR_EXC_ADDR] & ~3;
961 env->ipr[IPR_EXC_ADDR] = env->ipr[IPR_EXC_ADDR] & 1;
962 /* XXX: re-enable interrupts and memory mapping */
966 void OPPROTO op_hw_ret (void)
969 env->ipr[IPR_EXC_ADDR] = T0 & 1;
970 /* XXX: re-enable interrupts and memory mapping */
974 void OPPROTO op_mfpr (void)
976 helper_mfpr(PARAM(1));
980 void OPPROTO op_mtpr (void)
982 helper_mtpr(PARAM(1));
986 void OPPROTO op_set_alt_mode (void)
988 env->saved_mode = env->ps & 0xC;
989 env->ps = (env->ps & ~0xC) | (env->ipr[IPR_ALT_MODE] & 0xC);
993 void OPPROTO op_restore_mode (void)
995 env->ps = (env->ps & ~0xC) | env->saved_mode;
999 void OPPROTO op_ld_phys_to_virt (void)
1001 helper_ld_phys_to_virt();
1005 void OPPROTO op_st_phys_to_virt (void)
1007 helper_st_phys_to_virt();
1010 #endif /* !defined (CONFIG_USER_ONLY) */