target/ppc: Implement xxm[tf]acc and xxsetaccz
Implement the following PowerISA v3.1 instructions: xxmfacc: VSX Move From Accumulator xxmtacc: VSX Move To Accumulator xxsetaccz: VSX Set Accumulator to Zero The PowerISA 3.1 mentions that for the current version of the architecture, "the hardware implementation provides the effect of ACC[i] and VSRs 4*i to 4*i + 3 logically containing the same data" and "The Accumulators introduce no new logical state at this time" (page 501). For now it seems unnecessary to create new structures, so this patch just uses ACC[i] as VSRs 4*i to 4*i+3 and therefore move to and from accumulators are no-ops. Signed-off-by: Lucas Mateus Castro (alqotel) <lucas.araujo@eldorado.org.br> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20220524140537.27451-2-lucas.araujo@eldorado.org.br> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
parent
03abfd90cf
commit
a702c5339e
@ -2663,6 +2663,11 @@ static inline int vsr_full_offset(int i)
|
||||
return offsetof(CPUPPCState, vsr[i].u64[0]);
|
||||
}
|
||||
|
||||
static inline int acc_full_offset(int i)
|
||||
{
|
||||
return vsr_full_offset(i * 4);
|
||||
}
|
||||
|
||||
static inline int fpr_offset(int i)
|
||||
{
|
||||
return vsr64_offset(i, true);
|
||||
|
@ -154,6 +154,9 @@
|
||||
&X_vrt_frbp vrt frbp
|
||||
@X_vrt_frbp ...... vrt:5 ..... ....0 .......... . &X_vrt_frbp frbp=%x_frbp
|
||||
|
||||
&X_a ra
|
||||
@X_a ...... ra:3 .. ..... ..... .......... . &X_a
|
||||
|
||||
%xx_xt 0:1 21:5
|
||||
%xx_xb 1:1 11:5
|
||||
%xx_xa 2:1 16:5
|
||||
@ -734,3 +737,9 @@ XVTLSBB 111100 ... -- 00010 ..... 111011011 . - @XX2_bf_xb
|
||||
&XL_s s:uint8_t
|
||||
@XL_s ......-------------- s:1 .......... - &XL_s
|
||||
RFEBB 010011-------------- . 0010010010 - @XL_s
|
||||
|
||||
## Accumulator Instructions
|
||||
|
||||
XXMFACC 011111 ... -- 00000 ----- 0010110001 - @X_a
|
||||
XXMTACC 011111 ... -- 00001 ----- 0010110001 - @X_a
|
||||
XXSETACCZ 011111 ... -- 00011 ----- 0010110001 - @X_a
|
||||
|
@ -2816,6 +2816,37 @@ static bool trans_XVCVBF16SPN(DisasContext *ctx, arg_XX2 *a)
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* The PowerISA 3.1 mentions that for the current version of the
|
||||
* architecture, "the hardware implementation provides the effect of
|
||||
* ACC[i] and VSRs 4*i to 4*i + 3 logically containing the same data"
|
||||
* and "The Accumulators introduce no new logical state at this time"
|
||||
* (page 501). For now it seems unnecessary to create new structures,
|
||||
* so ACC[i] is the same as VSRs 4*i to 4*i+3 and therefore
|
||||
* move to and from accumulators are no-ops.
|
||||
*/
|
||||
static bool trans_XXMFACC(DisasContext *ctx, arg_X_a *a)
|
||||
{
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA310);
|
||||
REQUIRE_VSX(ctx);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_XXMTACC(DisasContext *ctx, arg_X_a *a)
|
||||
{
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA310);
|
||||
REQUIRE_VSX(ctx);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_XXSETACCZ(DisasContext *ctx, arg_X_a *a)
|
||||
{
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA310);
|
||||
REQUIRE_VSX(ctx);
|
||||
tcg_gen_gvec_dup_imm(MO_64, acc_full_offset(a->ra), 64, 64, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
#undef GEN_XX2FORM
|
||||
#undef GEN_XX3FORM
|
||||
#undef GEN_XX2IFORM
|
||||
|
Loading…
Reference in New Issue
Block a user