mirror of
https://github.com/qemu/qemu.git
synced 2024-11-24 19:33:39 +08:00
target-sparc: Add accessors for double-precision fpr access.
Begin using i64 quantities to manipulate double-precision values. On a 64-bit host this will, for the moment, generate less efficient code; on a 32-bit host code quality should be largely unchanged. Code quality for 64-bit will be adjusted with a subsequent patch. Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
141ae5c13f
commit
96eda02412
@ -82,6 +82,8 @@ typedef struct DisasContext {
|
||||
uint32_t cc_op; /* current CC operation */
|
||||
struct TranslationBlock *tb;
|
||||
sparc_def_t *def;
|
||||
TCGv_i64 t64[3];
|
||||
int n_t64;
|
||||
} DisasContext;
|
||||
|
||||
// This function uses non-native bit order
|
||||
@ -129,7 +131,7 @@ static TCGv_i32 gen_load_fpr_F(DisasContext *dc, unsigned int src)
|
||||
|
||||
static void gen_store_fpr_F(DisasContext *dc, unsigned int dst, TCGv_i32 v)
|
||||
{
|
||||
tcg_gen_mov_i32 (cpu__fpr[dst], v);
|
||||
tcg_gen_mov_i32(cpu__fpr[dst], v);
|
||||
gen_update_fprs_dirty(dst);
|
||||
}
|
||||
|
||||
@ -138,6 +140,52 @@ static TCGv_i32 gen_dest_fpr_F(void)
|
||||
return cpu_tmp32;
|
||||
}
|
||||
|
||||
static TCGv_i64 gen_load_fpr_D(DisasContext *dc, unsigned int src)
|
||||
{
|
||||
TCGv_i64 ret = tcg_temp_new_i64();
|
||||
src = DFPREG(src);
|
||||
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
tcg_gen_mov_i32(TCGV_HIGH(ret), cpu__fpr[src]);
|
||||
tcg_gen_mov_i32(TCGV_LOW(ret), cpu__fpr[src + 1]);
|
||||
#else
|
||||
{
|
||||
TCGv_i64 t = tcg_temp_new_i64();
|
||||
tcg_gen_extu_i32_i64(ret, cpu__fpr[src]);
|
||||
tcg_gen_extu_i32_i64(t, cpu__fpr[src + 1]);
|
||||
tcg_gen_shli_i64(ret, ret, 32);
|
||||
tcg_gen_or_i64(ret, ret, t);
|
||||
tcg_temp_free_i64(t);
|
||||
}
|
||||
#endif
|
||||
|
||||
dc->t64[dc->n_t64++] = ret;
|
||||
assert(dc->n_t64 <= ARRAY_SIZE(dc->t64));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void gen_store_fpr_D(DisasContext *dc, unsigned int dst, TCGv_i64 v)
|
||||
{
|
||||
dst = DFPREG(dst);
|
||||
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
tcg_gen_mov_i32(cpu__fpu[dst], TCGV_HIGH(v));
|
||||
tcg_gen_mov_i32(cpu__fpu[dst + 1], TCGV_LOW(v));
|
||||
#else
|
||||
tcg_gen_trunc_i64_i32(cpu__fpr[dst + 1], v);
|
||||
tcg_gen_shri_i64(v, v, 32);
|
||||
tcg_gen_trunc_i64_i32(cpu__fpr[dst], v);
|
||||
#endif
|
||||
|
||||
gen_update_fprs_dirty(dst);
|
||||
}
|
||||
|
||||
static TCGv_i64 gen_dest_fpr_D(void)
|
||||
{
|
||||
return cpu_tmp64;
|
||||
}
|
||||
|
||||
static void gen_op_load_fpr_DT0(unsigned int src)
|
||||
{
|
||||
tcg_gen_st_i32(cpu__fpr[src], cpu_env, offsetof(CPUSPARCState, dt0) +
|
||||
@ -1909,6 +1957,7 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
unsigned int insn, opc, rs1, rs2, rd;
|
||||
TCGv cpu_src1, cpu_src2, cpu_tmp1, cpu_tmp2;
|
||||
TCGv_i32 cpu_src1_32, cpu_src2_32, cpu_dst_32;
|
||||
TCGv_i64 cpu_src1_64, cpu_src2_64, cpu_dst_64;
|
||||
target_long simm;
|
||||
|
||||
if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP)))
|
||||
@ -2661,11 +2710,8 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
#ifdef TARGET_SPARC64
|
||||
case 0x2: /* V9 fmovd */
|
||||
tcg_gen_mov_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs2)]);
|
||||
tcg_gen_mov_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs2) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs2);
|
||||
gen_store_fpr_D(dc, rd, cpu_src1_64);
|
||||
break;
|
||||
case 0x3: /* V9 fmovq */
|
||||
CHECK_FPU_FEATURE(dc, FLOAT128);
|
||||
@ -2791,9 +2837,8 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
cpu_src1 = get_src1(insn, cpu_src1);
|
||||
tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1,
|
||||
0, l1);
|
||||
tcg_gen_mov_i32(cpu__fpr[DFPREG(rd)], cpu__fpr[DFPREG(rs2)]);
|
||||
tcg_gen_mov_i32(cpu__fpr[DFPREG(rd) + 1], cpu__fpr[DFPREG(rs2) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs2);
|
||||
gen_store_fpr_D(dc, rd, cpu_src1_64);
|
||||
gen_set_label(l1);
|
||||
break;
|
||||
} else if ((xop & 0x11f) == 0x007) { // V9 fmovqr
|
||||
@ -2843,11 +2888,8 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
gen_fcond(r_cond, fcc, cond); \
|
||||
tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, \
|
||||
0, l1); \
|
||||
tcg_gen_mov_i32(cpu__fpr[DFPREG(rd)], \
|
||||
cpu__fpr[DFPREG(rs2)]); \
|
||||
tcg_gen_mov_i32(cpu__fpr[DFPREG(rd) + 1], \
|
||||
cpu__fpr[DFPREG(rs2) + 1]); \
|
||||
gen_update_fprs_dirty(DFPREG(rd)); \
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs2); \
|
||||
gen_store_fpr_D(dc, rd, cpu_src1_64); \
|
||||
gen_set_label(l1); \
|
||||
tcg_temp_free(r_cond); \
|
||||
}
|
||||
@ -2944,10 +2986,8 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
gen_cond(r_cond, icc, cond, dc); \
|
||||
tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, \
|
||||
0, l1); \
|
||||
tcg_gen_mov_i32(cpu__fpr[DFPREG(rd)], \
|
||||
cpu__fpr[DFPREG(rs2)]); \
|
||||
tcg_gen_mov_i32(cpu__fpr[DFPREG(rd) + 1], \
|
||||
cpu__fpr[DFPREG(rs2) + 1]); \
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs2); \
|
||||
gen_store_fpr_D(dc, rd, cpu_src1_64); \
|
||||
gen_update_fprs_dirty(DFPREG(rd)); \
|
||||
gen_set_label(l1); \
|
||||
tcg_temp_free(r_cond); \
|
||||
@ -4124,9 +4164,9 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x060: /* VIS I fzero */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_movi_i32(cpu__fpr[DFPREG(rd)], 0);
|
||||
tcg_gen_movi_i32(cpu__fpr[DFPREG(rd) + 1], 0);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_movi_i64(cpu_dst_64, 0);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x061: /* VIS I fzeros */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4136,13 +4176,11 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x062: /* VIS I fnor */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_nor_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs1)],
|
||||
cpu__fpr[DFPREG(rs2)]);
|
||||
tcg_gen_nor_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs1) + 1],
|
||||
cpu__fpr[DFPREG(rs2) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs1);
|
||||
cpu_src2_64 = gen_load_fpr_D(dc, rs2);
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_nor_i64(cpu_dst_64, cpu_src1_64, cpu_src2_64);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x063: /* VIS I fnors */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4154,13 +4192,11 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x064: /* VIS I fandnot2 */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_andc_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs1)],
|
||||
cpu__fpr[DFPREG(rs2)]);
|
||||
tcg_gen_andc_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs1) + 1],
|
||||
cpu__fpr[DFPREG(rs2) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs1);
|
||||
cpu_src2_64 = gen_load_fpr_D(dc, rs2);
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_andc_i64(cpu_dst_64, cpu_src1_64, cpu_src2_64);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x065: /* VIS I fandnot2s */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4172,11 +4208,10 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x066: /* VIS I fnot2 */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_not_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs2)]);
|
||||
tcg_gen_not_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs2) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs2);
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_not_i64(cpu_dst_64, cpu_src1_64);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x067: /* VIS I fnot2s */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4187,13 +4222,11 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x068: /* VIS I fandnot1 */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_andc_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs2)],
|
||||
cpu__fpr[DFPREG(rs1)]);
|
||||
tcg_gen_andc_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs2) + 1],
|
||||
cpu__fpr[DFPREG(rs1) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs1);
|
||||
cpu_src2_64 = gen_load_fpr_D(dc, rs2);
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_andc_i64(cpu_dst_64, cpu_src2_64, cpu_src1_64);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x069: /* VIS I fandnot1s */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4205,11 +4238,10 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x06a: /* VIS I fnot1 */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_not_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs1)]);
|
||||
tcg_gen_not_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs1) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs1);
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_not_i64(cpu_dst_64, cpu_src1_64);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x06b: /* VIS I fnot1s */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4220,13 +4252,11 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x06c: /* VIS I fxor */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_xor_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs1)],
|
||||
cpu__fpr[DFPREG(rs2)]);
|
||||
tcg_gen_xor_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs1) + 1],
|
||||
cpu__fpr[DFPREG(rs2) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs1);
|
||||
cpu_src2_64 = gen_load_fpr_D(dc, rs2);
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_xor_i64(cpu_dst_64, cpu_src1_64, cpu_src2_64);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x06d: /* VIS I fxors */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4238,13 +4268,11 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x06e: /* VIS I fnand */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_nand_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs1)],
|
||||
cpu__fpr[DFPREG(rs2)]);
|
||||
tcg_gen_nand_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs1) + 1],
|
||||
cpu__fpr[DFPREG(rs2) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs1);
|
||||
cpu_src2_64 = gen_load_fpr_D(dc, rs2);
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_nand_i64(cpu_dst_64, cpu_src1_64, cpu_src2_64);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x06f: /* VIS I fnands */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4256,13 +4284,11 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x070: /* VIS I fand */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_and_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs1)],
|
||||
cpu__fpr[DFPREG(rs2)]);
|
||||
tcg_gen_and_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs1) + 1],
|
||||
cpu__fpr[DFPREG(rs2) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs1);
|
||||
cpu_src2_64 = gen_load_fpr_D(dc, rs2);
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_and_i64(cpu_dst_64, cpu_src1_64, cpu_src2_64);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x071: /* VIS I fands */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4274,13 +4300,11 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x072: /* VIS I fxnor */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_eqv_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs1)],
|
||||
cpu__fpr[DFPREG(rs2)]);
|
||||
tcg_gen_eqv_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs1) + 1],
|
||||
cpu__fpr[DFPREG(rs2) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs1);
|
||||
cpu_src2_64 = gen_load_fpr_D(dc, rs2);
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_eqv_i64(cpu_dst_64, cpu_src1_64, cpu_src2_64);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x073: /* VIS I fxnors */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4292,11 +4316,8 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x074: /* VIS I fsrc1 */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_mov_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs1)]);
|
||||
tcg_gen_mov_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs1) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs1);
|
||||
gen_store_fpr_D(dc, rd, cpu_src1_64);
|
||||
break;
|
||||
case 0x075: /* VIS I fsrc1s */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4305,13 +4326,11 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x076: /* VIS I fornot2 */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_orc_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs1)],
|
||||
cpu__fpr[DFPREG(rs2)]);
|
||||
tcg_gen_orc_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs1) + 1],
|
||||
cpu__fpr[DFPREG(rs2) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs1);
|
||||
cpu_src2_64 = gen_load_fpr_D(dc, rs2);
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_orc_i64(cpu_dst_64, cpu_src1_64, cpu_src2_64);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x077: /* VIS I fornot2s */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4323,9 +4342,8 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x078: /* VIS I fsrc2 */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
gen_op_load_fpr_DT0(DFPREG(rs2));
|
||||
gen_op_store_DT0_fpr(DFPREG(rd));
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs2);
|
||||
gen_store_fpr_D(dc, rd, cpu_src1_64);
|
||||
break;
|
||||
case 0x079: /* VIS I fsrc2s */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4334,13 +4352,11 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x07a: /* VIS I fornot1 */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_orc_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs2)],
|
||||
cpu__fpr[DFPREG(rs1)]);
|
||||
tcg_gen_orc_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs2) + 1],
|
||||
cpu__fpr[DFPREG(rs1) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs1);
|
||||
cpu_src2_64 = gen_load_fpr_D(dc, rs2);
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_orc_i64(cpu_dst_64, cpu_src2_64, cpu_src1_64);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x07b: /* VIS I fornot1s */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4352,13 +4368,11 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x07c: /* VIS I for */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_or_i32(cpu__fpr[DFPREG(rd)],
|
||||
cpu__fpr[DFPREG(rs1)],
|
||||
cpu__fpr[DFPREG(rs2)]);
|
||||
tcg_gen_or_i32(cpu__fpr[DFPREG(rd) + 1],
|
||||
cpu__fpr[DFPREG(rs1) + 1],
|
||||
cpu__fpr[DFPREG(rs2) + 1]);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_src1_64 = gen_load_fpr_D(dc, rs1);
|
||||
cpu_src2_64 = gen_load_fpr_D(dc, rs2);
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_or_i64(cpu_dst_64, cpu_src1_64, cpu_src2_64);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x07d: /* VIS I fors */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -4370,9 +4384,9 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||
break;
|
||||
case 0x07e: /* VIS I fone */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
tcg_gen_movi_i32(cpu__fpr[DFPREG(rd)], -1);
|
||||
tcg_gen_movi_i32(cpu__fpr[DFPREG(rd) + 1], -1);
|
||||
gen_update_fprs_dirty(DFPREG(rd));
|
||||
cpu_dst_64 = gen_dest_fpr_D();
|
||||
tcg_gen_movi_i64(cpu_dst_64, -1);
|
||||
gen_store_fpr_D(dc, rd, cpu_dst_64);
|
||||
break;
|
||||
case 0x07f: /* VIS I fones */
|
||||
CHECK_FPU_FEATURE(dc, VIS1);
|
||||
@ -5199,6 +5213,10 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb,
|
||||
tcg_temp_free_i64(cpu_tmp64);
|
||||
tcg_temp_free_i32(cpu_tmp32);
|
||||
tcg_temp_free(cpu_tmp0);
|
||||
for (j = dc->n_t64 - 1; j >= 0; --j) {
|
||||
tcg_temp_free_i64(dc->t64[j]);
|
||||
}
|
||||
|
||||
if (tb->cflags & CF_LAST_IO)
|
||||
gen_io_end();
|
||||
if (!dc->is_br) {
|
||||
|
Loading…
Reference in New Issue
Block a user