target/ppc: Implement lwsync with weaker memory ordering
This allows an x86 host to no-op lwsyncs, and ppc host can use lwsync rather than sync. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20220519135908.21282-5-npiggin@gmail.com> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
parent
fc879703f7
commit
03abfd90cf
@ -2273,6 +2273,8 @@ enum {
|
||||
PPC2_ISA300 = 0x0000000000080000ULL,
|
||||
/* POWER ISA 3.1 */
|
||||
PPC2_ISA310 = 0x0000000000100000ULL,
|
||||
/* lwsync instruction */
|
||||
PPC2_MEM_LWSYNC = 0x0000000000200000ULL,
|
||||
|
||||
#define PPC_TCG_INSNS2 (PPC2_BOOKE206 | PPC2_VSX | PPC2_PRCNTL | PPC2_DBRX | \
|
||||
PPC2_ISA205 | PPC2_VSX207 | PPC2_PERM_ISA206 | \
|
||||
@ -2281,7 +2283,7 @@ enum {
|
||||
PPC2_BCTAR_ISA207 | PPC2_LSQ_ISA207 | \
|
||||
PPC2_ALTIVEC_207 | PPC2_ISA207S | PPC2_DFP | \
|
||||
PPC2_FP_CVT_S64 | PPC2_TM | PPC2_PM_ISA206 | \
|
||||
PPC2_ISA300 | PPC2_ISA310)
|
||||
PPC2_ISA300 | PPC2_ISA310 | PPC2_MEM_LWSYNC)
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -5769,7 +5769,7 @@ POWERPC_FAMILY(970)(ObjectClass *oc, void *data)
|
||||
PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
|
||||
PPC_64B | PPC_ALTIVEC |
|
||||
PPC_SEGMENT_64B | PPC_SLBI;
|
||||
pcc->insns_flags2 = PPC2_FP_CVT_S64;
|
||||
pcc->insns_flags2 = PPC2_FP_CVT_S64 | PPC2_MEM_LWSYNC;
|
||||
pcc->msr_mask = (1ull << MSR_SF) |
|
||||
(1ull << MSR_VR) |
|
||||
(1ull << MSR_POW) |
|
||||
@ -5846,7 +5846,7 @@ POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data)
|
||||
PPC_64B |
|
||||
PPC_POPCNTB |
|
||||
PPC_SEGMENT_64B | PPC_SLBI;
|
||||
pcc->insns_flags2 = PPC2_FP_CVT_S64;
|
||||
pcc->insns_flags2 = PPC2_FP_CVT_S64 | PPC2_MEM_LWSYNC;
|
||||
pcc->msr_mask = (1ull << MSR_SF) |
|
||||
(1ull << MSR_VR) |
|
||||
(1ull << MSR_POW) |
|
||||
@ -5985,7 +5985,7 @@ POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
|
||||
PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
|
||||
PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
|
||||
PPC2_FP_TST_ISA206 | PPC2_FP_CVT_S64 |
|
||||
PPC2_PM_ISA206;
|
||||
PPC2_PM_ISA206 | PPC2_MEM_LWSYNC;
|
||||
pcc->msr_mask = (1ull << MSR_SF) |
|
||||
(1ull << MSR_VR) |
|
||||
(1ull << MSR_VSX) |
|
||||
@ -6159,7 +6159,7 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
|
||||
PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
|
||||
PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
|
||||
PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
|
||||
PPC2_TM | PPC2_PM_ISA206;
|
||||
PPC2_TM | PPC2_PM_ISA206 | PPC2_MEM_LWSYNC;
|
||||
pcc->msr_mask = (1ull << MSR_SF) |
|
||||
(1ull << MSR_HV) |
|
||||
(1ull << MSR_TM) |
|
||||
@ -6379,7 +6379,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
|
||||
PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
|
||||
PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
|
||||
PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
|
||||
PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
|
||||
PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL | PPC2_MEM_LWSYNC;
|
||||
pcc->msr_mask = (1ull << MSR_SF) |
|
||||
(1ull << MSR_HV) |
|
||||
(1ull << MSR_TM) |
|
||||
@ -6596,7 +6596,8 @@ POWERPC_FAMILY(POWER10)(ObjectClass *oc, void *data)
|
||||
PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
|
||||
PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
|
||||
PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
|
||||
PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL | PPC2_ISA310;
|
||||
PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL | PPC2_ISA310 |
|
||||
PPC2_MEM_LWSYNC;
|
||||
pcc->msr_mask = (1ull << MSR_SF) |
|
||||
(1ull << MSR_HV) |
|
||||
(1ull << MSR_TM) |
|
||||
|
@ -157,7 +157,8 @@ static int cpu_pre_save(void *opaque)
|
||||
| PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206
|
||||
| PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207
|
||||
| PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207
|
||||
| PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 | PPC2_TM;
|
||||
| PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 | PPC2_TM
|
||||
| PPC2_MEM_LWSYNC;
|
||||
|
||||
env->spr[SPR_LR] = env->lr;
|
||||
env->spr[SPR_CTR] = env->ctr;
|
||||
|
@ -4041,8 +4041,13 @@ static void gen_stqcx_(DisasContext *ctx)
|
||||
/* sync */
|
||||
static void gen_sync(DisasContext *ctx)
|
||||
{
|
||||
TCGBar bar = TCG_MO_ALL;
|
||||
uint32_t l = (ctx->opcode >> 21) & 3;
|
||||
|
||||
if ((l == 1) && (ctx->insns_flags2 & PPC2_MEM_LWSYNC)) {
|
||||
bar = TCG_MO_LD_LD | TCG_MO_LD_ST | TCG_MO_ST_ST;
|
||||
}
|
||||
|
||||
/*
|
||||
* We may need to check for a pending TLB flush.
|
||||
*
|
||||
@ -4054,7 +4059,8 @@ static void gen_sync(DisasContext *ctx)
|
||||
if (((l == 2) || !(ctx->insns_flags & PPC_64B)) && !ctx->pr) {
|
||||
gen_check_tlb_flush(ctx, true);
|
||||
}
|
||||
tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC);
|
||||
|
||||
tcg_gen_mb(bar | TCG_BAR_SC);
|
||||
}
|
||||
|
||||
/* wait */
|
||||
|
Loading…
Reference in New Issue
Block a user