?? translate.c
字號:
shiftop = (insn >> 5) & 3; if (shift != 0) { gen_shift_T2_im[shiftop](shift); } else if (shiftop != 0) { gen_shift_T2_0[shiftop](); } if (!(insn & (1 << 23))) gen_op_subl_T1_T2(); else gen_op_addl_T1_T2(); }}static inline void gen_add_datah_offset(DisasContext *s, unsigned int insn, int extra){ int val, rm; if (insn & (1 << 22)) { /* immediate */ val = (insn & 0xf) | ((insn >> 4) & 0xf0); if (!(insn & (1 << 23))) val = -val; val += extra; if (val != 0) gen_op_addl_T1_im(val); } else { /* register */ if (extra) gen_op_addl_T1_im(extra); rm = (insn) & 0xf; gen_movl_T2_reg(s, rm); if (!(insn & (1 << 23))) gen_op_subl_T1_T2(); else gen_op_addl_T1_T2(); }}#define VFP_OP(name) \static inline void gen_vfp_##name(int dp) \{ \ if (dp) \ gen_op_vfp_##name##d(); \ else \ gen_op_vfp_##name##s(); \}#define VFP_OP1(name) \static inline void gen_vfp_##name(int dp, int arg) \{ \ if (dp) \ gen_op_vfp_##name##d(arg); \ else \ gen_op_vfp_##name##s(arg); \}VFP_OP(add)VFP_OP(sub)VFP_OP(mul)VFP_OP(div)VFP_OP(neg)VFP_OP(abs)VFP_OP(sqrt)VFP_OP(cmp)VFP_OP(cmpe)VFP_OP(F1_ld0)VFP_OP(uito)VFP_OP(sito)VFP_OP(toui)VFP_OP(touiz)VFP_OP(tosi)VFP_OP(tosiz)VFP_OP1(tosh)VFP_OP1(tosl)VFP_OP1(touh)VFP_OP1(toul)VFP_OP1(shto)VFP_OP1(slto)VFP_OP1(uhto)VFP_OP1(ulto)#undef VFP_OPstatic inline void gen_vfp_fconst(int dp, uint32_t val){ if (dp) gen_op_vfp_fconstd(val); else gen_op_vfp_fconsts(val);}static inline void gen_vfp_ld(DisasContext *s, int dp){ gen_ldst(vfp_ldd, s); else gen_ldst(vfp_lds, s);}static inline void gen_vfp_st(DisasContext *s, int dp){ if (dp) gen_ldst(vfp_std, s); else gen_ldst(vfp_sts, s);}static inline longvfp_reg_offset (int dp, int reg){ if (dp) return offsetof(CPUARMState, vfp.regs[reg]); else if (reg & 1) { return offsetof(CPUARMState, vfp.regs[reg >> 1]) + offsetof(CPU_DoubleU, l.upper); } else { return offsetof(CPUARMState, vfp.regs[reg >> 1]) + offsetof(CPU_DoubleU, l.lower); }}/* Return the offset of a 32-bit piece of a NEON register. zero is the least significant end of the register. */static inline longneon_reg_offset (int reg, int n){ int sreg; sreg = reg * 2 + n; return vfp_reg_offset(0, sreg);}#define NEON_GET_REG(T, reg, n) gen_op_neon_getreg_##T(neon_reg_offset(reg, n))#define NEON_SET_REG(T, reg, n) gen_op_neon_setreg_##T(neon_reg_offset(reg, n))static inline void gen_mov_F0_vreg(int dp, int reg){ if (dp) gen_op_vfp_getreg_F0d(vfp_reg_offset(dp, reg)); else gen_op_vfp_getreg_F0s(vfp_reg_offset(dp, reg));}static inline void gen_mov_F1_vreg(int dp, int reg){ if (dp) gen_op_vfp_getreg_F1d(vfp_reg_offset(dp, reg)); else gen_op_vfp_getreg_F1s(vfp_reg_offset(dp, reg));}static inline void gen_mov_vreg_F0(int dp, int reg){ if (dp) gen_op_vfp_setreg_F0d(vfp_reg_offset(dp, reg)); else gen_op_vfp_setreg_F0s(vfp_reg_offset(dp, reg));}#define ARM_CP_RW_BIT (1 << 20)static inline int gen_iwmmxt_address(DisasContext *s, uint32_t insn){ int rd; uint32_t offset; rd = (insn >> 16) & 0xf; gen_movl_T1_reg(s, rd); offset = (insn & 0xff) << ((insn >> 7) & 2); if (insn & (1 << 24)) { /* Pre indexed */ if (insn & (1 << 23)) gen_op_addl_T1_im(offset); else gen_op_addl_T1_im(-offset); if (insn & (1 << 21)) gen_movl_reg_T1(s, rd); } else if (insn & (1 << 21)) { /* Post indexed */ if (insn & (1 << 23)) gen_op_movl_T0_im(offset); else gen_op_movl_T0_im(- offset); gen_op_addl_T0_T1(); gen_movl_reg_T0(s, rd); } else if (!(insn & (1 << 23))) return 1; return 0;}static inline int gen_iwmmxt_shift(uint32_t insn, uint32_t mask){ int rd = (insn >> 0) & 0xf; if (insn & (1 << 8)) if (rd < ARM_IWMMXT_wCGR0 || rd > ARM_IWMMXT_wCGR3) return 1; else gen_op_iwmmxt_movl_T0_wCx(rd); else gen_op_iwmmxt_movl_T0_T1_wRn(rd); gen_op_movl_T1_im(mask); gen_op_andl_T0_T1(); return 0;}/* Disassemble an iwMMXt instruction. Returns nonzero if an error occured (ie. an undefined instruction). */static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn){ int rd, wrd; int rdhi, rdlo, rd0, rd1, i; if ((insn & 0x0e000e00) == 0x0c000000) { if ((insn & 0x0fe00ff0) == 0x0c400000) { wrd = insn & 0xf; rdlo = (insn >> 12) & 0xf; rdhi = (insn >> 16) & 0xf; if (insn & ARM_CP_RW_BIT) { /* TMRRC */ gen_op_iwmmxt_movl_T0_T1_wRn(wrd); gen_movl_reg_T0(s, rdlo); gen_movl_reg_T1(s, rdhi); } else { /* TMCRR */ gen_movl_T0_reg(s, rdlo); gen_movl_T1_reg(s, rdhi); gen_op_iwmmxt_movl_wRn_T0_T1(wrd); gen_op_iwmmxt_set_mup(); } return 0; } wrd = (insn >> 12) & 0xf; if (gen_iwmmxt_address(s, insn)) return 1; if (insn & ARM_CP_RW_BIT) { if ((insn >> 28) == 0xf) { /* WLDRW wCx */ gen_ldst(ldl, s); gen_op_iwmmxt_movl_wCx_T0(wrd); } else { if (insn & (1 << 8)) if (insn & (1 << 22)) /* WLDRD */ gen_ldst(iwmmxt_ldq, s); else /* WLDRW wRd */ gen_ldst(iwmmxt_ldl, s); else if (insn & (1 << 22)) /* WLDRH */ gen_ldst(iwmmxt_ldw, s); else /* WLDRB */ gen_ldst(iwmmxt_ldb, s); gen_op_iwmmxt_movq_wRn_M0(wrd); } } else { if ((insn >> 28) == 0xf) { /* WSTRW wCx */ gen_op_iwmmxt_movl_T0_wCx(wrd); gen_ldst(stl, s); } else { gen_op_iwmmxt_movq_M0_wRn(wrd); if (insn & (1 << 8)) if (insn & (1 << 22)) /* WSTRD */ gen_ldst(iwmmxt_stq, s); else /* WSTRW wRd */ gen_ldst(iwmmxt_stl, s); else if (insn & (1 << 22)) /* WSTRH */ gen_ldst(iwmmxt_ldw, s); else /* WSTRB */ gen_ldst(iwmmxt_stb, s); } } return 0; } if ((insn & 0x0f000000) != 0x0e000000) return 1; switch (((insn >> 12) & 0xf00) | ((insn >> 4) & 0xff)) { case 0x000: /* WOR */ wrd = (insn >> 12) & 0xf; rd0 = (insn >> 0) & 0xf; rd1 = (insn >> 16) & 0xf; gen_op_iwmmxt_movq_M0_wRn(rd0); gen_op_iwmmxt_orq_M0_wRn(rd1); gen_op_iwmmxt_setpsr_nz(); gen_op_iwmmxt_movq_wRn_M0(wrd); gen_op_iwmmxt_set_mup(); gen_op_iwmmxt_set_cup(); break; case 0x011: /* TMCR */ if (insn & 0xf) return 1; rd = (insn >> 12) & 0xf; wrd = (insn >> 16) & 0xf; switch (wrd) { case ARM_IWMMXT_wCID: case ARM_IWMMXT_wCASF: break; case ARM_IWMMXT_wCon: gen_op_iwmmxt_set_cup(); /* Fall through. */ case ARM_IWMMXT_wCSSF: gen_op_iwmmxt_movl_T0_wCx(wrd); gen_movl_T1_reg(s, rd); gen_op_bicl_T0_T1(); gen_op_iwmmxt_movl_wCx_T0(wrd); break; case ARM_IWMMXT_wCGR0: case ARM_IWMMXT_wCGR1: case ARM_IWMMXT_wCGR2: case ARM_IWMMXT_wCGR3: gen_op_iwmmxt_set_cup(); gen_movl_reg_T0(s, rd); gen_op_iwmmxt_movl_wCx_T0(wrd); break; default: return 1; } break; case 0x100: /* WXOR */ wrd = (insn >> 12) & 0xf; rd0 = (insn >> 0) & 0xf; rd1 = (insn >> 16) & 0xf; gen_op_iwmmxt_movq_M0_wRn(rd0); gen_op_iwmmxt_xorq_M0_wRn(rd1); gen_op_iwmmxt_setpsr_nz(); gen_op_iwmmxt_movq_wRn_M0(wrd); gen_op_iwmmxt_set_mup(); gen_op_iwmmxt_set_cup(); break; case 0x111: /* TMRC */ if (insn & 0xf) return 1; rd = (insn >> 12) & 0xf; wrd = (insn >> 16) & 0xf; gen_op_iwmmxt_movl_T0_wCx(wrd); gen_movl_reg_T0(s, rd); break; case 0x300: /* WANDN */ wrd = (insn >> 12) & 0xf; rd0 = (insn >> 0) & 0xf; rd1 = (insn >> 16) & 0xf; gen_op_iwmmxt_movq_M0_wRn(rd0); gen_op_iwmmxt_negq_M0(); gen_op_iwmmxt_andq_M0_wRn(rd1); gen_op_iwmmxt_setpsr_nz(); gen_op_iwmmxt_movq_wRn_M0(wrd); gen_op_iwmmxt_set_mup(); gen_op_iwmmxt_set_cup(); break; case 0x200: /* WAND */ wrd = (insn >> 12) & 0xf; rd0 = (insn >> 0) & 0xf; rd1 = (insn >> 16) & 0xf; gen_op_iwmmxt_movq_M0_wRn(rd0); gen_op_iwmmxt_andq_M0_wRn(rd1); gen_op_iwmmxt_setpsr_nz(); gen_op_iwmmxt_movq_wRn_M0(wrd); gen_op_iwmmxt_set_mup(); gen_op_iwmmxt_set_cup(); break; case 0x810: case 0xa10: /* WMADD */ wrd = (insn >> 12) & 0xf; rd0 = (insn >> 0) & 0xf; rd1 = (insn >> 16) & 0xf; gen_op_iwmmxt_movq_M0_wRn(rd0); if (insn & (1 << 21)) gen_op_iwmmxt_maddsq_M0_wRn(rd1); else gen_op_iwmmxt_madduq_M0_wRn(rd1); gen_op_iwmmxt_movq_wRn_M0(wrd); gen_op_iwmmxt_set_mup(); break; case 0x10e: case 0x50e: case 0x90e: case 0xd0e: /* WUNPCKIL */ wrd = (insn >> 12) & 0xf; rd0 = (insn >> 16) & 0xf; rd1 = (insn >> 0) & 0xf; gen_op_iwmmxt_movq_M0_wRn(rd0); switch ((insn >> 22) & 3) { case 0: gen_op_iwmmxt_unpacklb_M0_wRn(rd1); break; case 1: gen_op_iwmmxt_unpacklw_M0_wRn(rd1); break; case 2: gen_op_iwmmxt_unpackll_M0_wRn(rd1); break; case 3: return 1; } gen_op_iwmmxt_movq_wRn_M0(wrd); gen_op_iwmmxt_set_mup(); gen_op_iwmmxt_set_cup(); break; case 0x10c: case 0x50c: case 0x90c: case 0xd0c: /* WUNPCKIH */ wrd = (insn >> 12) & 0xf; rd0 = (insn >> 16) & 0xf; rd1 = (insn >> 0) & 0xf; gen_op_iwmmxt_movq_M0_wRn(rd0); switch ((insn >> 22) & 3) { case 0: gen_op_iwmmxt_unpackhb_M0_wRn(rd1); break; case 1: gen_op_iwmmxt_unpackhw_M0_wRn(rd1); break; case 2: gen_op_iwmmxt_unpackhl_M0_wRn(rd1); break; case 3: return 1; } gen_op_iwmmxt_movq_wRn_M0(wrd); gen_op_iwmmxt_set_mup(); gen_op_iwmmxt_set_cup(); break; case 0x012: case 0x112: case 0x412: case 0x512: /* WSAD */ wrd = (insn >> 12) & 0xf; rd0 = (insn >> 16) & 0xf; rd1 = (insn >> 0) & 0xf; gen_op_iwmmxt_movq_M0_wRn(rd0); if (insn & (1 << 22)) gen_op_iwmmxt_sadw_M0_wRn(rd1); else gen_op_iwmmxt_sadb_M0_wRn(rd1); if (!(insn & (1 << 20))) gen_op_iwmmxt_addl_M0_wRn(wrd); gen_op_iwmmxt_movq_wRn_M0(wrd); gen_op_iwmmxt_set_mup(); break; case 0x010: case 0x110: case 0x210: case 0x310: /* WMUL */ wrd = (insn >> 12) & 0xf;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -