target/ppc: Move VSX vector storage access insns to decodetree.
Moving the following instructions to decodetree specification:
  lxv{b16, d2, h8, w4, ds, ws}x   : X-form
  stxv{b16, d2, h8, w4}x          : X-form
The changes were verified by validating that the tcg-ops generated for those
instructions remain the same, which were captured using the '-d in_asm,op' flag.
Signed-off-by: Chinmay Rath <rathc@linux.ibm.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
			
			
This commit is contained in:
		
				
					committed by
					
						
						Nicholas Piggin
					
				
			
			
				
	
			
			
			
						parent
						
							29df8d950e
						
					
				
				
					commit
					7419dc5b2b
				
			@@ -1006,9 +1006,19 @@ STXSIHX         011111 ..... ..... ..... 1110101101 .   @X_TSX
 | 
			
		||||
STXSIWX         011111 ..... ..... ..... 0010001100 .   @X_TSX
 | 
			
		||||
STXSSPX         011111 ..... ..... ..... 1010001100 .   @X_TSX
 | 
			
		||||
 | 
			
		||||
LXVB16X         011111 ..... ..... ..... 1101101100 .   @X_TSX
 | 
			
		||||
LXVD2X          011111 ..... ..... ..... 1101001100 .   @X_TSX
 | 
			
		||||
LXVH8X          011111 ..... ..... ..... 1100101100 .   @X_TSX
 | 
			
		||||
LXVW4X          011111 ..... ..... ..... 1100001100 .   @X_TSX
 | 
			
		||||
LXVDSX          011111 ..... ..... ..... 0101001100 .   @X_TSX
 | 
			
		||||
LXVWSX          011111 ..... ..... ..... 0101101100 .   @X_TSX
 | 
			
		||||
LXVL            011111 ..... ..... ..... 0100001101 .   @X_TSX
 | 
			
		||||
LXVLL           011111 ..... ..... ..... 0100101101 .   @X_TSX
 | 
			
		||||
 | 
			
		||||
STXVB16X        011111 ..... ..... ..... 1111101100 .   @X_TSX
 | 
			
		||||
STXVD2X         011111 ..... ..... ..... 1111001100 .   @X_TSX
 | 
			
		||||
STXVH8X         011111 ..... ..... ..... 1110101100 .   @X_TSX
 | 
			
		||||
STXVW4X         011111 ..... ..... ..... 1110001100 .   @X_TSX
 | 
			
		||||
STXVL           011111 ..... ..... ..... 0110001101 .   @X_TSX
 | 
			
		||||
STXVLL          011111 ..... ..... ..... 0110101101 .   @X_TSX
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -46,41 +46,37 @@ TRANS_FLAGS2(ISA300, LXSIHZX, do_lxs, gen_qemu_ld16u_i64);
 | 
			
		||||
TRANS_FLAGS2(VSX207, LXSIWZX, do_lxs, gen_qemu_ld32u_i64);
 | 
			
		||||
TRANS_FLAGS2(VSX207, LXSSPX, do_lxs, gen_qemu_ld32fs);
 | 
			
		||||
 | 
			
		||||
static void gen_lxvd2x(DisasContext *ctx)
 | 
			
		||||
