mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-02-10 09:25:16 +07:00
powerpc: Avoid load hit store in __giveup_fpu() and __giveup_altivec()
In both __giveup_fpu() and __giveup_altivec() we make two modifications to tsk->thread.regs->msr. gcc decides to do a read/modify/write of each change, so we end up with a load hit store: ld r9,264(r10) rldicl r9,r9,50,1 rotldi r9,r9,14 std r9,264(r10) ... ld r9,264(r10) rldicl r9,r9,40,1 rotldi r9,r9,24 std r9,264(r10) Fix this by using a temporary. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
5edb56491d
commit
8eb9803723
@ -139,12 +139,16 @@ EXPORT_SYMBOL(__msr_check_and_clear);
|
|||||||
#ifdef CONFIG_PPC_FPU
|
#ifdef CONFIG_PPC_FPU
|
||||||
void __giveup_fpu(struct task_struct *tsk)
|
void __giveup_fpu(struct task_struct *tsk)
|
||||||
{
|
{
|
||||||
|
unsigned long msr;
|
||||||
|
|
||||||
save_fpu(tsk);
|
save_fpu(tsk);
|
||||||
tsk->thread.regs->msr &= ~MSR_FP;
|
msr = tsk->thread.regs->msr;
|
||||||
|
msr &= ~MSR_FP;
|
||||||
#ifdef CONFIG_VSX
|
#ifdef CONFIG_VSX
|
||||||
if (cpu_has_feature(CPU_FTR_VSX))
|
if (cpu_has_feature(CPU_FTR_VSX))
|
||||||
tsk->thread.regs->msr &= ~MSR_VSX;
|
msr &= ~MSR_VSX;
|
||||||
#endif
|
#endif
|
||||||
|
tsk->thread.regs->msr = msr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void giveup_fpu(struct task_struct *tsk)
|
void giveup_fpu(struct task_struct *tsk)
|
||||||
@ -219,12 +223,16 @@ static int restore_fp(struct task_struct *tsk) { return 0; }
|
|||||||
|
|
||||||
static void __giveup_altivec(struct task_struct *tsk)
|
static void __giveup_altivec(struct task_struct *tsk)
|
||||||
{
|
{
|
||||||
|
unsigned long msr;
|
||||||
|
|
||||||
save_altivec(tsk);
|
save_altivec(tsk);
|
||||||
tsk->thread.regs->msr &= ~MSR_VEC;
|
msr = tsk->thread.regs->msr;
|
||||||
|
msr &= ~MSR_VEC;
|
||||||
#ifdef CONFIG_VSX
|
#ifdef CONFIG_VSX
|
||||||
if (cpu_has_feature(CPU_FTR_VSX))
|
if (cpu_has_feature(CPU_FTR_VSX))
|
||||||
tsk->thread.regs->msr &= ~MSR_VSX;
|
msr &= ~MSR_VSX;
|
||||||
#endif
|
#endif
|
||||||
|
tsk->thread.regs->msr = msr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void giveup_altivec(struct task_struct *tsk)
|
void giveup_altivec(struct task_struct *tsk)
|
||||||
|
Loading…
Reference in New Issue
Block a user