Bug 1687441 part 6 - Add spectreMaskIndexPtr to the MacroAssembler. r=anba

Baesd on spectreMaskIndex32 and cmp32Move32.

Also removes incorrect and unused cmp32 implementations on ARM64.

Differential Revision: https://phabricator.services.mozilla.com/D102431
This commit is contained in:
Jan de Mooij 2021-01-21 10:14:42 +00:00
parent ace89cf6f2
commit 6d5c1e5451
7 changed files with 78 additions and 16 deletions

View File

@ -3896,6 +3896,27 @@ void MacroAssembler::spectreMaskIndex32(Register index, const Address& length,
cmp32Move32(Assembler::Below, index, length, index, output);
}
void MacroAssembler::spectreMaskIndexPtr(Register index, Register length,
Register output) {
MOZ_ASSERT(JitOptions.spectreIndexMasking);
MOZ_ASSERT(length != output);
MOZ_ASSERT(index != output);
movePtr(ImmWord(0), output);
cmpPtrMovePtr(Assembler::Below, index, length, index, output);
}
void MacroAssembler::spectreMaskIndexPtr(Register index, const Address& length,
Register output) {
MOZ_ASSERT(JitOptions.spectreIndexMasking);
MOZ_ASSERT(index != length.base);
MOZ_ASSERT(length.base != output);
MOZ_ASSERT(index != output);
movePtr(ImmWord(0), output);
cmpPtrMovePtr(Assembler::Below, index, length, index, output);
}
void MacroAssembler::boundsCheck32PowerOfTwo(Register index, uint32_t length,
Label* failure) {
MOZ_ASSERT(mozilla::IsPowerOfTwo(length));

View File

@ -1858,6 +1858,12 @@ class MacroAssembler : public MacroAssemblerSpecific {
Register src, Register dest)
DEFINED_ON(arm, arm64, mips_shared, x86_shared);
inline void cmpPtrMovePtr(Condition cond, Register lhs, Register rhs,
Register src, Register dest) PER_ARCH;
inline void cmpPtrMovePtr(Condition cond, Register lhs, const Address& rhs,
Register src, Register dest) PER_ARCH;
inline void cmp32Load32(Condition cond, Register lhs, const Address& rhs,
const Address& src, Register dest)
DEFINED_ON(arm, arm64, mips_shared, x86_shared);
@ -3608,6 +3614,9 @@ class MacroAssembler : public MacroAssemblerSpecific {
void spectreMaskIndex32(Register index, Register length, Register output);
void spectreMaskIndex32(Register index, const Address& length,
Register output);
void spectreMaskIndexPtr(Register index, Register length, Register output);
void spectreMaskIndexPtr(Register index, const Address& length,
Register output);
// The length must be a power of two. Performs a bounds check and Spectre
// index masking.

View File

@ -2015,6 +2015,17 @@ void MacroAssembler::cmp32Move32(Condition cond, Register lhs,
cmp32Move32(cond, lhs, scratch, src, dest);
}
void MacroAssembler::cmpPtrMovePtr(Condition cond, Register lhs, Register rhs,
Register src, Register dest) {
cmp32Move32(cond, lhs, rhs, src, dest);
}
void MacroAssembler::cmpPtrMovePtr(Condition cond, Register lhs,
const Address& rhs, Register src,
Register dest) {
cmp32Move32(cond, lhs, rhs, src, dest);
}
void MacroAssembler::cmp32Load32(Condition cond, Register lhs,
const Address& rhs, const Address& src,
Register dest) {

View File

@ -1746,11 +1746,22 @@ void MacroAssembler::cmp32Move32(Condition cond, Register lhs, Register rhs,
void MacroAssembler::cmp32Move32(Condition cond, Register lhs,
const Address& rhs, Register src,
Register dest) {
cmp32(lhs, rhs);
Csel(ARMRegister(dest, 32), ARMRegister(src, 32), ARMRegister(dest, 32),
MOZ_CRASH("NYI");
}
void MacroAssembler::cmpPtrMovePtr(Condition cond, Register lhs, Register rhs,
Register src, Register dest) {
cmpPtr(lhs, rhs);
Csel(ARMRegister(dest, 64), ARMRegister(src, 64), ARMRegister(dest, 64),
cond);
}
void MacroAssembler::cmpPtrMovePtr(Condition cond, Register lhs,
const Address& rhs, Register src,
Register dest) {
MOZ_CRASH("NYI");
}
void MacroAssembler::cmp32Load32(Condition cond, Register lhs,
const Address& rhs, const Address& src,
Register dest) {

View File

@ -1062,14 +1062,6 @@ class MacroAssemblerCompat : public vixl::MacroAssembler {
Ldr(scratch32, toMemOperand(lhs));
Cmp(scratch32, Operand(ARMRegister(rhs, 32)));
}
void cmp32(Register lhs, const Address& rhs) {
vixl::UseScratchRegisterScope temps(this);
const ARMRegister scratch32 = temps.AcquireW();
MOZ_ASSERT(scratch32.asUnsized() != rhs.base);
MOZ_ASSERT(scratch32.asUnsized() != lhs);
Ldr(scratch32, toMemOperand(rhs));
Cmp(scratch32, Operand(ARMRegister(lhs, 32)));
}
void cmp32(const vixl::Operand& lhs, Imm32 rhs) {
vixl::UseScratchRegisterScope temps(this);
const ARMRegister scratch32 = temps.AcquireW();
@ -1082,12 +1074,6 @@ class MacroAssemblerCompat : public vixl::MacroAssembler {
Mov(scratch32, lhs);
Cmp(scratch32, Operand(ARMRegister(rhs, 32)));
}
void cmp32(Register lhs, const vixl::Operand& rhs) {
vixl::UseScratchRegisterScope temps(this);
const ARMRegister scratch32 = temps.AcquireW();
Mov(scratch32, rhs);
Cmp(scratch32, Operand(ARMRegister(lhs, 32)));
}
void cmn32(Register lhs, Imm32 rhs) {
Cmn(ARMRegister(lhs, 32), Operand(rhs.value));

View File

@ -724,6 +724,19 @@ void MacroAssembler::branchToComputedAddress(const BaseIndex& address) {
jmp(Operand(address));
}
void MacroAssembler::cmpPtrMovePtr(Condition cond, Register lhs, Register rhs,
Register src, Register dest) {
cmpPtr(lhs, rhs);
cmovCCq(cond, src, dest);
}
void MacroAssembler::cmpPtrMovePtr(Condition cond, Register lhs,
const Address& rhs, Register src,
Register dest) {
cmpPtr(lhs, Operand(rhs));
cmovCCq(cond, src, dest);
}
void MacroAssembler::cmp32MovePtr(Condition cond, Register lhs, Imm32 rhs,
Register src, Register dest) {
cmp32(lhs, rhs);

View File

@ -992,6 +992,17 @@ void MacroAssembler::cmp32LoadPtr(Condition cond, const Address& lhs, Imm32 rhs,
cmovCCl(cond, Operand(src), dest);
}
void MacroAssembler::cmpPtrMovePtr(Condition cond, Register lhs, Register rhs,
Register src, Register dest) {
cmp32Move32(cond, lhs, rhs, src, dest);
}
void MacroAssembler::cmpPtrMovePtr(Condition cond, Register lhs,
const Address& rhs, Register src,
Register dest) {
cmp32Move32(cond, lhs, rhs, src, dest);
}
void MacroAssembler::test32LoadPtr(Condition cond, const Address& addr,
Imm32 mask, const Address& src,
Register dest) {