translate.c

来自「xen虚拟机源代码安装包」· C语言 代码 · 共 2,286 行 · 第 1/5 页

C
2,286
字号
    gen_helper_iwmmxt_muladdsw(cpu_M0, cpu_M0, cpu_T[0], cpu_T[1]);}static inline void gen_op_iwmmxt_muladdswl_M0_T0_T1(void){    gen_helper_iwmmxt_muladdswl(cpu_M0, cpu_M0, cpu_T[0], cpu_T[1]);}static inline void gen_op_iwmmxt_align_M0_T0_wRn(int rn){    iwmmxt_load_reg(cpu_V1, rn);    gen_helper_iwmmxt_align(cpu_M0, cpu_M0, cpu_V1, cpu_T[0]);}static inline void gen_op_iwmmxt_insr_M0_T0_T1(int shift){    TCGv tmp = tcg_const_i32(shift);    gen_helper_iwmmxt_insr(cpu_M0, cpu_M0, cpu_T[0], cpu_T[1], tmp);}static inline void gen_op_iwmmxt_extrsb_T0_M0(int shift){    tcg_gen_shri_i64(cpu_M0, cpu_M0, shift);    tcg_gen_trunc_i64_i32(cpu_T[0], cpu_M0);    tcg_gen_ext8s_i32(cpu_T[0], cpu_T[0]);}static inline void gen_op_iwmmxt_extrsw_T0_M0(int shift){    tcg_gen_shri_i64(cpu_M0, cpu_M0, shift);    tcg_gen_trunc_i64_i32(cpu_T[0], cpu_M0);    tcg_gen_ext16s_i32(cpu_T[0], cpu_T[0]);}static inline void gen_op_iwmmxt_extru_T0_M0(int shift, uint32_t mask){    tcg_gen_shri_i64(cpu_M0, cpu_M0, shift);    tcg_gen_trunc_i64_i32(cpu_T[0], cpu_M0);    if (mask != ~0u)        tcg_gen_andi_i32(cpu_T[0], cpu_T[0], mask);}static void gen_op_iwmmxt_set_mup(void){    TCGv tmp;    tmp = load_cpu_field(iwmmxt.cregs[ARM_IWMMXT_wCon]);    tcg_gen_ori_i32(tmp, tmp, 2);    store_cpu_field(tmp, iwmmxt.cregs[ARM_IWMMXT_wCon]);}static void gen_op_iwmmxt_set_cup(void){    TCGv tmp;    tmp = load_cpu_field(iwmmxt.cregs[ARM_IWMMXT_wCon]);    tcg_gen_ori_i32(tmp, tmp, 1);    store_cpu_field(tmp, iwmmxt.cregs[ARM_IWMMXT_wCon]);}static void gen_op_iwmmxt_setpsr_nz(void){    TCGv tmp = new_tmp();    gen_helper_iwmmxt_setpsr_nz(tmp, cpu_M0);    store_cpu_field(tmp, iwmmxt.cregs[ARM_IWMMXT_wCASF]);}static inline void gen_op_iwmmxt_addl_M0_wRn(int rn){    iwmmxt_load_reg(cpu_V1, rn);    tcg_gen_ext32u_i64(cpu_V1, cpu_V1);    tcg_gen_add_i64(cpu_M0, cpu_M0, cpu_V1);}static void gen_iwmmxt_movl_T0_T1_wRn(int rn){    iwmmxt_load_reg(cpu_V0, rn);    tcg_gen_trunc_i64_i32(cpu_T[0], cpu_V0);    tcg_gen_shri_i64(cpu_V0, cpu_V0, 32);    tcg_gen_trunc_i64_i32(cpu_T[1], cpu_V0);}static void gen_iwmmxt_movl_wRn_T0_T1(int rn){    tcg_gen_extu_i32_i64(cpu_V0, cpu_T[0]);    tcg_gen_extu_i32_i64(cpu_V1, cpu_T[0]);    tcg_gen_shli_i64(cpu_V1, cpu_V1, 32);    tcg_gen_or_i64(cpu_V0, cpu_V0, cpu_V1);    iwmmxt_store_reg(cpu_V0, rn);}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_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;    TCGv tmp;    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_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_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 */                tmp = gen_ld32(cpu_T[1], IS_USER(s));                tcg_gen_mov_i32(cpu_T[0], tmp);                dead_tmp(tmp);                gen_op_iwmmxt_movl_wCx_T0(wrd);            } else {                i = 1;                if (insn & (1 << 8)) {                    if (insn & (1 << 22)) {		/* WLDRD */                        tcg_gen_qemu_ld64(cpu_M0, cpu_T[1], IS_USER(s));                        i = 0;                    } else {				/* WLDRW wRd */                        tmp = gen_ld32(cpu_T[1], IS_USER(s));                    }                } else {                    if (insn & (1 << 22)) {		/* WLDRH */                        tmp = gen_ld16u(cpu_T[1], IS_USER(s));                    } else {				/* WLDRB */                        tmp = gen_ld8u(cpu_T[1], IS_USER(s));                    }                }                if (i) {                    tcg_gen_extu_i32_i64(cpu_M0, tmp);                    dead_tmp(tmp);                }                gen_op_iwmmxt_movq_wRn_M0(wrd);            }        } else {            if ((insn >> 28) == 0xf) {			/* WSTRW wCx */                gen_op_iwmmxt_movl_T0_wCx(wrd);                tmp = new_tmp();                tcg_gen_mov_i32(tmp, cpu_T[0]);                gen_st32(tmp, cpu_T[1], IS_USER(s));            } else {                gen_op_iwmmxt_movq_M0_wRn(wrd);                tmp = new_tmp();                if (insn & (1 << 8)) {                    if (insn & (1 << 22)) {		/* WSTRD */                        dead_tmp(tmp);                        tcg_gen_qemu_st64(cpu_M0, cpu_T[1], IS_USER(s));                    } else {				/* WSTRW wRd */                        tcg_gen_trunc_i64_i32(tmp, cpu_M0);                        gen_st32(tmp, cpu_T[1], IS_USER(s));                    }                } else {                    if (insn & (1 << 22)) {		/* WSTRH */                        tcg_gen_trunc_i64_i32(tmp, cpu_M0);                        gen_st16(tmp, cpu_T[1], IS_USER(s));                    } else {				/* WSTRB */                        tcg_gen_trunc_i64_i32(tmp, cpu_M0);                        gen_st8(tmp, cpu_T[1], IS_USER(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);        tcg_gen_neg_i64(cpu_M0, cpu_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;        rd0 = (insn >> 16) & 0xf;        rd1 = (insn >> 0) & 0xf;        gen_op_iwmmxt_movq_M0_wRn(rd0);        if (insn & (1 << 21)) {            if (insn & (1 << 20))                gen_op_iwmmxt_mulshw_M0_wRn(rd1);            else                gen_op_iwmmxt_mulslw_M0_wRn(rd1);        } else {            if (insn & (1 << 20))                gen_op_iwmmxt_muluhw_M0_wRn(rd1);            else                gen_op_iwmmxt_mululw_M0_wRn(rd1);        }        gen_op_iwmmxt_movq_wRn_M0(wrd);        gen_op_iwmmxt_set_mup();        break;    case 0x410: case 0x510: case 0x610: case 0x710:	/* WMAC */        wrd = (insn >> 12) & 0xf;        rd0 = (insn >> 16) & 0xf;        rd1 = (insn >> 0) & 0xf;        gen_op_iwmmxt_movq_M0_wRn(rd0);        if (insn & (1 << 21))            gen_op_iwmmxt_macsw_M0_wRn(rd1);        else            gen_op_iwmmxt_macuw_M0_wRn(rd1);        if (!(insn & (1 << 20))) {            iwmmxt_load_reg(cpu_V1, wrd);            tcg_gen_add_i64(cpu_M0, cpu_M0, cpu_V1);        }        gen_op_iwmmxt_movq_wRn_M0(wrd);        gen_op_iwmmxt_set_mup();        break;    case 0x006: case 0x406: case 0x806: case 0xc06:	/* WCMPEQ */        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_cmpeqb_M0_wRn(rd1);            break;        case 1:            gen_op_iwmmxt_cmpeqw_M0_wRn(rd1);            break;        case 2:            gen_op_iwmmxt_cmpeql_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 0x800: case 0x900: case 0xc00: case 0xd00:	/* WAVG2 */        wrd = (insn >> 12) & 0xf;        rd0 = (insn >> 16) & 0xf;        rd1 = (insn >> 0) & 0xf;        gen_op_iwmmxt_movq_M0_wRn(rd0);        if (insn & (1 << 22)) {            if (insn & (1 << 20))                gen_op_iwmmxt_avgw1_M0_wRn(rd1);            else                gen_op_iwmmxt_avgw0_M0_wRn(rd1);        } else {            if (insn & (1 << 20))                gen_op_iwmmxt_avgb1_M0_wRn(rd1);            else                gen_op_iwmmxt_avgb0_M0_wRn(rd1);        }        gen_op_iwmmxt_movq_wRn_M0(wrd);        gen_op_iwmmxt_set_mup();

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?