static bool trans_LXVD2X(DisasContext *ctx, arg_LXVD2X *a)
 | 
			
		||||
{
 | 
			
		||||
    TCGv EA;
 | 
			
		||||
    TCGv_i64 t0;
 | 
			
		||||
    if (unlikely(!ctx->vsx_enabled)) {
 | 
			
		||||
        gen_exception(ctx, POWERPC_EXCP_VSXU);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    REQUIRE_VSX(ctx);
 | 
			
		||||
    REQUIRE_INSNS_FLAGS2(ctx, VSX);
 | 
			
		||||
 | 
			
		||||
    t0 = tcg_temp_new_i64();
 | 
			
		||||
    gen_set_access_type(ctx, ACCESS_INT);
 | 
			
		||||
    EA = tcg_temp_new();
 | 
			
		||||
    gen_addr_reg_index(ctx, EA);
 | 
			
		||||
    EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
 | 
			
		||||
    gen_qemu_ld64_i64(ctx, t0, EA);
 | 
			
		||||
    set_cpu_vsr(xT(ctx->opcode), t0, true);
 | 
			
		||||
    set_cpu_vsr(a->rt, t0, true);
 | 
			
		||||
    tcg_gen_addi_tl(EA, EA, 8);
 | 
			
		||||
    gen_qemu_ld64_i64(ctx, t0, EA);
 | 
			
		||||
    set_cpu_vsr(xT(ctx->opcode), t0, false);
 | 
			
		||||
    set_cpu_vsr(a->rt, t0, false);
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void gen_lxvw4x(DisasContext *ctx)
 | 
			
		||||
static bool trans_LXVW4X(DisasContext *ctx, arg_LXVW4X *a)
 | 
			
		||||
{
 | 
			
		||||
    TCGv EA;
 | 
			
		||||
    TCGv_i64 xth;
 | 
			
		||||
    TCGv_i64 xtl;
 | 
			
		||||
    if (unlikely(!ctx->vsx_enabled)) {
 | 
			
		||||
        gen_exception(ctx, POWERPC_EXCP_VSXU);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    TCGv_i64 xth, xtl;
 | 
			
		||||
 | 
			
		||||
    REQUIRE_VSX(ctx);
 | 
			
		||||
    REQUIRE_INSNS_FLAGS2(ctx, VSX);
 | 
			
		||||
 | 
			
		||||
    xth = tcg_temp_new_i64();
 | 
			
		||||
    xtl = tcg_temp_new_i64();
 | 
			
		||||
 | 
			
		||||
    gen_set_access_type(ctx, ACCESS_INT);
 | 
			
		||||
    EA = tcg_temp_new();
 | 
			
		||||
 | 
			
		||||
    gen_addr_reg_index(ctx, EA);
 | 
			
		||||
    EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
 | 
			
		||||
    if (ctx->le_mode) {
 | 
			
		||||
        TCGv_i64 t0 = tcg_temp_new_i64();
 | 
			
		||||
        TCGv_i64 t1 = tcg_temp_new_i64();
 | 
			
		||||
@@ -97,55 +93,45 @@ static void gen_lxvw4x(DisasContext *ctx)
 | 
			
		||||
        tcg_gen_addi_tl(EA, EA, 8);
 | 
			
		||||
        tcg_gen_qemu_ld_i64(xtl, EA, ctx->mem_idx, MO_BEUQ);
 | 
			
		||||
    }
 | 
			
		||||
    set_cpu_vsr(xT(ctx->opcode), xth, true);
 | 
			
		||||
    set_cpu_vsr(xT(ctx->opcode), xtl, false);
 | 
			
		||||
    set_cpu_vsr(a->rt, xth, true);
 | 
			
		||||
    set_cpu_vsr(a->rt, xtl, false);
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void gen_lxvwsx(DisasContext *ctx)
 | 
			
		||||
static bool trans_LXVWSX(DisasContext *ctx, arg_LXVWSX *a)
 | 
			
		||||
{
 | 
			
		||||
    TCGv EA;
 | 
			
		||||
    TCGv_i32 data;
 | 
			
		||||
 | 
			
		||||
    if (xT(ctx->opcode) < 32) {
 | 
			
		||||
        if (unlikely(!ctx->vsx_enabled)) {
 | 
			
		||||
            gen_exception(ctx, POWERPC_EXCP_VSXU);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    if (a->rt < 32) {
 | 
			
		||||
        REQUIRE_VSX(ctx);
 | 
			
		||||
    } else {
 | 
			
		||||
        if (unlikely(!ctx->altivec_enabled)) {
 | 
			
		||||
            gen_exception(ctx, POWERPC_EXCP_VPU);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        REQUIRE_VECTOR(ctx);
 | 
			
		||||
    }
 | 
			
		||||
    REQUIRE_INSNS_FLAGS2(ctx, ISA300);
 | 
			
		||||
 | 
			
		||||
    gen_set_access_type(ctx, ACCESS_INT);
 | 
			
		||||
    EA = tcg_temp_new();
 | 
			
		||||
 | 
			
		||||
    gen_addr_reg_index(ctx, EA);
 | 
			
		||||
 | 
			
		||||
    EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
 | 
			
		||||
    data = tcg_temp_new_i32();
 | 
			
		||||
    tcg_gen_qemu_ld_i32(data, EA, ctx->mem_idx, DEF_MEMOP(MO_UL));
 | 
			
		||||
    tcg_gen_gvec_dup_i32(MO_UL, vsr_full_offset(xT(ctx->opcode)), 16, 16, data);
 | 
			
		||||
    tcg_gen_gvec_dup_i32(MO_UL, vsr_full_offset(a->rt), 16, 16, data);
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void gen_lxvdsx(DisasContext *ctx)
 | 
			
		||||
static bool trans_LXVDSX(DisasContext *ctx, arg_LXVDSX *a)
 | 
			
		||||
{
 | 
			
		||||
    TCGv EA;
 | 
			
		||||
    TCGv_i64 data;
 | 
			
		||||
 | 
			
		||||
    if (unlikely(!ctx->vsx_enabled)) {
 | 
			
		||||
        gen_exception(ctx, POWERPC_EXCP_VSXU);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    REQUIRE_VSX(ctx);
 | 
			
		||||
    REQUIRE_INSNS_FLAGS2(ctx, VSX);
 | 
			
		||||
 | 
			
		||||
    gen_set_access_type(ctx, ACCESS_INT);
 | 
			
		||||
    EA = tcg_temp_new();
 | 
			
		||||
 | 
			
		||||
    gen_addr_reg_index(ctx, EA);
 | 
			
		||||
 | 
			
		||||
    EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
 | 
			
		||||
    data = tcg_temp_new_i64();
 | 
			
		||||
    tcg_gen_qemu_ld_i64(data, EA, ctx->mem_idx, DEF_MEMOP(MO_UQ));
 | 
			
		||||
    tcg_gen_gvec_dup_i64(MO_UQ, vsr_full_offset(xT(ctx->opcode)), 16, 16, data);
 | 
			
		||||
    tcg_gen_gvec_dup_i64(MO_UQ, vsr_full_offset(a->rt), 16, 16, data);
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void gen_bswap16x8(TCGv_i64 outh, TCGv_i64 outl,
 | 
			
		||||
@@ -184,52 +170,47 @@ static void gen_bswap32x4(TCGv_i64 outh, TCGv_i64 outl,
 | 
			
		||||
    tcg_gen_deposit_i64(outl, outl, lo, 32, 32);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void gen_lxvh8x(DisasContext *ctx)
 | 
			
		||||
static bool trans_LXVH8X(DisasContext *ctx, arg_LXVH8X *a)
 | 
			
		||||
{
 | 
			
		||||
    TCGv EA;
 | 
			
		||||
    TCGv_i64 xth;
 | 
			
		||||
    TCGv_i64 xtl;
 | 
			
		||||
    TCGv_i64 xth, xtl;
 | 
			
		||||
 | 
			
		||||
    REQUIRE_VSX(ctx);
 | 
			
		||||
    REQUIRE_INSNS_FLAGS2(ctx, ISA300);
 | 
			
		||||
 | 
			
		||||
    if (unlikely(!ctx->vsx_enabled)) {
 | 
			
		||||
        gen_exception(ctx, POWERPC_EXCP_VSXU);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    xth = tcg_temp_new_i64();
 | 
			
		||||
    xtl = tcg_temp_new_i64();
 | 
			
		||||
    gen_set_access_type(ctx, ACCESS_INT);
 | 
			
		||||
 | 
			
		||||
    EA = tcg_temp_new();
 | 
			
		||||
    gen_addr_reg_index(ctx, EA);
 | 
			
		||||
    EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
 | 
			
		||||
    tcg_gen_qemu_ld_i64(xth, EA, ctx->mem_idx, MO_BEUQ);
 | 
			
		||||
    tcg_gen_addi_tl(EA, EA, 8);
 | 
			
		||||
    tcg_gen_qemu_ld_i64(xtl, EA, ctx->mem_idx, MO_BEUQ);
 | 
			
		||||
    if (ctx->le_mode) {
 | 
			
		||||
        gen_bswap16x8(xth, xtl, xth, xtl);
 | 
			
		||||
    }
 | 
			
		||||
    set_cpu_vsr(xT(ctx->opcode), xth, true);
 | 
			
		||||
    set_cpu_vsr(xT(ctx->opcode), xtl, false);
 | 
			
		||||
    set_cpu_vsr(a->rt, xth, true);
 | 
			
		||||
    set_cpu_vsr(a->rt, xtl, false);
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void gen_lxvb16x(DisasContext *ctx)
 | 
			
		||||
static bool trans_LXVB16X(DisasContext *ctx, arg_LXVB16X *a)
 | 
			
		||||
{
 | 
			
		||||
    TCGv EA;
 | 
			
		||||
    TCGv_i64 xth;
 | 
			
		||||
    TCGv_i64 xtl;
 | 
			
		||||
    TCGv_i64 xth, xtl;
 | 
			
		||||
 | 
			
		||||
    REQUIRE_VSX(ctx);
 | 
			
		||||
    REQUIRE_INSNS_FLAGS2(ctx, ISA300);
 | 
			
		||||
 | 
			
		||||
    if (unlikely(!ctx->vsx_enabled)) {
 | 
			
		||||
        gen_exception(ctx, POWERPC_EXCP_VSXU);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    xth = tcg_temp_new_i64();
 | 
			
		||||
    xtl = tcg_temp_new_i64();
 | 
			
		||||
    gen_set_access_type(ctx, ACCESS_INT);
 | 
			
		||||
    EA = tcg_temp_new();
 | 
			
		||||
    gen_addr_reg_index(ctx, EA);
 | 
			
		||||
    EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
 | 
			
		||||
    tcg_gen_qemu_ld_i64(xth, EA, ctx->mem_idx, MO_BEUQ);
 | 
			
		||||
    tcg_gen_addi_tl(EA, EA, 8);
 | 
			
		||||
    tcg_gen_qemu_ld_i64(xtl, EA, ctx->mem_idx, MO_BEUQ);
 | 
			
		||||
    set_cpu_vsr(xT(ctx->opcode), xth, true);
 | 
			
		||||
    set_cpu_vsr(xT(ctx->opcode), xtl, false);
 | 
			
		||||
    set_cpu_vsr(a->rt, xth, true);
 | 
			
		||||
    set_cpu_vsr(a->rt, xtl, false);
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(TARGET_PPC64)
 | 
			
		||||
@@ -319,42 +300,39 @@ TRANS_FLAGS2(ISA300, STXSIHX, do_stxs, gen_qemu_st16_i64);
 | 
			
		||||
TRANS_FLAGS2(VSX207, STXSIWX, do_stxs, gen_qemu_st32_i64);
 | 
			
		||||
TRANS_FLAGS2(VSX207, STXSSPX, do_stxs, gen_qemu_st32fs);
 | 
			
		||||
 | 
			
		||||
static void gen_stxvd2x(DisasContext *ctx)
 | 
			
		||||
static bool trans_STXVD2X(DisasContext *ctx, arg_STXVD2X *a)
 | 
			
		||||
{
 | 
			
		||||
    TCGv EA;
 | 
			
		||||
    TCGv_i64 t0;
 | 
			
		||||
    if (unlikely(!ctx->vsx_enabled)) {
 | 
			
		||||
        gen_exception(ctx, POWERPC_EXCP_VSXU);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    REQUIRE_VSX(ctx);
 | 
			
		||||
    REQUIRE_INSNS_FLAGS2(ctx, VSX);
 | 
			
		||||
 | 
			
		||||
    t0 = tcg_temp_new_i64();
 | 
			
		||||
    gen_set_access_type(ctx, ACCESS_INT);
 | 
			
		||||
    EA = tcg_temp_new();
 | 
			
		||||
    gen_addr_reg_index(ctx, EA);
 | 
			
		||||
    get_cpu_vsr(t0, xS(ctx->opcode), true);
 | 
			
		||||
    EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
 | 
			
		||||
    get_cpu_vsr(t0, a->rt, true);
 | 
			
		||||
    gen_qemu_st64_i64(ctx, t0, EA);
 | 
			
		||||
    tcg_gen_addi_tl(EA, EA, 8);
 | 
			
		||||
    get_cpu_vsr(t0, xS(ctx->opcode), false);
 | 
			
		||||
    get_cpu_vsr(t0, a->rt, false);
 | 
			
		||||
    gen_qemu_st64_i64(ctx, t0, EA);
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void gen_stxvw4x(DisasContext *ctx)
 | 
			
		||||
static bool trans_STXVW4X(DisasContext *ctx, arg_STXVW4X *a)
 | 
			
		||||
{
 | 
			
		||||
    TCGv EA;
 | 
			
		||||
    TCGv_i64 xsh;
 | 
			
		||||
    TCGv_i64 xsl;
 | 
			
		||||
    TCGv_i64 xsh, xsl;
 | 
			
		||||
 | 
			
		||||
    REQUIRE_VSX(ctx);
 | 
			
		||||
    REQUIRE_INSNS_FLAGS2(ctx, VSX);
 | 
			
		||||
 | 
			
		||||
    if (unlikely(!ctx->vsx_enabled)) {
 | 
			
		||||
        gen_exception(ctx, POWERPC_EXCP_VSXU);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    xsh = tcg_temp_new_i64();
 | 
			
		||||
    xsl = tcg_temp_new_i64();
 | 
			
		||||
    get_cpu_vsr(xsh, xS(ctx->opcode), true);
 | 
			
		||||
    get_cpu_vsr(xsl, xS(ctx->opcode), false);
 | 
			
		||||
    get_cpu_vsr(xsh, a->rt, true);
 | 
			
		||||
    get_cpu_vsr(xsl, a->rt, false);
 | 
			
		||||
    gen_set_access_type(ctx, ACCESS_INT);
 | 
			
		||||
    EA = tcg_temp_new();
 | 
			
		||||
    gen_addr_reg_index(ctx, EA);
 | 
			
		||||
    EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
 | 
			
		||||
    if (ctx->le_mode) {
 | 
			
		||||
        TCGv_i64 t0 = tcg_temp_new_i64();
 | 
			
		||||
        TCGv_i64 t1 = tcg_temp_new_i64();
 | 
			
		||||
@@ -371,25 +349,23 @@ static void gen_stxvw4x(DisasContext *ctx)
 | 
			
		||||
        tcg_gen_addi_tl(EA, EA, 8);
 | 
			
		||||
        tcg_gen_qemu_st_i64(xsl, EA, ctx->mem_idx, MO_BEUQ);
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void gen_stxvh8x(DisasContext *ctx)
 | 
			
		||||
static bool trans_STXVH8X(DisasContext *ctx, arg_STXVH8X *a)
 | 
			
		||||
{
 | 
			
		||||
    TCGv EA;
 | 
			
		||||
    TCGv_i64 xsh;
 | 
			
		||||
    TCGv_i64 xsl;
 | 
			
		||||
    TCGv_i64 xsh, xsl;
 | 
			
		||||
 | 
			
		||||
    REQUIRE_VSX(ctx);
 | 
			
		||||
    REQUIRE_INSNS_FLAGS2(ctx, ISA300);
 | 
			
		||||
 | 
			
		||||
    if (unlikely(!ctx->vsx_enabled)) {
 | 
			
		||||
        gen_exception(ctx, POWERPC_EXCP_VSXU);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    xsh = tcg_temp_new_i64();
 | 
			
		||||
    xsl = tcg_temp_new_i64();
 | 
			
		||||
    get_cpu_vsr(xsh, xS(ctx->opcode), true);
 | 
			
		||||
    get_cpu_vsr(xsl, xS(ctx->opcode), false);
 | 
			
		||||
    get_cpu_vsr(xsh, a->rt, true);
 | 
			
		||||
    get_cpu_vsr(xsl, a->rt, false);
 | 
			
		||||
    gen_set_access_type(ctx, ACCESS_INT);
 | 
			
		||||
    EA = tcg_temp_new();
 | 
			
		||||
    gen_addr_reg_index(ctx, EA);
 | 
			
		||||
    EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
 | 
			
		||||
    if (ctx->le_mode) {
 | 
			
		||||
        TCGv_i64 outh = tcg_temp_new_i64();
 | 
			
		||||
        TCGv_i64 outl = tcg_temp_new_i64();
 | 
			
		||||
@@ -403,28 +379,27 @@ static void gen_stxvh8x(DisasContext *ctx)
 | 
			
		||||
        tcg_gen_addi_tl(EA, EA, 8);
 | 
			
		||||
        tcg_gen_qemu_st_i64(xsl, EA, ctx->mem_idx, MO_BEUQ);
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void gen_stxvb16x(DisasContext *ctx)
 | 
			
		||||
static bool trans_STXVB16X(DisasContext *ctx, arg_STXVB16X *a)
 | 
			
		||||
{
 | 
			
		||||
    TCGv EA;
 | 
			
		||||
    TCGv_i64 xsh;
 | 
			
		||||
    TCGv_i64 xsl;
 | 
			
		||||
    TCGv_i64 xsh, xsl;
 | 
			
		||||
 | 
			
		||||
    REQUIRE_VSX(ctx);
 | 
			
		||||
    REQUIRE_INSNS_FLAGS2(ctx, ISA300);
 | 
			
		||||
 | 
			
		||||
    if (unlikely(!ctx->vsx_enabled)) {
 | 
			
		||||
        gen_exception(ctx, POWERPC_EXCP_VSXU);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    xsh = tcg_temp_new_i64();
 | 
			
		||||
    xsl = tcg_temp_new_i64();
 | 
			
		||||
    get_cpu_vsr(xsh, xS(ctx->opcode), true);
 | 
			
		||||
    get_cpu_vsr(xsl, xS(ctx->opcode), false);
 | 
			
		||||
    get_cpu_vsr(xsh, a->rt, true);
 | 
			
		||||
    get_cpu_vsr(xsl, a->rt, false);
 | 
			
		||||
    gen_set_access_type(ctx, ACCESS_INT);
 | 
			
		||||
    EA = tcg_temp_new();
 | 
			
		||||
    gen_addr_reg_index(ctx, EA);
 | 
			
		||||
    EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
 | 
			
		||||
    tcg_gen_qemu_st_i64(xsh, EA, ctx->mem_idx, MO_BEUQ);
 | 
			
		||||
    tcg_gen_addi_tl(EA, EA, 8);
 | 
			
		||||
    tcg_gen_qemu_st_i64(xsl, EA, ctx->mem_idx, MO_BEUQ);
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void gen_mfvsrwz(DisasContext *ctx)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,3 @@
 | 
			
		||||
GEN_HANDLER_E(lxvd2x, 0x1F, 0x0C, 0x1A, 0, PPC_NONE, PPC2_VSX),
 | 
			
		||||
GEN_HANDLER_E(lxvwsx, 0x1F, 0x0C, 0x0B, 0, PPC_NONE, PPC2_ISA300),
 | 
			
		||||
GEN_HANDLER_E(lxvdsx, 0x1F, 0x0C, 0x0A, 0, PPC_NONE, PPC2_VSX),
 | 
			
		||||
GEN_HANDLER_E(lxvw4x, 0x1F, 0x0C, 0x18, 0, PPC_NONE, PPC2_VSX),
 | 
			
		||||
GEN_HANDLER_E(lxvh8x, 0x1F, 0x0C, 0x19, 0, PPC_NONE,  PPC2_ISA300),
 | 
			
		||||
GEN_HANDLER_E(lxvb16x, 0x1F, 0x0C, 0x1B, 0, PPC_NONE, PPC2_ISA300),
 | 
			
		||||
 | 
			
		||||
GEN_HANDLER_E(stxvd2x, 0x1F, 0xC, 0x1E, 0, PPC_NONE, PPC2_VSX),
 | 
			
		||||
GEN_HANDLER_E(stxvw4x, 0x1F, 0xC, 0x1C, 0, PPC_NONE, PPC2_VSX),
 | 
			
		||||
GEN_HANDLER_E(stxvh8x, 0x1F, 0x0C, 0x1D, 0, PPC_NONE,  PPC2_ISA300),
 | 
			
		||||
GEN_HANDLER_E(stxvb16x, 0x1F, 0x0C, 0x1F, 0, PPC_NONE, PPC2_ISA300),
 | 
			
		||||
 | 
			
		||||
GEN_HANDLER_E(mfvsrwz, 0x1F, 0x13, 0x03, 0x0000F800, PPC_NONE, PPC2_VSX207),
 | 
			
		||||
GEN_HANDLER_E(mtvsrwa, 0x1F, 0x13, 0x06, 0x0000F800, PPC_NONE, PPC2_VSX207),
 | 
			
		||||
GEN_HANDLER_E(mtvsrwz, 0x1F, 0x13, 0x07, 0x0000F800, PPC_NONE, PPC2_VSX207),
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user