📄 op.c.svn-base
字号:
/* * Alpha emulation cpu micro-operations for qemu. * * Copyright (c) 2007 Jocelyn Mayer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#define DEBUG_OP#include "config.h"#include "exec.h"#include "host-utils.h"#include "op_helper.h"#define REG 0#include "op_template.h"#define REG 1#include "op_template.h"#define REG 2#include "op_template.h"#define REG 3#include "op_template.h"#define REG 4#include "op_template.h"#define REG 5#include "op_template.h"#define REG 6#include "op_template.h"#define REG 7#include "op_template.h"#define REG 8#include "op_template.h"#define REG 9#include "op_template.h"#define REG 10#include "op_template.h"#define REG 11#include "op_template.h"#define REG 12#include "op_template.h"#define REG 13#include "op_template.h"#define REG 14#include "op_template.h"#define REG 15#include "op_template.h"#define REG 16#include "op_template.h"#define REG 17#include "op_template.h"#define REG 18#include "op_template.h"#define REG 19#include "op_template.h"#define REG 20#include "op_template.h"#define REG 21#include "op_template.h"#define REG 22#include "op_template.h"#define REG 23#include "op_template.h"#define REG 24#include "op_template.h"#define REG 25#include "op_template.h"#define REG 26#include "op_template.h"#define REG 27#include "op_template.h"#define REG 28#include "op_template.h"#define REG 29#include "op_template.h"#define REG 30#include "op_template.h"#define REG 31#include "op_template.h"/* Debug stuff */void OPPROTO op_no_op (void){#if !defined (DEBUG_OP) __asm__ __volatile__("nop" : : : "memory");#endif RETURN();}void OPPROTO op_tb_flush (void){ helper_tb_flush(); RETURN();}/* Load and stores */#define MEMSUFFIX _raw#include "op_mem.h"#if !defined(CONFIG_USER_ONLY)#define MEMSUFFIX _kernel#include "op_mem.h"#define MEMSUFFIX _executive#include "op_mem.h"#define MEMSUFFIX _supervisor#include "op_mem.h"#define MEMSUFFIX _user#include "op_mem.h"/* This is used for pal modes */#define MEMSUFFIX _data#include "op_mem.h"#endif/* Special operation for load and store */void OPPROTO op_n7 (void){ T0 &= ~(uint64_t)0x7; RETURN();}/* Misc */void OPPROTO op_excp (void){ helper_excp(PARAM(1), PARAM(2)); RETURN();}void OPPROTO op_load_amask (void){ helper_amask(); RETURN();}void OPPROTO op_load_pcc (void){ helper_load_pcc(); RETURN();}void OPPROTO op_load_implver (void){ helper_load_implver(); RETURN();}void OPPROTO op_load_fpcr (void){ helper_load_fpcr(); RETURN();}void OPPROTO op_store_fpcr (void){ helper_store_fpcr(); RETURN();}void OPPROTO op_load_irf (void){ helper_load_irf(); RETURN();}void OPPROTO op_set_irf (void){ helper_set_irf(); RETURN();}void OPPROTO op_clear_irf (void){ helper_clear_irf(); RETURN();}void OPPROTO op_exit_tb (void){ EXIT_TB();}/* Arithmetic */void OPPROTO op_addq (void){ T0 += T1; RETURN();}void OPPROTO op_addqv (void){ helper_addqv(); RETURN();}void OPPROTO op_addl (void){ T0 = (int64_t)((int32_t)(T0 + T1)); RETURN();}void OPPROTO op_addlv (void){ helper_addlv(); RETURN();}void OPPROTO op_subq (void){ T0 -= T1; RETURN();}void OPPROTO op_subqv (void){ helper_subqv(); RETURN();}void OPPROTO op_subl (void){ T0 = (int64_t)((int32_t)(T0 - T1)); RETURN();}void OPPROTO op_sublv (void){ helper_sublv(); RETURN();}void OPPROTO op_s4 (void){ T0 <<= 2; RETURN();}void OPPROTO op_s8 (void){ T0 <<= 3; RETURN();}void OPPROTO op_mull (void){ T0 = (int64_t)((int32_t)T0 * (int32_t)T1); RETURN();}void OPPROTO op_mullv (void){ helper_mullv(); RETURN();}void OPPROTO op_mulq (void){ T0 = (int64_t)T0 * (int64_t)T1; RETURN();}void OPPROTO op_mulqv (void){ helper_mulqv(); RETURN();}void OPPROTO op_umulh (void){ uint64_t tl, th; mulu64(&tl, &th, T0, T1); T0 = th; RETURN();}/* Logical */void OPPROTO op_and (void){ T0 &= T1; RETURN();}void OPPROTO op_bic (void){ T0 &= ~T1; RETURN();}void OPPROTO op_bis (void){ T0 |= T1; RETURN();}void OPPROTO op_eqv (void){ T0 ^= ~T1; RETURN();}void OPPROTO op_ornot (void){ T0 |= ~T1; RETURN();}void OPPROTO op_xor (void){ T0 ^= T1; RETURN();}void OPPROTO op_sll (void){ T0 <<= T1; RETURN();}void OPPROTO op_srl (void){ T0 >>= T1; RETURN();}void OPPROTO op_sra (void){ T0 = (int64_t)T0 >> T1; RETURN();}void OPPROTO op_sextb (void){ T0 = (int64_t)((int8_t)T0); RETURN();}void OPPROTO op_sextw (void){ T0 = (int64_t)((int16_t)T0); RETURN();}void OPPROTO op_ctpop (void){ helper_ctpop(); RETURN();}void OPPROTO op_ctlz (void){ helper_ctlz(); RETURN();}void OPPROTO op_cttz (void){ helper_cttz(); RETURN();}void OPPROTO op_mskbl (void){ helper_mskbl(); RETURN();}void OPPROTO op_extbl (void){ helper_extbl(); RETURN();}void OPPROTO op_insbl (void){ helper_insbl(); RETURN();}void OPPROTO op_mskwl (void){ helper_mskwl(); RETURN();}void OPPROTO op_extwl (void){ helper_extwl(); RETURN();}void OPPROTO op_inswl (void){ helper_inswl(); RETURN();}void OPPROTO op_mskll (void){ helper_mskll(); RETURN();}void OPPROTO op_extll (void){ helper_extll(); RETURN();}void OPPROTO op_insll (void){ helper_insll(); RETURN();}void OPPROTO op_zap (void){ helper_zap(); RETURN();}void OPPROTO op_zapnot (void){ helper_zapnot(); RETURN();}void OPPROTO op_mskql (void){ helper_mskql(); RETURN();}void OPPROTO op_extql (void){ helper_extql(); RETURN();}void OPPROTO op_insql (void){ helper_insql(); RETURN();}void OPPROTO op_mskwh (void){ helper_mskwh(); RETURN();}void OPPROTO op_inswh (void){ helper_inswh(); RETURN();}void OPPROTO op_extwh (void){ helper_extwh(); RETURN();}void OPPROTO op_msklh (void){ helper_msklh(); RETURN();}void OPPROTO op_inslh (void){ helper_inslh(); RETURN();}void OPPROTO op_extlh (void){ helper_extlh(); RETURN();}void OPPROTO op_mskqh (void){ helper_mskqh(); RETURN();}void OPPROTO op_insqh (void){ helper_insqh(); RETURN();}void OPPROTO op_extqh (void){ helper_extqh(); RETURN();}/* Tests */void OPPROTO op_cmpult (void){ if (T0 < T1) T0 = 1; else T0 = 0; RETURN();}void OPPROTO op_cmpule (void){ if (T0 <= T1) T0 = 1; else T0 = 0; RETURN();}void OPPROTO op_cmpeq (void){ if (T0 == T1) T0 = 1; else T0 = 0; RETURN();}void OPPROTO op_cmplt (void){ if ((int64_t)T0 < (int64_t)T1) T0 = 1; else T0 = 0; RETURN();}void OPPROTO op_cmple (void){ if ((int64_t)T0 <= (int64_t)T1) T0 = 1; else T0 = 0; RETURN();}void OPPROTO op_cmpbge (void){ helper_cmpbge(); RETURN();}void OPPROTO op_cmpeqz (void){ if (T0 == 0) T0 = 1; else T0 = 0; RETURN();}void OPPROTO op_cmpnez (void){ if (T0 != 0) T0 = 1; else T0 = 0; RETURN();}void OPPROTO op_cmpltz (void){ if ((int64_t)T0 < 0) T0 = 1; else T0 = 0; RETURN();}void OPPROTO op_cmplez (void){ if ((int64_t)T0 <= 0) T0 = 1; else T0 = 0; RETURN();}void OPPROTO op_cmpgtz (void){ if ((int64_t)T0 > 0) T0 = 1; else T0 = 0; RETURN();}void OPPROTO op_cmpgez (void){ if ((int64_t)T0 >= 0) T0 = 1; else T0 = 0; RETURN();}void OPPROTO op_cmplbs (void){ T0 &= 1; RETURN();}void OPPROTO op_cmplbc (void){ T0 = (~T0) & 1; RETURN();}/* Branches */void OPPROTO op_branch (void){ env->pc = T0 & ~3; RETURN();}void OPPROTO op_addq1 (void){ T1 += T0; RETURN();}#if 0 // Qemu does not know how to do this...void OPPROTO op_bcond (void){ if (T0) env->pc = T1 & ~3; else env->pc = PARAM(1); RETURN();}#elsevoid OPPROTO op_bcond (void){ if (T0) env->pc = T1 & ~3; else env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2); RETURN();}#endif#if 0 // Qemu does not know how to do this...void OPPROTO op_update_pc (void){ env->pc = PARAM(1); RETURN();}#elsevoid OPPROTO op_update_pc (void){ env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2); RETURN();}#endif/* Optimization for 32 bits hosts architectures */void OPPROTO op_update_pc32 (void){ env->pc = (uint64_t)PARAM(1); RETURN();}/* IEEE floating point arithmetic *//* S floating (single) */void OPPROTO op_adds (void){ FT0 = float32_add(FT0, FT1, &FP_STATUS); RETURN();}void OPPROTO op_subs (void){ FT0 = float32_sub(FT0, FT1, &FP_STATUS); RETURN();}void OPPROTO op_muls (void){ FT0 = float32_mul(FT0, FT1, &FP_STATUS); RETURN();}void OPPROTO op_divs (void){ FT0 = float32_div(FT0, FT1, &FP_STATUS); RETURN();}void OPPROTO op_sqrts (void){ helper_sqrts(); RETURN();}void OPPROTO op_cpys (void){ helper_cpys(); RETURN();}void OPPROTO op_cpysn (void){ helper_cpysn(); RETURN();}void OPPROTO op_cpyse (void){ helper_cpyse(); RETURN();}void OPPROTO op_itofs (void){ helper_itofs(); RETURN();}void OPPROTO op_ftois (void){ helper_ftois(); RETURN();}/* T floating (double) */void OPPROTO op_addt (void){ FT0 = float64_add(FT0, FT1, &FP_STATUS); RETURN();}void OPPROTO op_subt (void){ FT0 = float64_sub(FT0, FT1, &FP_STATUS); RETURN();}void OPPROTO op_mult (void){ FT0 = float64_mul(FT0, FT1, &FP_STATUS); RETURN();}void OPPROTO op_divt (void){ FT0 = float64_div(FT0, FT1, &FP_STATUS); RETURN();}void OPPROTO op_sqrtt (void){ helper_sqrtt(); RETURN();}void OPPROTO op_cmptun (void){ helper_cmptun(); RETURN();}void OPPROTO op_cmpteq (void){ helper_cmpteq(); RETURN();}void OPPROTO op_cmptle (void){ helper_cmptle(); RETURN();}void OPPROTO op_cmptlt (void){ helper_cmptlt(); RETURN();}void OPPROTO op_itoft (void){ helper_itoft(); RETURN();}void OPPROTO op_ftoit (void){ helper_ftoit(); RETURN();}/* VAX floating point arithmetic *//* F floating */void OPPROTO op_addf (void){ helper_addf(); RETURN();}void OPPROTO op_subf (void){ helper_subf(); RETURN();}void OPPROTO op_mulf (void){ helper_mulf(); RETURN();}void OPPROTO op_divf (void){ helper_divf(); RETURN();}void OPPROTO op_sqrtf (void){ helper_sqrtf(); RETURN();}void OPPROTO op_cmpfeq (void){ helper_cmpfeq(); RETURN();}void OPPROTO op_cmpfne (void){ helper_cmpfne(); RETURN();}void OPPROTO op_cmpflt (void){ helper_cmpflt(); RETURN();}void OPPROTO op_cmpfle (void){ helper_cmpfle(); RETURN();}void OPPROTO op_cmpfgt (void){ helper_cmpfgt(); RETURN();}void OPPROTO op_cmpfge (void){ helper_cmpfge(); RETURN();}void OPPROTO op_itoff (void){ helper_itoff(); RETURN();}/* G floating */void OPPROTO op_addg (void){ helper_addg(); RETURN();}void OPPROTO op_subg (void){ helper_subg(); RETURN();}void OPPROTO op_mulg (void){ helper_mulg(); RETURN();}void OPPROTO op_divg (void){ helper_divg(); RETURN();}void OPPROTO op_sqrtg (void){ helper_sqrtg(); RETURN();}void OPPROTO op_cmpgeq (void){ helper_cmpgeq(); RETURN();}void OPPROTO op_cmpglt (void){ helper_cmpglt(); RETURN();}void OPPROTO op_cmpgle (void){ helper_cmpgle(); RETURN();}/* Floating point format conversion */void OPPROTO op_cvtst (void){ FT0 = (float)FT0; RETURN();}void OPPROTO op_cvtqs (void){ helper_cvtqs(); RETURN();}void OPPROTO op_cvtts (void){ FT0 = (float)FT0; RETURN();}void OPPROTO op_cvttq (void){ helper_cvttq(); RETURN();}void OPPROTO op_cvtqt (void){ helper_cvtqt(); RETURN();}void OPPROTO op_cvtqf (void){ helper_cvtqf(); RETURN();}void OPPROTO op_cvtgf (void){ helper_cvtgf(); RETURN();}void OPPROTO op_cvtgd (void){ helper_cvtgd(); RETURN();}void OPPROTO op_cvtgq (void){ helper_cvtgq(); RETURN();}void OPPROTO op_cvtqg (void){ helper_cvtqg(); RETURN();}void OPPROTO op_cvtdg (void){ helper_cvtdg(); RETURN();}void OPPROTO op_cvtlq (void){ helper_cvtlq(); RETURN();}void OPPROTO op_cvtql (void){ helper_cvtql(); RETURN();}void OPPROTO op_cvtqlv (void){ helper_cvtqlv(); RETURN();}void OPPROTO op_cvtqlsv (void){ helper_cvtqlsv(); RETURN();}/* PALcode support special instructions */#if !defined (CONFIG_USER_ONLY)void OPPROTO op_hw_rei (void){ env->pc = env->ipr[IPR_EXC_ADDR] & ~3; env->ipr[IPR_EXC_ADDR] = env->ipr[IPR_EXC_ADDR] & 1; /* XXX: re-enable interrupts and memory mapping */ RETURN();}void OPPROTO op_hw_ret (void){ env->pc = T0 & ~3; env->ipr[IPR_EXC_ADDR] = T0 & 1; /* XXX: re-enable interrupts and memory mapping */ RETURN();}void OPPROTO op_mfpr (void){ helper_mfpr(PARAM(1)); RETURN();}void OPPROTO op_mtpr (void){ helper_mtpr(PARAM(1)); RETURN();}void OPPROTO op_set_alt_mode (void){ env->saved_mode = env->ps & 0xC; env->ps = (env->ps & ~0xC) | (env->ipr[IPR_ALT_MODE] & 0xC); RETURN();}void OPPROTO op_restore_mode (void){ env->ps = (env->ps & ~0xC) | env->saved_mode; RETURN();}void OPPROTO op_ld_phys_to_virt (void){ helper_ld_phys_to_virt(); RETURN();}void OPPROTO op_st_phys_to_virt (void){ helper_st_phys_to_virt(); RETURN();}#endif /* !defined (CONFIG_USER_ONLY) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -