⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 translate.c.svn-base

📁 我们自己开发的一个OSEK操作系统!不知道可不可以?
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
        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){    if (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 + -