?? op.c
字號:
/* SPARC micro operations Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at> 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*/#include "exec.h" /*XXX*/#define REGNAME g0#define REG (env->gregs[0])#include "op_template.h"#define REGNAME g1#define REG (env->gregs[1])#include "op_template.h"#define REGNAME g2#define REG (env->gregs[2])#include "op_template.h"#define REGNAME g3#define REG (env->gregs[3])#include "op_template.h"#define REGNAME g4#define REG (env->gregs[4])#include "op_template.h"#define REGNAME g5#define REG (env->gregs[5])#include "op_template.h"#define REGNAME g6#define REG (env->gregs[6])#include "op_template.h"#define REGNAME g7#define REG (env->gregs[7])#include "op_template.h"#define REGNAME i0#define REG (REGWPTR[16])#include "op_template.h"#define REGNAME i1#define REG (REGWPTR[17])#include "op_template.h"#define REGNAME i2#define REG (REGWPTR[18])#include "op_template.h"#define REGNAME i3#define REG (REGWPTR[19])#include "op_template.h"#define REGNAME i4#define REG (REGWPTR[20])#include "op_template.h"#define REGNAME i5#define REG (REGWPTR[21])#include "op_template.h"#define REGNAME i6#define REG (REGWPTR[22])#include "op_template.h"#define REGNAME i7#define REG (REGWPTR[23])#include "op_template.h"#define REGNAME l0#define REG (REGWPTR[8])#include "op_template.h"#define REGNAME l1#define REG (REGWPTR[9])#include "op_template.h"#define REGNAME l2#define REG (REGWPTR[10])#include "op_template.h"#define REGNAME l3#define REG (REGWPTR[11])#include "op_template.h"#define REGNAME l4#define REG (REGWPTR[12])#include "op_template.h"#define REGNAME l5#define REG (REGWPTR[13])#include "op_template.h"#define REGNAME l6#define REG (REGWPTR[14])#include "op_template.h"#define REGNAME l7#define REG (REGWPTR[15])#include "op_template.h"#define REGNAME o0#define REG (REGWPTR[0])#include "op_template.h"#define REGNAME o1#define REG (REGWPTR[1])#include "op_template.h"#define REGNAME o2#define REG (REGWPTR[2])#include "op_template.h"#define REGNAME o3#define REG (REGWPTR[3])#include "op_template.h"#define REGNAME o4#define REG (REGWPTR[4])#include "op_template.h"#define REGNAME o5#define REG (REGWPTR[5])#include "op_template.h"#define REGNAME o6#define REG (REGWPTR[6])#include "op_template.h"#define REGNAME o7#define REG (REGWPTR[7])#include "op_template.h"#define REGNAME f0#define REG (env->fpr[0])#include "fop_template.h"#define REGNAME f1#define REG (env->fpr[1])#include "fop_template.h"#define REGNAME f2#define REG (env->fpr[2])#include "fop_template.h"#define REGNAME f3#define REG (env->fpr[3])#include "fop_template.h"#define REGNAME f4#define REG (env->fpr[4])#include "fop_template.h"#define REGNAME f5#define REG (env->fpr[5])#include "fop_template.h"#define REGNAME f6#define REG (env->fpr[6])#include "fop_template.h"#define REGNAME f7#define REG (env->fpr[7])#include "fop_template.h"#define REGNAME f8#define REG (env->fpr[8])#include "fop_template.h"#define REGNAME f9#define REG (env->fpr[9])#include "fop_template.h"#define REGNAME f10#define REG (env->fpr[10])#include "fop_template.h"#define REGNAME f11#define REG (env->fpr[11])#include "fop_template.h"#define REGNAME f12#define REG (env->fpr[12])#include "fop_template.h"#define REGNAME f13#define REG (env->fpr[13])#include "fop_template.h"#define REGNAME f14#define REG (env->fpr[14])#include "fop_template.h"#define REGNAME f15#define REG (env->fpr[15])#include "fop_template.h"#define REGNAME f16#define REG (env->fpr[16])#include "fop_template.h"#define REGNAME f17#define REG (env->fpr[17])#include "fop_template.h"#define REGNAME f18#define REG (env->fpr[18])#include "fop_template.h"#define REGNAME f19#define REG (env->fpr[19])#include "fop_template.h"#define REGNAME f20#define REG (env->fpr[20])#include "fop_template.h"#define REGNAME f21#define REG (env->fpr[21])#include "fop_template.h"#define REGNAME f22#define REG (env->fpr[22])#include "fop_template.h"#define REGNAME f23#define REG (env->fpr[23])#include "fop_template.h"#define REGNAME f24#define REG (env->fpr[24])#include "fop_template.h"#define REGNAME f25#define REG (env->fpr[25])#include "fop_template.h"#define REGNAME f26#define REG (env->fpr[26])#include "fop_template.h"#define REGNAME f27#define REG (env->fpr[27])#include "fop_template.h"#define REGNAME f28#define REG (env->fpr[28])#include "fop_template.h"#define REGNAME f29#define REG (env->fpr[29])#include "fop_template.h"#define REGNAME f30#define REG (env->fpr[30])#include "fop_template.h"#define REGNAME f31#define REG (env->fpr[31])#include "fop_template.h"#ifdef TARGET_SPARC64#define REGNAME f32#define REG (env->fpr[32])#include "fop_template.h"#define REGNAME f34#define REG (env->fpr[34])#include "fop_template.h"#define REGNAME f36#define REG (env->fpr[36])#include "fop_template.h"#define REGNAME f38#define REG (env->fpr[38])#include "fop_template.h"#define REGNAME f40#define REG (env->fpr[40])#include "fop_template.h"#define REGNAME f42#define REG (env->fpr[42])#include "fop_template.h"#define REGNAME f44#define REG (env->fpr[44])#include "fop_template.h"#define REGNAME f46#define REG (env->fpr[46])#include "fop_template.h"#define REGNAME f48#define REG (env->fpr[47])#include "fop_template.h"#define REGNAME f50#define REG (env->fpr[50])#include "fop_template.h"#define REGNAME f52#define REG (env->fpr[52])#include "fop_template.h"#define REGNAME f54#define REG (env->fpr[54])#include "fop_template.h"#define REGNAME f56#define REG (env->fpr[56])#include "fop_template.h"#define REGNAME f58#define REG (env->fpr[58])#include "fop_template.h"#define REGNAME f60#define REG (env->fpr[60])#include "fop_template.h"#define REGNAME f62#define REG (env->fpr[62])#include "fop_template.h"#endif#ifdef TARGET_SPARC64#ifdef WORDS_BIGENDIANtypedef union UREG64 { struct { uint16_t v3, v2, v1, v0; } w; struct { uint32_t v1, v0; } l; uint64_t q;} UREG64;#elsetypedef union UREG64 { struct { uint16_t v0, v1, v2, v3; } w; struct { uint32_t v0, v1; } l; uint64_t q;} UREG64;#endif#define PARAMQ1 \({\ UREG64 __p;\ __p.l.v1 = PARAM1;\ __p.l.v0 = PARAM2;\ __p.q;\})void OPPROTO op_movq_T0_im64(void){ T0 = PARAMQ1;}void OPPROTO op_movq_T1_im64(void){ T1 = PARAMQ1;}#define XFLAG_SET(x) ((env->xcc&x)?1:0)#else#define EIP (env->pc)#endif#define FLAG_SET(x) ((env->psr&x)?1:0)void OPPROTO op_movl_T0_0(void){ T0 = 0;}void OPPROTO op_movl_T0_im(void){ T0 = (uint32_t)PARAM1;}void OPPROTO op_movl_T1_im(void){ T1 = (uint32_t)PARAM1;}void OPPROTO op_movl_T2_im(void){ T2 = (uint32_t)PARAM1;}void OPPROTO op_movl_T0_sim(void){ T0 = (int32_t)PARAM1;}void OPPROTO op_movl_T1_sim(void){ T1 = (int32_t)PARAM1;}void OPPROTO op_movl_T2_sim(void){ T2 = (int32_t)PARAM1;}void OPPROTO op_movl_T0_env(void){ T0 = *(uint32_t *)((char *)env + PARAM1);}void OPPROTO op_movl_env_T0(void){ *(uint32_t *)((char *)env + PARAM1) = T0;}void OPPROTO op_movtl_T0_env(void){ T0 = *(target_ulong *)((char *)env + PARAM1);}void OPPROTO op_movtl_env_T0(void){ *(target_ulong *)((char *)env + PARAM1) = T0;}void OPPROTO op_add_T1_T0(void){ T0 += T1;}void OPPROTO op_add_T1_T0_cc(void){ target_ulong src1; src1 = T0; T0 += T1; env->psr = 0;#ifdef TARGET_SPARC64 if (!(T0 & 0xffffffff)) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; if ((T0 & 0xffffffff) < (src1 & 0xffffffff)) env->psr |= PSR_CARRY; if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) & ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) env->psr |= PSR_OVF; env->xcc = 0; if (!T0) env->xcc |= PSR_ZERO; if ((int64_t) T0 < 0) env->xcc |= PSR_NEG; if (T0 < src1) env->xcc |= PSR_CARRY; if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63)) env->xcc |= PSR_OVF;#else if (!T0) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; if (T0 < src1) env->psr |= PSR_CARRY; if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) env->psr |= PSR_OVF;#endif FORCE_RET();}void OPPROTO op_addx_T1_T0(void){ T0 += T1 + FLAG_SET(PSR_CARRY);}void OPPROTO op_addx_T1_T0_cc(void){ target_ulong src1; src1 = T0; if (FLAG_SET(PSR_CARRY)) { T0 += T1 + 1; env->psr = 0;#ifdef TARGET_SPARC64 if ((T0 & 0xffffffff) <= (src1 & 0xffffffff)) env->psr |= PSR_CARRY; env->xcc = 0; if (T0 <= src1) env->xcc |= PSR_CARRY;#else if (T0 <= src1) env->psr |= PSR_CARRY;#endif } else { T0 += T1; env->psr = 0;#ifdef TARGET_SPARC64 if ((T0 & 0xffffffff) < (src1 & 0xffffffff)) env->psr |= PSR_CARRY; env->xcc = 0; if (T0 < src1) env->xcc |= PSR_CARRY;#else if (T0 < src1) env->psr |= PSR_CARRY;#endif }#ifdef TARGET_SPARC64 if (!(T0 & 0xffffffff)) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) & ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) env->psr |= PSR_OVF; if (!T0) env->xcc |= PSR_ZERO; if ((int64_t) T0 < 0) env->xcc |= PSR_NEG; if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63)) env->xcc |= PSR_OVF;#else if (!T0) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) env->psr |= PSR_OVF;#endif FORCE_RET();}void OPPROTO op_tadd_T1_T0_cc(void){ target_ulong src1; src1 = T0; T0 += T1; env->psr = 0;#ifdef TARGET_SPARC64 if (!(T0 & 0xffffffff)) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; if ((T0 & 0xffffffff) < (src1 & 0xffffffff)) env->psr |= PSR_CARRY; if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) & ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) env->psr |= PSR_OVF; if ((src1 & 0x03) || (T1 & 0x03)) env->psr |= PSR_OVF; env->xcc = 0; if (!T0) env->xcc |= PSR_ZERO; if ((int64_t) T0 < 0) env->xcc |= PSR_NEG; if (T0 < src1) env->xcc |= PSR_CARRY; if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63)) env->xcc |= PSR_OVF;#else if (!T0) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; if (T0 < src1) env->psr |= PSR_CARRY; if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) env->psr |= PSR_OVF; if ((src1 & 0x03) || (T1 & 0x03)) env->psr |= PSR_OVF;#endif FORCE_RET();}void OPPROTO op_tadd_T1_T0_ccTV(void){ target_ulong src1; if ((T0 & 0x03) || (T1 & 0x03)) { raise_exception(TT_TOVF); FORCE_RET(); return; } src1 = T0; T0 += T1;#ifdef TARGET_SPARC64 if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) & ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) raise_exception(TT_TOVF);#else if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) raise_exception(TT_TOVF);#endif env->psr = 0;#ifdef TARGET_SPARC64 if (!(T0 & 0xffffffff)) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; if ((T0 & 0xffffffff) < (src1 & 0xffffffff)) env->psr |= PSR_CARRY; env->xcc = 0; if (!T0) env->xcc |= PSR_ZERO; if ((int64_t) T0 < 0) env->xcc |= PSR_NEG; if (T0 < src1) env->xcc |= PSR_CARRY;#else if (!T0) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; if (T0 < src1) env->psr |= PSR_CARRY;#endif FORCE_RET();}void OPPROTO op_sub_T1_T0(void){ T0 -= T1;}void OPPROTO op_sub_T1_T0_cc(void){ target_ulong src1; src1 = T0; T0 -= T1; env->psr = 0;#ifdef TARGET_SPARC64 if (!(T0 & 0xffffffff)) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; if ((src1 & 0xffffffff) < (T1 & 0xffffffff)) env->psr |= PSR_CARRY; if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) & ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) env->psr |= PSR_OVF; env->xcc = 0; if (!T0) env->xcc |= PSR_ZERO; if ((int64_t) T0 < 0) env->xcc |= PSR_NEG; if (src1 < T1) env->xcc |= PSR_CARRY; if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63)) env->xcc |= PSR_OVF;#else if (!T0) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; if (src1 < T1) env->psr |= PSR_CARRY; if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) env->psr |= PSR_OVF;#endif FORCE_RET();}void OPPROTO op_subx_T1_T0(void){ T0 -= T1 + FLAG_SET(PSR_CARRY);}void OPPROTO op_subx_T1_T0_cc(void){ target_ulong src1; src1 = T0; if (FLAG_SET(PSR_CARRY)) { T0 -= T1 + 1; env->psr = 0;#ifdef TARGET_SPARC64 if ((src1 & 0xffffffff) <= (T1 & 0xffffffff)) env->psr |= PSR_CARRY; env->xcc = 0; if (src1 <= T1) env->xcc |= PSR_CARRY;#else if (src1 <= T1) env->psr |= PSR_CARRY;#endif } else { T0 -= T1; env->psr = 0;#ifdef TARGET_SPARC64 if ((src1 & 0xffffffff) < (T1 & 0xffffffff)) env->psr |= PSR_CARRY; env->xcc = 0; if (src1 < T1) env->xcc |= PSR_CARRY;#else if (src1 < T1) env->psr |= PSR_CARRY;#endif }#ifdef TARGET_SPARC64 if (!(T0 & 0xffffffff)) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) & ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) env->psr |= PSR_OVF; if (!T0) env->xcc |= PSR_ZERO; if ((int64_t) T0 < 0) env->xcc |= PSR_NEG; if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63)) env->xcc |= PSR_OVF;#else if (!T0) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) env->psr |= PSR_OVF;#endif FORCE_RET();}void OPPROTO op_tsub_T1_T0_cc(void){ target_ulong src1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -