[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v12 07/14] target-mips: Add ASE DSP GPR-based sh
From: |
Aurelien Jarno |
Subject: |
Re: [Qemu-devel] [PATCH v12 07/14] target-mips: Add ASE DSP GPR-based shift instructions |
Date: |
Wed, 31 Oct 2012 21:29:55 +0100 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
On Wed, Oct 31, 2012 at 09:26:08PM +0800, Jia Liu wrote:
> Hi Aurelien,
>
> Is this time OK?
Yes, the explanation is fine, though it means the generated code is then
not really optimal. On the other hand it means the op is doing what it
is supposed to do.
> static void gen_mipsdsp_shift(DisasContext *ctx, uint32_t opc,
> int ret, int v1, int v2)
> {
> uint32_t op2;
> const char *opn = "mipsdsp shift";
> TCGv t0;
> TCGv v1_t;
> TCGv v2_t;
>
> if (ret == 0) {
> /* Treat as NOP. */
> MIPS_DEBUG("NOP");
> return;
> }
>
> if ((v1 < 0 || v1 > 32) || (v2 < 0 || v2 > 32)) {
> generate_exception(ctx, EXCP_RI);
> return;
> }
>
> t0 = tcg_temp_new();
> v1_t = tcg_temp_new();
> v2_t = tcg_temp_new();
>
> tcg_gen_movi_tl(t0, v1);
> gen_load_gpr(v1_t, v1);
> gen_load_gpr(v2_t, v2);
>
> switch (opc) {
> case OPC_SHLL_QB_DSP:
> {
> op2 = MASK_SHLL_QB(ctx->opcode);
> switch (op2) {
> case OPC_SHLL_QB:
> check_dsp(ctx);
> gen_helper_shll_qb(cpu_gpr[ret], t0, v2_t, cpu_env);
> break;
> case OPC_SHLLV_QB:
> check_dsp(ctx);
> gen_helper_shll_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
> break;
> case OPC_SHLL_PH:
> check_dsp(ctx);
> gen_helper_shll_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
> break;
> case OPC_SHLLV_PH:
> check_dsp(ctx);
> gen_helper_shll_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
> break;
> case OPC_SHLL_S_PH:
> check_dsp(ctx);
> gen_helper_shll_s_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
> break;
> case OPC_SHLLV_S_PH:
> check_dsp(ctx);
> gen_helper_shll_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
> break;
> case OPC_SHLL_S_W:
> check_dsp(ctx);
> gen_helper_shll_s_w(cpu_gpr[ret], t0, v2_t, cpu_env);
> break;
> case OPC_SHLLV_S_W:
> check_dsp(ctx);
> gen_helper_shll_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
> break;
> case OPC_SHRL_QB:
> check_dsp(ctx);
> gen_helper_shrl_qb(cpu_gpr[ret], t0, v2_t);
> break;
> case OPC_SHRLV_QB:
> check_dsp(ctx);
> gen_helper_shrl_qb(cpu_gpr[ret], v1_t, v2_t);
> break;
> case OPC_SHRL_PH:
> check_dspr2(ctx);
> gen_helper_shrl_ph(cpu_gpr[ret], t0, v2_t);
> break;
> case OPC_SHRLV_PH:
> check_dspr2(ctx);
> gen_helper_shrl_ph(cpu_gpr[ret], v1_t, v2_t);
> break;
> case OPC_SHRA_QB:
> check_dspr2(ctx);
> gen_helper_shra_qb(cpu_gpr[ret], t0, v2_t);
> break;
> case OPC_SHRA_R_QB:
> check_dspr2(ctx);
> gen_helper_shra_r_qb(cpu_gpr[ret], t0, v2_t);
> break;
> case OPC_SHRAV_QB:
> check_dspr2(ctx);
> gen_helper_shra_qb(cpu_gpr[ret], v1_t, v2_t);
> break;
> case OPC_SHRAV_R_QB:
> check_dspr2(ctx);
> gen_helper_shra_r_qb(cpu_gpr[ret], v1_t, v2_t);
> break;
> case OPC_SHRA_PH:
> check_dsp(ctx);
> gen_helper_shra_ph(cpu_gpr[ret], t0, v2_t);
> break;
> case OPC_SHRA_R_PH:
> check_dsp(ctx);
> gen_helper_shra_r_ph(cpu_gpr[ret], t0, v2_t);
> break;
> case OPC_SHRAV_PH:
> check_dsp(ctx);
> gen_helper_shra_ph(cpu_gpr[ret], v1_t, v2_t);
> break;
> case OPC_SHRAV_R_PH:
> check_dsp(ctx);
> gen_helper_shra_r_ph(cpu_gpr[ret], v1_t, v2_t);
> break;
> case OPC_SHRA_R_W:
> check_dsp(ctx);
> gen_helper_shra_r_w(cpu_gpr[ret], t0, v2_t);
> break;
> case OPC_SHRAV_R_W:
> check_dsp(ctx);
> gen_helper_shra_r_w(cpu_gpr[ret], v1_t, v2_t);
> break;
> default: /* Invalid */
> MIPS_INVAL("MASK SHLL.QB");
> generate_exception(ctx, EXCP_RI);
> break;
> }
> break;
> }
> #ifdef TARGET_MIPS64
> case OPC_SHLL_OB_DSP:
> op2 = MASK_SHLL_OB(ctx->opcode);
> switch (op2) {
> case OPC_SHLL_PW:
> check_dsp(ctx);
> gen_helper_shll_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
> break;
> case OPC_SHLLV_PW:
> check_dsp(ctx);
> gen_helper_shll_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
> break;
> case OPC_SHLL_S_PW:
> check_dsp(ctx);
> gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
> break;
> case OPC_SHLLV_S_PW:
> check_dsp(ctx);
> gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
> break;
> case OPC_SHLL_OB:
> check_dsp(ctx);
> gen_helper_shll_ob(cpu_gpr[ret], v2_t, t0, cpu_env);
> break;
> case OPC_SHLLV_OB:
> check_dsp(ctx);
> gen_helper_shll_ob(cpu_gpr[ret], v2_t, v1_t, cpu_env);
> break;
> case OPC_SHLL_QH:
> check_dsp(ctx);
> gen_helper_shll_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
> break;
> case OPC_SHLLV_QH:
> check_dsp(ctx);
> gen_helper_shll_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
> break;
> case OPC_SHLL_S_QH:
> check_dsp(ctx);
> gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
> break;
> case OPC_SHLLV_S_QH:
> check_dsp(ctx);
> gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
> break;
> case OPC_SHRA_OB:
> check_dspr2(ctx);
> gen_helper_shra_ob(cpu_gpr[ret], v2_t, t0);
> break;
> case OPC_SHRAV_OB:
> check_dspr2(ctx);
> gen_helper_shra_ob(cpu_gpr[ret], v2_t, v1_t);
> break;
> case OPC_SHRA_R_OB:
> check_dspr2(ctx);
> gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, t0);
> break;
> case OPC_SHRAV_R_OB:
> check_dspr2(ctx);
> gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, v1_t);
> break;
> case OPC_SHRA_PW:
> check_dsp(ctx);
> gen_helper_shra_pw(cpu_gpr[ret], v2_t, t0);
> break;
> case OPC_SHRAV_PW:
> check_dsp(ctx);
> gen_helper_shra_pw(cpu_gpr[ret], v2_t, v1_t);
> break;
> case OPC_SHRA_R_PW:
> check_dsp(ctx);
> gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, t0);
> break;
> case OPC_SHRAV_R_PW:
> check_dsp(ctx);
> gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, v1_t);
> break;
> case OPC_SHRA_QH:
> check_dsp(ctx);
> gen_helper_shra_qh(cpu_gpr[ret], v2_t, t0);
> break;
> case OPC_SHRAV_QH:
> check_dsp(ctx);
> gen_helper_shra_qh(cpu_gpr[ret], v2_t, v1_t);
> break;
> case OPC_SHRA_R_QH:
> check_dsp(ctx);
> gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, t0);
> break;
> case OPC_SHRAV_R_QH:
> check_dsp(ctx);
> gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, v1_t);
> break;
> case OPC_SHRL_OB:
> check_dsp(ctx);
> gen_helper_shrl_ob(cpu_gpr[ret], v2_t, t0);
> break;
> case OPC_SHRLV_OB:
> check_dsp(ctx);
> gen_helper_shrl_ob(cpu_gpr[ret], v2_t, v1_t);
> break;
> case OPC_SHRL_QH:
> check_dspr2(ctx);
> gen_helper_shrl_qh(cpu_gpr[ret], v2_t, t0);
> break;
> case OPC_SHRLV_QH:
> check_dspr2(ctx);
> gen_helper_shrl_qh(cpu_gpr[ret], v2_t, v1_t);
> break;
> default: /* Invalid */
> MIPS_INVAL("MASK SHLL.OB");
> generate_exception(ctx, EXCP_RI);
> break;
> }
> break;
> #endif
> }
>
> tcg_temp_free(t0);
> tcg_temp_free(v1_t);
> tcg_temp_free(v2_t);
> (void)opn; /* avoid a compiler warning */
> MIPS_DEBUG("%s", opn);
> }
>
> Regards,
> Jia.
>
--
Aurelien Jarno GPG: 1024D/F1BCDB73
address@hidden http://www.aurel32.net
- [Qemu-devel] [PATCH v12 00/14] QEMU MIPS ASE DSP su pport, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 01/14] target-mips: Add A SE DSP internal functions, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 02/14] target-mips: Add ASE DSP resources access check, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 03/14] Use correct acc value to index cpu_HI/cpu_LO rather than using a fix number, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 04/14] target-mips: Add ASE DSP branch instructions, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 05/14] target-mips: Add ASE DSP load instructions, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 07/14] target-mips: Add ASE DSP GPR-based shift instructions, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 06/14] target-mips: Add ASE DSP arithmetic instructions, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 11/14] target-mips: Add ASE DSP accumulator instructions, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 14/14] target-mips: Change TODO file, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 13/14] target-mips: Add ASE DSP testcases, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 10/14] target-mips: Add ASE DSP compare-pick instructions, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 08/14] target-mips: Add ASE DSP multiply instructions, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 12/14] target-mips: Add ASE DSP processors, Jia Liu, 2012/10/24
- [Qemu-devel] [PATCH v12 09/14] target-mips: Add ASE DSP bit/manipulation instructions, Jia Liu, 2012/10/24
- Re: [Qemu-devel] [PATCH v12 00/14] QEMU MIPS ASE DSP support, Aurelien Jarno, 2012/10/31